CtrlK
BlogDocsLog inGet started
Tessl Logo

spec-driven-devlopment/spec-as-source

Spec-driven development on OpenSpec, with mechanical spec-as-source enforcement: a custom 'spec-as-source' OpenSpec schema adds file-ownership (targets) and test-verification ([@test]) metadata to every capability spec, three scripts (link check, ownership check, manifest build) keep code and specs from drifting apart, plus requirement-gathering, spec-writer, work-review, and a session-handoff skill with a proactive context-warning hook.

71

Quality

89%

Does it follow best practices?

Impact

No eval scenarios have been run

SecuritybySnyk

Advisory

Suggest reviewing before use

Overview
Quality
Evals
Security
Files

README.md

spec-driven-devlopment/spec-as-source

Workflow di spec-driven development costruito su OpenSpec, con enforcement meccanico per lo spec-as-source sopra di esso.

OpenSpec porta un progetto a spec-anchored (propose → apply → archive, con openspec/specs/<capability>/spec.md come specifica canonica), ma non verifica nulla da solo. Questo plugin aggiunge una schema OpenSpec custom (spec-as-source) e gli strumenti che rendono la spec un vincolo strutturale: ownership dei file, verifica dei test, workflow CI, e le skill che li orchestrano.


Installazione

# prerequisito: CLI OpenSpec
npm install -g @fission-ai/openspec

# nel tuo progetto
tessl install spec-driven-devlopment/spec-as-source

Richiede: openspec CLI, git, e un test runner (pytest / vitest / jest / cargo / go).


Cosa installa

Rule (sempre attive)

RuleComportamento imposto
spec-as-sourceL'implementazione non è completa finché tutti i [@test] esistono; un targets non cambia senza la sua spec
generated-file-headerOgni file targets inizia con # GENERATED FROM SPEC
handoff-suggestionSuggerisce /handoff save quando il contesto della conversazione si fa lungo (fallback portabile dell'hook PreCompact)

Skill — prima di scrivere codice (on-demand)

SkillQuando usarlaComando
requirement-gatheringquando la richiesta è vaga: interview strutturata, una domanda alla voltaUse requirement-gathering.
spec-writerper scrivere o correggere a mano una openspec/specs/<capability>/spec.mdUse spec-writer.

Skill — workflow OpenSpec (on-demand, genericizzate cross-agente)

SkillQuando usarlaComando
openspec-exploreper investigare un'idea prima di proporlaUse openspec-explore.
openspec-proposeper proporre un change e generare tutti gli artifact in un colpoUse openspec-propose.
openspec-apply-changeper implementare i task di un changeUse openspec-apply-change.
openspec-sync-specsper unire le delta spec di un change in openspec/specs/Use openspec-sync-specs.
openspec-archive-changeper chiudere e archiviare un change completatoUse openspec-archive-change.

Skill — enforcement spec-as-source (on-demand)

SkillQuando usarlaComando
spec-as-source-setupuna volta, per installare lo schema OpenSpec + script + CI + pre-commitUse spec-as-source-setup.
spec-verifya ogni giro, per verificare spec/test/codice + drift semanticoUse spec-verify.
work-reviewprima di dire "ho finito": review requisito-per-requisito con evidenza file:rigaUse work-review.
spec-ci-syncdopo aver aggiunto una spec o cambiato stackUse spec-ci-sync.
spec-rebuildper dimostrare che le spec sono la sorgenteUse spec-rebuild.

Skill — continuità di sessione (on-demand)

SkillQuando usarlaComando
handoffper congelare lo stato della sessione (.handoff/HANDOFF-NNN.md) e riprenderlo dopo, o per installare l'hook PreCompactUse handoff.

Docs

docs/policy.md — la policy in chiaro: perché esiste, come funziona, il ciclo di vita completo, il gap di migrazione da v1.x.


Uso tipico

# 1. una tantum: installa schema OpenSpec + infrastruttura di enforcement
Use spec-as-source-setup.
Use handoff.    # opzionale: installa anche l'hook PreCompact (Workflow E)

# 2. per ogni nuova feature
Use requirement-gathering.    # se la richiesta è vaga: chiarisce scope ed edge case
Use openspec-propose.         # o openspec-explore se l'idea non è ancora chiara
Use spec-writer.               # se serve scrivere/correggere una spec a mano
Use openspec-apply-change.     # implementa tasks.md
Use spec-verify.                # verifica targets/test/drift contro la spec
Use work-review.                 # review requisito-per-requisito prima di dire "fatto"
Use openspec-archive-change.     # chiude il change, unisce le spec

# 3. manutenzione occasionale
Use spec-ci-sync.    # dopo aver cambiato stack o aggiunto test
Use spec-rebuild.     # per dimostrare che le spec bastano a ricostruire il codice

# 4. quando la sessione si allunga
Use handoff.    # salva lo stato prima che il contesto rischi allucinazioni

Cosa crea spec-as-source-setup nel progetto:

openspec/schemas/spec-as-source/     # schema OpenSpec custom con targets + [@test]
scripts/check-spec-links.sh          # ogni [@test] punta a un file esistente
scripts/check-target-ownership.sh    # un target non cambia senza la sua spec
scripts/build-spec-manifest.py       # mappa spec → requisiti → target → test
scripts/verify.sh                    # esegue i tre script + test suite
.pre-commit-config.yaml              # gli stessi check in locale
.github/workflows/spec-verification.yml  # gli stessi check in CI

I 5 controlli di spec-verify

I primi 4 girano anche in CI (meccanici); il quinto è una review qualitativa che solo un agente può fare:

#ControlloSe fallisceRecupero
1check-spec-linksun [@test] punta a un file inesistentecrea il file di test mancante
2check-target-ownershipun targets è cambiato senza la sua specannulla la modifica → aggiorna la spec → rigenera dalla spec
3build-spec-manifestuna spec non è parsabilecorreggi frontmatter / header dei requisiti
4test suiteil comportamento contraddice la specallinea il codice, o cambia prima la spec
5drift semanticoil codice fa qualcosa che la spec non descrive (o viceversa), pur con link e test a postoaggiorna la spec (spec-writer) se il codice è corretto, altrimenti correggi il codice

Il controllo #2 è il cuore dello spec-as-source: è ciò che OpenSpec da solo non ha. Il controllo #5 è il cuore di work-review: prova che spec e codice dicano davvero la stessa cosa, non solo che i link tra loro siano formalmente a posto.


Aggiornamento

tessl update spec-driven-devlopment/spec-as-source
# poi RIAVVIA Claude Code: le skill si caricano all'avvio della sessione

Se tessl update non vede il plugin, non è registrato in tessl.json: installalo prima con tessl install spec-driven-devlopment/spec-as-source.


Convenzioni delle spec

Perché gli script funzionino, ogni openspec/specs/<capability>/spec.md deve avere:

---
targets:
  - src/percorso/file.py      # i file che questa capability possiede
---

# <Capability> Specification

## Purpose
...

## Requirements

### Requirement: <nome del requisito>
Descrizione normativa (SHALL/MUST).

**Verified by**: [@test] tests/percorso/test_file.py

#### Scenario: <nome scenario>
- **WHEN** ...
- **THEN** ...
  • frontmatter con targets (dichiarazione di proprietà), prima del titolo;
  • requisiti con nome libero nell'header ### Requirement: <nome> (formato OpenSpec, non più ID REQ-*);
  • ogni requisito con una riga **Verified by**: [@test] <path> dopo la frase normativa, mai come prima riga del blocco.

Una spec appena creata da openspec archive per una capability nuova parte senza frontmatter (lo scheletro di OpenSpec non ne genera uno): non è una violazione finché non viene modificata in modo non banale, momento in cui deve guadagnarsi un targets:.


Migrazione da v1.x

Le versioni precedenti alla 2.0.0 imponevano un formato di spec diverso e fatto in casa: file flat in specs/<nome>.spec.md con header REQ-<AREA>-<NNN>. Non esiste una skill di migrazione automatica. Spostare un progetto v1.x a questa versione richiede di ricreare manualmente ogni spec sotto openspec/specs/<capability>/spec.md seguendo la nuova convenzione frontmatter + **Verified by**, e aggiornare i percorsi [@test] di conseguenza.


Autore

Costruito da Giuseppe Di Canosa. Workspace spec-driven-devlopment.

README.md

tile.json