CtrlK
BlogDocsLog inGet started
Tessl Logo

spec-driven-development/agent-registry

Coordina multipli agenti AI CLI (Kimi, Claude, Gemini, OpenAI, ecc.) che lavorano contemporaneamente sullo stesso progetto e mantiene una memoria collettiva (wiki) di tutte le sessioni passate. Usa questa skill SEMPRE quando lavori in parallelo con altre AI CLI, quando devi salvare lo stato di una sessione condivisa, quando vuoi evitare sovrascritture su file toccati da altri agenti, quando devi chiedere "questo lavoro è già stato fatto? questo bug si è già visto?", o quando l'utente parla di "multi-tap", "registry agenti", "coordination", "lock file", "handoff condiviso", "wiki delle sessioni", "chi sta lavorando su cosa" o "evitare che le AI si pestino i piedi".

72

Quality

90%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide

SecuritybySnyk

Passed

No findings from the security scan

Overview
Quality
Evals
Security
Files

check-target-ownership.shscripts/

#!/usr/bin/env bash
set -euo pipefail

python3 - <<'PY'
from pathlib import Path
import fnmatch
import subprocess
import sys

ROOT = Path.cwd()
SPEC_ROOT = ROOT / "openspec" / "specs"


def run(cmd):
    result = subprocess.run(cmd, shell=True, text=True, capture_output=True)
    return result.returncode, result.stdout.strip(), result.stderr.strip()


def changed_files():
    # Prefer PR/main comparison when origin/main is available.
    code, out, _ = run("git rev-parse --verify origin/main")
    if code == 0:
        code, out, _ = run("git diff --name-only origin/main...HEAD")
        if out:
            return set(out.splitlines())

    # Fallback for local demos: staged + unstaged files.
    files = set()
    for cmd in ["git diff --name-only --cached", "git diff --name-only"]:
        _, out, _ = run(cmd)
        if out:
            files.update(out.splitlines())
    return files


def parse_targets(spec: Path):
    text = spec.read_text(encoding="utf-8")
    if not text.startswith("---"):
        return []

    parts = text.split("---", 2)
    if len(parts) < 3:
        return []

    frontmatter = parts[1].splitlines()
    targets = []
    in_targets = False

    for line in frontmatter:
        stripped = line.strip()
        if stripped.startswith("targets:"):
            in_targets = True
            continue
        if in_targets:
            if stripped.startswith("-"):
                raw = stripped[1:].strip().strip('"\'')
                # targets: paths are project-root-relative, not relative to the spec file.
                resolved = (ROOT / raw).resolve()
                try:
                    rel = resolved.relative_to(ROOT)
                    targets.append(str(rel))
                except ValueError:
                    targets.append(raw)
            elif stripped and not line.startswith(" "):
                in_targets = False

    return targets


owners = {}
for spec in sorted(SPEC_ROOT.glob("**/spec.md")):
    for target in parse_targets(spec):
        owners.setdefault(target, []).append(str(spec.relative_to(ROOT)))

changed = changed_files()
changed_specs = {f for f in changed if f.startswith("openspec/specs/") and f.endswith("spec.md")}
violations = []

for changed_file in changed:
    for target_pattern, spec_owners in owners.items():
        if changed_file == target_pattern or fnmatch.fnmatch(changed_file, target_pattern):
            if not any(owner in changed_specs for owner in spec_owners):
                violations.append((changed_file, spec_owners))

if violations:
    print("FAILED — target file changed without spec update.\n")
    for file, spec_owners in violations:
        print("Changed target:")
        print(f"  {file}\n")
        print("Owned by:")
        for owner in spec_owners:
            print(f"  {owner}")
        print()
    print("Fix:")
    print("  1. update the owning spec first")
    print("  2. ask the agent to update targets and tests from the approved spec")
    sys.exit(1)

print("check-target-ownership: PASSED")
PY

README.md

requirements-dev.txt

SKILL.md

SPEC_SETUP.md

tile.json