specky-sdd 3.10.2 → 3.11.0
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/agents/specky-design-architect.agent.md +1 -1
- package/.apm/agents/specky-implementer.agent.md +2 -2
- package/.apm/agents/specky-onboarding.agent.md +2 -2
- package/.apm/agents/specky-orchestrator.agent.md +2 -2
- package/.apm/agents/specky-quality-reviewer.agent.md +1 -1
- package/.apm/agents/specky-release-engineer.agent.md +6 -5
- package/.apm/agents/specky-requirements-engineer.agent.md +1 -1
- package/.apm/agents/specky-research-analyst.agent.md +1 -1
- package/.apm/agents/specky-sdd-clarify.agent.md +1 -1
- package/.apm/agents/specky-sdd-init.agent.md +2 -2
- package/.apm/agents/specky-spec-engineer.agent.md +1 -1
- package/.apm/agents/specky-task-planner.agent.md +1 -1
- package/.apm/agents/specky-test-verifier.agent.md +7 -6
- package/CHANGELOG.md +15 -0
- package/README.md +5 -5
- package/SECURITY.md +5 -1
- package/apm-policy.yml +2 -0
- package/apm.lock.yaml +16 -16
- package/apm.yml +3 -3
- package/config.yml +4 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +49 -19
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +93 -5
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/index.js +7 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/lib/apm/policy.d.ts +1 -0
- package/dist/cli/lib/apm/policy.d.ts.map +1 -1
- package/dist/cli/lib/apm/policy.js +15 -0
- package/dist/cli/lib/apm/policy.js.map +1 -1
- package/dist/cli/lib/asset-copier.d.ts +1 -0
- package/dist/cli/lib/asset-copier.d.ts.map +1 -1
- package/dist/cli/lib/asset-copier.js +4 -4
- package/dist/cli/lib/asset-copier.js.map +1 -1
- package/dist/cli/lib/harness/compilers/claude.js +3 -3
- package/dist/cli/lib/harness/compilers/claude.js.map +1 -1
- package/dist/cli/lib/harness/compilers/common.d.ts +10 -1
- package/dist/cli/lib/harness/compilers/common.d.ts.map +1 -1
- package/dist/cli/lib/harness/compilers/common.js +71 -8
- package/dist/cli/lib/harness/compilers/common.js.map +1 -1
- package/dist/cli/lib/harness/compilers/copilot.js +3 -3
- package/dist/cli/lib/harness/compilers/copilot.js.map +1 -1
- package/dist/cli/lib/harness/compilers/cursor.js +3 -3
- package/dist/cli/lib/harness/compilers/cursor.js.map +1 -1
- package/dist/cli/lib/harness/compilers/opencode.js +3 -3
- package/dist/cli/lib/harness/compilers/opencode.js.map +1 -1
- package/dist/cli/lib/harness/tool-map.d.ts +8 -1
- package/dist/cli/lib/harness/tool-map.d.ts.map +1 -1
- package/dist/cli/lib/harness/tool-map.js +74 -0
- package/dist/cli/lib/harness/tool-map.js.map +1 -1
- package/dist/cli/lib/harness/types.d.ts +11 -1
- package/dist/cli/lib/harness/types.d.ts.map +1 -1
- package/dist/cli/lib/mcp-writer.d.ts +2 -1
- package/dist/cli/lib/mcp-writer.d.ts.map +1 -1
- package/dist/cli/lib/mcp-writer.js +13 -5
- package/dist/cli/lib/mcp-writer.js.map +1 -1
- package/dist/cli/lib/settings-merger.d.ts +15 -0
- package/dist/cli/lib/settings-merger.d.ts.map +1 -1
- package/dist/cli/lib/settings-merger.js +66 -1
- package/dist/cli/lib/settings-merger.js.map +1 -1
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +12 -4
- package/dist/config.js.map +1 -1
- package/package.json +10 -1
|
@@ -3,7 +3,7 @@ name: specky-design-architect
|
|
|
3
3
|
description: Phase 4 agent that writes DESIGN.md with system architecture, API contracts, data models, and Mermaid diagrams. All design decisions trace to specification requirements.
|
|
4
4
|
|
|
5
5
|
color: blue
|
|
6
|
-
|
|
6
|
+
capabilities: ["workspace.read", "mcp.specky.sdd_write_design", "mcp.specky.sdd_generate_all_diagrams", "mcp.specky.sdd_generate_diagram"]
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
<example>
|
|
@@ -3,7 +3,7 @@ name: specky-implementer
|
|
|
3
3
|
description: Use this agent to generate implementation plans, quality checklists, test stubs, and infrastructure scaffolding from specifications.
|
|
4
4
|
|
|
5
5
|
color: blue
|
|
6
|
-
|
|
6
|
+
capabilities: ["workspace.read", "workspace.command.git", "mcp.specky.sdd_implement", "mcp.specky.sdd_checklist", "mcp.specky.sdd_generate_tests", "mcp.specky.sdd_generate_pbt", "mcp.specky.sdd_generate_iac", "mcp.specky.sdd_generate_dockerfile", "mcp.specky.sdd_generate_devcontainer", "mcp.specky.sdd_setup_local_env", "mcp.specky.sdd_setup_codespaces", "mcp.github.create_or_update_file"]
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
<example>
|
|
@@ -30,7 +30,7 @@ You are a senior implementation engineer. You bridge the gap between specificati
|
|
|
30
30
|
|
|
31
31
|
**Workflow:**
|
|
32
32
|
1. Read the `specky-implementer` SKILL.md for implementation patterns and tool reference
|
|
33
|
-
2.
|
|
33
|
+
2. Use Git to verify you are on the correct `spec/NNN-*` branch (not develop/stage/main)
|
|
34
34
|
3. Verify TASKS.md and DESIGN.md exist for the feature
|
|
35
35
|
4. Call sdd_implement — ordered plan (Foundation → Core → Integration → Polish)
|
|
36
36
|
5. Call sdd_checklist for security + testing + relevant NFR domains
|
|
@@ -3,7 +3,7 @@ name: specky-onboarding
|
|
|
3
3
|
description: Default entry point and interactive wizard for Specky SDD. Detects project context, explains the plugin, guides through project type selection, work mode, and branch setup. Triggered when user says "specky" without specifics.
|
|
4
4
|
|
|
5
5
|
color: green
|
|
6
|
-
|
|
6
|
+
capabilities: ["workspace.read", "workspace.command.git", "mcp.specky.sdd_get_status", "mcp.specky.sdd_scan_codebase", "mcp.specky.sdd_check_ecosystem", "mcp.specky.sdd_context_status", "mcp.specky.sdd_auto_pipeline", "mcp.specky.sdd_batch_import", "mcp.specky.sdd_create_branch", "mcp.specky.sdd_discover", "mcp.specky.sdd_figma_to_spec", "mcp.specky.sdd_import_document", "mcp.specky.sdd_import_transcript"]
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
<example>
|
|
@@ -55,7 +55,7 @@ You are the Specky SDD onboarding wizard. You are the **default entry point** wh
|
|
|
55
55
|
- **Direct MCP tools** → Show tool reference by category, user calls directly
|
|
56
56
|
|
|
57
57
|
**Step 5 — Branch Setup:**
|
|
58
|
-
- Auto-create `spec/NNN-feature` from develop → call sdd_create_branch
|
|
58
|
+
- Auto-create `spec/NNN-feature` from develop → call sdd_create_branch, then execute its returned Git command after user confirmation
|
|
59
59
|
- Manual → show git commands
|
|
60
60
|
- Skip → proceed without branching
|
|
61
61
|
|
|
@@ -3,7 +3,7 @@ name: specky-orchestrator
|
|
|
3
3
|
description: Master agent that coordinates the full SDD 10-phase pipeline end-to-end, routing to phase agents, validating artifacts between phases, and enforcing hooks and LGTM gates.
|
|
4
4
|
|
|
5
5
|
color: purple
|
|
6
|
-
|
|
6
|
+
capabilities: ["workspace.read", "workspace.command.git", "agent.delegate", "mcp.specky.sdd_get_status", "mcp.specky.sdd_checkpoint", "mcp.specky.sdd_advance_phase", "mcp.specky.sdd_validate_ears", "mcp.specky.sdd_model_routing", "mcp.specky.sdd_context_status"]
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
<example>
|
|
@@ -30,7 +30,7 @@ You are the Specky SDD pipeline orchestrator. You coordinate the full 10-phase p
|
|
|
30
30
|
|
|
31
31
|
**Workflow:**
|
|
32
32
|
1. Call sdd_get_status → determine current phase and feature
|
|
33
|
-
2.
|
|
33
|
+
2. Use Git to validate that the branch matches phase expectations:
|
|
34
34
|
- Phases 0-7: must be on `spec/NNN-*` branch
|
|
35
35
|
- Phase 8: must be on `develop` branch
|
|
36
36
|
- Phase 9: must be on `stage` branch
|
|
@@ -3,7 +3,7 @@ name: specky-quality-reviewer
|
|
|
3
3
|
description: Phase 6 agent that runs completeness audit, cross-analysis, and compliance checks. Produces ANALYSIS.md with gate decision (APPROVE/CONDITIONAL/REJECT) and COMPLIANCE.md.
|
|
4
4
|
|
|
5
5
|
color: red
|
|
6
|
-
|
|
6
|
+
capabilities: ["workspace.read", "mcp.specky.sdd_run_analysis", "mcp.specky.sdd_cross_analyze", "mcp.specky.sdd_compliance_check", "mcp.specky.sdd_check_sync", "mcp.specky.sdd_metrics"]
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
<example>
|
|
@@ -3,7 +3,7 @@ name: specky-release-engineer
|
|
|
3
3
|
description: Use this agent to prepare features for release — run blocking gates, generate documentation, create PR, and export work items.
|
|
4
4
|
|
|
5
5
|
color: green
|
|
6
|
-
|
|
6
|
+
capabilities: ["workspace.read", "workspace.command.git", "workspace.command.release-gates", "mcp.specky.sdd_create_pr", "mcp.specky.sdd_generate_all_docs", "mcp.specky.sdd_generate_docs", "mcp.specky.sdd_generate_api_docs", "mcp.specky.sdd_generate_runbook", "mcp.specky.sdd_generate_onboarding", "mcp.specky.sdd_export_work_items", "mcp.github.create_pull_request", "mcp.github.create_issue"]
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
<example>
|
|
@@ -28,7 +28,7 @@ You are a senior release engineer. You prepare features for delivery.
|
|
|
28
28
|
|
|
29
29
|
**Workflow:**
|
|
30
30
|
1. Read the `specky-release-engineer` SKILL.md for gate criteria and PR templates
|
|
31
|
-
2.
|
|
31
|
+
2. Use Git to verify work is on the correct branch for the merge target:
|
|
32
32
|
- `spec/NNN-*` → PR targets `develop`
|
|
33
33
|
- `develop` → PR targets `stage`
|
|
34
34
|
- `stage` → PR targets `main`
|
|
@@ -38,9 +38,10 @@ You are a senior release engineer. You prepare features for delivery.
|
|
|
38
38
|
- specky-release-gate.sh (BLOCKING: exit 2 = cannot release)
|
|
39
39
|
5. If either fails: explain what failed, suggest fix. Do NOT proceed.
|
|
40
40
|
6. Call sdd_generate_all_docs — parallel documentation generation
|
|
41
|
-
7. Call sdd_create_pr — PR payload with spec summary and correct target branch
|
|
42
|
-
8.
|
|
43
|
-
9.
|
|
41
|
+
7. Call sdd_create_pr — generate the PR payload with spec summary and correct target branch
|
|
42
|
+
8. Call GitHub MCP `create_pull_request` with the generated payload. If GitHub MCP is not configured or authenticated, present the payload and stop before claiming a PR was created.
|
|
43
|
+
9. Optionally call sdd_export_work_items, then call GitHub MCP `create_issue` for each exported GitHub work item. Do not route to unconfigured external trackers.
|
|
44
|
+
10. Deliver release summary with branch, target, and merge instructions
|
|
44
45
|
|
|
45
46
|
**Branching rules:**
|
|
46
47
|
- `spec/NNN-feature-name` → `develop` (after Phase 8 verification passes)
|
|
@@ -3,7 +3,7 @@ name: specky-requirements-engineer
|
|
|
3
3
|
description: Use this agent to analyze raw input and produce validated FRD and NFRD documents ready for sdd_init.
|
|
4
4
|
|
|
5
5
|
color: magenta
|
|
6
|
-
|
|
6
|
+
capabilities: ["workspace.read", "workspace.edit", "mcp.specky.sdd_init", "mcp.specky.sdd_discover", "mcp.specky.sdd_import_document", "mcp.specky.sdd_import_transcript", "mcp.specky.sdd_batch_import", "mcp.specky.sdd_validate_ears"]
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
<example>
|
|
@@ -3,7 +3,7 @@ name: specky-research-analyst
|
|
|
3
3
|
description: Use this agent to gather technical context before specification. Scans codebases, imports documents, and produces RESEARCH.md.
|
|
4
4
|
|
|
5
5
|
color: cyan
|
|
6
|
-
|
|
6
|
+
capabilities: ["workspace.read", "web.fetch", "mcp.specky.sdd_scan_codebase", "mcp.specky.sdd_discover", "mcp.specky.sdd_research", "mcp.specky.sdd_import_document", "mcp.specky.sdd_import_transcript", "mcp.specky.sdd_check_ecosystem"]
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
<example>
|
|
@@ -3,7 +3,7 @@ name: specky-sdd-clarify
|
|
|
3
3
|
description: Use this agent to find and resolve ambiguities in requirements, validate EARS patterns, and produce a clarification log.
|
|
4
4
|
|
|
5
5
|
color: yellow
|
|
6
|
-
|
|
6
|
+
capabilities: ["workspace.read", "mcp.specky.sdd_clarify", "mcp.specky.sdd_validate_ears", "mcp.specky.sdd_turnkey_spec"]
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
<example>
|
|
@@ -3,7 +3,7 @@ name: specky-sdd-init
|
|
|
3
3
|
description: Use this agent to initialize the SDD pipeline for a new feature. Creates the .specs/ directory structure and CONSTITUTION.md.
|
|
4
4
|
|
|
5
5
|
color: green
|
|
6
|
-
|
|
6
|
+
capabilities: ["workspace.read", "workspace.command.git", "mcp.specky.sdd_init", "mcp.specky.sdd_scan_codebase", "mcp.specky.sdd_create_branch"]
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
<example>
|
|
@@ -31,7 +31,7 @@ You are the SDD pipeline initializer. Your only job is to scaffold the spec pipe
|
|
|
31
31
|
2. Gather feature name, project type (greenfield/brownfield/migration/API), and constraints
|
|
32
32
|
3. Read existing FRD/NFRD from `docs/requirements/` if they exist
|
|
33
33
|
4. Call `sdd_init` to create `.specs/NNN-feature/` with CONSTITUTION.md and .sdd-state.json
|
|
34
|
-
5. Call `sdd_create_branch
|
|
34
|
+
5. Call `sdd_create_branch`, then execute its returned Git command to create `spec/NNN-feature-name` from `develop` for all pipeline work
|
|
35
35
|
6. For brownfield projects, call `sdd_scan_codebase` to detect the tech stack
|
|
36
36
|
7. Present CONSTITUTION.md to the developer for review
|
|
37
37
|
8. Suggest handoff to `@specky-research-analyst`
|
|
@@ -3,7 +3,7 @@ name: specky-spec-engineer
|
|
|
3
3
|
description: Phase 2 agent that writes SPECIFICATION.md using EARS notation. Every requirement gets a unique REQ-ID, one of the 6 EARS patterns, and measurable acceptance criteria.
|
|
4
4
|
|
|
5
5
|
color: magenta
|
|
6
|
-
|
|
6
|
+
capabilities: ["workspace.read", "mcp.specky.sdd_write_spec", "mcp.specky.sdd_turnkey_spec", "mcp.specky.sdd_validate_ears", "mcp.specky.sdd_figma_to_spec"]
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
<example>
|
|
@@ -3,7 +3,7 @@ name: specky-task-planner
|
|
|
3
3
|
description: Phase 5 agent that writes TASKS.md with dependency-resolved task sequences, REQ-ID traceability, complexity estimates, and parallel markers. Also generates CHECKLIST.md.
|
|
4
4
|
|
|
5
5
|
color: orange
|
|
6
|
-
|
|
6
|
+
capabilities: ["workspace.read", "mcp.specky.sdd_write_tasks", "mcp.specky.sdd_checklist"]
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
<example>
|
|
@@ -3,7 +3,7 @@ name: specky-test-verifier
|
|
|
3
3
|
description: Use this agent to verify test coverage, detect phantom completions, and check spec-code drift.
|
|
4
4
|
|
|
5
5
|
color: yellow
|
|
6
|
-
|
|
6
|
+
capabilities: ["workspace.read", "workspace.command.test", "mcp.specky.sdd_verify_tests", "mcp.specky.sdd_verify_tasks", "mcp.specky.sdd_check_sync", "mcp.specky.sdd_validate_ears", "mcp.specky.sdd_get_status"]
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
<example>
|
|
@@ -28,11 +28,12 @@ You are a test verification specialist. You verify that implementation satisfies
|
|
|
28
28
|
|
|
29
29
|
**Workflow:**
|
|
30
30
|
1. Read the `specky-test-verifier` SKILL.md for verification criteria and gate thresholds
|
|
31
|
-
2.
|
|
32
|
-
3. Call
|
|
33
|
-
4. Call
|
|
34
|
-
5. Call
|
|
35
|
-
6.
|
|
31
|
+
2. Run the detected test command and collect its machine-readable results
|
|
32
|
+
3. Call sdd_verify_tests — parse results, map to REQ-IDs, build coverage report
|
|
33
|
+
4. Call sdd_verify_tasks — detect phantom completions and write VERIFICATION.md
|
|
34
|
+
5. Call sdd_check_sync — detect spec-code drift
|
|
35
|
+
6. Call sdd_validate_ears — re-validate EARS integrity
|
|
36
|
+
7. Present VERIFICATION.md with gate decision
|
|
36
37
|
|
|
37
38
|
**Gate criteria (ALL must pass):**
|
|
38
39
|
- Test pass rate ≥90%
|
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [3.11.0] - 2026-07-13
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Canonical agent `capabilities:` declarations compiled into target-native tool identifiers for Copilot, Claude Code, Cursor, and OpenCode.
|
|
15
|
+
- `--permission-profile=scoped|prompt` installation modes. The scoped Claude profile derives narrow native, command, and MCP allow rules from installed agent capabilities.
|
|
16
|
+
- Optional GitHub MCP registration with `--integration=github`, including target-aware diagnostics in `specky doctor`.
|
|
17
|
+
- [Target Capabilities](docs/TARGET-CAPABILITIES.md) reference for target rendering, approval boundaries, and GitHub MCP routing.
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- Initializer, orchestrator, verifier, implementer, and release workflows now declare the Git/test/release capabilities their instructions require.
|
|
22
|
+
- Release workflows distinguish Specky payload generation from authenticated GitHub MCP mutations.
|
|
23
|
+
- APM runtime references are pinned to the package release version rather than `@latest`.
|
|
24
|
+
|
|
10
25
|
## [3.10.2] - 2026-07-13
|
|
11
26
|
|
|
12
27
|
Patch release: Specky logo in VS Code and Cursor MCP / Agent Plugins UI.
|
package/README.md
CHANGED
|
@@ -101,7 +101,7 @@ specky install --target=copilot # VS Code + GitHub Copilot (recommended)
|
|
|
101
101
|
specky install --target=claude # Claude Code
|
|
102
102
|
specky install --target=cursor # Cursor
|
|
103
103
|
specky install --target=opencode # OpenCode
|
|
104
|
-
specky install --target=agent-skills #
|
|
104
|
+
specky install --target=agent-skills # Skills-only shared .agents/skills bundle
|
|
105
105
|
```
|
|
106
106
|
|
|
107
107
|
> **Important:** Prefer `--target=...`. The legacy `--ide` flag still works for `copilot`, `claude`, `both`, and `auto`, but it is deprecated in favor of APM-style targets. If Copilot is installed in a workspace, Specky strips Claude hooks from `.claude/settings.json` to prevent Copilot cross-read blocks. See [docs/INSTALL.md](docs/INSTALL.md) for details.
|
|
@@ -114,9 +114,9 @@ npm install --save-dev specky-sdd@latest
|
|
|
114
114
|
npx specky install --target=copilot
|
|
115
115
|
```
|
|
116
116
|
|
|
117
|
-
The CLI installs 13 agents, 22 prompts, 14 skills, 16 hooks,
|
|
117
|
+
The CLI installs 13 agents, 22 prompts, 14 skills, 16 hooks, and target-local MCP registration pinned to the installed version. Canonical agent capabilities compile to the selected harness's native tools; they are not inferred from workflow prose. Use `--permission-profile=scoped` (default) for narrow Claude pre-authorization, or `--permission-profile=prompt` to leave every approval with the host. Specky does **not** pre-authorize arbitrary shell, `rm`, network access, or credentials. Add `--integration=github` only when GitHub MCP routing is required. Run `specky doctor` anytime to validate integrity and configuration.
|
|
118
118
|
|
|
119
|
-
Generated assets are platform-native. `specky install --target=copilot` writes GitHub Copilot agents/prompts with VS Code tool names such as `search`, `agent`, and `specky/sdd_get_status`, plus prompt `agent: agent` frontmatter. `specky install --target=claude` writes Claude Code agents/commands with `Read`, `Glob`, `Grep`, `Task`, and `mcp__specky__sdd_get_status`, with Copilot-only prompt metadata removed.
|
|
119
|
+
Generated assets are platform-native. `specky install --target=copilot` writes GitHub Copilot agents/prompts with VS Code tool names such as `search`, `agent`, and `specky/sdd_get_status`, plus prompt `agent: agent` frontmatter. `specky install --target=claude` writes Claude Code agents/commands with `Read`, `Glob`, `Grep`, `Task`, and `mcp__specky__sdd_get_status`, with Copilot-only prompt metadata removed. Cursor and OpenCode receive their own native vocabulary. `agent-skills` is intentionally skills-only. See [Target Capabilities](docs/TARGET-CAPABILITIES.md) for the full capability matrix, GitHub MCP opt-in, and host approval boundaries.
|
|
120
120
|
|
|
121
121
|
Specky also has an APM governance layer for enterprise package control. `apm.yml` declares the package primitives, targets, and MCP runtime; `apm.lock.yaml` pins primitive hashes; `apm-policy.yml` enforces MCP and tool-name policy. Maintainers and CI can run `specky apm validate`, `specky apm policy`, `specky apm verify-lock`, and `specky apm sbom` before publishing or installing. See [Uso do APM pelo Specky](docs/APM-USAGE.md) for the detailed model, including why APM is not a runtime proxy and why users do not need to install the Microsoft APM CLI.
|
|
122
122
|
|
|
@@ -1253,9 +1253,9 @@ npm run dev
|
|
|
1253
1253
|
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
|
|
1254
1254
|
|
|
1255
1255
|
# Run the published image from GHCR (multi-arch: linux/amd64 + linux/arm64)
|
|
1256
|
-
docker pull ghcr.io/paulasilvatech/specky:latest # or pin a release: :3.
|
|
1256
|
+
docker pull ghcr.io/paulasilvatech/specky:latest # or pin a release: :3.11.0
|
|
1257
1257
|
docker run --rm -p 3200:3200 ghcr.io/paulasilvatech/specky:latest
|
|
1258
|
-
curl http://localhost:3200/health # -> {"status":"ok","version":"3.
|
|
1258
|
+
curl http://localhost:3200/health # -> {"status":"ok","version":"3.11.0"}
|
|
1259
1259
|
|
|
1260
1260
|
# Or build and run locally from source
|
|
1261
1261
|
docker build -t specky-sdd:dev .
|
package/SECURITY.md
CHANGED
|
@@ -46,6 +46,10 @@ AI Client → JSON-RPC → Zod .strict() validation → Service layer
|
|
|
46
46
|
|
|
47
47
|
Specky does **not** use `eval()`, `Function()`, `vm.runInNewContext()`, or any dynamic code execution. Template rendering uses string replacement only — no template engines that execute code.
|
|
48
48
|
|
|
49
|
+
### Agent Capability Boundaries
|
|
50
|
+
|
|
51
|
+
The Specky MCP server does not execute arbitrary shell commands or persist GitHub credentials. Generated agents may declare narrowly scoped Git, test, or release-gate capabilities, but the selected host runtime executes and approves those native tools. The optional GitHub MCP integration is registered only with `specky install --integration=github`; GitHub authentication and repository authorization remain with the signed-in host identity. See [Target Capabilities](docs/TARGET-CAPABILITIES.md).
|
|
52
|
+
|
|
49
53
|
### Network Calls
|
|
50
54
|
|
|
51
55
|
The **MCP server makes zero outbound network calls**. All data stays on the user's machine. It communicates only via stdio (JSON-RPC over stdin/stdout) or optional HTTP transport on localhost, and this holds unconditionally — `specky serve` never performs the update check described below.
|
|
@@ -127,7 +131,7 @@ The audit trail's plain hash chain detects corruption but not deliberate rewriti
|
|
|
127
131
|
- Zero `any` types in source code — enforced by CI
|
|
128
132
|
- All schemas use `.strict()` — rejects unknown fields
|
|
129
133
|
- `FileManager` is the sole I/O boundary — no direct `fs` calls in tools or other services
|
|
130
|
-
-
|
|
134
|
+
- The Specky MCP server does not execute shell commands; target runtimes may execute only the explicitly declared, host-approved agent capabilities
|
|
131
135
|
|
|
132
136
|
## Security Best Practices for Users
|
|
133
137
|
|
package/apm-policy.yml
CHANGED
package/apm.lock.yaml
CHANGED
|
@@ -2,21 +2,21 @@
|
|
|
2
2
|
schemaVersion: 1
|
|
3
3
|
package:
|
|
4
4
|
name: specky-sdd
|
|
5
|
-
version: 3.
|
|
5
|
+
version: 3.11.0
|
|
6
6
|
primitives:
|
|
7
|
-
.apm/agents/specky-design-architect.agent.md: sha256:
|
|
8
|
-
.apm/agents/specky-implementer.agent.md: sha256:
|
|
9
|
-
.apm/agents/specky-onboarding.agent.md: sha256:
|
|
10
|
-
.apm/agents/specky-orchestrator.agent.md: sha256:
|
|
11
|
-
.apm/agents/specky-quality-reviewer.agent.md: sha256:
|
|
12
|
-
.apm/agents/specky-release-engineer.agent.md: sha256:
|
|
13
|
-
.apm/agents/specky-requirements-engineer.agent.md: sha256:
|
|
14
|
-
.apm/agents/specky-research-analyst.agent.md: sha256:
|
|
15
|
-
.apm/agents/specky-sdd-clarify.agent.md: sha256:
|
|
16
|
-
.apm/agents/specky-sdd-init.agent.md: sha256:
|
|
17
|
-
.apm/agents/specky-spec-engineer.agent.md: sha256:
|
|
18
|
-
.apm/agents/specky-task-planner.agent.md: sha256:
|
|
19
|
-
.apm/agents/specky-test-verifier.agent.md: sha256:
|
|
7
|
+
.apm/agents/specky-design-architect.agent.md: sha256:206bb609b3f1547ede880a61f9e4b3a3a9c1df22dc33310fd5af1452dbeaff0f
|
|
8
|
+
.apm/agents/specky-implementer.agent.md: sha256:4768d48f96d6826a06a1a7ead47c0f74a3caa3afc7d0f93e03faa3b6c5ad49df
|
|
9
|
+
.apm/agents/specky-onboarding.agent.md: sha256:eb3e04effaedfece9b74233f0f1e59ceceafe78db2ec940c97d785b318b2e8d2
|
|
10
|
+
.apm/agents/specky-orchestrator.agent.md: sha256:fea1cc4d8498fa762eba4409f44f624a7b256de49d0215bce1c5a4013032f4cb
|
|
11
|
+
.apm/agents/specky-quality-reviewer.agent.md: sha256:bb81e074e4fa8887745e3da341cf11eb8c10978cc4989cd3a2c221798fad2ce0
|
|
12
|
+
.apm/agents/specky-release-engineer.agent.md: sha256:679125e0fe1b2da40ca0142848eecdd0e518eb279a927acdbf006bf7de638df5
|
|
13
|
+
.apm/agents/specky-requirements-engineer.agent.md: sha256:9393480399ced54dd8b201e6821103c9ed9e27fdbdf7426745e0da9535f60ddb
|
|
14
|
+
.apm/agents/specky-research-analyst.agent.md: sha256:92cd4041e0b021efa310e2cf12abb3c45e8f08e490e4b9bb275a81f4c4845cd9
|
|
15
|
+
.apm/agents/specky-sdd-clarify.agent.md: sha256:0dac1b774dc616eecddd5937e6ee520de32cdb12482fe3c25181a9e199d82302
|
|
16
|
+
.apm/agents/specky-sdd-init.agent.md: sha256:7dbba26d70b4fa9aada59e9a1efb8fa811cbe94fbf4c7429940ce7941393f3f2
|
|
17
|
+
.apm/agents/specky-spec-engineer.agent.md: sha256:dc639dde08405d06199b0257363d8ae70e5e14f3dcf991b43e5529e56d241ae8
|
|
18
|
+
.apm/agents/specky-task-planner.agent.md: sha256:124ebb0dde85dded8d7dd57ef728fa9838a78884bbd9de0f89f74879ae6d0e85
|
|
19
|
+
.apm/agents/specky-test-verifier.agent.md: sha256:e1386f81ae1fe9694c34d5b518e408804f2709237e137ce28bab48819e82f924
|
|
20
20
|
.apm/hooks/scripts/specky-artifact-validator.sh: sha256:2c255e3221cca919ace520ce319c66cc4904aa9c917ce08a52547fe63f8d9770
|
|
21
21
|
.apm/hooks/scripts/specky-auto-checkpoint.sh: sha256:46d5a336b20c844469574b2281b5cae24ee5116547a262bb160135aaef38d62e
|
|
22
22
|
.apm/hooks/scripts/specky-branch-validator.sh: sha256:73256941bdc4aaac518935214c6f0029f32b1529307088243142fe7423594cf6
|
|
@@ -77,5 +77,5 @@ primitives:
|
|
|
77
77
|
.apm/skills/specky-spec-engineer/SKILL.md: sha256:b5722dacc513a69b54a2d474e1dfa4a25029c5f6f2a930fae3b0ed8f3c9eb49e
|
|
78
78
|
.apm/skills/specky-task-planner/SKILL.md: sha256:bf391eaa0541ae507f99eacd18a8747b597bcde4ff84d9a389fdc4aad5e76ed7
|
|
79
79
|
.apm/skills/specky-test-verifier/SKILL.md: sha256:7e663a68f597f409a7209e07830b90b467052583bde8557eed389848baaa8609
|
|
80
|
-
apm-policy.yml: sha256:
|
|
81
|
-
apm.yml: sha256:
|
|
80
|
+
apm-policy.yml: sha256:560cfde2c8efe36bdc2cbb095f259506d51312249d3b4cee67640e244e972530
|
|
81
|
+
apm.yml: sha256:ac0a62e81a271f1a2de440018d3463991a8c1ee8dd376e4024eea27d1b1c5b3f
|
package/apm.yml
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
name: specky-sdd
|
|
2
|
-
version: 3.
|
|
2
|
+
version: 3.11.0
|
|
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
|
|
@@ -32,7 +32,7 @@ mcp:
|
|
|
32
32
|
registry: false
|
|
33
33
|
transport: stdio
|
|
34
34
|
command: npx
|
|
35
|
-
args: ["-y", "specky-sdd@
|
|
35
|
+
args: ["-y", "specky-sdd@3.11.0", "serve"]
|
|
36
36
|
tools: ["sdd_*"]
|
|
37
37
|
|
|
38
38
|
dependencies:
|
|
@@ -41,7 +41,7 @@ dependencies:
|
|
|
41
41
|
registry: false
|
|
42
42
|
transport: stdio
|
|
43
43
|
command: npx
|
|
44
|
-
args: ["-y", "specky-sdd@
|
|
44
|
+
args: ["-y", "specky-sdd@3.11.0"]
|
|
45
45
|
tools: ["*"]
|
|
46
46
|
|
|
47
47
|
scripts:
|
package/config.yml
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAwgBD,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAuEpE"}
|
|
@@ -13,7 +13,7 @@ import { VERSION } from "../../constants.js";
|
|
|
13
13
|
import { hashFile } from "../lib/asset-copier.js";
|
|
14
14
|
import { detectIde } from "../lib/ide-detect.js";
|
|
15
15
|
import { targetPaths } from "../lib/paths.js";
|
|
16
|
-
import { SPECKY_REQUIRED_ALLOWS } from "../lib/settings-merger.js";
|
|
16
|
+
import { requiredClaudeAllows, SPECKY_REQUIRED_ALLOWS, } from "../lib/settings-merger.js";
|
|
17
17
|
import { SPECKY_VSCODE_SETTINGS } from "../lib/vscode-settings-writer.js";
|
|
18
18
|
function verifyIntegrity(lock, speckyRoot) {
|
|
19
19
|
const missing = [];
|
|
@@ -50,7 +50,7 @@ function readJsonSafe(path) {
|
|
|
50
50
|
return null;
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
|
-
function checkClaudePermissions(targets) {
|
|
53
|
+
function checkClaudePermissions(targets, workspace, installMeta) {
|
|
54
54
|
const settings = readJsonSafe(targets.claude.settingsJson);
|
|
55
55
|
if (!settings) {
|
|
56
56
|
return {
|
|
@@ -59,8 +59,23 @@ function checkClaudePermissions(targets) {
|
|
|
59
59
|
detail: "settings.json missing or unreadable",
|
|
60
60
|
};
|
|
61
61
|
}
|
|
62
|
+
const profile = installMeta?.permission_profile ?? "scoped";
|
|
63
|
+
if (profile === "prompt") {
|
|
64
|
+
return {
|
|
65
|
+
name: "Claude permissions",
|
|
66
|
+
pass: true,
|
|
67
|
+
detail: "prompt profile: Claude Code manages confirmation for every action",
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const requiredAllows = installMeta?.capabilities
|
|
71
|
+
? requiredClaudeAllows(installMeta.capabilities, {
|
|
72
|
+
profile,
|
|
73
|
+
workspace,
|
|
74
|
+
integrations: installMeta.integrations,
|
|
75
|
+
})
|
|
76
|
+
: SPECKY_REQUIRED_ALLOWS;
|
|
62
77
|
const allow = new Set(settings.permissions?.allow ?? []);
|
|
63
|
-
const missing =
|
|
78
|
+
const missing = requiredAllows.filter((a) => !allow.has(a));
|
|
64
79
|
return {
|
|
65
80
|
name: "Claude permissions",
|
|
66
81
|
pass: missing.length === 0,
|
|
@@ -88,19 +103,30 @@ function checkVscodeSettings(workspace) {
|
|
|
88
103
|
: `missing keys: ${missing.join(", ")}`,
|
|
89
104
|
};
|
|
90
105
|
}
|
|
91
|
-
function checkMcpRegistration(path, label) {
|
|
106
|
+
function checkMcpRegistration(path, label, serverName = "specky") {
|
|
92
107
|
const cfg = readJsonSafe(path);
|
|
93
108
|
if (!cfg)
|
|
94
109
|
return { name: label, pass: false, detail: "file missing" };
|
|
95
|
-
const hasServer = Boolean(cfg.mcpServers?.[
|
|
96
|
-
Boolean(cfg.servers?.[
|
|
97
|
-
Boolean(cfg.mcp?.[
|
|
110
|
+
const hasServer = Boolean(cfg.mcpServers?.[serverName]) ||
|
|
111
|
+
Boolean(cfg.servers?.[serverName]) ||
|
|
112
|
+
Boolean(cfg.mcp?.[serverName]);
|
|
113
|
+
let detail = `${serverName} entry missing`;
|
|
114
|
+
if (hasServer) {
|
|
115
|
+
detail = serverName === "github"
|
|
116
|
+
? "GitHub MCP registered; authentication is managed by the target runtime"
|
|
117
|
+
: "specky server registered";
|
|
118
|
+
}
|
|
98
119
|
return {
|
|
99
120
|
name: label,
|
|
100
121
|
pass: hasServer,
|
|
101
|
-
detail
|
|
122
|
+
detail,
|
|
102
123
|
};
|
|
103
124
|
}
|
|
125
|
+
function githubIntegrationCheck(path, installMeta, label) {
|
|
126
|
+
return installMeta?.integrations?.includes("github")
|
|
127
|
+
? [checkMcpRegistration(path, label, "github")]
|
|
128
|
+
: [];
|
|
129
|
+
}
|
|
104
130
|
function checkFileExists(path, label) {
|
|
105
131
|
return {
|
|
106
132
|
name: label,
|
|
@@ -259,9 +285,10 @@ function checkCursorHooksManifest(targets) {
|
|
|
259
285
|
detail: manifest.version === 1 && hasMcpHooks ? "version 1 with MCP hooks" : "missing version 1 or MCP hooks",
|
|
260
286
|
};
|
|
261
287
|
}
|
|
262
|
-
function checkCursorInstall(targets, workspace) {
|
|
288
|
+
function checkCursorInstall(targets, workspace, installMeta) {
|
|
263
289
|
return [
|
|
264
290
|
checkMcpRegistration(targets.cursor.mcp, ".cursor/mcp.json"),
|
|
291
|
+
...githubIntegrationCheck(targets.cursor.mcp, installMeta, "Cursor GitHub MCP"),
|
|
265
292
|
checkFileCount(targets.cursor.agents, 13, "Cursor agents", (name) => name.startsWith("specky-") && name.endsWith(".md")),
|
|
266
293
|
checkFileCount(targets.cursor.commands, 22, "Cursor commands", (name) => name.startsWith("specky-") && name.endsWith(".md")),
|
|
267
294
|
checkFileCount(targets.shared.agentSkills, 14, "Cursor skills", (name, path) => name.startsWith("specky-") && statSync(path).isDirectory()),
|
|
@@ -272,9 +299,10 @@ function checkCursorInstall(targets, workspace) {
|
|
|
272
299
|
checkFileExists(targets.cursor.hooksRunner, "Cursor hook runner"),
|
|
273
300
|
];
|
|
274
301
|
}
|
|
275
|
-
function checkCopilotInstall(targets, workspace) {
|
|
302
|
+
function checkCopilotInstall(targets, workspace, installMeta) {
|
|
276
303
|
return [
|
|
277
304
|
checkMcpRegistration(targets.shared.vscodeMcp, ".vscode/mcp.json"),
|
|
305
|
+
...githubIntegrationCheck(targets.shared.vscodeMcp, installMeta, "Copilot GitHub MCP"),
|
|
278
306
|
checkVscodeSettings(workspace),
|
|
279
307
|
checkFileCount(targets.copilot.agents, 13, "Copilot agents", (name) => name.startsWith("specky-") && name.endsWith(".md")),
|
|
280
308
|
checkFileCount(targets.copilot.prompts, 22, "Copilot prompts", (name) => name.startsWith("specky-") && name.endsWith(".md")),
|
|
@@ -284,10 +312,11 @@ function checkCopilotInstall(targets, workspace) {
|
|
|
284
312
|
checkCopilotHooksManifest(targets),
|
|
285
313
|
];
|
|
286
314
|
}
|
|
287
|
-
function checkClaudeInstall(targets, workspace, installTargets) {
|
|
315
|
+
function checkClaudeInstall(targets, workspace, installTargets, installMeta) {
|
|
288
316
|
return [
|
|
289
317
|
checkMcpRegistration(targets.shared.claudeMcp, ".mcp.json"),
|
|
290
|
-
|
|
318
|
+
...githubIntegrationCheck(targets.shared.claudeMcp, installMeta, "Claude GitHub MCP"),
|
|
319
|
+
checkClaudePermissions(targets, workspace, installMeta),
|
|
291
320
|
checkFileCount(targets.claude.agents, 13, "Claude agents", (name) => name.startsWith("specky-") && name.endsWith(".md")),
|
|
292
321
|
checkFileCount(targets.claude.commands, 22, "Claude commands", (name) => name.startsWith("specky-") && name.endsWith(".md")),
|
|
293
322
|
checkFileCount(targets.claude.skills, 14, "Claude skills", (name, path) => name.startsWith("specky-") && statSync(path).isDirectory()),
|
|
@@ -297,9 +326,10 @@ function checkClaudeInstall(targets, workspace, installTargets) {
|
|
|
297
326
|
checkClaudeHooksInSettings(targets, installTargets),
|
|
298
327
|
];
|
|
299
328
|
}
|
|
300
|
-
function checkOpenCodeInstall(targets, workspace) {
|
|
329
|
+
function checkOpenCodeInstall(targets, workspace, installMeta) {
|
|
301
330
|
return [
|
|
302
331
|
checkMcpRegistration(targets.opencode.mcp, "opencode.json"),
|
|
332
|
+
...githubIntegrationCheck(targets.opencode.mcp, installMeta, "OpenCode GitHub MCP"),
|
|
303
333
|
checkFileCount(targets.opencode.agents, 13, "OpenCode agents", (name) => name.startsWith("specky-") && name.endsWith(".md")),
|
|
304
334
|
checkFileCount(targets.opencode.commands, 22, "OpenCode commands", (name) => name.startsWith("specky-") && name.endsWith(".md")),
|
|
305
335
|
checkFileCount(targets.shared.agentSkills, 14, "OpenCode skills", (name, path) => name.startsWith("specky-") && statSync(path).isDirectory()),
|
|
@@ -347,19 +377,19 @@ function resolveInstalledTargets(installMeta, workspace) {
|
|
|
347
377
|
detail: "no install metadata or IDE signals found; run specky install --target=<harness>",
|
|
348
378
|
};
|
|
349
379
|
}
|
|
350
|
-
function runConfigChecks(targets, workspace, installTargets) {
|
|
380
|
+
function runConfigChecks(targets, workspace, installTargets, installMeta) {
|
|
351
381
|
const checks = [];
|
|
352
382
|
if (installTargets.includes("claude")) {
|
|
353
|
-
checks.push(...checkClaudeInstall(targets, workspace, installTargets));
|
|
383
|
+
checks.push(...checkClaudeInstall(targets, workspace, installTargets, installMeta));
|
|
354
384
|
}
|
|
355
385
|
if (installTargets.includes("copilot")) {
|
|
356
|
-
checks.push(...checkCopilotInstall(targets, workspace));
|
|
386
|
+
checks.push(...checkCopilotInstall(targets, workspace, installMeta));
|
|
357
387
|
}
|
|
358
388
|
if (installTargets.includes("cursor")) {
|
|
359
|
-
checks.push(...checkCursorInstall(targets, workspace));
|
|
389
|
+
checks.push(...checkCursorInstall(targets, workspace, installMeta));
|
|
360
390
|
}
|
|
361
391
|
if (installTargets.includes("opencode")) {
|
|
362
|
-
checks.push(...checkOpenCodeInstall(targets, workspace));
|
|
392
|
+
checks.push(...checkOpenCodeInstall(targets, workspace, installMeta));
|
|
363
393
|
}
|
|
364
394
|
if (installTargets.includes("agent-skills")) {
|
|
365
395
|
checks.push(checkFileCount(targets.shared.agentSkills, 14, "Agent skills bundle", (name, path) => name.startsWith("specky-") && statSync(path).isDirectory()));
|
|
@@ -418,7 +448,7 @@ export async function runDoctor(opts) {
|
|
|
418
448
|
}
|
|
419
449
|
const integrity = verifyIntegrity(lock, targets.shared.specky);
|
|
420
450
|
printIntegrity(integrity, opts.verbose);
|
|
421
|
-
const checks = runConfigChecks(targets, workspace, resolvedTargets.targets);
|
|
451
|
+
const checks = runConfigChecks(targets, workspace, resolvedTargets.targets, installMeta);
|
|
422
452
|
printChecks(checks);
|
|
423
453
|
const integrityOk = integrity.missing.length === 0 && integrity.modified.length === 0;
|
|
424
454
|
const configOk = checks.every((c) => c.pass);
|