Skip to content

Commit e91e88a

Browse files
release: SpecBridge v1.0.0 (#12)
* feat(core): add unified state-migration framework and hash-bound recovery engine Generic, schema-agnostic plan/apply/report/verify migration engine plus a recovery engine restricted to safe action kinds inside .specbridge/. Plans are hash-bound to exact file bytes; applies are atomic with backups and rollback; recovery preserves originals in quarantine and appends to an append-only log. Nothing runs automatically; CLI wiring follows. * chore(release): bump every package and manifest to 1.0.0 Root, all workspace packages, CLI/MCP/extension-SDK/Action version constants, plugin and marketplace manifests. Template and extension compatibility ranges widen from <1.0.0 to <2.0.0 (scaffolds now emit >=1.0.0 <2.0.0); built-in packs, registry index/entries, and galleries regenerated; version-sensitive tests updated. Plugin and Action dist rebuilds follow once the new CLI commands land. * docs: add v1.0.0 stability contracts, threat model, and community files docs/stability/{public-contracts,versioning-policy}.md inventory every public contract with per-area stability promises. docs/security/ threat-model.md consolidates the per-subsystem threat models (29 threats with mitigations verified against source) and states explicit non-claims. Adds SECURITY/SUPPORT/CONTRIBUTING/CODE_OF_CONDUCT, issue forms, PR template, release checklist, and the temporary v1.0.0 resume document. * feat(release): add public-contract snapshots, MCP doc generation, and security scan Machine-readable contract snapshots under contracts/ (CLI tree, exit codes, report IDs, schema versions, verification rules, runner/template/extension contracts, MCP names, Skill names, Action interface) enforced by pnpm check:public-contracts. Adds pnpm generate/check:mcp-docs (tool-reference generated from the authoritative registry) and pnpm check:security (deterministic scan for credentials, bypass strings, and bundle paths). Wires the new checks plus example validation into CI and adds a tag-driven, draft-first release workflow with a workflow_dispatch dry-run mode. * feat(cli): add migrate, state validate/recover, and setup commands Wires the migration framework and recovery engine into the CLI: specbridge migrate status|plan|apply|verify (--dry-run/--json/--backup-directory/--target) specbridge state validate (read-only; per-family diagnosis) specbridge state recover --plan|--apply <id> (acknowledgement-token gated) specbridge doctor --repair-plan (read-only recovery preview) specbridge setup (preview-first initialization) config migrate becomes a deprecated alias (stderr notice; removal >= v2.0.0). Adds the state-family registry, corruption fixtures, and 66 tests covering migration idempotency/atomicity/rollback, read-only validation, hash-bound recovery, quarantine preservation, and the never-invent-approvals guarantees. * test(perf): add large-repository performance suite and budgets 500-spec / 10,000-task deterministic fixtures plus 12 gated measurements (workspace detection, spec discovery, drift verification, template/extension/ registry search, affected-spec detection, MCP pagination, report generation, peak memory) with generous CI budgets and stable 'perf:' benchmark logs. docs/performance.md records methodology, indicative numbers, and two honest findings (single-spec read does full discovery; MCP spec_list analyzes all specs per page). Also pins the MCP stdio version assertions to the constant. * docs(examples): add maintained example projects and offline demo scripts Three new offline, deterministic examples validated in CI: claude-code-workflow (plugin flow + committed approvals), ci-drift-gate (verification policy + GitHub Action + trusted commands), and template-and-extension (template search/preview + safe analyzer flow). Adds scripts/validate-examples.mjs (26 checks over temp copies), scripts/demo.{sh,ps1} (offline drift demo, both run green), and docs/launch/demo-recording.md. * docs: reorganize documentation around a hub, rewrite README, add 1.0.0 CHANGELOG Additive documentation architecture: docs/README.md hub over the existing flat pages plus new getting-started/ (installation, quickstart, existing-kiro -project, claude-code-plugin), migrations hub, and dependency inventory. README first screen follows the launch layout (positioning, workflow, 30-second quickstart, honest maturity/security note). CHANGELOG gains the 1.0.0 entry; roadmap marks v0.7.1 and v1.0.0 shipped; verification-rules documents SBV026. * chore(release): publish CLI as specbridge-cli and rebuild bundled artifacts The bare npm name 'specbridge' is taken by an unrelated project, so the package is named specbridge-cli; the bin and command stay 'specbridge'. tsup bundles the @specbridge/* workspace packages into the published dist so the package installs standalone, with an explicit files allowlist (no source maps, tests, or fixtures) and committed LICENSE/NOTICE/README. Rebuilds the plugin and GitHub Action bundles at 1.0.0 and adds the release QUICKSTART. * feat(release): add cross-platform packaging, checksums, and release notes scripts/package-standalone.mjs builds portable-node and per-platform archives (windows-x64/linux-x64/macos-x64/macos-arm64) with a pinned, hash-verified Node 20.20.2 runtime, a per-archive release manifest (schema/contract versions, SHA-256 file list, no absolute paths), and on-platform smoke tests. scripts/validate-npm-package.mjs enforces the files allowlist and proves the packed specbridge-cli tarball installs and runs in isolation. scripts/assemble-release.mjs emits SHA256SUMS.txt/json and a combined release manifest, failing on any missing expected asset. Adds the v1.0.0 migration guide and release notes, fixes the plugin-ZIP path in release.yml, ignores dist-release/, and widens the doc example compatibility ranges to <2.0.0. * release: prepare SpecBridge v1.0.0 Removes the temporary release working document. All local release gates pass: lint, typecheck, 1266 tests, build, public-contract snapshots, security scan, MCP-doc drift, plugin validation + isolated bundle, template/extension galleries and registries, CLI smoke (47), example validation (26), npm package validation (14, isolated install), and standalone packaging (portable-node + windows-x64 smoke, linux archive, checksummed release manifest). Versions are consistently 1.0.0. No remote operation performed; publication awaits explicit authorization. * fix(ci): rebuild plugin bundle and isolate the performance suite Two CI failures on the v1.0.0 PR: The committed Claude Code plugin bundle predated the `setup` command, so CI's reproducibility check (git diff over the bundled dist) failed on Linux. Rebuilt from current source; a second build is now byte-identical. The large-repository performance suite builds ~9,000-file fixtures and real git history inside the main worker pool, which starved vitest's worker RPC on loaded runners: every test passed but the run still failed with an unhandled "Timeout calling onTaskUpdate" error (seen on windows/node-20). The suite now runs separately via `pnpm test:perf` (vitest.perf.config.ts, serial, generous timeouts) and CI runs it as its own step on one matrix combination, matching the policy of treating performance numbers as informational benchmarks. Main suite: 92 files / 1254 tests. Perf suite: 12 tests. Both green, with no unhandled errors. * ci: pin the skill-verification template to v0.2.0 SpecBridge 1.0.0 widens built-in template and reference-extension compatibility ranges to '<2.0.0' (the old '<1.0.0' bound excluded 1.0.0 itself, failing every built-in template with SBT006). That is a real change in grounded CLI output, so the pinned fixture in agent-skill-verification-template was regenerated and tagged v0.2.0; this pins the new ref. The verifier release pin (ASV_VERSION/ASV_SHA256) is unchanged.
1 parent bbfe36c commit e91e88a

179 files changed

Lines changed: 44046 additions & 28276 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude-plugin/marketplace.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"name": "specbridge",
1010
"source": "./integrations/claude-code-plugin/specbridge",
1111
"description": "Kiro-compatible spec workflows, verified interactive task execution, and deterministic drift checks.",
12-
"version": "0.7.1",
12+
"version": "1.0.0",
1313
"license": "MIT",
1414
"keywords": [
1515
"spec-driven-development",
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
name: Bug report
2+
description: Report a reproducible problem in SpecBridge
3+
title: "[bug] "
4+
labels: ["bug"]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: |
9+
Thanks for the report. Reproducible bugs in documented behavior — especially anything
10+
touching the security model or `.kiro` file integrity — get priority.
11+
12+
**Security issues do not belong here.** Report them privately per
13+
[SECURITY.md](https://github.com/HelloThisWorld/specbridge/blob/main/SECURITY.md).
14+
- type: input
15+
id: version
16+
attributes:
17+
label: SpecBridge version
18+
description: Output of `specbridge --version`, plus how you installed it (npm, plugin, source).
19+
placeholder: "1.0.0 (npm)"
20+
validations:
21+
required: true
22+
- type: input
23+
id: platform
24+
attributes:
25+
label: Platform
26+
description: Operating system and version.
27+
placeholder: "Windows 11 Pro 26100 / macOS 15.3 / Ubuntu 24.04"
28+
validations:
29+
required: true
30+
- type: input
31+
id: node-version
32+
attributes:
33+
label: Node.js version
34+
description: Output of `node --version` (Node >= 20 is required).
35+
placeholder: "v20.17.0"
36+
validations:
37+
required: true
38+
- type: textarea
39+
id: what-happened
40+
attributes:
41+
label: What happened
42+
description: The exact command you ran and what SpecBridge did, including error output.
43+
placeholder: |
44+
Command:
45+
Output:
46+
validations:
47+
required: true
48+
- type: textarea
49+
id: expected
50+
attributes:
51+
label: What you expected
52+
description: What documented behavior you expected instead.
53+
validations:
54+
required: true
55+
- type: textarea
56+
id: doctor-output
57+
attributes:
58+
label: "`specbridge doctor` output"
59+
description: >
60+
Paste the output of `specbridge doctor --json` with sensitive paths redacted.
61+
It prints no secret values by design, but paths can reveal machine or project names.
62+
render: json
63+
validations:
64+
required: false
65+
- type: textarea
66+
id: reproduction
67+
attributes:
68+
label: Reproduction steps
69+
description: >
70+
The smallest sequence that reproduces the issue — ideally against a tiny synthetic
71+
`.kiro` workspace. Numbered steps beat prose.
72+
placeholder: |
73+
1. Create a workspace with ...
74+
2. Run `specbridge ...`
75+
3. Observe ...
76+
validations:
77+
required: true
78+
- type: checkboxes
79+
id: hygiene
80+
attributes:
81+
label: Report hygiene
82+
options:
83+
- label: I removed all credentials, API keys, and proprietary company content from this report.
84+
required: true

.github/ISSUE_TEMPLATE/config.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
blank_issues_enabled: true
2+
contact_links:
3+
- name: Documentation
4+
url: https://github.com/HelloThisWorld/specbridge/tree/main/docs
5+
about: Guides for every area — start here for usage questions before opening an issue.
6+
- name: Security reports (private)
7+
url: https://github.com/HelloThisWorld/specbridge/blob/main/SECURITY.md
8+
about: Never report vulnerabilities in a public issue — see the reporting instructions.
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
name: Extension contribution
2+
description: Propose an extension for the community registry index
3+
title: "[extension] "
4+
labels: ["extension", "registry"]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: |
9+
The registry lists **metadata only** — your code stays in your repository and your
10+
archive stays on your HTTPS host. Read
11+
[registry/CONTRIBUTING.md](https://github.com/HelloThisWorld/specbridge/blob/main/registry/CONTRIBUTING.md)
12+
first: the actual contribution is a pull request adding
13+
`registry/entries/<your-extension-id>.json`; this issue is for proposing and
14+
discussing it.
15+
16+
Before filing, your extension should pass:
17+
```
18+
specbridge extension validate ./my-extension
19+
specbridge extension conformance ./my-extension --yes
20+
specbridge extension package ./my-extension
21+
```
22+
- type: input
23+
id: extension-id
24+
attributes:
25+
label: Extension ID
26+
description: "Must match the extension ID grammar: lowercase letters and digits in hyphen-separated segments, starting with a letter, max 64 characters."
27+
placeholder: "security-analyzer"
28+
validations:
29+
required: true
30+
- type: dropdown
31+
id: kind
32+
attributes:
33+
label: Kind
34+
options:
35+
- template-provider
36+
- analyzer
37+
- verifier
38+
- exporter
39+
- runner
40+
validations:
41+
required: true
42+
- type: input
43+
id: repo-url
44+
attributes:
45+
label: Source repository URL
46+
description: Public HTTPS URL of the extension's source repository.
47+
placeholder: "https://github.com/you/security-analyzer"
48+
validations:
49+
required: true
50+
- type: textarea
51+
id: checksum
52+
attributes:
53+
label: Archive hosting and checksum
54+
description: >
55+
The stable, credential-free HTTPS URL of your packaged
56+
`.specbridge-extension.zip` and the exact archive SHA-256 printed by
57+
`specbridge extension package`. The registry entry must carry both for every version.
58+
placeholder: |
59+
archiveUrl: https://github.com/you/security-analyzer/releases/download/v1.0.0/security-analyzer-1.0.0.specbridge-extension.zip
60+
sha256: <64 hex characters>
61+
validations:
62+
required: true
63+
- type: textarea
64+
id: permissions
65+
attributes:
66+
label: Permissions requested
67+
description: >
68+
The exact `permissions` block from your manifest (specRead, repositoryRead,
69+
repositoryWrite, network, childProcess, environmentVariables). It must match the
70+
manifest inside the archive byte-for-byte — understating permissions is grounds
71+
for removal.
72+
render: json
73+
validations:
74+
required: true
75+
- type: checkboxes
76+
id: terms
77+
attributes:
78+
label: Registry terms
79+
options:
80+
- label: I understand that registry listing is not endorsement, review, or a security guarantee, and that checksums prove integrity, not publisher identity.
81+
required: true
82+
- label: My entry declares every permission the manifest declares, my archive is hosted at a stable credential-free HTTPS URL, and I will publish new versions as new entries rather than changing published archives in place.
83+
required: true
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
name: Feature request
2+
description: Propose an improvement or new capability for SpecBridge
3+
title: "[feature] "
4+
labels: ["enhancement"]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: |
9+
Feature discussions work best when grounded in a concrete problem. Note that some
10+
requests are bounded by the project's invariants — SpecBridge will not add features
11+
that execute untrusted content, bypass permission systems, treat model claims as
12+
evidence, or mutate `.kiro`/Git state automatically.
13+
- type: textarea
14+
id: problem
15+
attributes:
16+
label: The problem
17+
description: What are you trying to do that SpecBridge currently makes hard or impossible? Describe the workflow, not just the missing flag.
18+
validations:
19+
required: true
20+
- type: textarea
21+
id: proposed-solution
22+
attributes:
23+
label: Proposed solution
24+
description: How you imagine it working — CLI commands, configuration, MCP tools, output. Sketches welcome.
25+
validations:
26+
required: true
27+
- type: textarea
28+
id: alternatives
29+
attributes:
30+
label: Alternatives considered
31+
description: Other approaches you tried or considered (including workarounds, templates, or extensions) and why they fall short.
32+
validations:
33+
required: false
34+
- type: dropdown
35+
id: contribution
36+
attributes:
37+
label: Willingness to contribute
38+
description: Would you implement this yourself if the design is agreed?
39+
options:
40+
- I would open a PR for this
41+
- I could help test or review
42+
- I am only proposing the idea
43+
validations:
44+
required: true
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
name: Template contribution
2+
description: Propose a built-in spec template pack
3+
title: "[template] "
4+
labels: ["template"]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: |
9+
Built-in templates are data, not code: a JSON manifest plus Markdown files with
10+
one-pass `{{variable}}` substitution — no scripts, no network, no model. Read
11+
[docs/template-contribution-guide.md](https://github.com/HelloThisWorld/specbridge/blob/main/docs/template-contribution-guide.md)
12+
for the pack layout, the generated artifacts, and the automatic test gate.
13+
- type: input
14+
id: template-id
15+
attributes:
16+
label: Template ID
17+
description: The manifest `id`, which must equal the pack directory name under `packages/templates/builtins/`.
18+
placeholder: "graphql-api"
19+
validations:
20+
required: true
21+
- type: dropdown
22+
id: kind
23+
attributes:
24+
label: Kind
25+
description: Which spec kind the template generates.
26+
options:
27+
- feature
28+
- bugfix
29+
validations:
30+
required: true
31+
- type: textarea
32+
id: modes
33+
attributes:
34+
label: Modes and variables
35+
description: Which stages the pack provides (requirements/bugfix, design, tasks) and the variables it declares, with their constraints.
36+
placeholder: |
37+
Stages: requirements, design, tasks
38+
Variables: serviceName (required), storageBackend (optional, default "postgres")
39+
validations:
40+
required: true
41+
- type: textarea
42+
id: scaffolds
43+
attributes:
44+
label: What it scaffolds
45+
description: What the rendered spec covers and why it is broadly reusable rather than project-specific. Which existing built-in is it closest to, and why is it not a variant of that one?
46+
validations:
47+
required: true
48+
- type: checkboxes
49+
id: guarantees
50+
attributes:
51+
label: Template guarantees
52+
options:
53+
- label: Rendering is fully offline and deterministic — the pack is plain UTF-8 Markdown plus a JSON manifest, uses only `{{variable}}` substitution, and contains no scripts, no symlinks, no network references, and no environment-dependent content.
54+
required: true
55+
- label: I removed all credentials and proprietary company content; examples are synthetic.
56+
required: true

.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Summary
2+
3+
<!-- What this PR changes and why. One or two paragraphs; link the design
4+
discussion if there was one. -->
5+
6+
Closes #<!-- issue number, or remove this line -->
7+
8+
## Checklist
9+
10+
- [ ] `pnpm lint`, `pnpm typecheck`, and `pnpm test` pass locally
11+
- [ ] `pnpm check:public-contracts` passes — or a stable contract changed
12+
**intentionally** and the snapshot under `contracts/` is updated in
13+
this PR
14+
- [ ] Documentation updated for any user-visible behavior change
15+
- [ ] CHANGELOG entry added for any user-visible change (required whenever
16+
a contract snapshot changed)
17+
- [ ] Everything is in English (code, comments, docs, commit messages)
18+
- [ ] No employer or client proprietary content — examples and fixtures
19+
are synthetic
20+
- [ ] No credentials, tokens, or secret values anywhere in the diff,
21+
fixtures, or recorded test output
22+
23+
<!-- Security-relevant change? Read SECURITY.md and
24+
docs/security/threat-model.md first, and say here which invariants
25+
the change touches. Never describe an unfixed vulnerability in a
26+
public PR. -->

.github/workflows/ci.yml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@ jobs:
4545
- name: Test (compatibility fixtures, round-trip byte identity, CLI, drift, action)
4646
run: pnpm test
4747

48+
- name: Large-repository performance suite (informational budgets)
49+
# Heavy ~9,000-file fixtures: one representative combination is enough,
50+
# and isolating it keeps the main test run's workers responsive.
51+
if: matrix.os == 'ubuntu-latest' && matrix.node == 20
52+
run: pnpm test:perf
53+
4854
- name: CLI smoke test against the example Kiro workspace
4955
run: node scripts/smoke.mjs
5056

@@ -54,6 +60,25 @@ jobs:
5460
- name: Template gallery matches the built-in manifests
5561
run: pnpm check:template-gallery
5662

63+
- name: Public contract snapshots match the built surface
64+
run: pnpm check:public-contracts
65+
66+
- name: Deterministic security scan (credentials, bypass strings, bundle paths)
67+
run: pnpm check:security
68+
69+
- name: Extension registry validates and matches the reference extensions
70+
run: |
71+
pnpm validate:extension-registry
72+
pnpm check:extension-registry
73+
pnpm check:builtin-registry
74+
pnpm check:extension-gallery
75+
76+
- name: Generated MCP tool reference matches the registry
77+
run: pnpm check:mcp-docs
78+
79+
- name: Example projects run offline with expected output
80+
run: node scripts/validate-examples.mjs
81+
5782
- name: GitHub Action bundle is reproducible
5883
if: matrix.os == 'ubuntu-latest'
5984
run: git diff --exit-code integrations/github-action/dist

0 commit comments

Comments
 (0)