Come funziona
Come mestiere fissa le skill a commit del registry, rileva gli aggiornamenti per skill con gli hash dei tree git e non sovrascrive mai una skill modificata.
Come funzionano gli aggiornamenti
mestiere fissa ogni skill a un commit del registry, come fanno i lockfile dei pacchetti. Chi scrive un registry non deve taggare le versioni.
addrisolve ilrefdel registry e fissa le nuove skill a quel commit.outdatedscarica il registry ed elenca le skill il cui contenuto è cambiato. Un nuovo commit che non tocca una skill non viene segnalato.updatesposta in avanti il lock, per tutto o solo per i target che indichi. Aggiornare un namespace prende anche le skill aggiunte e toglie quelle cancellate.syncinstalla esattamente quello che dice il lock.sync --frozenfallisce seinstallelocknon coincidono, ed è quello che deve eseguire la CI.
Fissa un intero progetto con ref: v2026.10 (un tag) o con l'ID di un commit.
Modello di sicurezza
Il lock è l'unico stato che mestiere conserva. Non ci sono database nascosti o file marker che possono andare fuori sync. Prima di sostituire o cancellare una cartella, mestiere controlla la cartella stessa:
- Calcola l'hash del tree git della cartella su disco, saltando i file nascosti come
.DS_Storee i file di swap degli editor. - Cerca la skill del registry che corrisponde al nome della cartella, e ogni versione che quella skill ha avuto nella storia del registry.
- Solo se l'hash corrisponde a una di quelle versioni la cartella è un'installazione intatta, e solo allora si può sostituire o rimuovere senza rischi.
Per ogni cartella in una directory di skill:
- Nel lock, l'hash corrisponde alla versione nel lock: niente da fare.
- Nel lock, l'hash corrisponde a una versione pubblicata più vecchia: aggiornata alla versione nel lock.
- Nel lock, l'hash non corrisponde a nessuna versione pubblicata:
syncsi ferma. La cartella ha modifiche locali; usa--forceoeject. - Non nel lock, nome e contenuto corrispondono a una skill pubblicata: rimossa, perché è stata tolta da
skills.yaml. - Non nel lock, qualsiasi altro caso: lasciata com'è. È una tua skill.
--force è sempre una scelta esplicita. Lo stesso controllo fa funzionare i flussi di lavoro abituali del team senza passaggi in più:
| Situazione | Risultato |
|---|---|
Un collega aggiorna una skill; fai pull ed esegui sync |
La tua copia più vecchia e non modificata viene aggiornata |
Un collega rimuove una skill; fai pull ed esegui sync |
La cartella rimasta viene rimossa |
| Hai modificato una skill installata | sync si ferma e suggerisce --force o eject |
| Hai copiato una skill per farne una tua | La copia non viene mai toccata |
| Offline, con un registry in cache | sync installa dalla cache |
Architettura
- Registry (git):
skills/<namespace>/<skill>/SKILL.mdeskills/<namespace>/_shared/. - Cache locale: un mirror git bare per ogni registry, riempito con
git fetch. - Progetto:
skills.yaml(install e lock),.agents/skills/<namespace>-<skill>/con i file veri, e symlink da.claude/skills/e.kiro/skills/.
add e update risolvono install sul mirror del registry e scrivono lock. sync confronta il lock con le cartelle delle skill su disco e applica solo i passaggi che può dimostrare sicuri: install, upgrade, link, unlink, remove.
Scelte di progettazione
- Il binario
gitdi sistema, non una libreria git in Go, così l'autenticazione funziona esattamente come per il tuogit. - Gli hash dei tree git come identità del contenuto. L'identità di una skill è il tree ID della sua cartella installata, quindi le modifiche si rilevano per singola skill. Per le skill senza link condivisi è il tree ID del registry stesso.
- La storia come prova di proprietà. La proprietà non viene mai registrata in un file di stato. Si decide in base al fatto che il contenuto di una cartella sia mai stato pubblicato.
- Installazioni piatte, registry con namespace. Gli harness trovano le skill a un solo livello di profondità, quindi i namespace esistono nel registry e nei nomi installati, non come cartelle.
- Le scritture passano per una cartella temporanea accanto a quella finale, che poi viene rinominata al suo posto, così un'esecuzione interrotta non lascia mai una skill scritta a metà.