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.
- package/.apm/instructions/cursor-instructions.instructions.md +59 -10
- package/.apm/instructions/opencode-instructions.instructions.md +45 -0
- package/.apm/skills/specky-sdd-pipeline/SKILL.md +8 -0
- package/CHANGELOG.md +59 -0
- package/README.md +19 -12
- package/apm.lock.yaml +5 -4
- package/apm.yml +1 -1
- package/config.yml +1 -1
- package/dist/cli/commands/compile.d.ts.map +1 -1
- package/dist/cli/commands/compile.js +2 -1
- package/dist/cli/commands/compile.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +91 -10
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/lib/apm/lock.js +2 -2
- package/dist/cli/lib/apm/lock.js.map +1 -1
- package/dist/cli/lib/asset-copier.d.ts.map +1 -1
- package/dist/cli/lib/asset-copier.js +2 -2
- package/dist/cli/lib/asset-copier.js.map +1 -1
- package/dist/cli/lib/harness/compilers/claude.d.ts.map +1 -1
- package/dist/cli/lib/harness/compilers/claude.js +2 -2
- package/dist/cli/lib/harness/compilers/claude.js.map +1 -1
- package/dist/cli/lib/harness/compilers/common.d.ts +2 -0
- package/dist/cli/lib/harness/compilers/common.d.ts.map +1 -1
- package/dist/cli/lib/harness/compilers/common.js +6 -0
- package/dist/cli/lib/harness/compilers/common.js.map +1 -1
- package/dist/cli/lib/harness/compilers/cursor.js +2 -2
- package/dist/cli/lib/harness/compilers/cursor.js.map +1 -1
- package/dist/cli/lib/harness/tool-map.js +2 -2
- package/dist/cli/lib/harness/tool-map.js.map +1 -1
- package/dist/cli/lib/mcp-writer.d.ts.map +1 -1
- package/dist/cli/lib/mcp-writer.js +2 -0
- package/dist/cli/lib/mcp-writer.js.map +1 -1
- package/dist/services/diagram-generator.d.ts.map +1 -1
- package/dist/services/diagram-generator.js +9 -3
- package/dist/services/diagram-generator.js.map +1 -1
- package/dist/services/git-manager.d.ts.map +1 -1
- package/dist/services/git-manager.js +10 -8
- package/dist/services/git-manager.js.map +1 -1
- package/dist/services/state-machine.d.ts +22 -1
- package/dist/services/state-machine.d.ts.map +1 -1
- package/dist/services/state-machine.js +108 -5
- package/dist/services/state-machine.js.map +1 -1
- package/dist/services/work-item-exporter.d.ts.map +1 -1
- package/dist/services/work-item-exporter.js +14 -33
- package/dist/services/work-item-exporter.js.map +1 -1
- package/dist/templates/compliance.md +1 -2
- package/dist/templates/specification.md +2 -0
- package/dist/templates/verification.md +1 -2
- package/dist/tools/integration.d.ts.map +1 -1
- package/dist/tools/integration.js +11 -19
- package/dist/tools/integration.js.map +1 -1
- package/dist/tools/pipeline.d.ts.map +1 -1
- package/dist/tools/pipeline.js +119 -68
- package/dist/tools/pipeline.js.map +1 -1
- package/dist/tools/quality.d.ts.map +1 -1
- package/dist/tools/quality.js +22 -15
- package/dist/tools/quality.js.map +1 -1
- package/dist/tools/tool-enforcement.d.ts.map +1 -1
- package/dist/tools/tool-enforcement.js +13 -0
- package/dist/tools/tool-enforcement.js.map +1 -1
- package/dist/tools/transcript.d.ts.map +1 -1
- package/dist/tools/transcript.js +24 -8
- package/dist/tools/transcript.js.map +1 -1
- package/dist/tools/visualization.d.ts.map +1 -1
- package/dist/tools/visualization.js +17 -3
- package/dist/tools/visualization.js.map +1 -1
- package/dist/utils/design-stubs.d.ts +32 -0
- package/dist/utils/design-stubs.d.ts.map +1 -0
- package/dist/utils/design-stubs.js +103 -0
- package/dist/utils/design-stubs.js.map +1 -0
- package/dist/utils/task-parser.d.ts +18 -0
- package/dist/utils/task-parser.d.ts.map +1 -0
- package/dist/utils/task-parser.js +159 -0
- package/dist/utils/task-parser.js.map +1 -0
- package/package.json +1 -1
- package/templates/compliance.md +1 -2
- package/templates/specification.md +2 -0
- package/templates/verification.md +1 -2
|
@@ -2,19 +2,68 @@
|
|
|
2
2
|
applyTo: '**'
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
# Specky SDD
|
|
5
|
+
# Specky SDD — Cursor Instructions
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
|
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
|
-
|
|
60
|
+
## EARS Patterns
|
|
19
61
|
|
|
20
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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 +
|
|
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
|
|
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.
|
|
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.
|
|
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:
|
|
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:
|
|
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:
|
|
81
|
+
apm.yml: sha256:faaad94df10783caf1226b684caac659685a418e70e3f4172610bdbfc89cdb5e
|
package/apm.yml
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
name: specky-sdd
|
|
2
|
-
version: 3.
|
|
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 +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;
|
|
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":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACpG,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAsB,MAAM,yBAAyB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAQ3D,MAAM,cAAc,GAAmD;IACnE,gBAAgB,EAAE,SAAS;IAC3B,MAAM,EAAE,SAAS;IACjB,aAAa,EAAE,QAAQ;IACvB,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;CACb,CAAC;AAEF,SAAS,aAAa,CAAC,OAAwB;IAC3C,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACnC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC;IACzD,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACrD,IAAI,OAAO,KAAK,KAAK;QAAE,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC;IAC9F,IAAI,iBAAiB,CAAC,QAAQ,CAAC,OAAwB,CAAC;QAAE,OAAO,CAAC,OAAwB,CAAC,CAAC;IAC5F,MAAM,IAAI,KAAK,CACX,oCAAoC,KAAK,yBAAyB,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAC9G,CAAC;AACN,CAAC;AAED,SAAS,cAAc,CAAC,MAAe;IACnC,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACrD,OAAO,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACrC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IACjD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC1C,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IAC5B,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;AAC7D,CAAC;AAED,SAAS,wBAAwB,CAAC,MAAqB;IACnD,QAAQ,MAAM,EAAE,CAAC;QACb,KAAK,QAAQ;YACT,OAAO,qCAAqC,CAAC;QACjD,KAAK,QAAQ,CAAC;
|
|
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;
|
|
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
|
|
153
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
336
|
+
const harnessTargets = detectWorkspaceHarnessTargets(workspace);
|
|
337
|
+
if (harnessTargets.length > 0) {
|
|
260
338
|
return {
|
|
261
|
-
targets:
|
|
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: [
|
|
345
|
+
targets: [],
|
|
268
346
|
source: "default",
|
|
269
|
-
detail: "no install metadata or IDE signals found;
|
|
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) {
|