@specship/specship-win32-arm64 0.24.0 → 0.28.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/bin/specship.cmd +31 -1
- package/lib/dist/activation/cheatsheet.d.ts +17 -1
- package/lib/dist/activation/cheatsheet.d.ts.map +1 -1
- package/lib/dist/activation/cheatsheet.js +47 -3
- package/lib/dist/activation/cheatsheet.js.map +1 -1
- package/lib/dist/activation/hook-output.d.ts +80 -0
- package/lib/dist/activation/hook-output.d.ts.map +1 -0
- package/lib/dist/activation/hook-output.js +103 -0
- package/lib/dist/activation/hook-output.js.map +1 -0
- package/lib/dist/activation/search-intercept.d.ts +60 -29
- package/lib/dist/activation/search-intercept.d.ts.map +1 -1
- package/lib/dist/activation/search-intercept.js +159 -55
- package/lib/dist/activation/search-intercept.js.map +1 -1
- package/lib/dist/activation/steering.d.ts +11 -13
- package/lib/dist/activation/steering.d.ts.map +1 -1
- package/lib/dist/activation/steering.js +25 -10
- package/lib/dist/activation/steering.js.map +1 -1
- package/lib/dist/behaviour/behaviour-surface.d.ts +47 -0
- package/lib/dist/behaviour/behaviour-surface.d.ts.map +1 -1
- package/lib/dist/behaviour/behaviour-surface.js +108 -2
- package/lib/dist/behaviour/behaviour-surface.js.map +1 -1
- package/lib/dist/bin/node-version-check.d.ts +22 -7
- package/lib/dist/bin/node-version-check.d.ts.map +1 -1
- package/lib/dist/bin/node-version-check.js +39 -9
- package/lib/dist/bin/node-version-check.js.map +1 -1
- package/lib/dist/bin/specship.js +989 -116
- package/lib/dist/bin/specship.js.map +1 -1
- package/lib/dist/commands/specship/learn.md +27 -3
- package/lib/dist/commands/specship/spec.md +85 -15
- package/lib/dist/db/spec-queries.d.ts +73 -3
- package/lib/dist/db/spec-queries.d.ts.map +1 -1
- package/lib/dist/db/spec-queries.js +139 -5
- package/lib/dist/db/spec-queries.js.map +1 -1
- package/lib/dist/db/sqlite-adapter.d.ts +7 -5
- package/lib/dist/db/sqlite-adapter.d.ts.map +1 -1
- package/lib/dist/db/sqlite-adapter.js +11 -9
- package/lib/dist/db/sqlite-adapter.js.map +1 -1
- package/lib/dist/enforce/changed-files.d.ts +39 -0
- package/lib/dist/enforce/changed-files.d.ts.map +1 -0
- package/lib/dist/enforce/changed-files.js +114 -0
- package/lib/dist/enforce/changed-files.js.map +1 -0
- package/lib/dist/enforce/enforce.d.ts +53 -2
- package/lib/dist/enforce/enforce.d.ts.map +1 -1
- package/lib/dist/enforce/enforce.js +95 -8
- package/lib/dist/enforce/enforce.js.map +1 -1
- package/lib/dist/enforce/mutation.d.ts +46 -0
- package/lib/dist/enforce/mutation.d.ts.map +1 -0
- package/lib/dist/enforce/mutation.js +104 -0
- package/lib/dist/enforce/mutation.js.map +1 -0
- package/lib/dist/enforce/suppressions.d.ts +33 -0
- package/lib/dist/enforce/suppressions.d.ts.map +1 -0
- package/lib/dist/enforce/suppressions.js +159 -0
- package/lib/dist/enforce/suppressions.js.map +1 -0
- package/lib/dist/extraction/grammars.d.ts +10 -0
- package/lib/dist/extraction/grammars.d.ts.map +1 -1
- package/lib/dist/extraction/grammars.js +32 -3
- package/lib/dist/extraction/grammars.js.map +1 -1
- package/lib/dist/extraction/index.d.ts +7 -0
- package/lib/dist/extraction/index.d.ts.map +1 -1
- package/lib/dist/extraction/index.js.map +1 -1
- package/lib/dist/extraction/specs/markdown-spec-extractor.d.ts +7 -0
- package/lib/dist/extraction/specs/markdown-spec-extractor.d.ts.map +1 -1
- package/lib/dist/extraction/specs/markdown-spec-extractor.js +97 -10
- package/lib/dist/extraction/specs/markdown-spec-extractor.js.map +1 -1
- package/lib/dist/extraction/wasm/tree-sitter-pascal.wasm.gz +0 -0
- package/lib/dist/extraction/wasm/tree-sitter-scala.wasm.gz +0 -0
- package/lib/dist/graph/spec-coverage.d.ts +142 -0
- package/lib/dist/graph/spec-coverage.d.ts.map +1 -0
- package/lib/dist/graph/spec-coverage.js +276 -0
- package/lib/dist/graph/spec-coverage.js.map +1 -0
- package/lib/dist/health/smoke-check.js +2 -2
- package/lib/dist/health/smoke-check.js.map +1 -1
- package/lib/dist/index.d.ts +75 -7
- package/lib/dist/index.d.ts.map +1 -1
- package/lib/dist/index.js +191 -23
- package/lib/dist/index.js.map +1 -1
- package/lib/dist/installer/gemini-commands.d.ts +107 -0
- package/lib/dist/installer/gemini-commands.d.ts.map +1 -0
- package/lib/dist/installer/gemini-commands.js +264 -0
- package/lib/dist/installer/gemini-commands.js.map +1 -0
- package/lib/dist/installer/index.d.ts +55 -8
- package/lib/dist/installer/index.d.ts.map +1 -1
- package/lib/dist/installer/index.js +72 -53
- package/lib/dist/installer/index.js.map +1 -1
- package/lib/dist/installer/init-offer.d.ts +14 -9
- package/lib/dist/installer/init-offer.d.ts.map +1 -1
- package/lib/dist/installer/init-offer.js +13 -9
- package/lib/dist/installer/init-offer.js.map +1 -1
- package/lib/dist/installer/install-defaults.d.ts +81 -0
- package/lib/dist/installer/install-defaults.d.ts.map +1 -0
- package/lib/dist/installer/install-defaults.js +95 -0
- package/lib/dist/installer/install-defaults.js.map +1 -0
- package/lib/dist/installer/instructions-template.d.ts +22 -0
- package/lib/dist/installer/instructions-template.d.ts.map +1 -1
- package/lib/dist/installer/instructions-template.js +37 -1
- package/lib/dist/installer/instructions-template.js.map +1 -1
- package/lib/dist/installer/targets/claude.d.ts +18 -0
- package/lib/dist/installer/targets/claude.d.ts.map +1 -1
- package/lib/dist/installer/targets/claude.js +70 -23
- package/lib/dist/installer/targets/claude.js.map +1 -1
- package/lib/dist/installer/targets/gemini.d.ts +85 -12
- package/lib/dist/installer/targets/gemini.d.ts.map +1 -1
- package/lib/dist/installer/targets/gemini.js +527 -30
- package/lib/dist/installer/targets/gemini.js.map +1 -1
- package/lib/dist/installer/targets/shared.d.ts +13 -0
- package/lib/dist/installer/targets/shared.d.ts.map +1 -1
- package/lib/dist/installer/targets/shared.js +22 -4
- package/lib/dist/installer/targets/shared.js.map +1 -1
- package/lib/dist/installer/targets/types.d.ts +12 -0
- package/lib/dist/installer/targets/types.d.ts.map +1 -1
- package/lib/dist/jira/auto-publish.d.ts +71 -4
- package/lib/dist/jira/auto-publish.d.ts.map +1 -1
- package/lib/dist/jira/auto-publish.js +186 -17
- package/lib/dist/jira/auto-publish.js.map +1 -1
- package/lib/dist/jira/reconcile.d.ts +24 -1
- package/lib/dist/jira/reconcile.d.ts.map +1 -1
- package/lib/dist/jira/reconcile.js +46 -2
- package/lib/dist/jira/reconcile.js.map +1 -1
- package/lib/dist/jira/repo-config.d.ts +9 -0
- package/lib/dist/jira/repo-config.d.ts.map +1 -1
- package/lib/dist/jira/repo-config.js +11 -0
- package/lib/dist/jira/repo-config.js.map +1 -1
- package/lib/dist/jira/types.d.ts +7 -0
- package/lib/dist/jira/types.d.ts.map +1 -1
- package/lib/dist/jira/types.js.map +1 -1
- package/lib/dist/knowledge/enforce.d.ts +75 -0
- package/lib/dist/knowledge/enforce.d.ts.map +1 -0
- package/lib/dist/knowledge/enforce.js +250 -0
- package/lib/dist/knowledge/enforce.js.map +1 -0
- package/lib/dist/knowledge/facts.d.ts +33 -0
- package/lib/dist/knowledge/facts.d.ts.map +1 -0
- package/lib/dist/knowledge/facts.js +117 -0
- package/lib/dist/knowledge/facts.js.map +1 -0
- package/lib/dist/knowledge/proposals.d.ts +88 -0
- package/lib/dist/knowledge/proposals.d.ts.map +1 -0
- package/lib/dist/knowledge/proposals.js +360 -0
- package/lib/dist/knowledge/proposals.js.map +1 -0
- package/lib/dist/knowledge/stale.d.ts +64 -0
- package/lib/dist/knowledge/stale.d.ts.map +1 -0
- package/lib/dist/knowledge/stale.js +174 -0
- package/lib/dist/knowledge/stale.js.map +1 -0
- package/lib/dist/mcp/fitness-tool.d.ts +5 -6
- package/lib/dist/mcp/fitness-tool.d.ts.map +1 -1
- package/lib/dist/mcp/fitness-tool.js +0 -16
- package/lib/dist/mcp/fitness-tool.js.map +1 -1
- package/lib/dist/mcp/gemini-session.d.ts +50 -0
- package/lib/dist/mcp/gemini-session.d.ts.map +1 -0
- package/lib/dist/mcp/gemini-session.js +159 -0
- package/lib/dist/mcp/gemini-session.js.map +1 -0
- package/lib/dist/mcp/health-tool.d.ts +26 -0
- package/lib/dist/mcp/health-tool.d.ts.map +1 -0
- package/lib/dist/mcp/health-tool.js +50 -0
- package/lib/dist/mcp/health-tool.js.map +1 -0
- package/lib/dist/mcp/jira-tools.d.ts.map +1 -1
- package/lib/dist/mcp/jira-tools.js +25 -0
- package/lib/dist/mcp/jira-tools.js.map +1 -1
- package/lib/dist/mcp/maintainability-tool.d.ts +5 -7
- package/lib/dist/mcp/maintainability-tool.d.ts.map +1 -1
- package/lib/dist/mcp/maintainability-tool.js +0 -16
- package/lib/dist/mcp/maintainability-tool.js.map +1 -1
- package/lib/dist/mcp/model-context.d.ts +31 -7
- package/lib/dist/mcp/model-context.d.ts.map +1 -1
- package/lib/dist/mcp/model-context.js +70 -21
- package/lib/dist/mcp/model-context.js.map +1 -1
- package/lib/dist/mcp/proxy.d.ts.map +1 -1
- package/lib/dist/mcp/proxy.js +5 -2
- package/lib/dist/mcp/proxy.js.map +1 -1
- package/lib/dist/mcp/server-instructions.d.ts +16 -15
- package/lib/dist/mcp/server-instructions.d.ts.map +1 -1
- package/lib/dist/mcp/server-instructions.js +72 -5
- package/lib/dist/mcp/server-instructions.js.map +1 -1
- package/lib/dist/mcp/session.js +1 -1
- package/lib/dist/mcp/session.js.map +1 -1
- package/lib/dist/mcp/spec-tools.d.ts +9 -1
- package/lib/dist/mcp/spec-tools.d.ts.map +1 -1
- package/lib/dist/mcp/spec-tools.js +282 -49
- package/lib/dist/mcp/spec-tools.js.map +1 -1
- package/lib/dist/mcp/tools.d.ts +49 -9
- package/lib/dist/mcp/tools.d.ts.map +1 -1
- package/lib/dist/mcp/tools.js +210 -58
- package/lib/dist/mcp/tools.js.map +1 -1
- package/lib/dist/pulse/pulse.d.ts +93 -0
- package/lib/dist/pulse/pulse.d.ts.map +1 -0
- package/lib/dist/pulse/pulse.js +401 -0
- package/lib/dist/pulse/pulse.js.map +1 -0
- package/lib/dist/reflect/apply.d.ts.map +1 -1
- package/lib/dist/reflect/apply.js +38 -3
- package/lib/dist/reflect/apply.js.map +1 -1
- package/lib/dist/reflect/auto-sweep.d.ts +26 -0
- package/lib/dist/reflect/auto-sweep.d.ts.map +1 -0
- package/lib/dist/reflect/auto-sweep.js +90 -0
- package/lib/dist/reflect/auto-sweep.js.map +1 -0
- package/lib/dist/reflect/cli.d.ts +62 -0
- package/lib/dist/reflect/cli.d.ts.map +1 -0
- package/lib/dist/reflect/cli.js +163 -0
- package/lib/dist/reflect/cli.js.map +1 -0
- package/lib/dist/reflect/miner.d.ts.map +1 -1
- package/lib/dist/reflect/miner.js +119 -0
- package/lib/dist/reflect/miner.js.map +1 -1
- package/lib/dist/reflect/sweep.d.ts +1 -0
- package/lib/dist/reflect/sweep.d.ts.map +1 -1
- package/lib/dist/reflect/sweep.js +62 -13
- package/lib/dist/reflect/sweep.js.map +1 -1
- package/lib/dist/reflect/targets.d.ts +2 -0
- package/lib/dist/reflect/targets.d.ts.map +1 -1
- package/lib/dist/reflect/targets.js +33 -0
- package/lib/dist/reflect/targets.js.map +1 -1
- package/lib/dist/reflect/types.d.ts +19 -2
- package/lib/dist/reflect/types.d.ts.map +1 -1
- package/lib/dist/resolution/spec-link-resolver.d.ts +44 -2
- package/lib/dist/resolution/spec-link-resolver.d.ts.map +1 -1
- package/lib/dist/resolution/spec-link-resolver.js +132 -0
- package/lib/dist/resolution/spec-link-resolver.js.map +1 -1
- package/lib/dist/resolution/test-title-links.d.ts +62 -0
- package/lib/dist/resolution/test-title-links.d.ts.map +1 -0
- package/lib/dist/resolution/test-title-links.js +97 -0
- package/lib/dist/resolution/test-title-links.js.map +1 -0
- package/lib/dist/search/query-parser.d.ts.map +1 -1
- package/lib/dist/search/query-parser.js +6 -1
- package/lib/dist/search/query-parser.js.map +1 -1
- package/lib/dist/server/project-registry.js +1 -1
- package/lib/dist/server/routes/claude.js +24 -43
- package/lib/dist/server/routes/graph.js +53 -7
- package/lib/dist/server/routes/knowledge.js +118 -0
- package/lib/dist/server/routes/mcp.js +4 -3
- package/lib/dist/server/routes/projects.js +4 -4
- package/lib/dist/server/routes/spec.js +49 -7
- package/lib/dist/server/server.js +31 -17
- package/lib/dist/skills/spec-author/SKILL.md +164 -0
- package/lib/dist/skills/spec-author/references/format.md +210 -0
- package/lib/dist/skills/spec-author/references/gap-questions.md +152 -0
- package/lib/dist/skills/spec-author/references/quality-rubric.md +125 -0
- package/lib/dist/skills/spec-author/references/review-checklist.md +175 -0
- package/lib/dist/spec-lint/lint.d.ts +82 -0
- package/lib/dist/spec-lint/lint.d.ts.map +1 -0
- package/lib/dist/spec-lint/lint.js +491 -0
- package/lib/dist/spec-lint/lint.js.map +1 -0
- package/lib/dist/spec-quality/criterion-ids.d.ts +13 -0
- package/lib/dist/spec-quality/criterion-ids.d.ts.map +1 -0
- package/lib/dist/spec-quality/criterion-ids.js +38 -0
- package/lib/dist/spec-quality/criterion-ids.js.map +1 -0
- package/lib/dist/spec-quality/evidence-kind.d.ts +54 -0
- package/lib/dist/spec-quality/evidence-kind.d.ts.map +1 -0
- package/lib/dist/spec-quality/evidence-kind.js +183 -0
- package/lib/dist/spec-quality/evidence-kind.js.map +1 -0
- package/lib/dist/spec-quality/link-persist.d.ts +65 -0
- package/lib/dist/spec-quality/link-persist.d.ts.map +1 -0
- package/lib/dist/spec-quality/link-persist.js +249 -0
- package/lib/dist/spec-quality/link-persist.js.map +1 -0
- package/lib/dist/spec-quality/plan-scope.d.ts +38 -0
- package/lib/dist/spec-quality/plan-scope.d.ts.map +1 -0
- package/lib/dist/spec-quality/plan-scope.js +129 -0
- package/lib/dist/spec-quality/plan-scope.js.map +1 -0
- package/lib/dist/spec-quality/postcheck.d.ts +85 -0
- package/lib/dist/spec-quality/postcheck.d.ts.map +1 -0
- package/lib/dist/spec-quality/postcheck.js +390 -0
- package/lib/dist/spec-quality/postcheck.js.map +1 -0
- package/lib/dist/spec-quality/readiness.d.ts +72 -0
- package/lib/dist/spec-quality/readiness.d.ts.map +1 -0
- package/lib/dist/spec-quality/readiness.js +226 -0
- package/lib/dist/spec-quality/readiness.js.map +1 -0
- package/lib/dist/statusline/index.js.map +1 -1
- package/lib/dist/statusline/render.d.ts +1 -1
- package/lib/dist/statusline/render.d.ts.map +1 -1
- package/lib/dist/statusline/render.js +3 -1
- package/lib/dist/statusline/render.js.map +1 -1
- package/lib/dist/ui/assets/index-BzuUWUAE.js +50 -0
- package/lib/dist/ui/index.html +1 -1
- package/lib/dist/verify/report-ingest.d.ts +88 -0
- package/lib/dist/verify/report-ingest.d.ts.map +1 -0
- package/lib/dist/verify/report-ingest.js +269 -0
- package/lib/dist/verify/report-ingest.js.map +1 -0
- package/lib/dist/workflows/agents/claude.d.ts +16 -0
- package/lib/dist/workflows/agents/claude.d.ts.map +1 -0
- package/lib/dist/workflows/agents/claude.js +82 -0
- package/lib/dist/workflows/agents/claude.js.map +1 -0
- package/lib/dist/workflows/agents/gemini.d.ts +21 -0
- package/lib/dist/workflows/agents/gemini.d.ts.map +1 -0
- package/lib/dist/workflows/agents/gemini.js +124 -0
- package/lib/dist/workflows/agents/gemini.js.map +1 -0
- package/lib/dist/workflows/agents/index.d.ts +28 -0
- package/lib/dist/workflows/agents/index.d.ts.map +1 -0
- package/lib/dist/workflows/agents/index.js +104 -0
- package/lib/dist/workflows/agents/index.js.map +1 -0
- package/lib/dist/workflows/agents/types.d.ts +55 -0
- package/lib/dist/workflows/agents/types.d.ts.map +1 -0
- package/lib/dist/workflows/agents/types.js +46 -0
- package/lib/dist/workflows/agents/types.js.map +1 -0
- package/lib/dist/workflows/batch.d.ts +63 -0
- package/lib/dist/workflows/batch.d.ts.map +1 -0
- package/lib/dist/workflows/batch.js +151 -0
- package/lib/dist/workflows/batch.js.map +1 -0
- package/lib/dist/workflows/defaults/claude-design-implement.yaml +3 -4
- package/lib/dist/workflows/defaults/spec-author.yaml +11 -9
- package/lib/dist/workflows/defaults/spec-fix.yaml +103 -12
- package/lib/dist/workflows/defaults/spec-implement-mixed.yaml +21 -193
- package/lib/dist/workflows/defaults/spec-implement.yaml +701 -41
- package/lib/dist/workflows/defaults/spec-verify.yaml +60 -9
- package/lib/dist/workflows/discovery.d.ts +13 -0
- package/lib/dist/workflows/discovery.d.ts.map +1 -1
- package/lib/dist/workflows/discovery.js +79 -17
- package/lib/dist/workflows/discovery.js.map +1 -1
- package/lib/dist/workflows/executor.d.ts +18 -0
- package/lib/dist/workflows/executor.d.ts.map +1 -1
- package/lib/dist/workflows/executor.js +130 -33
- package/lib/dist/workflows/executor.js.map +1 -1
- package/lib/dist/workflows/gc.d.ts +50 -0
- package/lib/dist/workflows/gc.d.ts.map +1 -0
- package/lib/dist/workflows/gc.js +120 -0
- package/lib/dist/workflows/gc.js.map +1 -0
- package/lib/dist/workflows/merge-queue.d.ts +64 -0
- package/lib/dist/workflows/merge-queue.d.ts.map +1 -0
- package/lib/dist/workflows/merge-queue.js +162 -0
- package/lib/dist/workflows/merge-queue.js.map +1 -0
- package/lib/dist/workflows/runners/approval.d.ts +1 -1
- package/lib/dist/workflows/runners/approval.d.ts.map +1 -1
- package/lib/dist/workflows/runners/approval.js +11 -2
- package/lib/dist/workflows/runners/approval.js.map +1 -1
- package/lib/dist/workflows/runners/bash.d.ts +15 -0
- package/lib/dist/workflows/runners/bash.d.ts.map +1 -1
- package/lib/dist/workflows/runners/bash.js +50 -1
- package/lib/dist/workflows/runners/bash.js.map +1 -1
- package/lib/dist/workflows/runners/prompt.d.ts +16 -41
- package/lib/dist/workflows/runners/prompt.d.ts.map +1 -1
- package/lib/dist/workflows/runners/prompt.js +55 -120
- package/lib/dist/workflows/runners/prompt.js.map +1 -1
- package/lib/dist/workflows/runners/types.d.ts +12 -0
- package/lib/dist/workflows/runners/types.d.ts.map +1 -1
- package/lib/dist/workflows/schemas/workflow.d.ts +17 -0
- package/lib/dist/workflows/schemas/workflow.d.ts.map +1 -1
- package/lib/dist/workflows/schemas/workflow.js +27 -0
- package/lib/dist/workflows/schemas/workflow.js.map +1 -1
- package/lib/node_modules/.package-lock.json +1 -1
- package/lib/package.json +8 -4
- package/package.json +5 -3
- package/lib/dist/extraction/wasm/tree-sitter-pascal.wasm +0 -0
- package/lib/dist/extraction/wasm/tree-sitter-scala.wasm +0 -0
- package/lib/dist/server/ingest/impact-query.js +0 -343
- package/lib/dist/server/routes/events.js +0 -152
- package/lib/dist/ui/assets/index-CjjaftDw.js +0 -50
- package/node.exe +0 -4
|
@@ -14,8 +14,10 @@ inputs:
|
|
|
14
14
|
systemPromptAppend: |
|
|
15
15
|
You are fixing code so a spec's link returns to "verified" state.
|
|
16
16
|
Call specship_spec($INPUT.SPEC_ID) first to see the current state and
|
|
17
|
-
drift_axis.
|
|
18
|
-
|
|
17
|
+
drift_axis. Link state changes only in the link_verify node, only after
|
|
18
|
+
the reviewer's approval, and only as the run's VERIFY_RESULT marker
|
|
19
|
+
allows — a verify leg that was skipped or never got past install/build
|
|
20
|
+
proves nothing and promotes nothing (REQ-REVINT-006).
|
|
19
21
|
|
|
20
22
|
nodes:
|
|
21
23
|
- id: diagnose
|
|
@@ -78,33 +80,122 @@ nodes:
|
|
|
78
80
|
output_type: test_results
|
|
79
81
|
timeout: 600000
|
|
80
82
|
bash: |
|
|
83
|
+
# Same VERIFY_RESULT marker contract as spec-implement
|
|
84
|
+
# (REQ-REVINT-006.A2): the link_verify node routes on the marker, so a
|
|
85
|
+
# skipped run can never be mistaken for a passing one, and an
|
|
86
|
+
# environment or build failure is never attributed to the tests.
|
|
81
87
|
if [ -f package.json ]; then
|
|
82
|
-
|
|
88
|
+
# A fresh worktree has no node_modules/ or build output.
|
|
89
|
+
if [ ! -d node_modules ]; then
|
|
90
|
+
if ! { npm ci --no-audit --no-fund || npm install --no-audit --no-fund; }; then
|
|
91
|
+
echo "VERIFY_RESULT=env-failed"; exit 1
|
|
92
|
+
fi
|
|
93
|
+
fi
|
|
94
|
+
if ! npm run build --if-present; then echo "VERIFY_RESULT=build-failed"; exit 1; fi
|
|
95
|
+
if npm test; then echo "VERIFY_RESULT=ran-and-passed"; else echo "VERIFY_RESULT=ran-and-failed"; exit 1; fi
|
|
83
96
|
elif [ -f Cargo.toml ]; then
|
|
84
|
-
cargo
|
|
97
|
+
if ! cargo build; then echo "VERIFY_RESULT=build-failed"; exit 1; fi
|
|
98
|
+
if cargo test; then echo "VERIFY_RESULT=ran-and-passed"; else echo "VERIFY_RESULT=ran-and-failed"; exit 1; fi
|
|
85
99
|
elif [ -f pyproject.toml ] || [ -f requirements.txt ]; then
|
|
86
|
-
python -
|
|
100
|
+
if ! python -c 'import pytest' 2>/dev/null; then echo "VERIFY_RESULT=env-failed"; exit 1; fi
|
|
101
|
+
if python -m pytest; then echo "VERIFY_RESULT=ran-and-passed"; else echo "VERIFY_RESULT=ran-and-failed"; exit 1; fi
|
|
87
102
|
else
|
|
88
|
-
echo "no recognised test framework;
|
|
103
|
+
echo "no recognised test framework; tests did NOT run"
|
|
104
|
+
echo "VERIFY_RESULT=skipped"
|
|
89
105
|
fi
|
|
90
106
|
|
|
107
|
+
- id: route_verify
|
|
108
|
+
kind: bash
|
|
109
|
+
depends_on: [verify]
|
|
110
|
+
output_type: verify_route
|
|
111
|
+
bash: |
|
|
112
|
+
# Deterministic verify routing (REQ-VSTATE-005.A1): code parses the
|
|
113
|
+
# VERIFY_RESULT marker and emits the LINK_ACTION the link node obeys, so
|
|
114
|
+
# the decision that governs link promotion isn't a prompt's reading of a
|
|
115
|
+
# test log. env-failed / build-failed halt here, before the approval gate
|
|
116
|
+
# and before any link mutation, naming the cause (REQ-VSTATE-005.A3).
|
|
117
|
+
VERIFY_OUT=$verify.output
|
|
118
|
+
MARKER=$(printf '%s' "$VERIFY_OUT" | grep -oE 'VERIFY_RESULT=[a-z-]+' | tail -n 1 | cut -d= -f2)
|
|
119
|
+
[ -n "$MARKER" ] || MARKER=missing
|
|
120
|
+
echo "VERIFY_RESULT=$MARKER"
|
|
121
|
+
case "$MARKER" in
|
|
122
|
+
ran-and-passed)
|
|
123
|
+
echo "LINK_ACTION=verify-pass" ;;
|
|
124
|
+
ran-and-failed)
|
|
125
|
+
echo "LINK_ACTION=verify-fail" ;;
|
|
126
|
+
skipped)
|
|
127
|
+
echo "LINK_ACTION=no-verify" ;;
|
|
128
|
+
env-failed)
|
|
129
|
+
echo "HALT_CAUSE=environment setup failed (dependency install) — nothing is known about the tests"
|
|
130
|
+
exit 1 ;;
|
|
131
|
+
build-failed)
|
|
132
|
+
echo "HALT_CAUSE=build failed — nothing is known about the tests"
|
|
133
|
+
exit 1 ;;
|
|
134
|
+
*)
|
|
135
|
+
echo "HALT_CAUSE=no VERIFY_RESULT marker found in the verify output — an unknown result is never a pass"
|
|
136
|
+
exit 1 ;;
|
|
137
|
+
esac
|
|
138
|
+
|
|
139
|
+
- id: approve_links
|
|
140
|
+
kind: approval
|
|
141
|
+
depends_on: [route_verify]
|
|
142
|
+
message: |
|
|
143
|
+
Fix applied for $INPUT.SPEC_ID — approve before any link changes state
|
|
144
|
+
(REQ-REVINT-006.A4).
|
|
145
|
+
|
|
146
|
+
Files changed:
|
|
147
|
+
$apply.output
|
|
148
|
+
|
|
149
|
+
Verify routing (computed in code, REQ-VSTATE-005.A1 — `no-verify`
|
|
150
|
+
means no test ran, so nothing here can reach `verified`):
|
|
151
|
+
$route_verify.output
|
|
152
|
+
|
|
153
|
+
Test results:
|
|
154
|
+
$verify.output
|
|
155
|
+
|
|
156
|
+
Approve to let the link states be updated, or reject to leave every
|
|
157
|
+
link exactly as it is.
|
|
158
|
+
capture_response: true
|
|
159
|
+
|
|
91
160
|
- id: link_verify
|
|
92
161
|
kind: prompt
|
|
93
|
-
depends_on: [
|
|
162
|
+
depends_on: [approve_links]
|
|
94
163
|
output_type: link_summary
|
|
95
164
|
allowed_tools:
|
|
96
165
|
- mcp__specship__specship_spec
|
|
97
166
|
- mcp__specship__specship_link_assert
|
|
98
167
|
- mcp__specship__specship_link_verify
|
|
99
168
|
prompt: |
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
169
|
+
The reviewer has approved updating link state for $INPUT.SPEC_ID.
|
|
170
|
+
|
|
171
|
+
Act on LINK_ACTION — a bash node already derived it from the
|
|
172
|
+
VERIFY_RESULT marker (REQ-VSTATE-005.A1). Do NOT re-derive it from the
|
|
173
|
+
test log; read it here:
|
|
174
|
+
|
|
175
|
+
$route_verify.output
|
|
176
|
+
|
|
177
|
+
- LINK_ACTION=verify-pass → for each link that was drifted/broken, call
|
|
178
|
+
specship_link_verify with result="pass" (or "fail" if a test failed
|
|
179
|
+
for that link specifically).
|
|
180
|
+
- LINK_ACTION=verify-fail → call specship_link_verify with
|
|
181
|
+
result="fail" for the affected links. Never "pass".
|
|
182
|
+
- LINK_ACTION=no-verify → no test ran, so nothing is proven. Do NOT
|
|
183
|
+
call specship_link_verify at all; no link may reach `verified`
|
|
184
|
+
(REQ-REVINT-006.A3). Report that verification was skipped.
|
|
185
|
+
|
|
186
|
+
A run whose environment or build broke never reaches this node — the
|
|
187
|
+
routing step halts it first (REQ-VSTATE-005.A3).
|
|
103
188
|
|
|
104
189
|
If a link is orphaned because the symbol moved, call
|
|
105
|
-
specship_link_assert at the new location.
|
|
190
|
+
specship_link_assert at the new location. Never pass kind: 'tests' —
|
|
191
|
+
test evidence is file-derived (`verifies:` block or an `@verifies`
|
|
192
|
+
comment), never minted by this workflow (REQ-REVINT-005.A1).
|
|
193
|
+
|
|
194
|
+
Reviewer feedback (if any):
|
|
195
|
+
$approve_links.output
|
|
106
196
|
|
|
107
197
|
Test results:
|
|
108
198
|
$verify.output
|
|
109
199
|
|
|
110
|
-
Output: one line per link with the new state
|
|
200
|
+
Output: one line per link with the new state, ending with one line
|
|
201
|
+
stating whether verification ran, failed, or was skipped.
|
|
@@ -1,197 +1,25 @@
|
|
|
1
1
|
name: spec-implement-mixed
|
|
2
2
|
description: Implement a spec with mixed models — sonnet plans, haiku executes, tests + gates verify. Same steps and gates as spec-implement at a fraction of the token cost.
|
|
3
3
|
tags: [spec, default, mixed-model]
|
|
4
|
-
requires: [specship, git]
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
#
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
- mcp__specship__specship_spec
|
|
28
|
-
- mcp__specship__specship_explore
|
|
29
|
-
prompt: |
|
|
30
|
-
Spec ID: $INPUT.SPEC_ID
|
|
31
|
-
|
|
32
|
-
Call specship_spec to fetch the spec. Then call specship_explore on
|
|
33
|
-
a small bag of terms drawn from the spec title and acceptance
|
|
34
|
-
criteria to find the relevant code area.
|
|
35
|
-
|
|
36
|
-
Output: a short summary (≤300 words) of (a) what the spec asks for,
|
|
37
|
-
(b) which code areas / symbols are most relevant, and (c) whether
|
|
38
|
-
any code currently claims to implement it (look at linked_code).
|
|
39
|
-
|
|
40
|
-
- id: plan
|
|
41
|
-
# MIXMODEL-DOC: judgment step → sonnet
|
|
42
|
-
model: sonnet
|
|
43
|
-
kind: prompt
|
|
44
|
-
depends_on: [fetch_spec]
|
|
45
|
-
output_type: plan
|
|
46
|
-
allowed_tools:
|
|
47
|
-
- mcp__specship__specship_explore
|
|
48
|
-
- mcp__specship__specship_node
|
|
49
|
-
- mcp__specship__specship_spec
|
|
50
|
-
- Read
|
|
51
|
-
prompt: |
|
|
52
|
-
Based on this spec summary, write a concrete implementation plan:
|
|
53
|
-
|
|
54
|
-
$fetch_spec.output
|
|
55
|
-
|
|
56
|
-
The plan should list:
|
|
57
|
-
- Files to create or modify (with project-relative paths)
|
|
58
|
-
- Specific functions/methods/classes to add or change
|
|
59
|
-
- Tests to add or update
|
|
60
|
-
- Order of changes
|
|
61
|
-
|
|
62
|
-
Keep it tight (≤500 words). Do NOT edit code in this step.
|
|
63
|
-
|
|
64
|
-
- id: approve_plan
|
|
65
|
-
kind: approval
|
|
66
|
-
depends_on: [plan]
|
|
67
|
-
message: |
|
|
68
|
-
Plan ready for $INPUT.SPEC_ID. Review the plan output and approve
|
|
69
|
-
to proceed with implementation, or reject with feedback to revise.
|
|
70
|
-
capture_response: true
|
|
71
|
-
on_reject:
|
|
72
|
-
prompt: |
|
|
73
|
-
The plan was rejected with this feedback. Revise:
|
|
74
|
-
|
|
75
|
-
$approve_plan.output
|
|
76
|
-
max_attempts: 3
|
|
77
|
-
|
|
78
|
-
- id: implement
|
|
79
|
-
# MIXMODEL-DOC: mechanical step → haiku
|
|
80
|
-
model: haiku
|
|
81
|
-
kind: prompt
|
|
82
|
-
depends_on: [approve_plan]
|
|
83
|
-
output_type: diff
|
|
84
|
-
allowed_tools:
|
|
85
|
-
- Read
|
|
86
|
-
- Edit
|
|
87
|
-
- Write
|
|
88
|
-
- Bash
|
|
89
|
-
- mcp__specship__specship_explore
|
|
90
|
-
- mcp__specship__specship_node
|
|
91
|
-
- mcp__specship__specship_spec
|
|
92
|
-
prompt: |
|
|
93
|
-
Implement the approved plan. Follow it closely.
|
|
94
|
-
|
|
95
|
-
Plan:
|
|
96
|
-
$plan.output
|
|
97
|
-
|
|
98
|
-
Approval feedback (if any):
|
|
99
|
-
$approve_plan.output
|
|
100
|
-
|
|
101
|
-
When done, output a short diff summary (which files changed and why).
|
|
102
|
-
|
|
103
|
-
- id: verify
|
|
104
|
-
kind: bash
|
|
105
|
-
depends_on: [implement]
|
|
106
|
-
output_type: test_results
|
|
107
|
-
timeout: 600000
|
|
108
|
-
bash: |
|
|
109
|
-
# Run the project's test suite. The verify node's exit code drives
|
|
110
|
-
# the gating for the link node — non-zero halts the workflow.
|
|
111
|
-
# The VERIFY_RESULT marker is the machine-readable contract the link
|
|
112
|
-
# node routes on (REQ-IMPLINT-001.A1): a skipped run must never be
|
|
113
|
-
# mistaken for a passing one.
|
|
114
|
-
if [ -f package.json ]; then
|
|
115
|
-
# A fresh worktree has no node_modules/ or build output — a verify
|
|
116
|
-
# failure must mean the tests failed, not that the environment was
|
|
117
|
-
# missing (WF-REJECT-DOC, REQ-WFREJ-005).
|
|
118
|
-
if [ ! -d node_modules ]; then npm ci --no-audit --no-fund || npm install --no-audit --no-fund; fi
|
|
119
|
-
npm run build --if-present
|
|
120
|
-
if npm test; then echo "VERIFY_RESULT=ran-and-passed"; else echo "VERIFY_RESULT=ran-and-failed"; exit 1; fi
|
|
121
|
-
elif [ -f Cargo.toml ]; then
|
|
122
|
-
if cargo test; then echo "VERIFY_RESULT=ran-and-passed"; else echo "VERIFY_RESULT=ran-and-failed"; exit 1; fi
|
|
123
|
-
elif [ -f pyproject.toml ] || [ -f requirements.txt ]; then
|
|
124
|
-
if python -m pytest; then echo "VERIFY_RESULT=ran-and-passed"; else echo "VERIFY_RESULT=ran-and-failed"; exit 1; fi
|
|
125
|
-
else
|
|
126
|
-
echo "no recognised test framework; tests did NOT run"
|
|
127
|
-
echo "VERIFY_RESULT=skipped"
|
|
128
|
-
fi
|
|
129
|
-
|
|
130
|
-
- id: link
|
|
131
|
-
# MIXMODEL-DOC: mechanical step → haiku
|
|
132
|
-
model: haiku
|
|
133
|
-
kind: prompt
|
|
134
|
-
depends_on: [verify]
|
|
135
|
-
output_type: link_summary
|
|
136
|
-
allowed_tools:
|
|
137
|
-
- mcp__specship__specship_link_assert
|
|
138
|
-
- mcp__specship__specship_link_verify
|
|
139
|
-
- mcp__specship__specship_spec
|
|
140
|
-
prompt: |
|
|
141
|
-
Assert spec→code links for the changes made in the implement step.
|
|
142
|
-
For each symbol that implements $INPUT.SPEC_ID (or its child
|
|
143
|
-
requirements), call specship_link_assert with the spec_id, the
|
|
144
|
-
file path, and the qualified symbol name.
|
|
145
|
-
|
|
146
|
-
Then route on the VERIFY_RESULT marker in the test results below
|
|
147
|
-
(REQ-IMPLINT-001):
|
|
148
|
-
- VERIFY_RESULT=ran-and-passed → after each assert, call
|
|
149
|
-
specship_link_verify with result="pass".
|
|
150
|
-
- VERIFY_RESULT=skipped → do NOT call specship_link_verify at all;
|
|
151
|
-
the links stay in the `implemented` state. Tests that did not run
|
|
152
|
-
are never reported as passing.
|
|
153
|
-
|
|
154
|
-
Implementation diff summary:
|
|
155
|
-
$implement.output
|
|
156
|
-
|
|
157
|
-
Test results:
|
|
158
|
-
$verify.output
|
|
159
|
-
|
|
160
|
-
Output: a short list of "spec_id → file:symbol [verified|implemented]"
|
|
161
|
-
lines, ending with one line stating whether verification ran or was
|
|
162
|
-
skipped.
|
|
163
|
-
|
|
164
|
-
- id: coverage
|
|
165
|
-
# MIXMODEL-DOC: mechanical step → haiku
|
|
166
|
-
model: haiku
|
|
167
|
-
kind: prompt
|
|
168
|
-
depends_on: [link]
|
|
169
|
-
output_type: coverage_summary
|
|
170
|
-
allowed_tools:
|
|
171
|
-
- mcp__specship__specship_spec
|
|
172
|
-
prompt: |
|
|
173
|
-
Report acceptance-criteria test coverage for $INPUT.SPEC_ID
|
|
174
|
-
(REQ-IMPLINT-002). Call specship_spec with the spec_id, count its
|
|
175
|
-
acceptance criteria (the .A<N> children; if the spec has none,
|
|
176
|
-
treat the requirement itself as one criterion), and count how many
|
|
177
|
-
of them carry a `tests`-kind link.
|
|
178
|
-
|
|
179
|
-
Output exactly one or two lines:
|
|
180
|
-
- "N of M acceptance criteria for $INPUT.SPEC_ID have linked tests."
|
|
181
|
-
- If N < M, add: "Close the gap with /specship:spec behaviour
|
|
182
|
-
$INPUT.SPEC_ID."
|
|
183
|
-
|
|
184
|
-
- id: final_review
|
|
185
|
-
kind: approval
|
|
186
|
-
depends_on: [coverage]
|
|
187
|
-
message: |
|
|
188
|
-
Implementation complete for $INPUT.SPEC_ID.
|
|
189
|
-
|
|
190
|
-
Links asserted:
|
|
191
|
-
$link.output
|
|
192
|
-
|
|
193
|
-
Acceptance-criteria test coverage:
|
|
194
|
-
$coverage.output
|
|
195
|
-
|
|
196
|
-
Approve to finalize the run (worktree is left for you to inspect
|
|
197
|
-
and merge), or reject to abandon.
|
|
5
|
+
# THROUGHPUT-DOC, REQ-THRU-004 — one source of truth for the implement
|
|
6
|
+
# pipeline. This variant inherits every node, gate and prompt from
|
|
7
|
+
# spec-implement and states only what differs: which model runs each step
|
|
8
|
+
# (MIXMODEL-DOC). Judgment steps are pinned up (sonnet); mechanical steps are
|
|
9
|
+
# pinned down (haiku); bash gates, approvals, verify, routing and coverage are
|
|
10
|
+
# model-free and identical by construction.
|
|
11
|
+
extends: spec-implement
|
|
12
|
+
|
|
13
|
+
node_overrides:
|
|
14
|
+
fetch_spec:
|
|
15
|
+
model: haiku # mechanical: read the spec and summarize
|
|
16
|
+
plan:
|
|
17
|
+
model: sonnet # judgment: the plan the human approves
|
|
18
|
+
implement:
|
|
19
|
+
model: haiku # mechanical: execute the approved plan
|
|
20
|
+
fix_quality:
|
|
21
|
+
model: haiku # mechanical: fix what the linter named
|
|
22
|
+
link:
|
|
23
|
+
model: haiku # mechanical: record implementations bullets
|
|
24
|
+
adversarial_review:
|
|
25
|
+
model: sonnet # judgment: try to break the change
|