specky-sdd 3.9.0 → 3.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/.apm/instructions/cursor-instructions.instructions.md +59 -10
  2. package/.apm/instructions/opencode-instructions.instructions.md +45 -0
  3. package/.apm/skills/specky-sdd-pipeline/SKILL.md +8 -0
  4. package/CHANGELOG.md +59 -0
  5. package/README.md +19 -12
  6. package/apm.lock.yaml +5 -4
  7. package/apm.yml +1 -1
  8. package/config.yml +1 -1
  9. package/dist/cli/commands/compile.d.ts.map +1 -1
  10. package/dist/cli/commands/compile.js +2 -1
  11. package/dist/cli/commands/compile.js.map +1 -1
  12. package/dist/cli/commands/doctor.d.ts.map +1 -1
  13. package/dist/cli/commands/doctor.js +91 -10
  14. package/dist/cli/commands/doctor.js.map +1 -1
  15. package/dist/cli/lib/apm/lock.js +2 -2
  16. package/dist/cli/lib/apm/lock.js.map +1 -1
  17. package/dist/cli/lib/asset-copier.d.ts.map +1 -1
  18. package/dist/cli/lib/asset-copier.js +2 -2
  19. package/dist/cli/lib/asset-copier.js.map +1 -1
  20. package/dist/cli/lib/harness/compilers/claude.d.ts.map +1 -1
  21. package/dist/cli/lib/harness/compilers/claude.js +2 -2
  22. package/dist/cli/lib/harness/compilers/claude.js.map +1 -1
  23. package/dist/cli/lib/harness/compilers/common.d.ts +2 -0
  24. package/dist/cli/lib/harness/compilers/common.d.ts.map +1 -1
  25. package/dist/cli/lib/harness/compilers/common.js +6 -0
  26. package/dist/cli/lib/harness/compilers/common.js.map +1 -1
  27. package/dist/cli/lib/harness/compilers/cursor.js +2 -2
  28. package/dist/cli/lib/harness/compilers/cursor.js.map +1 -1
  29. package/dist/cli/lib/harness/tool-map.js +2 -2
  30. package/dist/cli/lib/harness/tool-map.js.map +1 -1
  31. package/dist/cli/lib/mcp-writer.d.ts.map +1 -1
  32. package/dist/cli/lib/mcp-writer.js +2 -0
  33. package/dist/cli/lib/mcp-writer.js.map +1 -1
  34. package/dist/services/diagram-generator.d.ts.map +1 -1
  35. package/dist/services/diagram-generator.js +9 -3
  36. package/dist/services/diagram-generator.js.map +1 -1
  37. package/dist/services/git-manager.d.ts.map +1 -1
  38. package/dist/services/git-manager.js +10 -8
  39. package/dist/services/git-manager.js.map +1 -1
  40. package/dist/services/state-machine.d.ts +22 -1
  41. package/dist/services/state-machine.d.ts.map +1 -1
  42. package/dist/services/state-machine.js +108 -5
  43. package/dist/services/state-machine.js.map +1 -1
  44. package/dist/services/work-item-exporter.d.ts.map +1 -1
  45. package/dist/services/work-item-exporter.js +14 -33
  46. package/dist/services/work-item-exporter.js.map +1 -1
  47. package/dist/templates/compliance.md +1 -2
  48. package/dist/templates/specification.md +2 -0
  49. package/dist/templates/verification.md +1 -2
  50. package/dist/tools/integration.d.ts.map +1 -1
  51. package/dist/tools/integration.js +11 -19
  52. package/dist/tools/integration.js.map +1 -1
  53. package/dist/tools/pipeline.d.ts.map +1 -1
  54. package/dist/tools/pipeline.js +119 -68
  55. package/dist/tools/pipeline.js.map +1 -1
  56. package/dist/tools/quality.d.ts.map +1 -1
  57. package/dist/tools/quality.js +22 -15
  58. package/dist/tools/quality.js.map +1 -1
  59. package/dist/tools/tool-enforcement.d.ts.map +1 -1
  60. package/dist/tools/tool-enforcement.js +13 -0
  61. package/dist/tools/tool-enforcement.js.map +1 -1
  62. package/dist/tools/transcript.d.ts.map +1 -1
  63. package/dist/tools/transcript.js +24 -8
  64. package/dist/tools/transcript.js.map +1 -1
  65. package/dist/tools/visualization.d.ts.map +1 -1
  66. package/dist/tools/visualization.js +17 -3
  67. package/dist/tools/visualization.js.map +1 -1
  68. package/dist/utils/design-stubs.d.ts +32 -0
  69. package/dist/utils/design-stubs.d.ts.map +1 -0
  70. package/dist/utils/design-stubs.js +103 -0
  71. package/dist/utils/design-stubs.js.map +1 -0
  72. package/dist/utils/task-parser.d.ts +18 -0
  73. package/dist/utils/task-parser.d.ts.map +1 -0
  74. package/dist/utils/task-parser.js +159 -0
  75. package/dist/utils/task-parser.js.map +1 -0
  76. package/package.json +1 -1
  77. package/templates/compliance.md +1 -2
  78. package/templates/specification.md +2 -0
  79. package/templates/verification.md +1 -2
@@ -2,19 +2,68 @@
2
2
  applyTo: '**'
3
3
  ---
4
4
 
5
- # Specky SDD - Cursor Instructions
5
+ # Specky SDD Cursor Instructions
6
6
 
7
- 1. EARS notation is mandatory: use the 6 canonical patterns from `.agents/skills/specky-sdd-pipeline/references/ears-notation.md`.
8
- 2. REQ-ID traceability is required on every requirement, task, design decision, and test.
9
- 3. Pipeline artifacts live in `.specs/NNN-feature/`; Phases 0-7 run on `spec/NNN-*` branches from `develop`.
10
- 4. Active pipeline (`.sdd-state.json`) routes through `@specky-orchestrator`; otherwise start with `@specky-onboarding`.
11
- 5. Load the companion SKILL.md before phase work: `.agents/skills/{agent-name}/SKILL.md`.
12
- 6. Cursor MCP is configured in `.cursor/mcp.json` with the `specky` server.
7
+ This project uses Spec-Driven Development (SDD) via the Specky pipeline.
8
+
9
+ ## Key Rules
10
+
11
+ 1. **EARS notation is mandatory.** Every requirement must follow one of the 6 EARS patterns (see `.agents/skills/specky-sdd-pipeline/references/ears-notation.md`).
12
+ 2. **REQ-ID traceability is non-negotiable.** Every test, task, and design decision traces to a REQ-ID.
13
+ 3. **Model routing matters.** Use a fast model class for lightweight scaffolding (Phase 0, 9), a balanced model class for iterative delivery (Phase 1, 5-7), and a reasoning-focused model class for complex analysis and design (Phase 2-4, 8).
14
+ 4. **Never skip hooks.** Blocking hooks (specky-security-scan, specky-release-gate, specky-artifact-validator, specky-phase-gate) must pass before release.
15
+ 5. **Artifacts live in `.specs/NNN-feature/`.** CONSTITUTION.md, RESEARCH.md, SPECIFICATION.md, DESIGN.md, TASKS.md, VERIFICATION.md, ANALYSIS.md.
16
+ 6. **One branch per spec.** Create `spec/NNN-feature-name` from `develop` for all pipeline work (Phases 0-7). Merge to `develop` after verification, then `stage` for QA, then `main` for production.
17
+ 7. **Load companion SKILL.md first.** Every agent reads `.agents/skills/{skill-name}/SKILL.md` as the first workflow step. Phase agents have dedicated skills (specky-sdd-init, specky-spec-engineer, specky-sdd-clarify, specky-design-architect, specky-task-planner, specky-quality-reviewer); shared pipeline context lives in specky-sdd-pipeline.
18
+ 8. **Orchestrator is the single entry point.** When `.specs/` exists with an active pipeline (`.sdd-state.json` present), ALL work MUST flow through `@specky-orchestrator`. If unsure where to start, invoke `@specky-onboarding`.
19
+
20
+ ## Available Agents
21
+
22
+ - @specky-onboarding — Interactive wizard and default entry point
23
+ - @specky-orchestrator — Full pipeline coordinator (all 10 phases)
24
+ - @specky-sdd-init — Initialize pipeline (Phase 0)
25
+ - @specky-requirements-engineer — Produce FRD + NFRD
26
+ - @specky-research-analyst — Technical research (Phase 1)
27
+ - @specky-spec-engineer — Write SPECIFICATION.md with EARS (Phase 2)
28
+ - @specky-sdd-clarify — Resolve ambiguities (Phase 3)
29
+ - @specky-design-architect — Write DESIGN.md + diagrams (Phase 4)
30
+ - @specky-task-planner — Write TASKS.md + CHECKLIST.md (Phase 5)
31
+ - @specky-quality-reviewer — Completeness audit + compliance (Phase 6)
32
+ - @specky-implementer — Implementation scaffolding (Phase 7)
33
+ - @specky-test-verifier — Coverage verification (Phase 8)
34
+ - @specky-release-engineer — Release preparation (Phase 9)
35
+
36
+ ## Available Commands
37
+
38
+ Use slash commands in Cursor (`/prompt-name`):
39
+
40
+ **Quick Start:** /specky-onboarding, /specky-orchestrate, /specky-greenfield, /specky-brownfield, /specky-migration, /specky-api
41
+ **Pipeline:** /specky-research, /specky-clarify, /specky-specify, /specky-design, /specky-tasks, /specky-implement, /specky-verify, /specky-release, /specky-deploy
42
+ **Special:** /specky-from-figma, /specky-from-meeting, /specky-check-drift, /specky-resolve-conflict
43
+ **Debug:** /specky-debug-hook, /specky-pipeline-status, /specky-reset-phase
13
44
 
14
45
  ## Quality Gates
15
46
 
16
- Cursor installs native hooks at `.cursor/hooks.json` and `.cursor/hooks/scripts/` when `dist/cursor-hooks.json` is available. Blocking gates deny unsafe artifact, phase, security, and release actions; advisory gates warn for branch, pipeline, LGTM, drift, and checkpoint workflows.
47
+ Cursor installs native hooks at `.cursor/hooks.json` and `.cursor/hooks/scripts/`:
48
+
49
+ - **Blocking gates:** specky-artifact-validator, specky-phase-gate, specky-security-scan, specky-release-gate (failClosed)
50
+ - **Advisory gates:** specky-branch-validator, specky-pipeline-guard, specky-lgtm-gate, specky-drift-monitor, specky-auto-checkpoint
51
+ - **LGTM gates:** Phases 2 (Specify), 4 (Design), 5 (Tasks) pause for human review
52
+ - **Server-enforced gates:** Analysis APPROVE is required before implement-phase MCP tools run
53
+
54
+ If hooks are unavailable, enforce the same gates through MCP tools and agent workflows.
55
+
56
+ ## MCP Server
57
+
58
+ The specky-sdd MCP server (58 tools) is configured in `.cursor/mcp.json` and runs via npx.
17
59
 
18
- If hooks are unavailable, enforce the same gates through MCP tools, agent workflows, and this rule. Do not claim non-Cursor hook or MCP locations are Cursor runtime paths.
60
+ ## EARS Patterns
19
61
 
20
- For the full phase workflow, invoke `/specky-onboarding` or read `.agents/skills/specky-sdd-pipeline/SKILL.md`.
62
+ | Pattern | Format |
63
+ |---------|--------|
64
+ | Ubiquitous | The system shall... |
65
+ | Event-driven | When [event], the system shall... |
66
+ | State-driven | While [state], the system shall... |
67
+ | Optional | Where [condition], the system shall... |
68
+ | Unwanted | If [condition], then the system shall... |
69
+ | Complex | While [state], when [event], the system shall... |
@@ -0,0 +1,45 @@
1
+ ---
2
+ applyTo: '**'
3
+ ---
4
+
5
+ # Specky SDD — OpenCode Instructions
6
+
7
+ This project uses Spec-Driven Development (SDD) via the Specky pipeline.
8
+
9
+ ## Bootstrap
10
+
11
+ OpenCode requires two steps after install:
12
+
13
+ 1. `specky install --target=opencode` — agents, commands, skills, MCP in `opencode.json`
14
+ 2. `specky compile --target=opencode` — writes `AGENTS.md` root context
15
+
16
+ ## Key Rules
17
+
18
+ 1. **EARS notation is mandatory.** Every requirement must follow one of the 6 EARS patterns.
19
+ 2. **REQ-ID traceability is non-negotiable.** Every test, task, and design decision traces to a REQ-ID.
20
+ 3. **Artifacts live in `.specs/NNN-feature/`.** CONSTITUTION.md, SPECIFICATION.md, DESIGN.md, TASKS.md, ANALYSIS.md, VERIFICATION.md.
21
+ 4. **One branch per spec.** Create `spec/NNN-feature-name` from `develop` for pipeline work (Phases 0-7).
22
+ 5. **Load companion SKILL.md first.** Read `.agents/skills/{skill-name}/SKILL.md` before phase work.
23
+ 6. **Orchestrator is the single entry point.** When `.specs/` has an active pipeline, route work through `@specky-orchestrator` or `/specky-orchestrate`.
24
+
25
+ ## Available Agents
26
+
27
+ - @specky-onboarding, @specky-orchestrator, @specky-sdd-init, @specky-spec-engineer, @specky-sdd-clarify
28
+ - @specky-design-architect, @specky-task-planner, @specky-quality-reviewer, @specky-implementer
29
+ - @specky-test-verifier, @specky-release-engineer, @specky-research-analyst, @specky-requirements-engineer
30
+
31
+ ## Tool Tokens
32
+
33
+ OpenCode agents use native tools: `read`, `edit`, `bash`, `fetch`, `agent`, `todo`, and `specky/sdd_*` MCP tools.
34
+
35
+ ## Quality Gates
36
+
37
+ OpenCode has no native hook runtime. Enforce gates via MCP tools:
38
+
39
+ - Run `sdd_run_analysis` and obtain APPROVE before implementation tools
40
+ - Use `/specky-pipeline-status` to check phase and gate state
41
+ - LGTM review at Specify, Design, and Tasks phases
42
+
43
+ ## MCP Server
44
+
45
+ Configured in `opencode.json` under `mcp.specky` — runs via `npx specky-sdd serve`.
@@ -91,6 +91,14 @@ The pipeline includes 16 automation hooks for customization:
91
91
 
92
92
  Hooks are configured in `sdd-hooks.json` with PreToolUse and PostToolUse matchers.
93
93
 
94
+ ## Server-Enforced Analysis Gate (v3.10+)
95
+
96
+ Once the pipeline reaches **Analyze**, implement/verify/release MCP tools require `gate_decision: APPROVE` from `sdd_run_analysis`. The server blocks tools such as `sdd_implement`, `sdd_generate_iac`, and `sdd_create_pr` centrally via `validateGateForTool` — not only when calling `sdd_advance_phase`.
97
+
98
+ Rewriting SPECIFICATION.md, DESIGN.md, or TASKS.md invalidates the gate; re-run analysis before implementation.
99
+
100
+ Phase bookkeeping: write-tools call `ensurePhasesThrough` so skipping `sdd_advance_phase` does not leave orphan phases (e.g. Discover stuck in `in_progress`).
101
+
94
102
  ## Key Artifacts per Phase
95
103
 
96
104
  - **CONSTITUTION.md** (Phase 0 — Init) — Project charter, scope boundaries, success criteria, stakeholder register
package/CHANGELOG.md CHANGED
@@ -7,6 +7,65 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [3.10.1] - 2026-07-13
11
+
12
+ Patch release: dual TASKS.md parser (table + checkbox), honest COMPLIANCE/VERIFICATION persistence, Analyze-phase remediation for blocked gates, and generation quality fixes.
13
+
14
+ ### Added
15
+
16
+ - **Shared `parseTasksFromMarkdown`** (`src/utils/task-parser.ts`) — reads canonical task tables and legacy checkbox lines, merges by task id.
17
+ - **`deriveDesignStubs`** — minimal DESIGN.md section content from SPECIFICATION.md when optional write_design fields are omitted.
18
+ - Regression coverage for table→verify/export round-trip, remediation phase rules, user-story titles, and design stubs.
19
+
20
+ ### Fixed
21
+
22
+ - **TASKS.md mismatch** — `sdd_verify_tasks`, `sdd_implement`, `sdd_export_work_items`, git progress, and Gantt diagrams no longer fail or return empty results on table-format TASKS.md.
23
+ - **COMPLIANCE.md / VERIFICATION.md** — persisted reports use pre-rendered table rows (no `[TODO:` placeholders).
24
+ - **Analyze dead-end** — `sdd_write_spec` / `sdd_write_design` / `sdd_write_tasks` allowed in Analyze when gate is absent, `BLOCK`, or `CHANGES_NEEDED` (implement remains gated).
25
+ - **User story titles** — use EARS prose instead of the `(event_driven)` heading label.
26
+ - **Spec FN/NFR split** and design stubs derived from requirements in write_spec / write_design / auto-pipeline.
27
+
28
+ ### Changed
29
+
30
+ - `extractRequirementIds` unified via `id-contracts.ts` in pipeline writers.
31
+ - **Documentation layout** — `GETTING-STARTED.md` and `CONTRIBUTING.md` moved under `docs/`; release notes and audit reports organized into `docs/releases/` and `docs/audits/`; root keeps only essential public files.
32
+
33
+ ## [3.10.0] - 2026-07-13
34
+
35
+ Pipeline MCP hardening and harness completeness: server-enforced analysis gates, strict phase bookkeeping, and expanded per-target doctor/install coverage.
36
+
37
+ ### Added
38
+
39
+ - **Central analysis gate enforcement** via `validateGateForTool` in tool-enforcement — implement/verify/release tools require `gate_decision: APPROVE` once the pipeline reaches Analyze.
40
+ - **`ensurePhasesThrough`** closes orphan phase states when write-tools run without intermediate `sdd_advance_phase` calls.
41
+ - **`invalidateGateDecision`** clears stale approvals when SPEC/DESIGN/TASKS are rewritten.
42
+ - **Strict feature resolution** — wrong `feature_number` throws instead of silently falling back to `features[0]`.
43
+ - **OpenCode instruction primitive** (`.apm/instructions/opencode-instructions.instructions.md`) and target-aware `specky compile --target=opencode`.
44
+ - **Expanded Cursor instructions** with full agent/command/gate documentation.
45
+ - **Doctor checks:** Copilot hooks manifest, Claude hooks-in-settings, agent-skills skill count, OpenCode AGENTS.md advisory, improved workspace target inference (Cursor/OpenCode/agent-skills).
46
+ - **Regression tests:** pipeline gate MCP integration, Cursor full install, mcp-writer dual VS Code schema, expanded pipeline-honesty and state-integrity coverage.
47
+
48
+ ### Changed
49
+
50
+ - **`sdd_write_spec`** persists `discovery_answers` in SPECIFICATION.md, computes real EARS scores, blocks invalid EARS without `force: true`, and reorders phase recording (start-before-write).
51
+ - **`sdd_run_analysis`** marks Analyze completed only on APPROVE; BLOCK/CHANGES_NEEDED leave Analyze in progress.
52
+ - **`sdd_clarify`** no longer auto-completes Clarify — only starts the phase.
53
+ - **`sdd_discover`** completes Discover phase and uses correct MCP `readOnlyHint`.
54
+ - **`sdd_advance_phase`** loads `pipeline.require_lgtm` dynamically; LGTM check runs inside the state-machine lock.
55
+ - **VS Code MCP registration** writes both `servers` and `mcpServers` for legacy compatibility.
56
+ - **Claude/Cursor tool map** includes `MultiEdit` for `workspace.edit` parity with hook permissions.
57
+ - **Doctor default targets** returns empty scope with guidance when no install metadata or signals are found (no more silent claude+copilot default).
58
+
59
+ ### Fixed
60
+
61
+ - Analysis gate was only enforced on `sdd_advance_phase`, not on downstream implement tools.
62
+ - Phase state could become inconsistent when skipping `advance_phase` between discover and specify.
63
+ - Stale `gate_decision` survived artifact rewrites.
64
+ - Multi-feature silent fallback to the wrong feature directory.
65
+ - Cognitive-debt timing improved via start-before-write phase recording on write tools.
66
+ - Audited public documentation and website assets (carried from unreleased work).
67
+ - Aligned container security claims with the workflow (SBOM always; Cosign optional).
68
+
10
69
  ## [3.9.0] - 2026-07-09
11
70
 
12
71
  Cursor-native hook automation, six dedicated phase skills, full `specky doctor` install parity across harnesses, and cross-target instruction isolation fixes.
package/README.md CHANGED
@@ -32,7 +32,7 @@
32
32
 
33
33
  <p>
34
34
  <a href="https://getspecky.ai">Website</a> ·
35
- <a href="GETTING-STARTED.md">Getting Started</a> ·
35
+ <a href="docs/GETTING-STARTED.md">Getting Started</a> ·
36
36
  <a href="https://www.npmjs.com/package/specky-sdd">npm</a> ·
37
37
  <a href="SECURITY.md">Security</a>
38
38
  </p>
@@ -45,7 +45,7 @@
45
45
  | **Start** | [What is Specky?](#what-is-specky) | Overview and ecosystem |
46
46
  | | [What's Included](#whats-included) | Agents, prompts, skills, hooks, and MCP tools |
47
47
  | | [Why Specifications Matter](#why-specifications-matter-in-the-ai-era) | Vibe coding vs deterministic development |
48
- | | [Getting Started](GETTING-STARTED.md) | Complete educational guide |
48
+ | | [Getting Started](docs/GETTING-STARTED.md) | Complete educational guide |
49
49
  | **Use** | [Quick Start](#quick-start) | Install via npm CLI |
50
50
  | | [Where Specifications Live](#where-specifications-live) | File structure and naming conventions |
51
51
  | | [Input Methods](#input-methods-6-ways-to-start) | 6 ways to feed Specky |
@@ -57,7 +57,7 @@
57
57
  | **Enterprise** | [Compliance Frameworks](#compliance-frameworks) | HIPAA, SOC2, GDPR, PCI-DSS, ISO 27001 |
58
58
  | | [Enterprise Ready](#enterprise-ready) | Security, audit trail, quality gates |
59
59
  | **Platform** | [The SDD Platform](#the-spec-driven-development-platform) | Built on Spec-Kit, everything included |
60
- | | [Roadmap](#roadmap) | v3.7 current, v3.8+ planned |
60
+ | | [Roadmap](#roadmap) | v3.10 current, v3.11+ planned |
61
61
 
62
62
  ## What is Specky?
63
63
 
@@ -169,7 +169,7 @@ Specky adds a **deterministic engine** between your intent and your code:
169
169
  - **Cross-Artifact Analysis**: Automatic alignment checking between spec, design, and tasks. Orphaned requirements are flagged instantly.
170
170
  - **MCP-to-MCP Architecture**: Specky outputs structured JSON that your AI client routes to GitHub, Azure DevOps, Jira, Terraform, Figma, and Docker MCP servers. No vendor lock-in.
171
171
 
172
- > **The AI is the operator; Specky is the engine.** The AI's creativity is channeled through a validated pipeline instead of producing unstructured guesswork. For a complete educational walkthrough, see [GETTING-STARTED.md](GETTING-STARTED.md).
172
+ > **The AI is the operator; Specky is the engine.** The AI's creativity is channeled through a validated pipeline instead of producing unstructured guesswork. For a complete educational walkthrough, see [GETTING-STARTED.md](docs/GETTING-STARTED.md).
173
173
 
174
174
  ### What Makes Specky Different
175
175
 
@@ -1218,9 +1218,9 @@ npm run dev
1218
1218
  echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}' | node dist/index.js 2>/dev/null
1219
1219
 
1220
1220
  # Run the published image from GHCR (multi-arch: linux/amd64 + linux/arm64)
1221
- docker pull ghcr.io/paulasilvatech/specky:latest # or pin a release: :3.9.0
1221
+ docker pull ghcr.io/paulasilvatech/specky:latest # or pin a release: :3.10.1
1222
1222
  docker run --rm -p 3200:3200 ghcr.io/paulasilvatech/specky:latest
1223
- curl http://localhost:3200/health # -> {"status":"ok","version":"3.9.0"}
1223
+ curl http://localhost:3200/health # -> {"status":"ok","version":"3.10.1"}
1224
1224
 
1225
1225
  # Or build and run locally from source
1226
1226
  docker build -t specky-sdd:dev .
@@ -1235,7 +1235,7 @@ deployments (enterprise profile, token auth, TLS proxy, private packages) see
1235
1235
 
1236
1236
  ## Roadmap
1237
1237
 
1238
- ### v3.7 (current)
1238
+ ### v3.10 (current)
1239
1239
 
1240
1240
  | Capability | Status |
1241
1241
  |------------|--------|
@@ -1262,7 +1262,7 @@ deployments (enterprise profile, token auth, TLS proxy, private packages) see
1262
1262
  | 6 input types (transcript, PDF, DOCX, Figma, codebase, raw text) | Stable |
1263
1263
  | Test generation for 6 frameworks (vitest, jest, playwright, pytest, junit, xunit) | Stable |
1264
1264
  | MCP-to-MCP routing (GitHub, Azure DevOps, Jira, Terraform, Figma, Docker) | Stable |
1265
- | SBOM + cosign signing on Docker image | Stable |
1265
+ | CycloneDX SBOM artifact + optional Cosign signing on Docker image | Stable |
1266
1266
  | JSONL audit logger (optional) | Stable |
1267
1267
  | RBAC foundation (opt-in role-based access control) | Stable |
1268
1268
  | Rate limiting for HTTP transport (opt-in) | Stable |
@@ -1270,9 +1270,14 @@ deployments (enterprise profile, token auth, TLS proxy, private packages) see
1270
1270
  | Enterprise profile (`profile: enterprise` — audit/RBAC/rate-limit defaults ON, opt-in) | Stable |
1271
1271
  | Identity-based RBAC over HTTP (`SDD_HTTP_TOKENS_FILE`: token → principal + role) | Stable |
1272
1272
  | Tamper-evident audit trail (HMAC-signed entries, fail-closed mode, `sdd_verify_audit`) | Stable |
1273
- | Server-enforced LGTM gates (opt-in `pipeline.require_lgtm`) | Stable |
1273
+ | Server-enforced analysis gate on implement tools | Stable |
1274
+ | Strict phase bookkeeping (`ensurePhasesThrough`) | Stable |
1275
+ | Stale gate invalidation on artifact rewrite | Stable |
1276
+ | Strict multi-feature resolution | Stable |
1277
+ | OpenCode two-step bootstrap (`install` + `compile`) | Stable |
1278
+ | VS Code MCP dual schema (`servers` + `mcpServers`) | Stable |
1274
1279
 
1275
- ### v3.8+ (planned)
1280
+ ### v3.11+ (planned)
1276
1281
 
1277
1282
  | Feature | Description |
1278
1283
  |---------|-------------|
@@ -1295,13 +1300,15 @@ drop-in GitHub Action that verifies EARS + the quality gate on every PR.
1295
1300
 
1296
1301
  ## Contributing
1297
1302
 
1298
- See [CONTRIBUTING.md](CONTRIBUTING.md) for architecture details and how to add tools, templates, or services.
1303
+ See [CONTRIBUTING.md](docs/CONTRIBUTING.md) for architecture details and how to add tools, templates, or services.
1299
1304
 
1300
1305
  ## Links
1301
1306
 
1307
+ - [docs/README.md](docs/README.md): Documentation index
1308
+ - [docs/GETTING-STARTED.md](docs/GETTING-STARTED.md): Complete educational guide
1302
1309
  - [CHANGELOG.md](CHANGELOG.md): Version history and release notes
1303
1310
  - [SECURITY.md](SECURITY.md): Vulnerability disclosure policy and OWASP Top 10 coverage
1304
- - [CONTRIBUTING.md](CONTRIBUTING.md): How to add tools, templates, or services
1311
+ - [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md): How to add tools, templates, or services
1305
1312
  - [Spec-Kit](https://github.com/paulasilvatech/spec-kit): The SDD methodology foundation
1306
1313
  - [npm package](https://www.npmjs.com/package/specky-sdd): `specky-sdd` on npm
1307
1314
 
package/apm.lock.yaml CHANGED
@@ -2,7 +2,7 @@
2
2
  schemaVersion: 1
3
3
  package:
4
4
  name: specky-sdd
5
- version: 3.9.0
5
+ version: 3.10.1
6
6
  primitives:
7
7
  .apm/agents/specky-design-architect.agent.md: sha256:a9411a98bd2fe4c4aa1e6eab66e84eaf9a010897d408e1737a279fe58f7023b2
8
8
  .apm/agents/specky-implementer.agent.md: sha256:76c546fe70fe3f5399ba25f0e6de3d9b280880fe7c12d88f093cee55c0b02ece
@@ -37,7 +37,8 @@ primitives:
37
37
  .apm/hooks/specky-run.sh: sha256:0cb829414419cc05d5a592df130630045ef94d319f292815203b378b571bd721
38
38
  .apm/instructions/claude-instructions.instructions.md: sha256:9b3b77bb220950b3d087b0d5b5999bc60aa4a6d7a07b87fff914e4c1aa872982
39
39
  .apm/instructions/copilot-instructions.instructions.md: sha256:9acf227bde8f64f18b15c174171fa148f6d08dec48f163ad4524da77b4a0c93c
40
- .apm/instructions/cursor-instructions.instructions.md: sha256:f78a40113030173b91f36723a0b1f86ae5fdf93c19550d3cc0f0520b8f78f4e2
40
+ .apm/instructions/cursor-instructions.instructions.md: sha256:ee58c87b29de0c58f373834ebee31c469943821f655153febec6bd1f6c649051
41
+ .apm/instructions/opencode-instructions.instructions.md: sha256:a93d80cef598d99ea4d5116aa64c1e5c8c392316dea31b0448975677a9aac450
41
42
  .apm/prompts/specky-api.prompt.md: sha256:4a13ba39ba58773cbb0bf39c12e462a80d2348aa5fdc4ce612f924658f00c7ed
42
43
  .apm/prompts/specky-brownfield.prompt.md: sha256:0f66839cc82434fead66a7dd5e26934f385afc95a3537b414471f3603b31b4ec
43
44
  .apm/prompts/specky-check-drift.prompt.md: sha256:f3a04b00ef10167cbd1cdcf63f8b8595d3bc8196d107b48963f8b123f711f3af
@@ -72,9 +73,9 @@ primitives:
72
73
  .apm/skills/specky-sdd-markdown-standard/SKILL.md: sha256:ca74b956fa30cc40f2223e6692797f3d7048ddf5b3e082835476fa3e0de1af66
73
74
  .apm/skills/specky-sdd-pipeline/references/ears-notation.md: sha256:580dc051802750904ef409b9f89873ad250326bc17c992bd53366b3b1a04f1c5
74
75
  .apm/skills/specky-sdd-pipeline/references/model-routing.md: sha256:6ca9bd5cde2a8d227c795d37c4d43b712dd183c10d5d87b987514b494f7c28f3
75
- .apm/skills/specky-sdd-pipeline/SKILL.md: sha256:1d3eeeb14120ee9a4f8424f4ac013d3a74f4be249891203960195578a8b0309f
76
+ .apm/skills/specky-sdd-pipeline/SKILL.md: sha256:a056e76afcc13964ace69f5fdca001d02870c83e171286b0763919048bbd1027
76
77
  .apm/skills/specky-spec-engineer/SKILL.md: sha256:b5722dacc513a69b54a2d474e1dfa4a25029c5f6f2a930fae3b0ed8f3c9eb49e
77
78
  .apm/skills/specky-task-planner/SKILL.md: sha256:bf391eaa0541ae507f99eacd18a8747b597bcde4ff84d9a389fdc4aad5e76ed7
78
79
  .apm/skills/specky-test-verifier/SKILL.md: sha256:7e663a68f597f409a7209e07830b90b467052583bde8557eed389848baaa8609
79
80
  apm-policy.yml: sha256:421910c17b1a7431f1336d8374538c111245c0c1de58adc6d8eddc185010a639
80
- apm.yml: sha256:7b0da15a6684b1494d2061ed1c648fdbf1347131e6e63c5812081092378bbc17
81
+ apm.yml: sha256:faaad94df10783caf1226b684caac659685a418e70e3f4172610bdbfc89cdb5e
package/apm.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  name: specky-sdd
2
- version: 3.9.0
2
+ version: 3.10.1
3
3
  description: "Agentic Spec-Driven Development — 10-phase pipeline with 58 MCP tools, 13 agents, 22 prompts, 14 skills, 16 hooks, EARS notation, model routing, and enterprise security"
4
4
  author: Paula Silva
5
5
  license: MIT
package/config.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  audit_enabled: true
2
- version: "3.9.0"
2
+ version: "3.10.1"
3
3
  pipeline:
4
4
  phases: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
5
5
  phase_names:
@@ -1 +1 @@
1
- {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/compile.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,cAAc;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAyFD,wBAAsB,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAsCtE"}
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/compile.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,cAAc;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AA0FD,wBAAsB,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAsCtE"}
@@ -45,8 +45,9 @@ function instructionFileForTarget(target) {
45
45
  case "claude":
46
46
  return "claude-instructions.instructions.md";
47
47
  case "cursor":
48
- case "opencode":
49
48
  return "cursor-instructions.instructions.md";
49
+ case "opencode":
50
+ return "opencode-instructions.instructions.md";
50
51
  default:
51
52
  return "copilot-instructions.instructions.md";
52
53
  }
@@ -1 +1 @@
1
- {"version":3,"file":"compile.js","sourceRoot":"","sources":["../../../src/cli/commands/compile.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../../../src/cli/commands/compile.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAwXD,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAkEpE"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAwdD,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAkEpE"}
@@ -149,12 +149,14 @@ function checkCursorRule(targets) {
149
149
  const ruleLines = text.trimEnd().split(/\r?\n/);
150
150
  const hasDescription = ruleLines.some((line) => line.startsWith("description:") && line.trim() !== "description:");
151
151
  const hasAlwaysApply = ruleLines.some((line) => line.trim() === "alwaysApply: true");
152
- const lines = ruleLines.length;
153
- const ok = hasDescription && hasAlwaysApply && lines <= 40;
152
+ const hasSpeckyTitle = text.includes("Specky SDD");
153
+ const noWorkspaceLeak = !text.includes("@workspace");
154
+ const ok = hasDescription && hasAlwaysApply && hasSpeckyTitle && noWorkspaceLeak;
154
155
  const details = [
155
156
  hasDescription ? "description" : "missing description",
156
157
  hasAlwaysApply ? "alwaysApply" : "missing alwaysApply",
157
- `${lines} lines`,
158
+ hasSpeckyTitle ? "specky-sdd" : "missing title",
159
+ noWorkspaceLeak ? "no @workspace" : "has @workspace leak",
158
160
  ];
159
161
  return { name: "Cursor rule", pass: ok, detail: details.join(", ") };
160
162
  }
@@ -173,6 +175,78 @@ function checkNoCopilotLeak(root, workspace, label) {
173
175
  detail: hits.length === 0 ? "no Copilot/.vscode tokens" : hits.slice(0, 3).join(", "),
174
176
  };
175
177
  }
178
+ function checkCopilotHooksManifest(targets) {
179
+ const manifest = readJsonSafe(targets.copilot.hooksManifest);
180
+ if (!manifest) {
181
+ return { name: "Copilot hooks manifest", pass: false, detail: "sdd-hooks.json missing" };
182
+ }
183
+ const serialized = JSON.stringify(manifest);
184
+ const hasSddMatcher = serialized.includes("sdd_");
185
+ return {
186
+ name: "Copilot hooks manifest",
187
+ pass: hasSddMatcher,
188
+ detail: hasSddMatcher ? "sdd-hooks.json with sdd_* matchers" : "no sdd_* matchers in manifest",
189
+ };
190
+ }
191
+ function checkClaudeHooksInSettings(targets, installTargets) {
192
+ if (installTargets.includes("copilot")) {
193
+ return {
194
+ name: "Claude hooks in settings",
195
+ pass: true,
196
+ detail: "intentionally omitted (Copilot co-install strips .claude hooks)",
197
+ };
198
+ }
199
+ const settings = readJsonSafe(targets.claude.settingsJson);
200
+ if (!settings?.hooks) {
201
+ return { name: "Claude hooks in settings", pass: false, detail: "no hooks key in .claude/settings.json" };
202
+ }
203
+ const serialized = JSON.stringify(settings.hooks);
204
+ const hasSpecky = serialized.includes("specky");
205
+ const hasLifecycle = serialized.includes("PreToolUse") || serialized.includes("preToolUse");
206
+ return {
207
+ name: "Claude hooks in settings",
208
+ pass: hasSpecky && hasLifecycle,
209
+ detail: hasSpecky && hasLifecycle ? "Specky hooks registered" : "Specky hooks missing from settings",
210
+ };
211
+ }
212
+ function checkAgentsMd(workspace) {
213
+ const path = resolve(workspace, "AGENTS.md");
214
+ if (!existsSync(path)) {
215
+ return {
216
+ name: "AGENTS.md context",
217
+ pass: true,
218
+ detail: "recommended: run specky compile --target=opencode",
219
+ };
220
+ }
221
+ const text = readFileSync(path, "utf8");
222
+ const ok = text.includes("Specky SDD");
223
+ return {
224
+ name: "AGENTS.md context",
225
+ pass: ok,
226
+ detail: ok ? "contains Specky SDD guidance" : "missing Specky SDD section",
227
+ };
228
+ }
229
+ function detectWorkspaceHarnessTargets(workspace) {
230
+ const found = [];
231
+ if (existsSync(resolve(workspace, ".cursor/mcp.json")) || existsSync(resolve(workspace, ".cursor/rules"))) {
232
+ found.push("cursor");
233
+ }
234
+ if (existsSync(resolve(workspace, "opencode.json"))) {
235
+ found.push("opencode");
236
+ }
237
+ if (existsSync(resolve(workspace, ".agents/skills"))) {
238
+ const skills = readdirSync(resolve(workspace, ".agents/skills"));
239
+ if (skills.some((name) => name.startsWith("specky-"))) {
240
+ found.push("agent-skills");
241
+ }
242
+ }
243
+ const detected = detectIde(workspace);
244
+ if (detected.claudeCode)
245
+ found.push("claude");
246
+ if (detected.copilot)
247
+ found.push("copilot");
248
+ return [...new Set(found)];
249
+ }
176
250
  function checkCursorHooksManifest(targets) {
177
251
  const manifest = readJsonSafe(targets.cursor.hooksManifest);
178
252
  if (!manifest) {
@@ -207,9 +281,10 @@ function checkCopilotInstall(targets, workspace) {
207
281
  checkFileCount(targets.copilot.skills, 14, "Copilot skills", (name, path) => name.startsWith("specky-") && statSync(path).isDirectory()),
208
282
  checkFileExists(resolve(targets.copilot.instructions, "copilot-instructions.instructions.md"), "Copilot instruction"),
209
283
  checkFileCount(targets.copilot.hooksScripts, 16, "Copilot hook scripts", (name) => name.endsWith(".sh") || name.endsWith(".mjs")),
284
+ checkCopilotHooksManifest(targets),
210
285
  ];
211
286
  }
212
- function checkClaudeInstall(targets, workspace) {
287
+ function checkClaudeInstall(targets, workspace, installTargets) {
213
288
  return [
214
289
  checkMcpRegistration(targets.shared.claudeMcp, ".mcp.json"),
215
290
  checkClaudePermissions(targets),
@@ -219,6 +294,7 @@ function checkClaudeInstall(targets, workspace) {
219
294
  checkFileExists(resolve(targets.claude.rules, "specky-sdd.md"), "Claude rule"),
220
295
  checkNoCopilotLeak(targets.claude.root, workspace, "Claude leakage"),
221
296
  checkFileCount(targets.claude.hooksScripts, 16, "Claude hook scripts", (name) => name.endsWith(".sh") || name.endsWith(".mjs")),
297
+ checkClaudeHooksInSettings(targets, installTargets),
222
298
  ];
223
299
  }
224
300
  function checkOpenCodeInstall(targets, workspace) {
@@ -228,6 +304,7 @@ function checkOpenCodeInstall(targets, workspace) {
228
304
  checkFileCount(targets.opencode.commands, 22, "OpenCode commands", (name) => name.startsWith("specky-") && name.endsWith(".md")),
229
305
  checkFileCount(targets.shared.agentSkills, 14, "OpenCode skills", (name, path) => name.startsWith("specky-") && statSync(path).isDirectory()),
230
306
  checkNoCopilotLeak(targets.opencode.root, workspace, "OpenCode leakage"),
307
+ checkAgentsMd(workspace),
231
308
  ];
232
309
  }
233
310
  function loadInstallMeta(path) {
@@ -256,23 +333,24 @@ function resolveInstalledTargets(installMeta, workspace) {
256
333
  };
257
334
  }
258
335
  const detected = detectIde(workspace);
259
- if (detected.signals.length > 0) {
336
+ const harnessTargets = detectWorkspaceHarnessTargets(workspace);
337
+ if (harnessTargets.length > 0) {
260
338
  return {
261
- targets: targetsFromIde(detected.recommendation),
339
+ targets: harnessTargets,
262
340
  source: "workspace-signals",
263
- detail: `inferred from workspace signals: ${detected.signals.join(", ")}`,
341
+ detail: `inferred from workspace signals: ${detected.signals.join(", ") || harnessTargets.join(", ")}`,
264
342
  };
265
343
  }
266
344
  return {
267
- targets: ["claude", "copilot"],
345
+ targets: [],
268
346
  source: "default",
269
- detail: "no install metadata or IDE signals found; validating shared defaults only",
347
+ detail: "no install metadata or IDE signals found; run specky install --target=<harness>",
270
348
  };
271
349
  }
272
350
  function runConfigChecks(targets, workspace, installTargets) {
273
351
  const checks = [];
274
352
  if (installTargets.includes("claude")) {
275
- checks.push(...checkClaudeInstall(targets, workspace));
353
+ checks.push(...checkClaudeInstall(targets, workspace, installTargets));
276
354
  }
277
355
  if (installTargets.includes("copilot")) {
278
356
  checks.push(...checkCopilotInstall(targets, workspace));
@@ -283,6 +361,9 @@ function runConfigChecks(targets, workspace, installTargets) {
283
361
  if (installTargets.includes("opencode")) {
284
362
  checks.push(...checkOpenCodeInstall(targets, workspace));
285
363
  }
364
+ if (installTargets.includes("agent-skills")) {
365
+ checks.push(checkFileCount(targets.shared.agentSkills, 14, "Agent skills bundle", (name, path) => name.startsWith("specky-") && statSync(path).isDirectory()));
366
+ }
286
367
  return checks;
287
368
  }
288
369
  function printIntegrity(report, verbose) {