sillyspec 3.27.12 → 3.28.2
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/.claude/skills/sillyspec-execute/SKILL.md +214 -214
- package/.claude/skills/sillyspec-plan/SKILL.md +156 -156
- package/.claude/skills/sillyspec-quick/SKILL.md +116 -116
- package/package.json +1 -1
- package/src/agent-session-log.js +77 -10
- package/src/archive-delta.js +419 -0
- package/src/config-schema.js +2 -2
- package/src/contract-matrix.js +15 -2
- package/src/design-facts.js +354 -0
- package/src/docs-check.js +79 -8
- package/src/doctor-diagnostics.js +75 -3
- package/src/endpoint-baseline.js +109 -0
- package/src/endpoint-extractor.js +100 -24
- package/src/git-helper.js +31 -0
- package/src/index.js +248 -8
- package/src/machine-interface.js +63 -0
- package/src/modules.js +41 -12
- package/src/progress/change-registry.js +20 -0
- package/src/progress/consistency-doctor.js +124 -5
- package/src/progress/stage-machine.js +118 -2
- package/src/progress.js +6 -0
- package/src/quicklog.js +51 -0
- package/src/run/command.js +71 -2
- package/src/run/complete-handlers.js +84 -7
- package/src/run/complete.js +58 -5
- package/src/run/gates.js +333 -2
- package/src/run/prompt.js +70 -0
- package/src/run/quick-audit.js +98 -0
- package/src/run/scan-profile.js +98 -6
- package/src/run/shared.js +66 -1
- package/src/run/stage.js +25 -12
- package/src/scan-diff.js +54 -1
- package/src/scan-facts.js +173 -0
- package/src/scan-postcheck.js +110 -3
- package/src/spec-sync.js +210 -16
- package/src/stage-review.js +62 -3
- package/src/stages/archive.js +5 -5
- package/src/stages/brainstorm.js +10 -10
- package/src/stages/execute.js +21 -15
- package/src/stages/plan-postcheck.js +194 -1
- package/src/stages/plan.js +6 -2
- package/src/stages/scan.js +44 -102
- package/src/stages/verify.js +9 -7
- package/src/sync.js +122 -4
- package/src/task-review.js +51 -4
- package/src/taskcard.js +8 -1
- package/src/verify-postcheck.js +670 -10
- package/src/verify-probes.js +92 -10
- package/src/workflow.js +30 -0
- package/templates/agents-instruction.md +1 -1
- package/templates/prompts/taskcard-rules.md +5 -0
- package/templates/workflows/scan-docs.yaml +6 -0
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-archive/SKILL.md +0 -87
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-auto/SKILL.md +0 -93
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-brainstorm/SKILL.md +0 -114
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-commit/SKILL.md +0 -67
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-continue/SKILL.md +0 -47
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-doctor/SKILL.md +0 -76
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-execute/SKILL.md +0 -214
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-explore/SKILL.md +0 -102
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-export/SKILL.md +0 -57
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-init/SKILL.md +0 -177
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-knowledge/SKILL.md +0 -270
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-plan/SKILL.md +0 -156
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-quick/SKILL.md +0 -116
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-resume/SKILL.md +0 -70
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-scan/SKILL.md +0 -79
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-state/SKILL.md +0 -64
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-status/SKILL.md +0 -54
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-verify/SKILL.md +0 -87
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-workspace/SKILL.md +0 -175
- package/.claude/worktrees/sillyspec-data-model-research/.gitattributes +0 -2
- package/.claude/worktrees/sillyspec-data-model-research/.husky/pre-push +0 -20
- package/.claude/worktrees/sillyspec-data-model-research/README.md +0 -203
- package/.claude/worktrees/sillyspec-data-model-research/SKILL.md +0 -91
- package/.claude/worktrees/sillyspec-data-model-research/bin/sillyspec.js +0 -2
- package/.claude/worktrees/sillyspec-data-model-research/logo.jpg +0 -0
- package/.claude/worktrees/sillyspec-data-model-research/package-lock.json +0 -977
- package/.claude/worktrees/sillyspec-data-model-research/package.json +0 -39
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/assets/index-Bq_Z2hne.js +0 -7446
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/assets/index-O2W5RV4z.css +0 -1
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/favicon.jpg +0 -0
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/index.html +0 -16
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/logo.jpg +0 -0
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/prototype-dashboard.html +0 -836
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/prototype-overview.html +0 -256
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/package.json +0 -25
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/server/executor.js +0 -95
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/server/index.js +0 -679
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/server/parser.js +0 -526
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/server/watcher.js +0 -357
- package/.claude/worktrees/sillyspec-data-model-research/src/agent-session-log.js +0 -803
- package/.claude/worktrees/sillyspec-data-model-research/src/change-list.js +0 -290
- package/.claude/worktrees/sillyspec-data-model-research/src/change-risk-profile.js +0 -270
- package/.claude/worktrees/sillyspec-data-model-research/src/check-primitives.js +0 -65
- package/.claude/worktrees/sillyspec-data-model-research/src/classify-change.js +0 -109
- package/.claude/worktrees/sillyspec-data-model-research/src/commit-suggest.js +0 -202
- package/.claude/worktrees/sillyspec-data-model-research/src/config-cat.js +0 -88
- package/.claude/worktrees/sillyspec-data-model-research/src/config-schema.js +0 -328
- package/.claude/worktrees/sillyspec-data-model-research/src/constants.js +0 -97
- package/.claude/worktrees/sillyspec-data-model-research/src/contract-matrix.js +0 -480
- package/.claude/worktrees/sillyspec-data-model-research/src/datetime.js +0 -20
- package/.claude/worktrees/sillyspec-data-model-research/src/db-engine.js +0 -55
- package/.claude/worktrees/sillyspec-data-model-research/src/db.js +0 -381
- package/.claude/worktrees/sillyspec-data-model-research/src/decision-distill.js +0 -517
- package/.claude/worktrees/sillyspec-data-model-research/src/dispatch/backends/local-agent.js +0 -155
- package/.claude/worktrees/sillyspec-data-model-research/src/dispatch/backends/sillyhub-mcp.js +0 -245
- package/.claude/worktrees/sillyspec-data-model-research/src/dispatch/probe.js +0 -246
- package/.claude/worktrees/sillyspec-data-model-research/src/dispatch/strategy.js +0 -121
- package/.claude/worktrees/sillyspec-data-model-research/src/docs-check.js +0 -825
- package/.claude/worktrees/sillyspec-data-model-research/src/docs-debt.js +0 -393
- package/.claude/worktrees/sillyspec-data-model-research/src/docs-gate.js +0 -107
- package/.claude/worktrees/sillyspec-data-model-research/src/doctor-diagnostics.js +0 -1099
- package/.claude/worktrees/sillyspec-data-model-research/src/endpoint-extractor.js +0 -420
- package/.claude/worktrees/sillyspec-data-model-research/src/foreign-declared.js +0 -78
- package/.claude/worktrees/sillyspec-data-model-research/src/fs-atomic.js +0 -73
- package/.claude/worktrees/sillyspec-data-model-research/src/git-helper.js +0 -150
- package/.claude/worktrees/sillyspec-data-model-research/src/hooks/claude-pre-tool-use.cjs +0 -130
- package/.claude/worktrees/sillyspec-data-model-research/src/hooks/worktree-guard.js +0 -892
- package/.claude/worktrees/sillyspec-data-model-research/src/index.js +0 -2798
- package/.claude/worktrees/sillyspec-data-model-research/src/init.js +0 -626
- package/.claude/worktrees/sillyspec-data-model-research/src/knowledge-match.js +0 -231
- package/.claude/worktrees/sillyspec-data-model-research/src/local-detect.js +0 -128
- package/.claude/worktrees/sillyspec-data-model-research/src/local-register.js +0 -104
- package/.claude/worktrees/sillyspec-data-model-research/src/machine-interface.js +0 -543
- package/.claude/worktrees/sillyspec-data-model-research/src/migrate.js +0 -127
- package/.claude/worktrees/sillyspec-data-model-research/src/module-impact.js +0 -166
- package/.claude/worktrees/sillyspec-data-model-research/src/module-resolve.js +0 -222
- package/.claude/worktrees/sillyspec-data-model-research/src/modules.js +0 -580
- package/.claude/worktrees/sillyspec-data-model-research/src/progress/change-registry.js +0 -336
- package/.claude/worktrees/sillyspec-data-model-research/src/progress/consistency-doctor.js +0 -355
- package/.claude/worktrees/sillyspec-data-model-research/src/progress/shared.js +0 -36
- package/.claude/worktrees/sillyspec-data-model-research/src/progress/stage-machine.js +0 -594
- package/.claude/worktrees/sillyspec-data-model-research/src/progress/step-store.js +0 -265
- package/.claude/worktrees/sillyspec-data-model-research/src/progress.js +0 -1304
- package/.claude/worktrees/sillyspec-data-model-research/src/quick-recommend.js +0 -115
- package/.claude/worktrees/sillyspec-data-model-research/src/quicklog.js +0 -852
- package/.claude/worktrees/sillyspec-data-model-research/src/review-tier.js +0 -77
- package/.claude/worktrees/sillyspec-data-model-research/src/run/command.js +0 -1595
- package/.claude/worktrees/sillyspec-data-model-research/src/run/complete-handlers.js +0 -1552
- package/.claude/worktrees/sillyspec-data-model-research/src/run/complete.js +0 -1259
- package/.claude/worktrees/sillyspec-data-model-research/src/run/concurrent-detect.js +0 -156
- package/.claude/worktrees/sillyspec-data-model-research/src/run/gates.js +0 -1084
- package/.claude/worktrees/sillyspec-data-model-research/src/run/multi-repo-context.js +0 -208
- package/.claude/worktrees/sillyspec-data-model-research/src/run/next.js +0 -128
- package/.claude/worktrees/sillyspec-data-model-research/src/run/prompt.js +0 -843
- package/.claude/worktrees/sillyspec-data-model-research/src/run/quick-audit.js +0 -186
- package/.claude/worktrees/sillyspec-data-model-research/src/run/scan-profile.js +0 -269
- package/.claude/worktrees/sillyspec-data-model-research/src/run/shared.js +0 -1562
- package/.claude/worktrees/sillyspec-data-model-research/src/run/stage.js +0 -584
- package/.claude/worktrees/sillyspec-data-model-research/src/run.js +0 -23
- package/.claude/worktrees/sillyspec-data-model-research/src/scan-diff.js +0 -388
- package/.claude/worktrees/sillyspec-data-model-research/src/scan-postcheck.js +0 -512
- package/.claude/worktrees/sillyspec-data-model-research/src/scan-staleness.js +0 -95
- package/.claude/worktrees/sillyspec-data-model-research/src/setup.js +0 -414
- package/.claude/worktrees/sillyspec-data-model-research/src/sillyhub-mcp/client.js +0 -597
- package/.claude/worktrees/sillyspec-data-model-research/src/sillyhub-mcp/config.js +0 -62
- package/.claude/worktrees/sillyspec-data-model-research/src/spec-dir-typo.js +0 -50
- package/.claude/worktrees/sillyspec-data-model-research/src/spec-sync.js +0 -358
- package/.claude/worktrees/sillyspec-data-model-research/src/stage-contract-engine.js +0 -171
- package/.claude/worktrees/sillyspec-data-model-research/src/stage-contract-spec.js +0 -550
- package/.claude/worktrees/sillyspec-data-model-research/src/stage-contract.js +0 -889
- package/.claude/worktrees/sillyspec-data-model-research/src/stage-review.js +0 -597
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/archive.js +0 -199
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/brainstorm-auto.js +0 -236
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/brainstorm.js +0 -617
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/cmd-existence.js +0 -145
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/doctor.js +0 -540
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/execute.js +0 -1275
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/explore.js +0 -43
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/index.js +0 -29
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/knowledge.js +0 -514
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/plan-postcheck.js +0 -1344
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/plan.js +0 -650
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/quick.js +0 -167
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/scan.js +0 -608
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/status.js +0 -64
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/verify.js +0 -246
- package/.claude/worktrees/sillyspec-data-model-research/src/sync.js +0 -1470
- package/.claude/worktrees/sillyspec-data-model-research/src/task-review.js +0 -1498
- package/.claude/worktrees/sillyspec-data-model-research/src/taskcard.js +0 -210
- package/.claude/worktrees/sillyspec-data-model-research/src/verify-postcheck.js +0 -1718
- package/.claude/worktrees/sillyspec-data-model-research/src/verify-probes.js +0 -277
- package/.claude/worktrees/sillyspec-data-model-research/src/version.js +0 -19
- package/.claude/worktrees/sillyspec-data-model-research/src/workflow.js +0 -600
- package/.claude/worktrees/sillyspec-data-model-research/src/workspace.js +0 -125
- package/.claude/worktrees/sillyspec-data-model-research/src/worktree-apply.js +0 -1446
- package/.claude/worktrees/sillyspec-data-model-research/src/worktree-deps.js +0 -576
- package/.claude/worktrees/sillyspec-data-model-research/src/worktree.js +0 -1715
- package/.claude/worktrees/sillyspec-data-model-research/templates/claude-instruction.md +0 -23
- package/.claude/worktrees/sillyspec-data-model-research/templates/prompts/taskcard-rules.md +0 -28
- package/.claude/worktrees/sillyspec-data-model-research/templates/prompts/testcase-design.md +0 -12
- package/.claude/worktrees/sillyspec-data-model-research/templates/prompts/verify-probes.md +0 -32
- package/.claude/worktrees/sillyspec-data-model-research/templates/workflows/archive-impact.yaml +0 -79
- package/.claude/worktrees/sillyspec-data-model-research/templates/workflows/scan-docs.yaml +0 -132
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-archive/SKILL.md +0 -87
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-auto/SKILL.md +0 -93
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-brainstorm/SKILL.md +0 -114
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-commit/SKILL.md +0 -67
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-continue/SKILL.md +0 -47
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-doctor/SKILL.md +0 -76
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-execute/SKILL.md +0 -214
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-explore/SKILL.md +0 -102
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-export/SKILL.md +0 -57
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-init/SKILL.md +0 -177
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-knowledge/SKILL.md +0 -270
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-plan/SKILL.md +0 -156
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-propose/SKILL.md +0 -87
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-quick/SKILL.md +0 -116
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-resume/SKILL.md +0 -70
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-scan/SKILL.md +0 -79
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-state/SKILL.md +0 -64
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-status/SKILL.md +0 -54
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-verify/SKILL.md +0 -87
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-workspace/SKILL.md +0 -175
- package/.worktrees/2c37b1d7/.claude/skills/verify-per-user/SKILL.md +0 -6
- package/.worktrees/2c37b1d7/.gitattributes +0 -2
- package/.worktrees/2c37b1d7/.husky/pre-push +0 -20
- package/.worktrees/2c37b1d7/README.md +0 -203
- package/.worktrees/2c37b1d7/SKILL.md +0 -91
- package/.worktrees/2c37b1d7/architecture-analysis.md +0 -448
- package/.worktrees/2c37b1d7/bin/sillyspec.js +0 -2
- package/.worktrees/2c37b1d7/eval/README.md +0 -86
- package/.worktrees/2c37b1d7/eval/eval.config.json +0 -28
- package/.worktrees/2c37b1d7/eval/lib/adapters/cli.mjs +0 -63
- package/.worktrees/2c37b1d7/eval/lib/adapters/dryrun.mjs +0 -27
- package/.worktrees/2c37b1d7/eval/lib/config.mjs +0 -82
- package/.worktrees/2c37b1d7/eval/lib/db.mjs +0 -76
- package/.worktrees/2c37b1d7/eval/lib/report.mjs +0 -120
- package/.worktrees/2c37b1d7/eval/lib/runner.mjs +0 -157
- package/.worktrees/2c37b1d7/eval/lib/tasks.mjs +0 -73
- package/.worktrees/2c37b1d7/eval/lib/util.mjs +0 -107
- package/.worktrees/2c37b1d7/eval/lib/workdir.mjs +0 -30
- package/.worktrees/2c37b1d7/eval/run.mjs +0 -83
- package/.worktrees/2c37b1d7/eval/tasks/001-slugify/files/package.json +0 -6
- package/.worktrees/2c37b1d7/eval/tasks/001-slugify/solution/src/slugify.mjs +0 -26
- package/.worktrees/2c37b1d7/eval/tasks/001-slugify/task.json +0 -6
- package/.worktrees/2c37b1d7/eval/tasks/001-slugify/verify.mjs +0 -28
- package/.worktrees/2c37b1d7/eval/tasks/002-each-day/files/package.json +0 -6
- package/.worktrees/2c37b1d7/eval/tasks/002-each-day/files/src/dates.mjs +0 -4
- package/.worktrees/2c37b1d7/eval/tasks/002-each-day/solution/src/dates.mjs +0 -30
- package/.worktrees/2c37b1d7/eval/tasks/002-each-day/task.json +0 -6
- package/.worktrees/2c37b1d7/eval/tasks/002-each-day/verify.mjs +0 -31
- package/.worktrees/2c37b1d7/eval/tasks/003-word-report/files/data/notes.txt +0 -5
- package/.worktrees/2c37b1d7/eval/tasks/003-word-report/files/package.json +0 -6
- package/.worktrees/2c37b1d7/eval/tasks/003-word-report/solution/bin/report.mjs +0 -36
- package/.worktrees/2c37b1d7/eval/tasks/003-word-report/task.json +0 -6
- package/.worktrees/2c37b1d7/eval/tasks/003-word-report/verify.mjs +0 -38
- package/.worktrees/2c37b1d7/logo.jpg +0 -0
- package/.worktrees/2c37b1d7/package-lock.json +0 -977
- package/.worktrees/2c37b1d7/package.json +0 -41
- package/.worktrees/2c37b1d7/packages/dashboard/dist/assets/index-Bq_Z2hne.js +0 -7446
- package/.worktrees/2c37b1d7/packages/dashboard/dist/assets/index-O2W5RV4z.css +0 -1
- package/.worktrees/2c37b1d7/packages/dashboard/dist/favicon.jpg +0 -0
- package/.worktrees/2c37b1d7/packages/dashboard/dist/index.html +0 -16
- package/.worktrees/2c37b1d7/packages/dashboard/dist/logo.jpg +0 -0
- package/.worktrees/2c37b1d7/packages/dashboard/dist/prototype-dashboard.html +0 -836
- package/.worktrees/2c37b1d7/packages/dashboard/dist/prototype-overview.html +0 -256
- package/.worktrees/2c37b1d7/packages/dashboard/package.json +0 -25
- package/.worktrees/2c37b1d7/packages/dashboard/server/executor.js +0 -95
- package/.worktrees/2c37b1d7/packages/dashboard/server/index.js +0 -679
- package/.worktrees/2c37b1d7/packages/dashboard/server/parser.js +0 -526
- package/.worktrees/2c37b1d7/packages/dashboard/server/watcher.js +0 -357
- package/.worktrees/2c37b1d7/src/agent-session-log.js +0 -803
- package/.worktrees/2c37b1d7/src/change-list.js +0 -290
- package/.worktrees/2c37b1d7/src/change-risk-profile.js +0 -339
- package/.worktrees/2c37b1d7/src/check-primitives.js +0 -65
- package/.worktrees/2c37b1d7/src/classify-change.js +0 -109
- package/.worktrees/2c37b1d7/src/commit-suggest.js +0 -202
- package/.worktrees/2c37b1d7/src/config-cat.js +0 -88
- package/.worktrees/2c37b1d7/src/config-schema.js +0 -328
- package/.worktrees/2c37b1d7/src/constants.js +0 -97
- package/.worktrees/2c37b1d7/src/contract-matrix.js +0 -533
- package/.worktrees/2c37b1d7/src/datetime.js +0 -20
- package/.worktrees/2c37b1d7/src/db-engine.js +0 -55
- package/.worktrees/2c37b1d7/src/db.js +0 -381
- package/.worktrees/2c37b1d7/src/decision-distill.js +0 -517
- package/.worktrees/2c37b1d7/src/dispatch/backends/local-agent.js +0 -155
- package/.worktrees/2c37b1d7/src/dispatch/backends/sillyhub-mcp.js +0 -245
- package/.worktrees/2c37b1d7/src/dispatch/probe.js +0 -246
- package/.worktrees/2c37b1d7/src/dispatch/strategy.js +0 -121
- package/.worktrees/2c37b1d7/src/docs-check.js +0 -825
- package/.worktrees/2c37b1d7/src/docs-debt.js +0 -393
- package/.worktrees/2c37b1d7/src/docs-gate.js +0 -107
- package/.worktrees/2c37b1d7/src/doctor-diagnostics.js +0 -1099
- package/.worktrees/2c37b1d7/src/endpoint-extractor.js +0 -409
- package/.worktrees/2c37b1d7/src/foreign-declared.js +0 -155
- package/.worktrees/2c37b1d7/src/fs-atomic.js +0 -73
- package/.worktrees/2c37b1d7/src/git-helper.js +0 -150
- package/.worktrees/2c37b1d7/src/hooks/claude-pre-tool-use.cjs +0 -130
- package/.worktrees/2c37b1d7/src/hooks/worktree-guard.js +0 -892
- package/.worktrees/2c37b1d7/src/index.js +0 -2854
- package/.worktrees/2c37b1d7/src/init.js +0 -626
- package/.worktrees/2c37b1d7/src/knowledge-match.js +0 -231
- package/.worktrees/2c37b1d7/src/local-detect.js +0 -128
- package/.worktrees/2c37b1d7/src/local-register.js +0 -104
- package/.worktrees/2c37b1d7/src/machine-interface.js +0 -543
- package/.worktrees/2c37b1d7/src/migrate.js +0 -127
- package/.worktrees/2c37b1d7/src/module-impact.js +0 -166
- package/.worktrees/2c37b1d7/src/module-resolve.js +0 -222
- package/.worktrees/2c37b1d7/src/modules.js +0 -580
- package/.worktrees/2c37b1d7/src/plan-adopt-waves.js +0 -126
- package/.worktrees/2c37b1d7/src/progress/change-registry.js +0 -336
- package/.worktrees/2c37b1d7/src/progress/consistency-doctor.js +0 -355
- package/.worktrees/2c37b1d7/src/progress/shared.js +0 -36
- package/.worktrees/2c37b1d7/src/progress/stage-machine.js +0 -594
- package/.worktrees/2c37b1d7/src/progress/step-store.js +0 -265
- package/.worktrees/2c37b1d7/src/progress.js +0 -1304
- package/.worktrees/2c37b1d7/src/quick-recommend.js +0 -115
- package/.worktrees/2c37b1d7/src/quicklog.js +0 -883
- package/.worktrees/2c37b1d7/src/review-tier.js +0 -77
- package/.worktrees/2c37b1d7/src/run/command.js +0 -1641
- package/.worktrees/2c37b1d7/src/run/complete-handlers.js +0 -1552
- package/.worktrees/2c37b1d7/src/run/complete.js +0 -1259
- package/.worktrees/2c37b1d7/src/run/concurrent-detect.js +0 -156
- package/.worktrees/2c37b1d7/src/run/gates.js +0 -1111
- package/.worktrees/2c37b1d7/src/run/multi-repo-context.js +0 -208
- package/.worktrees/2c37b1d7/src/run/next.js +0 -128
- package/.worktrees/2c37b1d7/src/run/prompt.js +0 -843
- package/.worktrees/2c37b1d7/src/run/quick-audit.js +0 -186
- package/.worktrees/2c37b1d7/src/run/scan-profile.js +0 -269
- package/.worktrees/2c37b1d7/src/run/shared.js +0 -1562
- package/.worktrees/2c37b1d7/src/run/stage.js +0 -587
- package/.worktrees/2c37b1d7/src/run.js +0 -23
- package/.worktrees/2c37b1d7/src/scan-diff.js +0 -388
- package/.worktrees/2c37b1d7/src/scan-postcheck.js +0 -524
- package/.worktrees/2c37b1d7/src/scan-staleness.js +0 -95
- package/.worktrees/2c37b1d7/src/setup.js +0 -414
- package/.worktrees/2c37b1d7/src/sillyhub-mcp/client.js +0 -597
- package/.worktrees/2c37b1d7/src/sillyhub-mcp/config.js +0 -62
- package/.worktrees/2c37b1d7/src/spec-dir-typo.js +0 -50
- package/.worktrees/2c37b1d7/src/spec-sync.js +0 -358
- package/.worktrees/2c37b1d7/src/stage-contract-engine.js +0 -171
- package/.worktrees/2c37b1d7/src/stage-contract-spec.js +0 -551
- package/.worktrees/2c37b1d7/src/stage-contract.js +0 -948
- package/.worktrees/2c37b1d7/src/stage-review.js +0 -597
- package/.worktrees/2c37b1d7/src/stages/archive.js +0 -199
- package/.worktrees/2c37b1d7/src/stages/brainstorm-auto.js +0 -285
- package/.worktrees/2c37b1d7/src/stages/brainstorm.js +0 -624
- package/.worktrees/2c37b1d7/src/stages/cmd-existence.js +0 -145
- package/.worktrees/2c37b1d7/src/stages/doctor.js +0 -540
- package/.worktrees/2c37b1d7/src/stages/execute.js +0 -1277
- package/.worktrees/2c37b1d7/src/stages/explore.js +0 -43
- package/.worktrees/2c37b1d7/src/stages/index.js +0 -29
- package/.worktrees/2c37b1d7/src/stages/knowledge.js +0 -514
- package/.worktrees/2c37b1d7/src/stages/plan-postcheck.js +0 -1398
- package/.worktrees/2c37b1d7/src/stages/plan.js +0 -655
- package/.worktrees/2c37b1d7/src/stages/quick.js +0 -167
- package/.worktrees/2c37b1d7/src/stages/scan.js +0 -608
- package/.worktrees/2c37b1d7/src/stages/status.js +0 -64
- package/.worktrees/2c37b1d7/src/stages/verify.js +0 -246
- package/.worktrees/2c37b1d7/src/sync.js +0 -1470
- package/.worktrees/2c37b1d7/src/task-review.js +0 -1498
- package/.worktrees/2c37b1d7/src/taskcard-placeholders.js +0 -21
- package/.worktrees/2c37b1d7/src/taskcard.js +0 -250
- package/.worktrees/2c37b1d7/src/verify-postcheck.js +0 -1718
- package/.worktrees/2c37b1d7/src/verify-probes.js +0 -327
- package/.worktrees/2c37b1d7/src/version.js +0 -19
- package/.worktrees/2c37b1d7/src/workflow.js +0 -600
- package/.worktrees/2c37b1d7/src/workspace.js +0 -125
- package/.worktrees/2c37b1d7/src/worktree-apply.js +0 -1611
- package/.worktrees/2c37b1d7/src/worktree-deps.js +0 -668
- package/.worktrees/2c37b1d7/src/worktree.js +0 -1849
- package/.worktrees/2c37b1d7/templates/claude-instruction.md +0 -23
- package/.worktrees/2c37b1d7/templates/prompts/taskcard-rules.md +0 -29
- package/.worktrees/2c37b1d7/templates/prompts/testcase-design.md +0 -12
- package/.worktrees/2c37b1d7/templates/prompts/verify-probes.md +0 -32
- package/.worktrees/2c37b1d7/templates/workflows/archive-impact.yaml +0 -79
- package/.worktrees/2c37b1d7/templates/workflows/scan-docs.yaml +0 -132
- package/.worktrees/542c4415/.claude/skills/sillyspec-archive/SKILL.md +0 -87
- package/.worktrees/542c4415/.claude/skills/sillyspec-auto/SKILL.md +0 -93
- package/.worktrees/542c4415/.claude/skills/sillyspec-brainstorm/SKILL.md +0 -114
- package/.worktrees/542c4415/.claude/skills/sillyspec-commit/SKILL.md +0 -67
- package/.worktrees/542c4415/.claude/skills/sillyspec-continue/SKILL.md +0 -47
- package/.worktrees/542c4415/.claude/skills/sillyspec-doctor/SKILL.md +0 -76
- package/.worktrees/542c4415/.claude/skills/sillyspec-execute/SKILL.md +0 -214
- package/.worktrees/542c4415/.claude/skills/sillyspec-explore/SKILL.md +0 -102
- package/.worktrees/542c4415/.claude/skills/sillyspec-export/SKILL.md +0 -57
- package/.worktrees/542c4415/.claude/skills/sillyspec-init/SKILL.md +0 -177
- package/.worktrees/542c4415/.claude/skills/sillyspec-knowledge/SKILL.md +0 -270
- package/.worktrees/542c4415/.claude/skills/sillyspec-plan/SKILL.md +0 -156
- package/.worktrees/542c4415/.claude/skills/sillyspec-quick/SKILL.md +0 -116
- package/.worktrees/542c4415/.claude/skills/sillyspec-resume/SKILL.md +0 -70
- package/.worktrees/542c4415/.claude/skills/sillyspec-scan/SKILL.md +0 -79
- package/.worktrees/542c4415/.claude/skills/sillyspec-state/SKILL.md +0 -64
- package/.worktrees/542c4415/.claude/skills/sillyspec-status/SKILL.md +0 -54
- package/.worktrees/542c4415/.claude/skills/sillyspec-verify/SKILL.md +0 -87
- package/.worktrees/542c4415/.claude/skills/sillyspec-workspace/SKILL.md +0 -175
- package/.worktrees/542c4415/.gitattributes +0 -2
- package/.worktrees/542c4415/.husky/pre-push +0 -20
- package/.worktrees/542c4415/README.md +0 -203
- package/.worktrees/542c4415/SKILL.md +0 -91
- package/.worktrees/542c4415/architecture-analysis.md +0 -448
- package/.worktrees/542c4415/bin/sillyspec.js +0 -2
- package/.worktrees/542c4415/eval/README.md +0 -86
- package/.worktrees/542c4415/eval/eval.config.json +0 -28
- package/.worktrees/542c4415/eval/lib/adapters/cli.mjs +0 -63
- package/.worktrees/542c4415/eval/lib/adapters/dryrun.mjs +0 -27
- package/.worktrees/542c4415/eval/lib/config.mjs +0 -82
- package/.worktrees/542c4415/eval/lib/db.mjs +0 -76
- package/.worktrees/542c4415/eval/lib/report.mjs +0 -120
- package/.worktrees/542c4415/eval/lib/runner.mjs +0 -157
- package/.worktrees/542c4415/eval/lib/tasks.mjs +0 -73
- package/.worktrees/542c4415/eval/lib/util.mjs +0 -107
- package/.worktrees/542c4415/eval/lib/workdir.mjs +0 -30
- package/.worktrees/542c4415/eval/run.mjs +0 -83
- package/.worktrees/542c4415/eval/tasks/001-slugify/files/package.json +0 -6
- package/.worktrees/542c4415/eval/tasks/001-slugify/solution/src/slugify.mjs +0 -26
- package/.worktrees/542c4415/eval/tasks/001-slugify/task.json +0 -6
- package/.worktrees/542c4415/eval/tasks/001-slugify/verify.mjs +0 -28
- package/.worktrees/542c4415/eval/tasks/002-each-day/files/package.json +0 -6
- package/.worktrees/542c4415/eval/tasks/002-each-day/files/src/dates.mjs +0 -4
- package/.worktrees/542c4415/eval/tasks/002-each-day/solution/src/dates.mjs +0 -30
- package/.worktrees/542c4415/eval/tasks/002-each-day/task.json +0 -6
- package/.worktrees/542c4415/eval/tasks/002-each-day/verify.mjs +0 -31
- package/.worktrees/542c4415/eval/tasks/003-word-report/files/data/notes.txt +0 -5
- package/.worktrees/542c4415/eval/tasks/003-word-report/files/package.json +0 -6
- package/.worktrees/542c4415/eval/tasks/003-word-report/solution/bin/report.mjs +0 -36
- package/.worktrees/542c4415/eval/tasks/003-word-report/task.json +0 -6
- package/.worktrees/542c4415/eval/tasks/003-word-report/verify.mjs +0 -38
- package/.worktrees/542c4415/logo.jpg +0 -0
- package/.worktrees/542c4415/package-lock.json +0 -977
- package/.worktrees/542c4415/package.json +0 -41
- package/.worktrees/542c4415/packages/dashboard/dist/assets/index-Bq_Z2hne.js +0 -7446
- package/.worktrees/542c4415/packages/dashboard/dist/assets/index-O2W5RV4z.css +0 -1
- package/.worktrees/542c4415/packages/dashboard/dist/favicon.jpg +0 -0
- package/.worktrees/542c4415/packages/dashboard/dist/index.html +0 -16
- package/.worktrees/542c4415/packages/dashboard/dist/logo.jpg +0 -0
- package/.worktrees/542c4415/packages/dashboard/dist/prototype-dashboard.html +0 -836
- package/.worktrees/542c4415/packages/dashboard/dist/prototype-overview.html +0 -256
- package/.worktrees/542c4415/packages/dashboard/package.json +0 -25
- package/.worktrees/542c4415/packages/dashboard/server/executor.js +0 -95
- package/.worktrees/542c4415/packages/dashboard/server/index.js +0 -679
- package/.worktrees/542c4415/packages/dashboard/server/parser.js +0 -526
- package/.worktrees/542c4415/packages/dashboard/server/watcher.js +0 -357
- package/.worktrees/542c4415/src/agent-session-log.js +0 -803
- package/.worktrees/542c4415/src/change-list.js +0 -290
- package/.worktrees/542c4415/src/change-risk-profile.js +0 -339
- package/.worktrees/542c4415/src/check-primitives.js +0 -65
- package/.worktrees/542c4415/src/classify-change.js +0 -109
- package/.worktrees/542c4415/src/commit-suggest.js +0 -202
- package/.worktrees/542c4415/src/config-cat.js +0 -88
- package/.worktrees/542c4415/src/config-schema.js +0 -328
- package/.worktrees/542c4415/src/constants.js +0 -97
- package/.worktrees/542c4415/src/contract-matrix.js +0 -533
- package/.worktrees/542c4415/src/datetime.js +0 -20
- package/.worktrees/542c4415/src/db-engine.js +0 -55
- package/.worktrees/542c4415/src/db.js +0 -381
- package/.worktrees/542c4415/src/decision-distill.js +0 -517
- package/.worktrees/542c4415/src/dispatch/backends/local-agent.js +0 -155
- package/.worktrees/542c4415/src/dispatch/backends/sillyhub-mcp.js +0 -245
- package/.worktrees/542c4415/src/dispatch/probe.js +0 -246
- package/.worktrees/542c4415/src/dispatch/strategy.js +0 -121
- package/.worktrees/542c4415/src/docs-check.js +0 -825
- package/.worktrees/542c4415/src/docs-debt.js +0 -393
- package/.worktrees/542c4415/src/docs-gate.js +0 -107
- package/.worktrees/542c4415/src/doctor-diagnostics.js +0 -1099
- package/.worktrees/542c4415/src/endpoint-extractor.js +0 -409
- package/.worktrees/542c4415/src/foreign-declared.js +0 -155
- package/.worktrees/542c4415/src/fs-atomic.js +0 -73
- package/.worktrees/542c4415/src/git-helper.js +0 -150
- package/.worktrees/542c4415/src/hooks/claude-pre-tool-use.cjs +0 -130
- package/.worktrees/542c4415/src/hooks/worktree-guard.js +0 -892
- package/.worktrees/542c4415/src/index.js +0 -2854
- package/.worktrees/542c4415/src/init.js +0 -626
- package/.worktrees/542c4415/src/knowledge-match.js +0 -231
- package/.worktrees/542c4415/src/local-detect.js +0 -128
- package/.worktrees/542c4415/src/local-register.js +0 -104
- package/.worktrees/542c4415/src/machine-interface.js +0 -543
- package/.worktrees/542c4415/src/migrate.js +0 -127
- package/.worktrees/542c4415/src/module-impact.js +0 -166
- package/.worktrees/542c4415/src/module-resolve.js +0 -222
- package/.worktrees/542c4415/src/modules.js +0 -580
- package/.worktrees/542c4415/src/plan-adopt-waves.js +0 -126
- package/.worktrees/542c4415/src/progress/change-registry.js +0 -336
- package/.worktrees/542c4415/src/progress/consistency-doctor.js +0 -355
- package/.worktrees/542c4415/src/progress/shared.js +0 -36
- package/.worktrees/542c4415/src/progress/stage-machine.js +0 -594
- package/.worktrees/542c4415/src/progress/step-store.js +0 -265
- package/.worktrees/542c4415/src/progress.js +0 -1304
- package/.worktrees/542c4415/src/quick-recommend.js +0 -115
- package/.worktrees/542c4415/src/quicklog.js +0 -883
- package/.worktrees/542c4415/src/review-tier.js +0 -77
- package/.worktrees/542c4415/src/run/command.js +0 -1641
- package/.worktrees/542c4415/src/run/complete-handlers.js +0 -1552
- package/.worktrees/542c4415/src/run/complete.js +0 -1259
- package/.worktrees/542c4415/src/run/concurrent-detect.js +0 -156
- package/.worktrees/542c4415/src/run/gates.js +0 -1111
- package/.worktrees/542c4415/src/run/multi-repo-context.js +0 -208
- package/.worktrees/542c4415/src/run/next.js +0 -128
- package/.worktrees/542c4415/src/run/prompt.js +0 -843
- package/.worktrees/542c4415/src/run/quick-audit.js +0 -186
- package/.worktrees/542c4415/src/run/scan-profile.js +0 -269
- package/.worktrees/542c4415/src/run/shared.js +0 -1562
- package/.worktrees/542c4415/src/run/stage.js +0 -587
- package/.worktrees/542c4415/src/run.js +0 -23
- package/.worktrees/542c4415/src/scan-diff.js +0 -388
- package/.worktrees/542c4415/src/scan-postcheck.js +0 -524
- package/.worktrees/542c4415/src/scan-staleness.js +0 -95
- package/.worktrees/542c4415/src/setup.js +0 -414
- package/.worktrees/542c4415/src/sillyhub-mcp/client.js +0 -597
- package/.worktrees/542c4415/src/sillyhub-mcp/config.js +0 -62
- package/.worktrees/542c4415/src/spec-dir-typo.js +0 -50
- package/.worktrees/542c4415/src/spec-sync.js +0 -358
- package/.worktrees/542c4415/src/stage-contract-engine.js +0 -171
- package/.worktrees/542c4415/src/stage-contract-spec.js +0 -551
- package/.worktrees/542c4415/src/stage-contract.js +0 -948
- package/.worktrees/542c4415/src/stage-review.js +0 -597
- package/.worktrees/542c4415/src/stages/archive.js +0 -199
- package/.worktrees/542c4415/src/stages/brainstorm-auto.js +0 -285
- package/.worktrees/542c4415/src/stages/brainstorm.js +0 -624
- package/.worktrees/542c4415/src/stages/cmd-existence.js +0 -145
- package/.worktrees/542c4415/src/stages/doctor.js +0 -540
- package/.worktrees/542c4415/src/stages/execute.js +0 -1277
- package/.worktrees/542c4415/src/stages/explore.js +0 -43
- package/.worktrees/542c4415/src/stages/index.js +0 -29
- package/.worktrees/542c4415/src/stages/knowledge.js +0 -514
- package/.worktrees/542c4415/src/stages/plan-postcheck.js +0 -1398
- package/.worktrees/542c4415/src/stages/plan.js +0 -655
- package/.worktrees/542c4415/src/stages/quick.js +0 -167
- package/.worktrees/542c4415/src/stages/scan.js +0 -608
- package/.worktrees/542c4415/src/stages/status.js +0 -64
- package/.worktrees/542c4415/src/stages/verify.js +0 -246
- package/.worktrees/542c4415/src/sync.js +0 -1470
- package/.worktrees/542c4415/src/task-review.js +0 -1498
- package/.worktrees/542c4415/src/taskcard-placeholders.js +0 -21
- package/.worktrees/542c4415/src/taskcard.js +0 -250
- package/.worktrees/542c4415/src/verify-postcheck.js +0 -1718
- package/.worktrees/542c4415/src/verify-probes.js +0 -327
- package/.worktrees/542c4415/src/version.js +0 -19
- package/.worktrees/542c4415/src/workflow.js +0 -600
- package/.worktrees/542c4415/src/workspace.js +0 -125
- package/.worktrees/542c4415/src/worktree-apply.js +0 -1611
- package/.worktrees/542c4415/src/worktree-deps.js +0 -668
- package/.worktrees/542c4415/src/worktree.js +0 -1849
- package/.worktrees/542c4415/templates/claude-instruction.md +0 -23
- package/.worktrees/542c4415/templates/prompts/taskcard-rules.md +0 -29
- package/.worktrees/542c4415/templates/prompts/testcase-design.md +0 -12
- package/.worktrees/542c4415/templates/prompts/verify-probes.md +0 -32
- package/.worktrees/542c4415/templates/workflows/archive-impact.yaml +0 -79
- package/.worktrees/542c4415/templates/workflows/scan-docs.yaml +0 -132
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-archive/SKILL.md +0 -87
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-auto/SKILL.md +0 -93
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-brainstorm/SKILL.md +0 -114
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-commit/SKILL.md +0 -67
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-continue/SKILL.md +0 -47
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-doctor/SKILL.md +0 -76
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-execute/SKILL.md +0 -214
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-explore/SKILL.md +0 -102
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-export/SKILL.md +0 -57
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-init/SKILL.md +0 -177
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-knowledge/SKILL.md +0 -270
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-plan/SKILL.md +0 -156
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-propose/SKILL.md +0 -87
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-quick/SKILL.md +0 -116
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-resume/SKILL.md +0 -70
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-scan/SKILL.md +0 -79
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-state/SKILL.md +0 -64
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-status/SKILL.md +0 -54
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-verify/SKILL.md +0 -87
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-workspace/SKILL.md +0 -175
- package/.worktrees/8d2d0392/.claude/skills/verify-per-user/SKILL.md +0 -6
- package/.worktrees/8d2d0392/.gitattributes +0 -2
- package/.worktrees/8d2d0392/.husky/pre-push +0 -20
- package/.worktrees/8d2d0392/README.md +0 -203
- package/.worktrees/8d2d0392/SKILL.md +0 -91
- package/.worktrees/8d2d0392/architecture-analysis.md +0 -448
- package/.worktrees/8d2d0392/bin/sillyspec.js +0 -2
- package/.worktrees/8d2d0392/eval/README.md +0 -86
- package/.worktrees/8d2d0392/eval/eval.config.json +0 -28
- package/.worktrees/8d2d0392/eval/lib/adapters/cli.mjs +0 -63
- package/.worktrees/8d2d0392/eval/lib/adapters/dryrun.mjs +0 -27
- package/.worktrees/8d2d0392/eval/lib/config.mjs +0 -82
- package/.worktrees/8d2d0392/eval/lib/db.mjs +0 -76
- package/.worktrees/8d2d0392/eval/lib/report.mjs +0 -120
- package/.worktrees/8d2d0392/eval/lib/runner.mjs +0 -157
- package/.worktrees/8d2d0392/eval/lib/tasks.mjs +0 -73
- package/.worktrees/8d2d0392/eval/lib/util.mjs +0 -107
- package/.worktrees/8d2d0392/eval/lib/workdir.mjs +0 -30
- package/.worktrees/8d2d0392/eval/run.mjs +0 -83
- package/.worktrees/8d2d0392/eval/tasks/001-slugify/files/package.json +0 -6
- package/.worktrees/8d2d0392/eval/tasks/001-slugify/solution/src/slugify.mjs +0 -26
- package/.worktrees/8d2d0392/eval/tasks/001-slugify/task.json +0 -6
- package/.worktrees/8d2d0392/eval/tasks/001-slugify/verify.mjs +0 -28
- package/.worktrees/8d2d0392/eval/tasks/002-each-day/files/package.json +0 -6
- package/.worktrees/8d2d0392/eval/tasks/002-each-day/files/src/dates.mjs +0 -4
- package/.worktrees/8d2d0392/eval/tasks/002-each-day/solution/src/dates.mjs +0 -30
- package/.worktrees/8d2d0392/eval/tasks/002-each-day/task.json +0 -6
- package/.worktrees/8d2d0392/eval/tasks/002-each-day/verify.mjs +0 -31
- package/.worktrees/8d2d0392/eval/tasks/003-word-report/files/data/notes.txt +0 -5
- package/.worktrees/8d2d0392/eval/tasks/003-word-report/files/package.json +0 -6
- package/.worktrees/8d2d0392/eval/tasks/003-word-report/solution/bin/report.mjs +0 -36
- package/.worktrees/8d2d0392/eval/tasks/003-word-report/task.json +0 -6
- package/.worktrees/8d2d0392/eval/tasks/003-word-report/verify.mjs +0 -38
- package/.worktrees/8d2d0392/logo.jpg +0 -0
- package/.worktrees/8d2d0392/package-lock.json +0 -977
- package/.worktrees/8d2d0392/package.json +0 -41
- package/.worktrees/8d2d0392/packages/dashboard/dist/assets/index-Bq_Z2hne.js +0 -7446
- package/.worktrees/8d2d0392/packages/dashboard/dist/assets/index-O2W5RV4z.css +0 -1
- package/.worktrees/8d2d0392/packages/dashboard/dist/favicon.jpg +0 -0
- package/.worktrees/8d2d0392/packages/dashboard/dist/index.html +0 -16
- package/.worktrees/8d2d0392/packages/dashboard/dist/logo.jpg +0 -0
- package/.worktrees/8d2d0392/packages/dashboard/dist/prototype-dashboard.html +0 -836
- package/.worktrees/8d2d0392/packages/dashboard/dist/prototype-overview.html +0 -256
- package/.worktrees/8d2d0392/packages/dashboard/package.json +0 -25
- package/.worktrees/8d2d0392/packages/dashboard/server/executor.js +0 -95
- package/.worktrees/8d2d0392/packages/dashboard/server/index.js +0 -679
- package/.worktrees/8d2d0392/packages/dashboard/server/parser.js +0 -526
- package/.worktrees/8d2d0392/packages/dashboard/server/watcher.js +0 -357
- package/.worktrees/8d2d0392/src/agent-session-log.js +0 -803
- package/.worktrees/8d2d0392/src/change-list.js +0 -290
- package/.worktrees/8d2d0392/src/change-risk-profile.js +0 -339
- package/.worktrees/8d2d0392/src/check-primitives.js +0 -65
- package/.worktrees/8d2d0392/src/classify-change.js +0 -109
- package/.worktrees/8d2d0392/src/commit-suggest.js +0 -202
- package/.worktrees/8d2d0392/src/config-cat.js +0 -88
- package/.worktrees/8d2d0392/src/config-schema.js +0 -328
- package/.worktrees/8d2d0392/src/constants.js +0 -97
- package/.worktrees/8d2d0392/src/contract-matrix.js +0 -533
- package/.worktrees/8d2d0392/src/datetime.js +0 -20
- package/.worktrees/8d2d0392/src/db-engine.js +0 -55
- package/.worktrees/8d2d0392/src/db.js +0 -381
- package/.worktrees/8d2d0392/src/decision-distill.js +0 -517
- package/.worktrees/8d2d0392/src/dispatch/backends/local-agent.js +0 -155
- package/.worktrees/8d2d0392/src/dispatch/backends/sillyhub-mcp.js +0 -245
- package/.worktrees/8d2d0392/src/dispatch/probe.js +0 -246
- package/.worktrees/8d2d0392/src/dispatch/strategy.js +0 -121
- package/.worktrees/8d2d0392/src/docs-check.js +0 -825
- package/.worktrees/8d2d0392/src/docs-debt.js +0 -393
- package/.worktrees/8d2d0392/src/docs-gate.js +0 -107
- package/.worktrees/8d2d0392/src/doctor-diagnostics.js +0 -1099
- package/.worktrees/8d2d0392/src/endpoint-extractor.js +0 -409
- package/.worktrees/8d2d0392/src/foreign-declared.js +0 -78
- package/.worktrees/8d2d0392/src/fs-atomic.js +0 -73
- package/.worktrees/8d2d0392/src/git-helper.js +0 -150
- package/.worktrees/8d2d0392/src/hooks/claude-pre-tool-use.cjs +0 -130
- package/.worktrees/8d2d0392/src/hooks/worktree-guard.js +0 -892
- package/.worktrees/8d2d0392/src/index.js +0 -2854
- package/.worktrees/8d2d0392/src/init.js +0 -626
- package/.worktrees/8d2d0392/src/knowledge-match.js +0 -231
- package/.worktrees/8d2d0392/src/local-detect.js +0 -128
- package/.worktrees/8d2d0392/src/local-register.js +0 -104
- package/.worktrees/8d2d0392/src/machine-interface.js +0 -543
- package/.worktrees/8d2d0392/src/migrate.js +0 -127
- package/.worktrees/8d2d0392/src/module-impact.js +0 -166
- package/.worktrees/8d2d0392/src/module-resolve.js +0 -222
- package/.worktrees/8d2d0392/src/modules.js +0 -580
- package/.worktrees/8d2d0392/src/plan-adopt-waves.js +0 -126
- package/.worktrees/8d2d0392/src/progress/change-registry.js +0 -336
- package/.worktrees/8d2d0392/src/progress/consistency-doctor.js +0 -355
- package/.worktrees/8d2d0392/src/progress/shared.js +0 -36
- package/.worktrees/8d2d0392/src/progress/stage-machine.js +0 -594
- package/.worktrees/8d2d0392/src/progress/step-store.js +0 -265
- package/.worktrees/8d2d0392/src/progress.js +0 -1304
- package/.worktrees/8d2d0392/src/quick-recommend.js +0 -115
- package/.worktrees/8d2d0392/src/quicklog.js +0 -883
- package/.worktrees/8d2d0392/src/review-tier.js +0 -77
- package/.worktrees/8d2d0392/src/run/command.js +0 -1641
- package/.worktrees/8d2d0392/src/run/complete-handlers.js +0 -1552
- package/.worktrees/8d2d0392/src/run/complete.js +0 -1259
- package/.worktrees/8d2d0392/src/run/concurrent-detect.js +0 -156
- package/.worktrees/8d2d0392/src/run/gates.js +0 -1094
- package/.worktrees/8d2d0392/src/run/multi-repo-context.js +0 -208
- package/.worktrees/8d2d0392/src/run/next.js +0 -128
- package/.worktrees/8d2d0392/src/run/prompt.js +0 -843
- package/.worktrees/8d2d0392/src/run/quick-audit.js +0 -186
- package/.worktrees/8d2d0392/src/run/scan-profile.js +0 -269
- package/.worktrees/8d2d0392/src/run/shared.js +0 -1562
- package/.worktrees/8d2d0392/src/run/stage.js +0 -587
- package/.worktrees/8d2d0392/src/run.js +0 -23
- package/.worktrees/8d2d0392/src/scan-diff.js +0 -388
- package/.worktrees/8d2d0392/src/scan-postcheck.js +0 -524
- package/.worktrees/8d2d0392/src/scan-staleness.js +0 -95
- package/.worktrees/8d2d0392/src/setup.js +0 -414
- package/.worktrees/8d2d0392/src/sillyhub-mcp/client.js +0 -597
- package/.worktrees/8d2d0392/src/sillyhub-mcp/config.js +0 -62
- package/.worktrees/8d2d0392/src/spec-dir-typo.js +0 -50
- package/.worktrees/8d2d0392/src/spec-sync.js +0 -358
- package/.worktrees/8d2d0392/src/stage-contract-engine.js +0 -171
- package/.worktrees/8d2d0392/src/stage-contract-spec.js +0 -551
- package/.worktrees/8d2d0392/src/stage-contract.js +0 -948
- package/.worktrees/8d2d0392/src/stage-review.js +0 -597
- package/.worktrees/8d2d0392/src/stages/archive.js +0 -199
- package/.worktrees/8d2d0392/src/stages/brainstorm-auto.js +0 -285
- package/.worktrees/8d2d0392/src/stages/brainstorm.js +0 -624
- package/.worktrees/8d2d0392/src/stages/cmd-existence.js +0 -145
- package/.worktrees/8d2d0392/src/stages/doctor.js +0 -540
- package/.worktrees/8d2d0392/src/stages/execute.js +0 -1277
- package/.worktrees/8d2d0392/src/stages/explore.js +0 -43
- package/.worktrees/8d2d0392/src/stages/index.js +0 -29
- package/.worktrees/8d2d0392/src/stages/knowledge.js +0 -514
- package/.worktrees/8d2d0392/src/stages/plan-postcheck.js +0 -1398
- package/.worktrees/8d2d0392/src/stages/plan.js +0 -651
- package/.worktrees/8d2d0392/src/stages/quick.js +0 -167
- package/.worktrees/8d2d0392/src/stages/scan.js +0 -608
- package/.worktrees/8d2d0392/src/stages/status.js +0 -64
- package/.worktrees/8d2d0392/src/stages/verify.js +0 -246
- package/.worktrees/8d2d0392/src/sync.js +0 -1470
- package/.worktrees/8d2d0392/src/task-review.js +0 -1498
- package/.worktrees/8d2d0392/src/taskcard-placeholders.js +0 -21
- package/.worktrees/8d2d0392/src/taskcard.js +0 -217
- package/.worktrees/8d2d0392/src/verify-postcheck.js +0 -1718
- package/.worktrees/8d2d0392/src/verify-probes.js +0 -327
- package/.worktrees/8d2d0392/src/version.js +0 -19
- package/.worktrees/8d2d0392/src/workflow.js +0 -600
- package/.worktrees/8d2d0392/src/workspace.js +0 -125
- package/.worktrees/8d2d0392/src/worktree-apply.js +0 -1611
- package/.worktrees/8d2d0392/src/worktree-deps.js +0 -576
- package/.worktrees/8d2d0392/src/worktree.js +0 -1838
- package/.worktrees/8d2d0392/templates/claude-instruction.md +0 -23
- package/.worktrees/8d2d0392/templates/prompts/taskcard-rules.md +0 -29
- package/.worktrees/8d2d0392/templates/prompts/testcase-design.md +0 -12
- package/.worktrees/8d2d0392/templates/prompts/verify-probes.md +0 -32
- package/.worktrees/8d2d0392/templates/workflows/archive-impact.yaml +0 -79
- package/.worktrees/8d2d0392/templates/workflows/scan-docs.yaml +0 -132
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-archive/SKILL.md +0 -87
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-auto/SKILL.md +0 -93
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-brainstorm/SKILL.md +0 -114
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-commit/SKILL.md +0 -67
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-continue/SKILL.md +0 -47
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-doctor/SKILL.md +0 -76
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-execute/SKILL.md +0 -214
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-explore/SKILL.md +0 -102
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-export/SKILL.md +0 -57
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-init/SKILL.md +0 -177
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-knowledge/SKILL.md +0 -270
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-plan/SKILL.md +0 -156
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-quick/SKILL.md +0 -116
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-resume/SKILL.md +0 -70
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-scan/SKILL.md +0 -79
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-state/SKILL.md +0 -64
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-status/SKILL.md +0 -54
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-verify/SKILL.md +0 -87
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-workspace/SKILL.md +0 -175
- package/.worktrees/c1eae35e/.gitattributes +0 -2
- package/.worktrees/c1eae35e/.husky/pre-push +0 -20
- package/.worktrees/c1eae35e/README.md +0 -203
- package/.worktrees/c1eae35e/SKILL.md +0 -91
- package/.worktrees/c1eae35e/architecture-analysis.md +0 -448
- package/.worktrees/c1eae35e/bin/sillyspec.js +0 -2
- package/.worktrees/c1eae35e/eval/README.md +0 -86
- package/.worktrees/c1eae35e/eval/eval.config.json +0 -28
- package/.worktrees/c1eae35e/eval/lib/adapters/cli.mjs +0 -63
- package/.worktrees/c1eae35e/eval/lib/adapters/dryrun.mjs +0 -27
- package/.worktrees/c1eae35e/eval/lib/config.mjs +0 -82
- package/.worktrees/c1eae35e/eval/lib/db.mjs +0 -76
- package/.worktrees/c1eae35e/eval/lib/report.mjs +0 -120
- package/.worktrees/c1eae35e/eval/lib/runner.mjs +0 -157
- package/.worktrees/c1eae35e/eval/lib/tasks.mjs +0 -73
- package/.worktrees/c1eae35e/eval/lib/util.mjs +0 -107
- package/.worktrees/c1eae35e/eval/lib/workdir.mjs +0 -30
- package/.worktrees/c1eae35e/eval/run.mjs +0 -83
- package/.worktrees/c1eae35e/eval/tasks/001-slugify/files/package.json +0 -6
- package/.worktrees/c1eae35e/eval/tasks/001-slugify/solution/src/slugify.mjs +0 -26
- package/.worktrees/c1eae35e/eval/tasks/001-slugify/task.json +0 -6
- package/.worktrees/c1eae35e/eval/tasks/001-slugify/verify.mjs +0 -28
- package/.worktrees/c1eae35e/eval/tasks/002-each-day/files/package.json +0 -6
- package/.worktrees/c1eae35e/eval/tasks/002-each-day/files/src/dates.mjs +0 -4
- package/.worktrees/c1eae35e/eval/tasks/002-each-day/solution/src/dates.mjs +0 -30
- package/.worktrees/c1eae35e/eval/tasks/002-each-day/task.json +0 -6
- package/.worktrees/c1eae35e/eval/tasks/002-each-day/verify.mjs +0 -31
- package/.worktrees/c1eae35e/eval/tasks/003-word-report/files/data/notes.txt +0 -5
- package/.worktrees/c1eae35e/eval/tasks/003-word-report/files/package.json +0 -6
- package/.worktrees/c1eae35e/eval/tasks/003-word-report/solution/bin/report.mjs +0 -36
- package/.worktrees/c1eae35e/eval/tasks/003-word-report/task.json +0 -6
- package/.worktrees/c1eae35e/eval/tasks/003-word-report/verify.mjs +0 -38
- package/.worktrees/c1eae35e/logo.jpg +0 -0
- package/.worktrees/c1eae35e/package-lock.json +0 -977
- package/.worktrees/c1eae35e/package.json +0 -41
- package/.worktrees/c1eae35e/packages/dashboard/dist/assets/index-Bq_Z2hne.js +0 -7446
- package/.worktrees/c1eae35e/packages/dashboard/dist/assets/index-O2W5RV4z.css +0 -1
- package/.worktrees/c1eae35e/packages/dashboard/dist/favicon.jpg +0 -0
- package/.worktrees/c1eae35e/packages/dashboard/dist/index.html +0 -16
- package/.worktrees/c1eae35e/packages/dashboard/dist/logo.jpg +0 -0
- package/.worktrees/c1eae35e/packages/dashboard/dist/prototype-dashboard.html +0 -836
- package/.worktrees/c1eae35e/packages/dashboard/dist/prototype-overview.html +0 -256
- package/.worktrees/c1eae35e/packages/dashboard/package.json +0 -25
- package/.worktrees/c1eae35e/packages/dashboard/server/executor.js +0 -95
- package/.worktrees/c1eae35e/packages/dashboard/server/index.js +0 -679
- package/.worktrees/c1eae35e/packages/dashboard/server/parser.js +0 -526
- package/.worktrees/c1eae35e/packages/dashboard/server/watcher.js +0 -357
- package/.worktrees/c1eae35e/src/agent-session-log.js +0 -803
- package/.worktrees/c1eae35e/src/change-list.js +0 -290
- package/.worktrees/c1eae35e/src/change-risk-profile.js +0 -339
- package/.worktrees/c1eae35e/src/check-primitives.js +0 -65
- package/.worktrees/c1eae35e/src/classify-change.js +0 -109
- package/.worktrees/c1eae35e/src/commit-suggest.js +0 -202
- package/.worktrees/c1eae35e/src/config-cat.js +0 -88
- package/.worktrees/c1eae35e/src/config-schema.js +0 -328
- package/.worktrees/c1eae35e/src/constants.js +0 -97
- package/.worktrees/c1eae35e/src/contract-matrix.js +0 -533
- package/.worktrees/c1eae35e/src/datetime.js +0 -20
- package/.worktrees/c1eae35e/src/db-engine.js +0 -55
- package/.worktrees/c1eae35e/src/db.js +0 -381
- package/.worktrees/c1eae35e/src/decision-distill.js +0 -517
- package/.worktrees/c1eae35e/src/dispatch/backends/local-agent.js +0 -155
- package/.worktrees/c1eae35e/src/dispatch/backends/sillyhub-mcp.js +0 -245
- package/.worktrees/c1eae35e/src/dispatch/probe.js +0 -246
- package/.worktrees/c1eae35e/src/dispatch/strategy.js +0 -121
- package/.worktrees/c1eae35e/src/docs-check.js +0 -825
- package/.worktrees/c1eae35e/src/docs-debt.js +0 -393
- package/.worktrees/c1eae35e/src/docs-gate.js +0 -107
- package/.worktrees/c1eae35e/src/doctor-diagnostics.js +0 -1099
- package/.worktrees/c1eae35e/src/endpoint-extractor.js +0 -409
- package/.worktrees/c1eae35e/src/foreign-declared.js +0 -155
- package/.worktrees/c1eae35e/src/fs-atomic.js +0 -73
- package/.worktrees/c1eae35e/src/git-helper.js +0 -150
- package/.worktrees/c1eae35e/src/hooks/claude-pre-tool-use.cjs +0 -130
- package/.worktrees/c1eae35e/src/hooks/worktree-guard.js +0 -892
- package/.worktrees/c1eae35e/src/index.js +0 -2854
- package/.worktrees/c1eae35e/src/init.js +0 -626
- package/.worktrees/c1eae35e/src/knowledge-match.js +0 -231
- package/.worktrees/c1eae35e/src/local-detect.js +0 -128
- package/.worktrees/c1eae35e/src/local-register.js +0 -104
- package/.worktrees/c1eae35e/src/machine-interface.js +0 -543
- package/.worktrees/c1eae35e/src/migrate.js +0 -127
- package/.worktrees/c1eae35e/src/module-impact.js +0 -166
- package/.worktrees/c1eae35e/src/module-resolve.js +0 -222
- package/.worktrees/c1eae35e/src/modules.js +0 -580
- package/.worktrees/c1eae35e/src/plan-adopt-waves.js +0 -126
- package/.worktrees/c1eae35e/src/progress/change-registry.js +0 -336
- package/.worktrees/c1eae35e/src/progress/consistency-doctor.js +0 -355
- package/.worktrees/c1eae35e/src/progress/shared.js +0 -36
- package/.worktrees/c1eae35e/src/progress/stage-machine.js +0 -594
- package/.worktrees/c1eae35e/src/progress/step-store.js +0 -265
- package/.worktrees/c1eae35e/src/progress.js +0 -1304
- package/.worktrees/c1eae35e/src/quick-recommend.js +0 -115
- package/.worktrees/c1eae35e/src/quicklog.js +0 -883
- package/.worktrees/c1eae35e/src/review-tier.js +0 -77
- package/.worktrees/c1eae35e/src/run/command.js +0 -1641
- package/.worktrees/c1eae35e/src/run/complete-handlers.js +0 -1552
- package/.worktrees/c1eae35e/src/run/complete.js +0 -1259
- package/.worktrees/c1eae35e/src/run/concurrent-detect.js +0 -156
- package/.worktrees/c1eae35e/src/run/gates.js +0 -1111
- package/.worktrees/c1eae35e/src/run/multi-repo-context.js +0 -208
- package/.worktrees/c1eae35e/src/run/next.js +0 -128
- package/.worktrees/c1eae35e/src/run/prompt.js +0 -843
- package/.worktrees/c1eae35e/src/run/quick-audit.js +0 -186
- package/.worktrees/c1eae35e/src/run/scan-profile.js +0 -269
- package/.worktrees/c1eae35e/src/run/shared.js +0 -1562
- package/.worktrees/c1eae35e/src/run/stage.js +0 -587
- package/.worktrees/c1eae35e/src/run.js +0 -23
- package/.worktrees/c1eae35e/src/scan-diff.js +0 -388
- package/.worktrees/c1eae35e/src/scan-postcheck.js +0 -524
- package/.worktrees/c1eae35e/src/scan-staleness.js +0 -95
- package/.worktrees/c1eae35e/src/setup.js +0 -414
- package/.worktrees/c1eae35e/src/sillyhub-mcp/client.js +0 -597
- package/.worktrees/c1eae35e/src/sillyhub-mcp/config.js +0 -62
- package/.worktrees/c1eae35e/src/spec-dir-typo.js +0 -50
- package/.worktrees/c1eae35e/src/spec-sync.js +0 -358
- package/.worktrees/c1eae35e/src/stage-contract-engine.js +0 -171
- package/.worktrees/c1eae35e/src/stage-contract-spec.js +0 -551
- package/.worktrees/c1eae35e/src/stage-contract.js +0 -948
- package/.worktrees/c1eae35e/src/stage-review.js +0 -597
- package/.worktrees/c1eae35e/src/stages/archive.js +0 -199
- package/.worktrees/c1eae35e/src/stages/brainstorm-auto.js +0 -285
- package/.worktrees/c1eae35e/src/stages/brainstorm.js +0 -624
- package/.worktrees/c1eae35e/src/stages/cmd-existence.js +0 -145
- package/.worktrees/c1eae35e/src/stages/doctor.js +0 -540
- package/.worktrees/c1eae35e/src/stages/execute.js +0 -1277
- package/.worktrees/c1eae35e/src/stages/explore.js +0 -43
- package/.worktrees/c1eae35e/src/stages/index.js +0 -29
- package/.worktrees/c1eae35e/src/stages/knowledge.js +0 -514
- package/.worktrees/c1eae35e/src/stages/plan-postcheck.js +0 -1398
- package/.worktrees/c1eae35e/src/stages/plan.js +0 -655
- package/.worktrees/c1eae35e/src/stages/quick.js +0 -167
- package/.worktrees/c1eae35e/src/stages/scan.js +0 -608
- package/.worktrees/c1eae35e/src/stages/status.js +0 -64
- package/.worktrees/c1eae35e/src/stages/verify.js +0 -246
- package/.worktrees/c1eae35e/src/sync.js +0 -1470
- package/.worktrees/c1eae35e/src/task-review.js +0 -1498
- package/.worktrees/c1eae35e/src/taskcard-placeholders.js +0 -21
- package/.worktrees/c1eae35e/src/taskcard.js +0 -250
- package/.worktrees/c1eae35e/src/verify-postcheck.js +0 -1718
- package/.worktrees/c1eae35e/src/verify-probes.js +0 -327
- package/.worktrees/c1eae35e/src/version.js +0 -19
- package/.worktrees/c1eae35e/src/workflow.js +0 -600
- package/.worktrees/c1eae35e/src/workspace.js +0 -125
- package/.worktrees/c1eae35e/src/worktree-apply.js +0 -1611
- package/.worktrees/c1eae35e/src/worktree-deps.js +0 -668
- package/.worktrees/c1eae35e/src/worktree.js +0 -1849
- package/.worktrees/c1eae35e/templates/claude-instruction.md +0 -23
- package/.worktrees/c1eae35e/templates/prompts/taskcard-rules.md +0 -29
- package/.worktrees/c1eae35e/templates/prompts/testcase-design.md +0 -12
- package/.worktrees/c1eae35e/templates/prompts/verify-probes.md +0 -32
- package/.worktrees/c1eae35e/templates/workflows/archive-impact.yaml +0 -79
- package/.worktrees/c1eae35e/templates/workflows/scan-docs.yaml +0 -132
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-archive/SKILL.md +0 -87
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-auto/SKILL.md +0 -93
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-brainstorm/SKILL.md +0 -114
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-commit/SKILL.md +0 -67
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-continue/SKILL.md +0 -47
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-doctor/SKILL.md +0 -76
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-execute/SKILL.md +0 -214
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-explore/SKILL.md +0 -102
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-export/SKILL.md +0 -57
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-init/SKILL.md +0 -177
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-knowledge/SKILL.md +0 -270
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-plan/SKILL.md +0 -156
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-propose/SKILL.md +0 -87
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-quick/SKILL.md +0 -116
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-resume/SKILL.md +0 -70
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-scan/SKILL.md +0 -79
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-state/SKILL.md +0 -64
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-status/SKILL.md +0 -54
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-verify/SKILL.md +0 -87
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-workspace/SKILL.md +0 -175
- package/.worktrees/dafc71ad/.gitattributes +0 -2
- package/.worktrees/dafc71ad/.husky/pre-push +0 -20
- package/.worktrees/dafc71ad/README.md +0 -203
- package/.worktrees/dafc71ad/SKILL.md +0 -91
- package/.worktrees/dafc71ad/analysis.md +0 -366
- package/.worktrees/dafc71ad/architecture-analysis.md +0 -448
- package/.worktrees/dafc71ad/bin/sillyspec.js +0 -2
- package/.worktrees/dafc71ad/eval/README.md +0 -86
- package/.worktrees/dafc71ad/eval/eval.config.json +0 -28
- package/.worktrees/dafc71ad/eval/lib/adapters/cli.mjs +0 -63
- package/.worktrees/dafc71ad/eval/lib/adapters/dryrun.mjs +0 -27
- package/.worktrees/dafc71ad/eval/lib/config.mjs +0 -82
- package/.worktrees/dafc71ad/eval/lib/db.mjs +0 -76
- package/.worktrees/dafc71ad/eval/lib/report.mjs +0 -120
- package/.worktrees/dafc71ad/eval/lib/runner.mjs +0 -157
- package/.worktrees/dafc71ad/eval/lib/tasks.mjs +0 -73
- package/.worktrees/dafc71ad/eval/lib/util.mjs +0 -107
- package/.worktrees/dafc71ad/eval/lib/workdir.mjs +0 -30
- package/.worktrees/dafc71ad/eval/run.mjs +0 -83
- package/.worktrees/dafc71ad/eval/tasks/001-slugify/files/package.json +0 -6
- package/.worktrees/dafc71ad/eval/tasks/001-slugify/solution/src/slugify.mjs +0 -26
- package/.worktrees/dafc71ad/eval/tasks/001-slugify/task.json +0 -6
- package/.worktrees/dafc71ad/eval/tasks/001-slugify/verify.mjs +0 -28
- package/.worktrees/dafc71ad/eval/tasks/002-each-day/files/package.json +0 -6
- package/.worktrees/dafc71ad/eval/tasks/002-each-day/files/src/dates.mjs +0 -4
- package/.worktrees/dafc71ad/eval/tasks/002-each-day/solution/src/dates.mjs +0 -30
- package/.worktrees/dafc71ad/eval/tasks/002-each-day/task.json +0 -6
- package/.worktrees/dafc71ad/eval/tasks/002-each-day/verify.mjs +0 -31
- package/.worktrees/dafc71ad/eval/tasks/003-word-report/files/data/notes.txt +0 -5
- package/.worktrees/dafc71ad/eval/tasks/003-word-report/files/package.json +0 -6
- package/.worktrees/dafc71ad/eval/tasks/003-word-report/solution/bin/report.mjs +0 -36
- package/.worktrees/dafc71ad/eval/tasks/003-word-report/task.json +0 -6
- package/.worktrees/dafc71ad/eval/tasks/003-word-report/verify.mjs +0 -38
- package/.worktrees/dafc71ad/logo.jpg +0 -0
- package/.worktrees/dafc71ad/package-lock.json +0 -977
- package/.worktrees/dafc71ad/package.json +0 -41
- package/.worktrees/dafc71ad/packages/dashboard/dist/assets/index-Bq_Z2hne.js +0 -7446
- package/.worktrees/dafc71ad/packages/dashboard/dist/assets/index-O2W5RV4z.css +0 -1
- package/.worktrees/dafc71ad/packages/dashboard/dist/favicon.jpg +0 -0
- package/.worktrees/dafc71ad/packages/dashboard/dist/index.html +0 -16
- package/.worktrees/dafc71ad/packages/dashboard/dist/logo.jpg +0 -0
- package/.worktrees/dafc71ad/packages/dashboard/dist/prototype-dashboard.html +0 -836
- package/.worktrees/dafc71ad/packages/dashboard/dist/prototype-overview.html +0 -256
- package/.worktrees/dafc71ad/packages/dashboard/package.json +0 -25
- package/.worktrees/dafc71ad/packages/dashboard/server/executor.js +0 -95
- package/.worktrees/dafc71ad/packages/dashboard/server/index.js +0 -679
- package/.worktrees/dafc71ad/packages/dashboard/server/parser.js +0 -526
- package/.worktrees/dafc71ad/packages/dashboard/server/watcher.js +0 -357
- package/.worktrees/dafc71ad/src/agent-session-log.js +0 -803
- package/.worktrees/dafc71ad/src/change-list.js +0 -290
- package/.worktrees/dafc71ad/src/change-risk-profile.js +0 -339
- package/.worktrees/dafc71ad/src/check-primitives.js +0 -65
- package/.worktrees/dafc71ad/src/classify-change.js +0 -109
- package/.worktrees/dafc71ad/src/commit-suggest.js +0 -202
- package/.worktrees/dafc71ad/src/config-cat.js +0 -88
- package/.worktrees/dafc71ad/src/config-schema.js +0 -328
- package/.worktrees/dafc71ad/src/constants.js +0 -97
- package/.worktrees/dafc71ad/src/contract-matrix.js +0 -533
- package/.worktrees/dafc71ad/src/datetime.js +0 -20
- package/.worktrees/dafc71ad/src/db-engine.js +0 -55
- package/.worktrees/dafc71ad/src/db.js +0 -381
- package/.worktrees/dafc71ad/src/decision-distill.js +0 -517
- package/.worktrees/dafc71ad/src/dispatch/backends/local-agent.js +0 -155
- package/.worktrees/dafc71ad/src/dispatch/backends/sillyhub-mcp.js +0 -245
- package/.worktrees/dafc71ad/src/dispatch/probe.js +0 -246
- package/.worktrees/dafc71ad/src/dispatch/strategy.js +0 -121
- package/.worktrees/dafc71ad/src/docs-check.js +0 -825
- package/.worktrees/dafc71ad/src/docs-debt.js +0 -393
- package/.worktrees/dafc71ad/src/docs-gate.js +0 -107
- package/.worktrees/dafc71ad/src/doctor-diagnostics.js +0 -1099
- package/.worktrees/dafc71ad/src/endpoint-extractor.js +0 -409
- package/.worktrees/dafc71ad/src/foreign-declared.js +0 -155
- package/.worktrees/dafc71ad/src/fs-atomic.js +0 -73
- package/.worktrees/dafc71ad/src/git-helper.js +0 -150
- package/.worktrees/dafc71ad/src/hooks/claude-pre-tool-use.cjs +0 -130
- package/.worktrees/dafc71ad/src/hooks/worktree-guard.js +0 -892
- package/.worktrees/dafc71ad/src/index.js +0 -2854
- package/.worktrees/dafc71ad/src/init.js +0 -626
- package/.worktrees/dafc71ad/src/knowledge-match.js +0 -231
- package/.worktrees/dafc71ad/src/local-detect.js +0 -128
- package/.worktrees/dafc71ad/src/local-register.js +0 -104
- package/.worktrees/dafc71ad/src/machine-interface.js +0 -543
- package/.worktrees/dafc71ad/src/migrate.js +0 -127
- package/.worktrees/dafc71ad/src/module-impact.js +0 -166
- package/.worktrees/dafc71ad/src/module-resolve.js +0 -222
- package/.worktrees/dafc71ad/src/modules.js +0 -580
- package/.worktrees/dafc71ad/src/plan-adopt-waves.js +0 -126
- package/.worktrees/dafc71ad/src/progress/change-registry.js +0 -336
- package/.worktrees/dafc71ad/src/progress/consistency-doctor.js +0 -355
- package/.worktrees/dafc71ad/src/progress/shared.js +0 -36
- package/.worktrees/dafc71ad/src/progress/stage-machine.js +0 -594
- package/.worktrees/dafc71ad/src/progress/step-store.js +0 -265
- package/.worktrees/dafc71ad/src/progress.js +0 -1304
- package/.worktrees/dafc71ad/src/quick-recommend.js +0 -115
- package/.worktrees/dafc71ad/src/quicklog.js +0 -883
- package/.worktrees/dafc71ad/src/review-tier.js +0 -77
- package/.worktrees/dafc71ad/src/run/command.js +0 -1641
- package/.worktrees/dafc71ad/src/run/complete-handlers.js +0 -1552
- package/.worktrees/dafc71ad/src/run/complete.js +0 -1259
- package/.worktrees/dafc71ad/src/run/concurrent-detect.js +0 -156
- package/.worktrees/dafc71ad/src/run/gates.js +0 -1111
- package/.worktrees/dafc71ad/src/run/multi-repo-context.js +0 -208
- package/.worktrees/dafc71ad/src/run/next.js +0 -128
- package/.worktrees/dafc71ad/src/run/prompt.js +0 -843
- package/.worktrees/dafc71ad/src/run/quick-audit.js +0 -186
- package/.worktrees/dafc71ad/src/run/scan-profile.js +0 -269
- package/.worktrees/dafc71ad/src/run/shared.js +0 -1562
- package/.worktrees/dafc71ad/src/run/stage.js +0 -587
- package/.worktrees/dafc71ad/src/run.js +0 -23
- package/.worktrees/dafc71ad/src/scan-diff.js +0 -388
- package/.worktrees/dafc71ad/src/scan-postcheck.js +0 -524
- package/.worktrees/dafc71ad/src/scan-staleness.js +0 -95
- package/.worktrees/dafc71ad/src/setup.js +0 -414
- package/.worktrees/dafc71ad/src/sillyhub-mcp/client.js +0 -597
- package/.worktrees/dafc71ad/src/sillyhub-mcp/config.js +0 -62
- package/.worktrees/dafc71ad/src/spec-dir-typo.js +0 -50
- package/.worktrees/dafc71ad/src/spec-sync.js +0 -358
- package/.worktrees/dafc71ad/src/stage-contract-engine.js +0 -171
- package/.worktrees/dafc71ad/src/stage-contract-spec.js +0 -551
- package/.worktrees/dafc71ad/src/stage-contract.js +0 -948
- package/.worktrees/dafc71ad/src/stage-review.js +0 -597
- package/.worktrees/dafc71ad/src/stages/archive.js +0 -199
- package/.worktrees/dafc71ad/src/stages/brainstorm-auto.js +0 -285
- package/.worktrees/dafc71ad/src/stages/brainstorm.js +0 -624
- package/.worktrees/dafc71ad/src/stages/cmd-existence.js +0 -145
- package/.worktrees/dafc71ad/src/stages/doctor.js +0 -540
- package/.worktrees/dafc71ad/src/stages/execute.js +0 -1277
- package/.worktrees/dafc71ad/src/stages/explore.js +0 -43
- package/.worktrees/dafc71ad/src/stages/index.js +0 -29
- package/.worktrees/dafc71ad/src/stages/knowledge.js +0 -514
- package/.worktrees/dafc71ad/src/stages/plan-postcheck.js +0 -1398
- package/.worktrees/dafc71ad/src/stages/plan.js +0 -655
- package/.worktrees/dafc71ad/src/stages/quick.js +0 -167
- package/.worktrees/dafc71ad/src/stages/scan.js +0 -608
- package/.worktrees/dafc71ad/src/stages/status.js +0 -64
- package/.worktrees/dafc71ad/src/stages/verify.js +0 -246
- package/.worktrees/dafc71ad/src/sync.js +0 -1470
- package/.worktrees/dafc71ad/src/task-review.js +0 -1498
- package/.worktrees/dafc71ad/src/taskcard-placeholders.js +0 -21
- package/.worktrees/dafc71ad/src/taskcard.js +0 -250
- package/.worktrees/dafc71ad/src/verify-postcheck.js +0 -1718
- package/.worktrees/dafc71ad/src/verify-probes.js +0 -327
- package/.worktrees/dafc71ad/src/version.js +0 -19
- package/.worktrees/dafc71ad/src/workflow.js +0 -600
- package/.worktrees/dafc71ad/src/workspace.js +0 -125
- package/.worktrees/dafc71ad/src/worktree-apply.js +0 -1611
- package/.worktrees/dafc71ad/src/worktree-deps.js +0 -668
- package/.worktrees/dafc71ad/src/worktree.js +0 -1849
- package/.worktrees/dafc71ad/templates/claude-instruction.md +0 -23
- package/.worktrees/dafc71ad/templates/prompts/taskcard-rules.md +0 -29
- package/.worktrees/dafc71ad/templates/prompts/testcase-design.md +0 -12
- package/.worktrees/dafc71ad/templates/prompts/verify-probes.md +0 -32
- package/.worktrees/dafc71ad/templates/workflows/archive-impact.yaml +0 -79
- package/.worktrees/dafc71ad/templates/workflows/scan-docs.yaml +0 -132
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-archive/SKILL.md +0 -87
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-auto/SKILL.md +0 -93
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-brainstorm/SKILL.md +0 -114
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-commit/SKILL.md +0 -67
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-continue/SKILL.md +0 -47
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-doctor/SKILL.md +0 -76
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-execute/SKILL.md +0 -214
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-explore/SKILL.md +0 -102
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-export/SKILL.md +0 -57
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-init/SKILL.md +0 -177
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-knowledge/SKILL.md +0 -270
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-plan/SKILL.md +0 -156
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-propose/SKILL.md +0 -87
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-quick/SKILL.md +0 -116
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-resume/SKILL.md +0 -70
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-scan/SKILL.md +0 -79
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-state/SKILL.md +0 -64
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-status/SKILL.md +0 -54
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-verify/SKILL.md +0 -87
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-workspace/SKILL.md +0 -175
- package/.worktrees/e58fcc4c/.gitattributes +0 -2
- package/.worktrees/e58fcc4c/.husky/pre-push +0 -20
- package/.worktrees/e58fcc4c/README.md +0 -203
- package/.worktrees/e58fcc4c/SKILL.md +0 -91
- package/.worktrees/e58fcc4c/architecture-analysis.md +0 -503
- package/.worktrees/e58fcc4c/bin/sillyspec.js +0 -2
- package/.worktrees/e58fcc4c/eval/README.md +0 -86
- package/.worktrees/e58fcc4c/eval/eval.config.json +0 -28
- package/.worktrees/e58fcc4c/eval/lib/adapters/cli.mjs +0 -63
- package/.worktrees/e58fcc4c/eval/lib/adapters/dryrun.mjs +0 -27
- package/.worktrees/e58fcc4c/eval/lib/config.mjs +0 -82
- package/.worktrees/e58fcc4c/eval/lib/db.mjs +0 -76
- package/.worktrees/e58fcc4c/eval/lib/report.mjs +0 -120
- package/.worktrees/e58fcc4c/eval/lib/runner.mjs +0 -157
- package/.worktrees/e58fcc4c/eval/lib/tasks.mjs +0 -73
- package/.worktrees/e58fcc4c/eval/lib/util.mjs +0 -107
- package/.worktrees/e58fcc4c/eval/lib/workdir.mjs +0 -30
- package/.worktrees/e58fcc4c/eval/run.mjs +0 -83
- package/.worktrees/e58fcc4c/eval/tasks/001-slugify/files/package.json +0 -6
- package/.worktrees/e58fcc4c/eval/tasks/001-slugify/solution/src/slugify.mjs +0 -26
- package/.worktrees/e58fcc4c/eval/tasks/001-slugify/task.json +0 -6
- package/.worktrees/e58fcc4c/eval/tasks/001-slugify/verify.mjs +0 -28
- package/.worktrees/e58fcc4c/eval/tasks/002-each-day/files/package.json +0 -6
- package/.worktrees/e58fcc4c/eval/tasks/002-each-day/files/src/dates.mjs +0 -4
- package/.worktrees/e58fcc4c/eval/tasks/002-each-day/solution/src/dates.mjs +0 -30
- package/.worktrees/e58fcc4c/eval/tasks/002-each-day/task.json +0 -6
- package/.worktrees/e58fcc4c/eval/tasks/002-each-day/verify.mjs +0 -31
- package/.worktrees/e58fcc4c/eval/tasks/003-word-report/files/data/notes.txt +0 -5
- package/.worktrees/e58fcc4c/eval/tasks/003-word-report/files/package.json +0 -6
- package/.worktrees/e58fcc4c/eval/tasks/003-word-report/solution/bin/report.mjs +0 -36
- package/.worktrees/e58fcc4c/eval/tasks/003-word-report/task.json +0 -6
- package/.worktrees/e58fcc4c/eval/tasks/003-word-report/verify.mjs +0 -38
- package/.worktrees/e58fcc4c/logo.jpg +0 -0
- package/.worktrees/e58fcc4c/package-lock.json +0 -977
- package/.worktrees/e58fcc4c/package.json +0 -41
- package/.worktrees/e58fcc4c/packages/dashboard/dist/assets/index-Bq_Z2hne.js +0 -7446
- package/.worktrees/e58fcc4c/packages/dashboard/dist/assets/index-O2W5RV4z.css +0 -1
- package/.worktrees/e58fcc4c/packages/dashboard/dist/favicon.jpg +0 -0
- package/.worktrees/e58fcc4c/packages/dashboard/dist/index.html +0 -16
- package/.worktrees/e58fcc4c/packages/dashboard/dist/logo.jpg +0 -0
- package/.worktrees/e58fcc4c/packages/dashboard/dist/prototype-dashboard.html +0 -836
- package/.worktrees/e58fcc4c/packages/dashboard/dist/prototype-overview.html +0 -256
- package/.worktrees/e58fcc4c/packages/dashboard/package.json +0 -25
- package/.worktrees/e58fcc4c/packages/dashboard/server/executor.js +0 -95
- package/.worktrees/e58fcc4c/packages/dashboard/server/index.js +0 -679
- package/.worktrees/e58fcc4c/packages/dashboard/server/parser.js +0 -526
- package/.worktrees/e58fcc4c/packages/dashboard/server/watcher.js +0 -357
- package/.worktrees/e58fcc4c/src/agent-session-log.js +0 -803
- package/.worktrees/e58fcc4c/src/change-list.js +0 -290
- package/.worktrees/e58fcc4c/src/change-risk-profile.js +0 -339
- package/.worktrees/e58fcc4c/src/check-primitives.js +0 -65
- package/.worktrees/e58fcc4c/src/classify-change.js +0 -109
- package/.worktrees/e58fcc4c/src/commit-suggest.js +0 -202
- package/.worktrees/e58fcc4c/src/config-cat.js +0 -88
- package/.worktrees/e58fcc4c/src/config-schema.js +0 -328
- package/.worktrees/e58fcc4c/src/constants.js +0 -97
- package/.worktrees/e58fcc4c/src/contract-matrix.js +0 -533
- package/.worktrees/e58fcc4c/src/datetime.js +0 -20
- package/.worktrees/e58fcc4c/src/db-engine.js +0 -55
- package/.worktrees/e58fcc4c/src/db.js +0 -381
- package/.worktrees/e58fcc4c/src/decision-distill.js +0 -517
- package/.worktrees/e58fcc4c/src/dispatch/backends/local-agent.js +0 -155
- package/.worktrees/e58fcc4c/src/dispatch/backends/sillyhub-mcp.js +0 -245
- package/.worktrees/e58fcc4c/src/dispatch/probe.js +0 -246
- package/.worktrees/e58fcc4c/src/dispatch/strategy.js +0 -121
- package/.worktrees/e58fcc4c/src/docs-check.js +0 -825
- package/.worktrees/e58fcc4c/src/docs-debt.js +0 -393
- package/.worktrees/e58fcc4c/src/docs-gate.js +0 -107
- package/.worktrees/e58fcc4c/src/doctor-diagnostics.js +0 -1099
- package/.worktrees/e58fcc4c/src/endpoint-extractor.js +0 -409
- package/.worktrees/e58fcc4c/src/foreign-declared.js +0 -155
- package/.worktrees/e58fcc4c/src/fs-atomic.js +0 -73
- package/.worktrees/e58fcc4c/src/git-helper.js +0 -150
- package/.worktrees/e58fcc4c/src/hooks/claude-pre-tool-use.cjs +0 -130
- package/.worktrees/e58fcc4c/src/hooks/worktree-guard.js +0 -892
- package/.worktrees/e58fcc4c/src/index.js +0 -2854
- package/.worktrees/e58fcc4c/src/init.js +0 -626
- package/.worktrees/e58fcc4c/src/knowledge-match.js +0 -231
- package/.worktrees/e58fcc4c/src/local-detect.js +0 -128
- package/.worktrees/e58fcc4c/src/local-register.js +0 -104
- package/.worktrees/e58fcc4c/src/machine-interface.js +0 -543
- package/.worktrees/e58fcc4c/src/migrate.js +0 -127
- package/.worktrees/e58fcc4c/src/module-impact.js +0 -166
- package/.worktrees/e58fcc4c/src/module-resolve.js +0 -222
- package/.worktrees/e58fcc4c/src/modules.js +0 -580
- package/.worktrees/e58fcc4c/src/plan-adopt-waves.js +0 -126
- package/.worktrees/e58fcc4c/src/progress/change-registry.js +0 -336
- package/.worktrees/e58fcc4c/src/progress/consistency-doctor.js +0 -355
- package/.worktrees/e58fcc4c/src/progress/shared.js +0 -36
- package/.worktrees/e58fcc4c/src/progress/stage-machine.js +0 -594
- package/.worktrees/e58fcc4c/src/progress/step-store.js +0 -265
- package/.worktrees/e58fcc4c/src/progress.js +0 -1304
- package/.worktrees/e58fcc4c/src/quick-recommend.js +0 -115
- package/.worktrees/e58fcc4c/src/quicklog.js +0 -883
- package/.worktrees/e58fcc4c/src/review-tier.js +0 -77
- package/.worktrees/e58fcc4c/src/run/command.js +0 -1641
- package/.worktrees/e58fcc4c/src/run/complete-handlers.js +0 -1552
- package/.worktrees/e58fcc4c/src/run/complete.js +0 -1259
- package/.worktrees/e58fcc4c/src/run/concurrent-detect.js +0 -156
- package/.worktrees/e58fcc4c/src/run/gates.js +0 -1111
- package/.worktrees/e58fcc4c/src/run/multi-repo-context.js +0 -208
- package/.worktrees/e58fcc4c/src/run/next.js +0 -128
- package/.worktrees/e58fcc4c/src/run/prompt.js +0 -843
- package/.worktrees/e58fcc4c/src/run/quick-audit.js +0 -186
- package/.worktrees/e58fcc4c/src/run/scan-profile.js +0 -269
- package/.worktrees/e58fcc4c/src/run/shared.js +0 -1562
- package/.worktrees/e58fcc4c/src/run/stage.js +0 -587
- package/.worktrees/e58fcc4c/src/run.js +0 -23
- package/.worktrees/e58fcc4c/src/scan-diff.js +0 -388
- package/.worktrees/e58fcc4c/src/scan-postcheck.js +0 -524
- package/.worktrees/e58fcc4c/src/scan-staleness.js +0 -95
- package/.worktrees/e58fcc4c/src/setup.js +0 -414
- package/.worktrees/e58fcc4c/src/sillyhub-mcp/client.js +0 -597
- package/.worktrees/e58fcc4c/src/sillyhub-mcp/config.js +0 -62
- package/.worktrees/e58fcc4c/src/spec-dir-typo.js +0 -50
- package/.worktrees/e58fcc4c/src/spec-sync.js +0 -358
- package/.worktrees/e58fcc4c/src/stage-contract-engine.js +0 -171
- package/.worktrees/e58fcc4c/src/stage-contract-spec.js +0 -551
- package/.worktrees/e58fcc4c/src/stage-contract.js +0 -948
- package/.worktrees/e58fcc4c/src/stage-review.js +0 -597
- package/.worktrees/e58fcc4c/src/stages/archive.js +0 -199
- package/.worktrees/e58fcc4c/src/stages/brainstorm-auto.js +0 -285
- package/.worktrees/e58fcc4c/src/stages/brainstorm.js +0 -624
- package/.worktrees/e58fcc4c/src/stages/cmd-existence.js +0 -145
- package/.worktrees/e58fcc4c/src/stages/doctor.js +0 -540
- package/.worktrees/e58fcc4c/src/stages/execute.js +0 -1277
- package/.worktrees/e58fcc4c/src/stages/explore.js +0 -43
- package/.worktrees/e58fcc4c/src/stages/index.js +0 -29
- package/.worktrees/e58fcc4c/src/stages/knowledge.js +0 -514
- package/.worktrees/e58fcc4c/src/stages/plan-postcheck.js +0 -1398
- package/.worktrees/e58fcc4c/src/stages/plan.js +0 -655
- package/.worktrees/e58fcc4c/src/stages/quick.js +0 -167
- package/.worktrees/e58fcc4c/src/stages/scan.js +0 -608
- package/.worktrees/e58fcc4c/src/stages/status.js +0 -64
- package/.worktrees/e58fcc4c/src/stages/verify.js +0 -246
- package/.worktrees/e58fcc4c/src/sync.js +0 -1470
- package/.worktrees/e58fcc4c/src/task-review.js +0 -1498
- package/.worktrees/e58fcc4c/src/taskcard-placeholders.js +0 -21
- package/.worktrees/e58fcc4c/src/taskcard.js +0 -250
- package/.worktrees/e58fcc4c/src/verify-postcheck.js +0 -1718
- package/.worktrees/e58fcc4c/src/verify-probes.js +0 -327
- package/.worktrees/e58fcc4c/src/version.js +0 -19
- package/.worktrees/e58fcc4c/src/workflow.js +0 -600
- package/.worktrees/e58fcc4c/src/workspace.js +0 -125
- package/.worktrees/e58fcc4c/src/worktree-apply.js +0 -1611
- package/.worktrees/e58fcc4c/src/worktree-deps.js +0 -668
- package/.worktrees/e58fcc4c/src/worktree.js +0 -1849
- package/.worktrees/e58fcc4c/templates/claude-instruction.md +0 -23
- package/.worktrees/e58fcc4c/templates/prompts/taskcard-rules.md +0 -29
- package/.worktrees/e58fcc4c/templates/prompts/testcase-design.md +0 -12
- package/.worktrees/e58fcc4c/templates/prompts/verify-probes.md +0 -32
- package/.worktrees/e58fcc4c/templates/workflows/archive-impact.yaml +0 -79
- package/.worktrees/e58fcc4c/templates/workflows/scan-docs.yaml +0 -132
|
@@ -1,1259 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* run/complete.js(W6 Step7b 从 run.js 抽出)。
|
|
3
|
-
*
|
|
4
|
-
* step 完成处理核心:completeStep(调度主干——WAIT/requiresWait 门控 + 各 handler 调用 +
|
|
5
|
-
* completion path 收尾 + single-step path)+ skipStep/waitStep/continueStep(W6 Step7b-2 续搬)。
|
|
6
|
-
* 本 commit(7b-1)先搬 completeStep + 2 独占 helper(validateMetadata/validateFileLocations)。
|
|
7
|
-
*
|
|
8
|
-
* 安全锚:run.js 始终 barrel。completeStep 由 run/command.js 在 --done 路径调用,无测试专用导出
|
|
9
|
-
* (曾以 `_completeStepForTest` 别名 re-export 供 characterization 测试直驱动,2026-08-13 这些测试
|
|
10
|
-
* 全部迁到 CLI 子进程 `sillyspec run <stage> --done`,导出已移除——见 run.js barrel 注释)。
|
|
11
|
-
*
|
|
12
|
-
* 依赖(completeStep 仅用已抽叶子 + 随搬 helper,零 run.js 闭包,零动态 import):
|
|
13
|
-
* - shared.js: triggerSync/WAIT_MARKER_RE/getStageSteps;prompt.js: outputStep;gates.js: enforceDepsGate/runStageCompletionGates
|
|
14
|
-
* - complete-handlers.js: 8 handler;stages/index.js: stageRegistry;worktree-apply.js: formatExecuteSummary
|
|
15
|
-
* - scan-profile.js: executeScanPreflight/executeScanPostcheck/computeScanProfile(noAI 硬门)
|
|
16
|
-
* - stages/plan-postcheck.js: executePlanPostcheck(noAI 硬门)
|
|
17
|
-
* - node: join(path) + existsSync/readdirSync/readFileSync/mkdirSync/writeFileSync/appendFileSync/statSync(fs)
|
|
18
|
-
*/
|
|
19
|
-
import { join } from 'node:path'
|
|
20
|
-
import { existsSync, readFileSync, mkdirSync, writeFileSync, appendFileSync } from 'node:fs'
|
|
21
|
-
import { writeAtomicSync } from '../fs-atomic.js'
|
|
22
|
-
import { withFileLock } from '../quicklog.js'
|
|
23
|
-
import { triggerSync, WAIT_MARKER_RE, getStageSteps, formatWaitOptions, resolveRuntimeRoot, getOrCreateMultiRepoContext, resolveChangeDir } from './shared.js'
|
|
24
|
-
import { executeScanPreflight, executeScanPostcheck, computeScanProfile } from './scan-profile.js'
|
|
25
|
-
import { executePlanPostcheck as runPlanPostcheckLib } from '../stages/plan-postcheck.js'
|
|
26
|
-
import { outputStep } from './prompt.js'
|
|
27
|
-
import { enforceDepsGate, enforceReviewJsonGate, enforceSymbolImpactGate, warnMissingUiPrototype, completeStageGates, readDesignScale } from './gates.js'
|
|
28
|
-
import { handleArchiveConfirmStep, handlePlanGeneratePlanStep, handleScanProjectListStep, handleWorkflowPostCheck, handleQuickStageCompletion, handleExecuteWaveArtifact } from './complete-handlers.js'
|
|
29
|
-
import { formatExecuteSummary } from '../worktree-apply.js'
|
|
30
|
-
import { isEndToEndTaskText } from '../change-risk-profile.js'
|
|
31
|
-
import { deriveTitleFromLinkedChange } from '../quicklog.js'
|
|
32
|
-
import { gitQuiet } from '../git-helper.js'
|
|
33
|
-
|
|
34
|
-
// validateMetadata / readDesignScale / validateFileLocations 已迁至 ./gates.js(completeStageGates
|
|
35
|
-
// 共享收尾管线,消除 noAI 末步 / continueStep 完成分支绕过 gate 的 S1/S2/S3 不对称)。
|
|
36
|
-
// completeStep 阶段完成分支(task-02 接入 completeStageGates)+ brainstorm 下一步提示改 import 自 gates.js。
|
|
37
|
-
|
|
38
|
-
// 完整流程 change title 刷新:从 proposal/design 首个 # 标题提取中文描述写 changes.title(人类可读
|
|
39
|
-
// 展示元信息)。proposal/design 落盘后的**任意步骤持久化点**都调用——单步 --done(brainstorm
|
|
40
|
-
// step6 design.md 已落盘但阶段未完)与阶段完成同样刷新,治「brainstorm 全程 title 存英文 autoName
|
|
41
|
-
// 兜底」。quick-<hex> 无 proposal/design 目录,deriveTitleFromLinkedChange 返回 '' 不刷新
|
|
42
|
-
// (quick 走 handleQuickStageCompletion 的 extractTitleFromResult)。失败静默(不阻断流程)。
|
|
43
|
-
function refreshChangeTitleFromArtifacts(pm, cwd, specBase, changeName) {
|
|
44
|
-
if (!changeName || /^quick-[0-9a-f]{8}$/.test(changeName)) return
|
|
45
|
-
try {
|
|
46
|
-
const refinedTitle = deriveTitleFromLinkedChange(specBase, changeName)
|
|
47
|
-
if (refinedTitle) pm.updateChangeMeta(cwd, changeName, { title: refinedTitle })
|
|
48
|
-
} catch { /* title 刷新失败不阻断 */ }
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* 坑1:用 --done --answer 解掉「已 waiting 的步骤」。
|
|
53
|
-
*
|
|
54
|
-
* completeStep 的 currentIdx 选择(findIndex pending||in-progress)排除 waiting,导致
|
|
55
|
-
* --done --answer 落到已 --wait 暂停的 requiresWait 步骤时跳过它、--answer 静默丢失、步骤永久
|
|
56
|
-
* 卡 WAITING、末步报「Step N 等待用户输入」无法 finish。本函数把首个 waiting 步骤拉回 pending
|
|
57
|
-
* + 补 waitAnswer(对齐 continueStep 对 requiresWait 的 shouldReturnToCurrentStep=回 pending 语义),
|
|
58
|
-
* 让主流程 requiresWait 门控见 waitAnswer 已置→不阻断→正常 completed。
|
|
59
|
-
*
|
|
60
|
-
* @param {object[]} steps - stageData.steps(原地修改)
|
|
61
|
-
* @param {string|null|undefined} doneAnswer - --answer 值;空则不触发(返回 -1)
|
|
62
|
-
* @param {string} nowStr - 时间戳字符串(用于 waitAnswers[].answeredAt)
|
|
63
|
-
* @returns {number} 被解的 waiting 步骤 idx;无 waiting 或无 answer 返回 -1
|
|
64
|
-
*/
|
|
65
|
-
export function resolveWaitingStepWithAnswer(steps, doneAnswer, nowStr) {
|
|
66
|
-
if (!doneAnswer) return -1
|
|
67
|
-
const waitIdx = steps.findIndex(s => s && s.status === 'waiting')
|
|
68
|
-
if (waitIdx === -1) return -1
|
|
69
|
-
const ws = steps[waitIdx]
|
|
70
|
-
ws.waitAnswer = doneAnswer
|
|
71
|
-
ws.waitAnswers = Array.isArray(ws.waitAnswers) ? ws.waitAnswers : []
|
|
72
|
-
ws.waitAnswers.push({ round: (ws.waitRound || 0) + 1, answer: doneAnswer, answeredAt: nowStr })
|
|
73
|
-
delete ws.waitReason
|
|
74
|
-
delete ws.waitOptions
|
|
75
|
-
delete ws.waitedAt
|
|
76
|
-
ws.status = 'pending'
|
|
77
|
-
ws.completedAt = null
|
|
78
|
-
return waitIdx
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export async function completeStep(pm, progress, stageName, cwd, outputText, inputText = null, options = {}) {
|
|
82
|
-
const { printNext = true, confirm = false, changeName, platformOpts = {}, nonInteractive = false, isForceBaseline = false, isAllowNew = false, isAllowDelete = false } = options
|
|
83
|
-
const specBase = platformOpts.specRoot || join(cwd, '.sillyspec')
|
|
84
|
-
const stageData = progress.stages[stageName]
|
|
85
|
-
|
|
86
|
-
// ── WAIT MARKER 硬校验 ──
|
|
87
|
-
// 如果 output 包含等待标记,拒绝 --done 推进
|
|
88
|
-
if (outputText) {
|
|
89
|
-
const match = WAIT_MARKER_RE.exec(outputText)
|
|
90
|
-
if (match) {
|
|
91
|
-
console.error(`❌ Refused: step output contains ${match[1]} — human input required.`)
|
|
92
|
-
console.error(` 使用 --wait 替代 --done,例如:`)
|
|
93
|
-
console.error(` sillyspec run ${stageName} --wait --reason "等待用户决策" --output "你的摘要"${changeName ? ` --change ${changeName}` : ''}`)
|
|
94
|
-
process.exit(1)
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
if (!stageData || !stageData.steps) {
|
|
98
|
-
console.error(`❌ 阶段 ${stageName} 未初始化`)
|
|
99
|
-
process.exit(1)
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
const steps = stageData.steps
|
|
103
|
-
let currentIdx = steps.findIndex(s => s.status === 'pending' || s.status === 'in-progress')
|
|
104
|
-
// ── 坑1:--done --answer 解「已 waiting 的步骤」──
|
|
105
|
-
// findIndex 仅查 pending/in-progress,排除 waiting;故 --done --answer 落到已 --wait 暂停的
|
|
106
|
-
// requiresWait 步骤时会跳过它、把 --answer 静默丢弃,步骤永久卡 WAITING、末步报「等待用户输入」。
|
|
107
|
-
// 修复:带 doneAnswer 且存在 waiting 步骤时,把首个 waiting 拉回 pending + 补 waitAnswer,主流程
|
|
108
|
-
// requiresWait 门控见 waitAnswer 已置→不阻断→正常 completed。仅 --answer 触发,普通 --done 零变化。
|
|
109
|
-
const _doneAnswer = options && options.doneAnswer
|
|
110
|
-
// ── 多 waiting 歧义守卫(对齐 continueStep 742-751 的同名保护)──
|
|
111
|
-
// resolveWaitingStepWithAnswer 只 findIndex 解「第一个」waiting;阶段内 ≥2 个 waiting 时
|
|
112
|
-
// --done --answer 会静默把 answer 填给第一个,可能答错对象。与 --continue 对齐:多 waiting 时报错列出。
|
|
113
|
-
if (_doneAnswer) {
|
|
114
|
-
const waitingIdxs = steps.map((s, i) => (s && s.status === 'waiting') ? i : -1).filter(i => i !== -1)
|
|
115
|
-
if (waitingIdxs.length > 1) {
|
|
116
|
-
console.error(`❌ 检测到 ${waitingIdxs.length} 个等待中的步骤,--done --answer 无法确定解哪一个:`)
|
|
117
|
-
for (const i of waitingIdxs) {
|
|
118
|
-
console.error(` Step ${i + 1}: ${steps[i].name}${steps[i].waitReason ? `(${steps[i].waitReason})` : ''}`)
|
|
119
|
-
}
|
|
120
|
-
console.error(` 出路:用 --continue 逐个指定恢复(每次解一个 waiting,降到 1 个后即可 --done --answer):`)
|
|
121
|
-
console.error(` sillyspec run ${stageName} --continue --from-step <序号|名称> --answer "..."${changeName ? ` --change ${changeName}` : ''}`)
|
|
122
|
-
process.exit(1)
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
const _resolvedWaitIdx = resolveWaitingStepWithAnswer(steps, _doneAnswer, new Date().toLocaleString('zh-CN', { hour12: false }))
|
|
126
|
-
if (_resolvedWaitIdx !== -1) {
|
|
127
|
-
currentIdx = _resolvedWaitIdx
|
|
128
|
-
console.log(`⚠️ Step "${steps[_resolvedWaitIdx].name}" 此前处于 waiting,--done --answer 已补回答并拉回待完成。`)
|
|
129
|
-
}
|
|
130
|
-
// ── waiting 前置守卫(坑 archive-step3-wait-answer-hint-late)──
|
|
131
|
-
// 普通 --done(无 --answer)时若存在 waiting 步骤:currentIdx 会跳过它推进后续步骤
|
|
132
|
-
//(findIndex 只查 pending/in-progress),步骤被静默越过 + --answer 要求要到别处报错才暴露。
|
|
133
|
-
// fail-closed 拒绝并把「需要 --answer」的提示前置到第一次尝试 --done 的时刻。
|
|
134
|
-
if (!_doneAnswer) {
|
|
135
|
-
const _waitIdx = steps.findIndex(s => s.status === 'waiting')
|
|
136
|
-
if (_waitIdx !== -1) {
|
|
137
|
-
const _ws = steps[_waitIdx]
|
|
138
|
-
console.error(`❌ Step ${_waitIdx + 1} "${_ws.name}" 处于等待用户输入状态(waiting),先恢复它再推进后续步骤。`)
|
|
139
|
-
if (_ws.waitReason) console.error(` 原因:${_ws.waitReason}`)
|
|
140
|
-
if (_ws.waitOptions) {
|
|
141
|
-
try {
|
|
142
|
-
const _opts = JSON.parse(_ws.waitOptions)
|
|
143
|
-
if (Array.isArray(_opts) && _opts.length > 0) console.error(` 选项:${_opts.join(', ')}`)
|
|
144
|
-
} catch { /* 兼容旧格式(逗号串)非 JSON,不额外展示 */ }
|
|
145
|
-
}
|
|
146
|
-
console.error(` 恢复:sillyspec run ${stageName} --continue --answer "用户回答"${changeName ? ` --change ${changeName}` : ''}`)
|
|
147
|
-
console.error(` 或一步完成:sillyspec run ${stageName} --done --answer "用户回答"${changeName ? ` --change ${changeName}` : ''} --output "你的摘要"`)
|
|
148
|
-
process.exit(1)
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
if (currentIdx === -1) {
|
|
152
|
-
// ── reopen stale 收尾路径(坑 reopen-done-escape-hatch-unreachable)──
|
|
153
|
-
// 全 completed+stale(无 pending/in-progress)时若只有 exit(1),--done --confirm 逃生门
|
|
154
|
-
// 永远到不了下方回填门控。修复:有 stale 时——无 confirm 报拦截指引(与门控同文案);
|
|
155
|
-
// 带 confirm 把首个 stale 拉回 pending 走完整完成管线,末步后的回填门控 confirm 分支
|
|
156
|
-
// 收尾其余 stale(--confirm 语义 = 全部 stale 一并确认)。
|
|
157
|
-
const _staleIdx = steps.findIndex(s => s.status === 'stale')
|
|
158
|
-
if (_staleIdx !== -1) {
|
|
159
|
-
const _staleNames = steps.filter(s => s.status === 'stale').map(s => s.name)
|
|
160
|
-
if (!confirm) {
|
|
161
|
-
console.error(`\n⏸️ 检测到 ${_staleNames.length} 个 stale 步骤(reopen 后未执行):${_staleNames.join('、')}`)
|
|
162
|
-
console.error(` 两条出路:`)
|
|
163
|
-
console.error(` ① sillyspec run ${stageName}${changeName ? ` --change ${changeName}` : ''} 逐个真实执行(stale 会被转为 pending)`)
|
|
164
|
-
console.error(` ② 确认方案未变,一次性回填收尾:sillyspec run ${stageName} --done --confirm${changeName ? ` --change ${changeName}` : ''} --output "..."`)
|
|
165
|
-
process.exit(1)
|
|
166
|
-
}
|
|
167
|
-
steps[_staleIdx].status = 'pending'
|
|
168
|
-
currentIdx = _staleIdx
|
|
169
|
-
console.log(`⚠️ --confirm 收尾:把 stale 步骤 "${steps[_staleIdx].name}" 拉回当前步骤走完成管线,其余 stale 由回填门控一并确认。`)
|
|
170
|
-
} else if (stageData?.status !== 'completed' && steps.length > 0) {
|
|
171
|
-
// ── 矛盾态自愈(坑 execute-status-machine-contradiction,2026-08-23 实证:--done 报
|
|
172
|
-
// 「没有待完成的步骤」而 status 显示 15 步未完成——并发进程写入竞争后 DB 步骤行停在
|
|
173
|
-
// completed 但阶段 status 未推进的矛盾态,用户只能靠 verify 启动碰运气自愈)。
|
|
174
|
-
// 自愈 = 重播种:ensureStageSteps 按 def 步骤名重建步骤行(保留同名完成态),矛盾行
|
|
175
|
-
// (DB 有但 def 无的幽灵行/半写行)被清掉;重读后再走正常管线。自愈失败再报错给精确指引。
|
|
176
|
-
console.warn(`⚠️ 检测到状态机矛盾:阶段 ${stageName} 无 pending/in-progress 步骤但 status=${stageData.status}(并发写入竞争的半写态)。自动重播种修复…`)
|
|
177
|
-
try {
|
|
178
|
-
const { ensureStageSteps } = await import('./command.js')
|
|
179
|
-
const reseeded = await ensureStageSteps(progress, stageName, cwd, platformOpts?.specRoot || null)
|
|
180
|
-
if (reseeded && effectiveChange) {
|
|
181
|
-
pm._write(cwd, progress, effectiveChange)
|
|
182
|
-
progress = pm.read(cwd, effectiveChange) || progress
|
|
183
|
-
}
|
|
184
|
-
const freshSteps = progress?.stages?.[stageName]?.steps || []
|
|
185
|
-
const freshPending = freshSteps.findIndex(s => s.status === 'pending' || s.status === 'in-progress')
|
|
186
|
-
if (freshPending !== -1) {
|
|
187
|
-
console.log(`✅ 重播种成功:${freshSteps.filter(s => s.status === 'pending').length} 个待完成步骤恢复,继续完成管线`)
|
|
188
|
-
currentIdx = freshPending
|
|
189
|
-
steps.length = 0
|
|
190
|
-
steps.push(...freshSteps)
|
|
191
|
-
stageData.steps = freshSteps
|
|
192
|
-
} else {
|
|
193
|
-
console.error(`重播种后仍无待完成步骤(阶段 status=${progress?.stages?.[stageName]?.status ?? '未知'})。`)
|
|
194
|
-
console.error(` 手动修复:sillyspec run ${stageName} --reset${changeName ? ` --change ${changeName}` : ''} 从头重跑,或 sillyspec doctor 诊断。`)
|
|
195
|
-
process.exit(1)
|
|
196
|
-
}
|
|
197
|
-
} catch (e) {
|
|
198
|
-
console.error(`❌ 矛盾态自愈失败: ${e.message}`)
|
|
199
|
-
console.error(` 手动修复:sillyspec run ${stageName} --reset${changeName ? ` --change ${changeName}` : ''},或 sillyspec doctor`)
|
|
200
|
-
process.exit(1)
|
|
201
|
-
}
|
|
202
|
-
} else {
|
|
203
|
-
console.error(`没有待完成的步骤(阶段 ${stageName} 已无 pending/in-progress 步骤)。当前阶段状态:${stageData?.status ?? '未知'}。用 \`sillyspec run ${stageName} --status\` 查看进度,或 \`sillyspec progress show\` 看全局下一步。`)
|
|
204
|
-
process.exit(1)
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
// ── requiresWait 硬门控 ──
|
|
209
|
-
const defStepsForCurrent = await getStageSteps(stageName, cwd, progress, platformOpts?.specRoot || null)
|
|
210
|
-
// def↔DB 一致性守卫(坑 execute-step-table-drift,2026-08-20 实证):runCommand 入口已按名
|
|
211
|
-
// 重播种(ensureStageSteps),但同一命令进程内 plan.md 若再次被改(或绕过 runCommand 直调
|
|
212
|
-
// completeStep 的路径),def 与 DB 步数错位会让 currentIdx 的门控/prompt 施加到错误的步骤上
|
|
213
|
-
// (17/12 交替报错但仍在推进)。fail-closed:中止本次 --done,重跑即自愈(入口重播种)。
|
|
214
|
-
if (Array.isArray(defStepsForCurrent) && defStepsForCurrent.length > 0 && steps.length > 0
|
|
215
|
-
&& defStepsForCurrent.length !== steps.length) {
|
|
216
|
-
console.error(`❌ 步骤表与当前阶段定义漂移(DB ${steps.length} 步 vs 定义 ${defStepsForCurrent.length} 步)——本次 --done 中止,防止错位门控/推进。`)
|
|
217
|
-
console.error(` 常见原因:plan.md 的 Wave 结构在本命令执行期间又被修改(execute 步骤由 plan 动态构建)。`)
|
|
218
|
-
console.error(` 解法:原样重跑本条 --done 命令——CLI 入口会先按步骤名保留完成态重播种(见 ⚠️ 漂移告警),然后正常推进。`)
|
|
219
|
-
process.exit(1)
|
|
220
|
-
}
|
|
221
|
-
const currentStepDef = defStepsForCurrent?.[currentIdx] || {}
|
|
222
|
-
const currentStep = steps[currentIdx]
|
|
223
|
-
if (currentStepDef.requiresWait === true && !currentStep.waitAnswer) {
|
|
224
|
-
// 检查 --done 是否带了 --answer:如果是,自动补全 waitAnswer 状态,一步完成
|
|
225
|
-
const doneAnswer = typeof options !== 'undefined' && options.doneAnswer ? options.doneAnswer : null
|
|
226
|
-
// B4: 前置 step 已对同一问题确认则自动跳过重复 wait。
|
|
227
|
-
// 归一化去掉「最终/再次/重复」等修饰词,避免 step N「确认 X」与 step M「最终确认 X」重复打断。
|
|
228
|
-
const normalizeReason = (r) => (r || '').replace(/(最终|再次|重复|最后|首|初次|首次)/g, '').trim()
|
|
229
|
-
const currentReason = normalizeReason(currentStepDef.waitReason)
|
|
230
|
-
const priorConfirmed = currentReason && steps.slice(0, currentIdx).some(s =>
|
|
231
|
-
s.waitAnswer && s.status === 'completed' && normalizeReason(s.waitReason) === currentReason
|
|
232
|
-
)
|
|
233
|
-
if (priorConfirmed) {
|
|
234
|
-
currentStep.status = 'waiting'
|
|
235
|
-
currentStep.waitAnswer = '前置步骤已对同一问题确认 — 自动跳过重复 wait'
|
|
236
|
-
currentStep.waitReason = currentStepDef.waitReason || '等待用户输入'
|
|
237
|
-
console.log(`⚠️ Step "${currentStep.name}" 的确认(${currentStepDef.waitReason})已在前置步骤完成,自动跳过。`)
|
|
238
|
-
} else if (doneAnswer) {
|
|
239
|
-
currentStep.status = 'waiting'
|
|
240
|
-
currentStep.waitAnswer = doneAnswer
|
|
241
|
-
currentStep.waitReason = currentStepDef.waitReason || '等待用户输入'
|
|
242
|
-
console.log(`⚠️ Step "${currentStep.name}" 需要 wait,但 --done 带了 --answer,自动补全 wait 状态。`)
|
|
243
|
-
} else {
|
|
244
|
-
console.error(`❌ Step "${currentStep.name}" 必须先等待用户输入,不能直接 --done。`)
|
|
245
|
-
console.error(` 原因:${currentStepDef.waitReason || '该步骤需要人工确认/回答'}`)
|
|
246
|
-
if (currentStepDef.waitOptions) {
|
|
247
|
-
console.error(` 选项:${currentStepDef.waitOptions.join(', ')}`)
|
|
248
|
-
}
|
|
249
|
-
console.error(` 请先执行:`)
|
|
250
|
-
console.error(` sillyspec run ${stageName} --wait --reason "${currentStepDef.waitReason || '等待用户输入'}" --options "${(currentStepDef.waitOptions || ['确认']).join(',')}"${changeName ? ` --change ${changeName}` : ''} --output "你的问题/方案摘要"`)
|
|
251
|
-
console.error(` 或使用 --done --answer "用户回答" 一步完成 wait + done`)
|
|
252
|
-
process.exit(1)
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
// ── execute deps 验证硬门(change 2026-06-28-worktree-deps-provision)──
|
|
257
|
-
// persist 回调:gate 置 step=blocked 后 exit(1) 前落库(否则 blocked 只在内存,
|
|
258
|
-
// progress show/doctor 看到的仍是 pending,误导诊断)
|
|
259
|
-
const persistBlocked = () => pm._write(cwd, progress, changeName)
|
|
260
|
-
await enforceDepsGate(stageName, cwd, changeName, steps[currentIdx], steps, currentIdx, specBase, platformOpts, persistBlocked)
|
|
261
|
-
// review.json 字段硬门(坑 review-json-field-gap):已勾 [x] task 的 review.json 必须 schema 完整,
|
|
262
|
-
// 提前到每次 --done 校验(而非等 Task Review Gate 在整阶段收尾才暴露,迫使用户事后批量补)。
|
|
263
|
-
await enforceReviewJsonGate(stageName, cwd, changeName, steps[currentIdx], steps, currentIdx, specBase, platformOpts, persistBlocked)
|
|
264
|
-
// 符号影响面报告硬门(ql-20260816-005-3d7f):execute「加载上下文」步产出落盘核验——
|
|
265
|
-
// symbol-impact.md 存在 + plan 每 task 有结论行;防前缀步被一句「上下文在会话内」盖章跳过。
|
|
266
|
-
await enforceSymbolImpactGate(stageName, changeName, steps[currentIdx]?.name, specBase)
|
|
267
|
-
// UI 原型软提醒(非阻断):brainstorm 收尾步 design.md 命中前端文件但无 prototype → 提示用户可否决
|
|
268
|
-
warnMissingUiPrototype(stageName, changeName, steps[currentIdx]?.name, specBase)
|
|
269
|
-
|
|
270
|
-
// ── noAI 步骤硬门(坑 noai-done-bypass):noAI 步骤的确定性校验不可被 --done 绕过 ──
|
|
271
|
-
// 正常路径 agent 跑 `run <stage>` 推进到 noAI step 时,runStage 自动执行 _cliAction
|
|
272
|
-
// (stage.js noAI 分支,不写 step output);若 agent 对 noAI step 直接 --done,此前
|
|
273
|
-
// completeStep 无 noAI 检测直接标 completed,executePlanPostcheck 等 CLI 确定性校验被
|
|
274
|
-
// 静默跳过(实证:multi-agent-platform 2026-08-13-spec-sync-visibility tasks/ 从未
|
|
275
|
-
// 生成但 plan 阶段 completed——step4 output 为 agent 口吻 178 字符而非 CLI 自动路径的
|
|
276
|
-
// 空 output)。修复:--done 落到 noAI step 时同样执行 _cliAction,校验 throw →
|
|
277
|
-
// completeStep 不推进(step 保持 pending)。分支对齐 stage.js 的 noAI 自动执行。
|
|
278
|
-
const _isNoAIStep = currentStepDef.noAI === true || currentStep?.noAI === true
|
|
279
|
-
if (_isNoAIStep) {
|
|
280
|
-
const _cliAction = currentStepDef._cliAction || currentStep?._cliAction
|
|
281
|
-
console.log(`⚙️ Step ${currentIdx + 1}/${steps.length}: ${steps[currentIdx].name}(noAI,--done 路径执行 CLI 校验)`)
|
|
282
|
-
if (_cliAction === 'scanPreflight') {
|
|
283
|
-
await executeScanPreflight(cwd, platformOpts, stageData.scanProfile || computeScanProfile(cwd, platformOpts))
|
|
284
|
-
} else if (_cliAction === 'scanPostcheck') {
|
|
285
|
-
await executeScanPostcheck(cwd, platformOpts, stageData.scanProfile || computeScanProfile(cwd, platformOpts))
|
|
286
|
-
} else if (_cliAction === 'planPostcheck') {
|
|
287
|
-
await runPlanPostcheckLib({ cwd, specRoot: platformOpts?.specRoot, resolveChangeDir, progress })
|
|
288
|
-
} else {
|
|
289
|
-
throw new Error(`noAI 步骤 ${steps[currentIdx].name} 的未知 _cliAction: ${_cliAction}——请在 complete.js 注册对应分支`)
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
steps[currentIdx].status = 'completed'
|
|
294
|
-
steps[currentIdx].completedAt = new Date().toLocaleString('zh-CN',{hour12:false})
|
|
295
|
-
if (outputText) {
|
|
296
|
-
const MAX_OUTPUT = 200
|
|
297
|
-
if (outputText.length > MAX_OUTPUT) {
|
|
298
|
-
steps[currentIdx].output = outputText.slice(0, MAX_OUTPUT) + '…'
|
|
299
|
-
steps[currentIdx].output_truncated = true
|
|
300
|
-
steps[currentIdx].output_original_length = outputText.length
|
|
301
|
-
// 平台模式:artifact 写入 runtime-root,否则写 .sillyspec/.runtime/artifacts
|
|
302
|
-
const artifactBase = platformOpts?.runtimeRoot
|
|
303
|
-
? join(platformOpts.runtimeRoot, 'scan-runs', platformOpts.scanRunId || 'unknown')
|
|
304
|
-
: join(specBase, '.runtime', 'artifacts')
|
|
305
|
-
mkdirSync(artifactBase, { recursive: true })
|
|
306
|
-
const ts = new Date().toISOString().slice(0,19).replace(/[-T:]/g, '')
|
|
307
|
-
writeFileSync(join(artifactBase, `${changeName || 'unknown'}-${stageName}-step${currentIdx + 1}-${ts}.txt`), outputText)
|
|
308
|
-
} else {
|
|
309
|
-
steps[currentIdx].output = outputText
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
// archive「确认归档」收尾:--confirm 门控 + archiveChangeDirectory 移动 + 推荐文档校验
|
|
314
|
-
// (抽成 handleArchiveConfirmStep;缺 --confirm 时返回 early-return 对象,completeStep 透传)
|
|
315
|
-
{
|
|
316
|
-
const _archiveEarlyReturn = await handleArchiveConfirmStep({ stageName, steps, currentIdx, confirm, outputText, pm, cwd, progress, changeName, specBase, platformOpts })
|
|
317
|
-
if (_archiveEarlyReturn) return _archiveEarlyReturn
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
// plan 阶段 "generate_plan" 完成后,动态插入任务蓝图 + postcheck 步骤(抽成 handlePlanGeneratePlanStep)
|
|
321
|
-
await handlePlanGeneratePlanStep({ stageName, steps, currentIdx, defStepsForCurrent, cwd, progress })
|
|
322
|
-
|
|
323
|
-
// scan 阶段 step 2「构建扫描项目列表」完成后,按项目展开 perProject 步骤(抽成 handleScanProjectListStep)
|
|
324
|
-
await handleScanProjectListStep({ stageName, steps, currentIdx, outputText, stageData, specBase, cwd, platformOpts })
|
|
325
|
-
|
|
326
|
-
// execute Wave artifact(W6 Step6c 抽至 complete-handlers.js handleExecuteWaveArtifact)
|
|
327
|
-
await handleExecuteWaveArtifact({ stageName, steps, currentIdx, changeName, specBase, cwd })
|
|
328
|
-
|
|
329
|
-
// execute 批量完成检测:plan 全勾 + 代码客观核验通过 → 剩余 step 一次性标 completed,
|
|
330
|
-
// 使本次 --done 直接进入阶段完成分支(治"3 Wave 做完仍逐次 +1、需重走 7 次 --done")。
|
|
331
|
-
// 先按 review.json pass 自动勾 plan checkbox(复用 continueStep 同源逻辑),再判批量条件。
|
|
332
|
-
if (stageName === 'execute' && changeName) {
|
|
333
|
-
const _ac = await autoCheckPlanFromReviews({ stageName, changeName, cwd, platformOpts })
|
|
334
|
-
if (_ac.autoChecked) {
|
|
335
|
-
console.log(` ✅ 自动勾选 ${_ac.checkedCount} 个 task checkbox(基于 review.json pass)`)
|
|
336
|
-
}
|
|
337
|
-
if (_ac.skippedCount > 0) {
|
|
338
|
-
console.warn(` ⚠️ ${_ac.skippedCount} 个 task 未勾(review.json 缺失/fail)→ 批量完成条件不满足,仍按单步推进`)
|
|
339
|
-
}
|
|
340
|
-
const _bf = await detectExecuteBatchFinish({ pm, stageName, changeName, cwd, specBase, steps })
|
|
341
|
-
if (_bf.batched && _bf.aligned > 0) {
|
|
342
|
-
console.log(`\n🚀 execute 批量完成:plan 全勾 + 代码核验通过,一次性补完 ${_bf.aligned} 个剩余 step → 进入阶段完成分支`)
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
// per-task review 草稿兜底(坑 worktree-execute-apply-friction 坑2):主 agent 直接实现模式
|
|
346
|
-
// 无子代理 review 落盘 → Task Review Gate 报缺 review.json 阻断。每次 execute --done 跑(幂等,
|
|
347
|
-
// 已存在跳过),据 git diff base..head 按 allowed_paths 归属生成 cannot_verify 草稿,进 gate 前就位。
|
|
348
|
-
try {
|
|
349
|
-
const { generateTaskReviewDrafts } = await import('../task-review.js')
|
|
350
|
-
// W3 task-09:best-effort 构造 ctx 透传(D-013),跨仓 task 草稿用跨仓 gitDir 取 diff。
|
|
351
|
-
// 失败降级 null(不阻断 execute 完成——草稿兜底本就是 best-effort,gate 会复校验)。
|
|
352
|
-
let _draftCtx = null
|
|
353
|
-
try {
|
|
354
|
-
_draftCtx = await getOrCreateMultiRepoContext({ cwd, changeName, platformOpts })
|
|
355
|
-
} catch (e) {
|
|
356
|
-
console.warn(' ⚠️ 草稿 ctx 构造失败,降级单仓草稿(' + (e && e.message ? e.message : e) + ')')
|
|
357
|
-
}
|
|
358
|
-
const _drafts = await generateTaskReviewDrafts({ changeName, cwd, platformOpts, ctx: _draftCtx })
|
|
359
|
-
if (_drafts.generated > 0) {
|
|
360
|
-
console.log(' 📄 自动补写 ' + _drafts.generated + ' 个 per-task review.json 草稿(cannot_verify,主 agent 实现模式兜底,需 agent 复核后升级为 pass/fail)')
|
|
361
|
-
if (_drafts.noAttribution > 0) {
|
|
362
|
-
console.warn(' ⚠️ 其中 ' + _drafts.noAttribution + ' 个 task 的 allowed_paths 未命中本次 diff(无归属草稿,changedFiles 为空)——需人工确认实际改动后升级 verdict,确属未实现则回 fail')
|
|
363
|
-
}
|
|
364
|
-
if (_drafts.unattributed && _drafts.unattributed.length > 0) {
|
|
365
|
-
console.warn(' ⚠️ ' + _drafts.unattributed.length + ' 个变更文件未归属任何 task(顺带修复/非源码),草稿未覆盖:' + _drafts.unattributed.join(', '))
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
} catch (e) {
|
|
369
|
-
console.warn(' ⚠️ per-task review 草稿生成失败(不阻断 execute 完成):' + (e && e.message ? e.message : e))
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
const nextPendingIdx = steps.findIndex(s => s.status === 'pending' || s.status === 'in-progress')
|
|
374
|
-
|
|
375
|
-
if (nextPendingIdx === -1) {
|
|
376
|
-
// 也检查是否有 waiting 的步骤
|
|
377
|
-
const hasWaiting = steps.some(s => s.status === 'waiting')
|
|
378
|
-
if (hasWaiting) {
|
|
379
|
-
// 有等待中的步骤,阶段未完成
|
|
380
|
-
progress.lastActive = new Date().toLocaleString('zh-CN',{hour12:false})
|
|
381
|
-
pm._write(cwd, progress, changeName)
|
|
382
|
-
const wsIdx = steps.findIndex(s => s.status === 'waiting')
|
|
383
|
-
console.log(`\n⏸️ 阶段暂停:Step ${wsIdx + 1} 等待用户输入`)
|
|
384
|
-
if (steps[wsIdx].waitReason) console.log(` 原因:${steps[wsIdx].waitReason}`)
|
|
385
|
-
// 前置恢复指引(坑 archive-step3-wait-answer-hint-late):暂停点直接给出 --answer 恢复命令,
|
|
386
|
-
// 不等用户撞 --done 报错才知道需要 --answer
|
|
387
|
-
console.log(` 恢复:sillyspec run ${stageName} --continue --answer "用户回答"${changeName ? ` --change ${changeName}` : ''}`)
|
|
388
|
-
return { stageCompleted: false, currentIdx, nextPendingIdx: -1 }
|
|
389
|
-
}
|
|
390
|
-
// quick 收尾(W6 Step6b 抽至 complete-handlers.js handleQuickStageCompletion)
|
|
391
|
-
await handleQuickStageCompletion({ stageName, steps, currentIdx, cwd, progress, changeName, specBase, outputText, confirm, isForceBaseline, isAllowNew, isAllowDelete, platformOpts, pm })
|
|
392
|
-
|
|
393
|
-
// ── reopen --done 回填(坑 brainstorm-reopen-step-state-desync)──
|
|
394
|
-
// nextPendingIdx === -1 且无 waiting,说明要进阶段完成分支。此时若存在 stale 步骤
|
|
395
|
-
// (reopen --from-step N 把 N+1..end 置 stale,但方案未变、无需重跑),需同步回填为
|
|
396
|
-
// completed,否则进度数字与实际步骤明细矛盾(阶段已完成 + 6/8)。
|
|
397
|
-
// 安全边界:仅进入阶段完成分支时才回填(stale 本就被跳过、不回填也照常标 completed),
|
|
398
|
-
// 不改变单步推进行为;stale 若确需重跑,运行流(stage.js:141-148)会先于本分支转 pending 执行。
|
|
399
|
-
// FR-01 门控:无 --confirm 时不回填,阻断并给两条出路;带 --confirm 时回填并审计。
|
|
400
|
-
const staleSteps = steps.filter(s => s.status === 'stale')
|
|
401
|
-
if (staleSteps.length > 0) {
|
|
402
|
-
if (!confirm) {
|
|
403
|
-
// 无 confirm:不回填,阶段不完成,返回 staleBlocked 标记
|
|
404
|
-
const staleNames = staleSteps.map(s => `Step ${steps.indexOf(s) + 1}(${s.name})`).join(', ')
|
|
405
|
-
console.error(`⏸️ 检测到 ${staleSteps.length} 个 stale 步骤(reopen 后未执行)——两条出路:`)
|
|
406
|
-
console.error(` ① sillyspec run ${stageName} 逐个真实执行(首个 stale 自动转 pending)`)
|
|
407
|
-
console.error(` ② 确认方案未变用 --done --confirm 一次性回填收尾`)
|
|
408
|
-
console.error(` stale 步骤:${staleNames}`)
|
|
409
|
-
progress.lastActive = new Date().toLocaleString('zh-CN',{hour12:false})
|
|
410
|
-
pm._write(cwd, progress, changeName)
|
|
411
|
-
return { stageCompleted: false, currentIdx, nextPendingIdx: -1, staleBlocked: true }
|
|
412
|
-
}
|
|
413
|
-
// 带 confirm:按现行回填逻辑 + 审计记录
|
|
414
|
-
const nowStr = new Date().toLocaleString('zh-CN',{hour12:false})
|
|
415
|
-
for (const st of staleSteps) {
|
|
416
|
-
st.status = 'completed'
|
|
417
|
-
st.completedAt = st.completedAt || nowStr
|
|
418
|
-
}
|
|
419
|
-
pm._write(cwd, progress, changeName)
|
|
420
|
-
console.log(` ⚠️ 同步回填 ${staleSteps.length} 个 stale 步骤为 completed(reopen --from-step N 后 --done --confirm,方案未变)`)
|
|
421
|
-
// 审计记录 reopen-stale-backfill
|
|
422
|
-
try {
|
|
423
|
-
pm._appendAuditLog(cwd, {
|
|
424
|
-
action: 'reopen-stale-backfill',
|
|
425
|
-
stage: stageName,
|
|
426
|
-
change: changeName,
|
|
427
|
-
steps: staleSteps.map(s => s.name),
|
|
428
|
-
confirmedAt: nowStr
|
|
429
|
-
})
|
|
430
|
-
} catch (e) {
|
|
431
|
-
console.warn('⚠️ 回填审计日志写入失败(不阻断):', e.message)
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
stageData.status = 'completed'
|
|
436
|
-
stageData.completedAt = new Date().toLocaleString('zh-CN',{hour12:false})
|
|
437
|
-
progress.lastActive = new Date().toLocaleString('zh-CN',{hour12:false})
|
|
438
|
-
// persist(_write + triggerSync)移到 completeStageGates 成功之后(task-01 / review-2026-08-09 #2):
|
|
439
|
-
// gate 任一段异常/失败 → rollbackCompletionAndReturn 回 in-progress 并落盘;此处未到 _write,DB 不留假 completed。
|
|
440
|
-
|
|
441
|
-
// Append to user-inputs.md
|
|
442
|
-
if (outputText) {
|
|
443
|
-
const inputsPath = join(specBase, '.runtime', 'user-inputs.md')
|
|
444
|
-
const entry = `\n## ${new Date().toLocaleString('zh-CN',{hour12:false})} | ${changeName || '?'} | ${stageName}: ${steps[currentIdx].name}\n${inputText ? "- 输入:" + inputText + "\n" : ""}- 输出:${outputText}\n`
|
|
445
|
-
try {
|
|
446
|
-
appendFileSync(inputsPath, entry)
|
|
447
|
-
} catch (e) {
|
|
448
|
-
// best-effort:Windows AV/索引占用偶发 EPERM,历史日志写失败不阻断主流程(review-2026-08-09 #7,对齐 shared.js triggerSync)
|
|
449
|
-
console.warn('⚠️ user-inputs.md 追加失败(不阻断):', e.message)
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
// 阶段完成收尾共享管线(handleScan manifest + validateMetadata/FileLocations + auxiliary 重置 +
|
|
454
|
-
// runStageCompletionGates + execute worktree cleanup),消除 S1/S2/S3 三处收尾不对称(task-01 抽出)。
|
|
455
|
-
// gate 失败已 rollback,early-return 跳过下方"阶段已完成/下一步"提示(合理收紧:回滚不该打完成提示)。
|
|
456
|
-
// W3 task-09:best-effort 构造 ctx 透传给 completeStageGates(D-013),让 task-07 gate 跨仓 task
|
|
457
|
-
// 切 gitDir + per-repo verify。execute 启动期已 fail-closed 过一次,此处命中缓存或单仓退化。
|
|
458
|
-
let _completeCtx = null
|
|
459
|
-
try {
|
|
460
|
-
_completeCtx = await getOrCreateMultiRepoContext({ cwd, changeName, platformOpts })
|
|
461
|
-
} catch (e) {
|
|
462
|
-
console.warn('⚠️ 阶段完成 ctx 构造失败,降级单仓 gate(' + (e && e.message ? e.message : e) + ')')
|
|
463
|
-
}
|
|
464
|
-
const _stageGatesResult = await completeStageGates({ stageName, cwd, changeName, platformOpts, specBase, progress, pm, stageData, steps, currentIdx, outputText, ctx: _completeCtx })
|
|
465
|
-
// task-04 / A5:gate 失败(stageCompleted===false)设进程退出码 1,对齐 quick 审计 blocked→exit 1 惯例。
|
|
466
|
-
// 用 process.exitCode 而非 process.exit(1):让回滚 pm._write + triggerSync 落盘完成后自然退出,保留失败现场。
|
|
467
|
-
if (_stageGatesResult?.stageCompleted === false) process.exitCode = 1
|
|
468
|
-
if (_stageGatesResult) return _stageGatesResult
|
|
469
|
-
|
|
470
|
-
// 完整流程 change title 刷新(阶段完成时;proposal/design 已落盘,机制见 refreshChangeTitleFromArtifacts)
|
|
471
|
-
refreshChangeTitleFromArtifacts(pm, cwd, specBase, changeName)
|
|
472
|
-
|
|
473
|
-
// gate 全过:persist completed(task-01 移后)。此处到 _write 之间若崩,DB 仍 in-progress(内存已 completed 但未落盘),下次进 CLI 读 DB 即 in-progress,不产生"假 completed"。
|
|
474
|
-
pm._write(cwd, progress, changeName)
|
|
475
|
-
triggerSync(cwd, changeName, platformOpts)
|
|
476
|
-
|
|
477
|
-
const total = steps.length
|
|
478
|
-
console.log(`✅ ${stageName} 阶段已完成(${total}/${total} 步)`)
|
|
479
|
-
|
|
480
|
-
if (stageName === 'execute') {
|
|
481
|
-
// execute run summary:展示真实可得的结构化信息
|
|
482
|
-
try {
|
|
483
|
-
const lastOutput = steps[steps.length - 1]?.output || ''
|
|
484
|
-
const summary = formatExecuteSummary({
|
|
485
|
-
changeName,
|
|
486
|
-
stepsCompleted: total,
|
|
487
|
-
stepsTotal: total,
|
|
488
|
-
agentSummary: lastOutput,
|
|
489
|
-
cwd,
|
|
490
|
-
})
|
|
491
|
-
console.log(`\n${summary}`)
|
|
492
|
-
} catch (e) {
|
|
493
|
-
// summary 失败不影响主流程
|
|
494
|
-
console.log(`\n👉 下一步:sillyspec run verify${changeName ? ` --change ${changeName}` : ''}(验证通过后才能归档)`)
|
|
495
|
-
}
|
|
496
|
-
} else if (stageName === 'archive') {
|
|
497
|
-
console.log('\n👉 归档完成!现在可以提交了:git commit -m "..."')
|
|
498
|
-
} else if (stageName === 'verify') {
|
|
499
|
-
// verify 的"验证通过"提示延后到下方 validator 通过后才打印,
|
|
500
|
-
// 避免校验失败(FAIL / 缺 verify-result.md)时仍声称"验证通过可以归档"。
|
|
501
|
-
} else if (stageName === 'brainstorm') {
|
|
502
|
-
// brainstorm 下一步按 design.md 的 scale 分叉(与末步 prompt 的 large→plan / small→quick 对齐),
|
|
503
|
-
// 不走下方 _getNextSuggestion —— 后者按全局状态机「第一个未完成且上游就绪的阶段」推荐,
|
|
504
|
-
// 当 scan 未完成时会误推 scan(回头路),与 brainstorm 已完成、应进入 plan/quick 矛盾。
|
|
505
|
-
// 历史教训:曾因此让 agent 在 brainstorm 完成后被误导去跑 scan。
|
|
506
|
-
const _bscale = readDesignScale(specBase, changeName)
|
|
507
|
-
if (_bscale === 'small') {
|
|
508
|
-
console.log(`\n👉 brainstorm 已完成(small)。下一步:sillyspec run quick --linked-changes ${changeName}`)
|
|
509
|
-
} else {
|
|
510
|
-
console.log(`\n👉 brainstorm 已完成。下一步:sillyspec run plan${changeName ? ` --change ${changeName}` : ''}(scale=large 或未标 small 走完整 plan)`)
|
|
511
|
-
}
|
|
512
|
-
} else if (stageName === 'quick') {
|
|
513
|
-
// quick 是收尾阶段(辅助流程,不走主链 scan→archive),完成后该提交,而非推 scan。
|
|
514
|
-
// 走下方 _getNextSuggestion 会因 scan 是 STAGE_ORDER 首位、永未完成而误推 scan(回头路),
|
|
515
|
-
// 与 brainstorm 同类问题(见上注释),故给 quick 专属分支。
|
|
516
|
-
console.log('\n👉 quick 已完成。下一步:提交本次改动(git commit / sillyspec-commit),或 sillyspec run <stage> 继续其他阶段。')
|
|
517
|
-
} else {
|
|
518
|
-
// D1 暗衔接修:阶段刚完成,CLI 本就知道状态机下一步是哪个阶段(_getNextSuggestion),
|
|
519
|
-
// 却只丢一句「下一步由你决定」让 agent 自己猜命令。改为按 progress 实际状态给出精确命令。
|
|
520
|
-
let next = null
|
|
521
|
-
try { next = pm._getNextSuggestion(progress) } catch { /* 读建议失败不阻断完成 */ }
|
|
522
|
-
if (next && next.command) {
|
|
523
|
-
console.log(`\n👉 ${next.text}`)
|
|
524
|
-
console.log(` 下一步命令:${next.command}`)
|
|
525
|
-
} else {
|
|
526
|
-
console.log(`\n下一步由你决定:sillyspec run <stage>(brainstorm/plan/execute/verify/archive 等)`)
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
return { stageCompleted: true, currentIdx, nextPendingIdx: -1 }
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
progress.lastActive = new Date().toLocaleString('zh-CN',{hour12:false})
|
|
534
|
-
pm._write(cwd, progress, changeName)
|
|
535
|
-
triggerSync(cwd, changeName, platformOpts)
|
|
536
|
-
// 单步完成也刷新 change title:design.md 在 brainstorm step6 落盘,此后每次 --done 都该让
|
|
537
|
-
// changes.title 反映中文描述,不等阶段收尾(机制见 refreshChangeTitleFromArtifacts)。
|
|
538
|
-
refreshChangeTitleFromArtifacts(pm, cwd, specBase, changeName)
|
|
539
|
-
|
|
540
|
-
// Append to user-inputs.md
|
|
541
|
-
if (outputText) {
|
|
542
|
-
const inputsPath = join(specBase, '.runtime', 'user-inputs.md')
|
|
543
|
-
const entry = `\n## ${new Date().toLocaleString('zh-CN',{hour12:false})} | ${changeName || '?'} | ${stageName}: ${steps[currentIdx].name}\n${inputText ? "- 输入:" + inputText + "\n" : ""}- 输出:${outputText}\n`
|
|
544
|
-
try {
|
|
545
|
-
appendFileSync(inputsPath, entry)
|
|
546
|
-
} catch (e) {
|
|
547
|
-
console.warn('⚠️ user-inputs.md 追加失败(不阻断):', e.message)
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
const defSteps = await getStageSteps(stageName, cwd, progress, platformOpts?.specRoot || null)
|
|
552
|
-
console.log(`✅ Step ${currentIdx + 1}/${steps.length} 完成:${steps[currentIdx].name}\n`)
|
|
553
|
-
|
|
554
|
-
// Workflow post_check(W6 Step6 抽至 complete-handlers.js handleWorkflowPostCheck)
|
|
555
|
-
const _wfResult = await handleWorkflowPostCheck({ stageName, steps, currentIdx, cwd, specBase, progress, platformOpts, changeName })
|
|
556
|
-
if (_wfResult) return _wfResult
|
|
557
|
-
|
|
558
|
-
if (printNext) {
|
|
559
|
-
await outputStep(stageName, nextPendingIdx, defSteps, cwd, changeName, progress.project || null, platformOpts)
|
|
560
|
-
// task-08:底部锚定行——outputStep 渲染的长 prompt 易被 tail 截断,末尾再打一行推进位置,
|
|
561
|
-
// 让 agent 只看末几行也能知道「推进到第几步」。仅单步推进分支(阶段完成分支已有 ✅ 阶段已完成)。
|
|
562
|
-
// defSteps 越界防御:平台模式 buildPlanSteps 长度漂移时 nextPendingIdx 可能越界
|
|
563
|
-
// (参照 prompt.js:174-179 越界降级先例),越界时静默跳过,不崩。
|
|
564
|
-
if (defSteps && defSteps[nextPendingIdx]) {
|
|
565
|
-
console.log(`\n🚀 advanced to step ${nextPendingIdx + 1}/${steps.length}: ${defSteps[nextPendingIdx].name}`)
|
|
566
|
-
}
|
|
567
|
-
// quick 末步四字段前置预告(坑 quick-step3-four-fields-late):末步 --done 的 --output 四字段
|
|
568
|
-
// 是硬校验(缺任一项被拒 + 回滚),但模板藏在 step3 长 prompt 中段——task-08 同因(长 prompt
|
|
569
|
-
// 易被 tail 截断),agent 常到 --done 被拦才第一次见到模板。推进到末步的此刻用底部短块预告
|
|
570
|
-
// 模板 + 可照抄命令,省一轮拦截往返(拦截路径保留兜底)。
|
|
571
|
-
if (stageName === 'quick' && nextPendingIdx === steps.length - 1) {
|
|
572
|
-
console.log(`\n📌 本步是 quick 末步:--done 必须给全四字段(CLI 硬校验,缺任一项会被拒、补全重跑不丢进度)。推荐四参数形式(CLI 自动合成,无格式事故面):`)
|
|
573
|
-
console.log(` sillyspec run quick --done${changeName ? ` --change ${changeName}` : ''} --req "一句话语义化短标题(即 QUICKLOG 条目标题)" --cause "为什么这样改(纯新增/样式则写「无,纯新增/纯样式」)" --solution "怎么改的" --result "验证情况(测试数 / lint / typecheck / 部署状态)"`)
|
|
574
|
-
console.log(` 兼容旧形式:--output "需求:… 根因:… 方案:… 结果:…"(四字段逐项一句话、不可「见前述」,正文内禁嵌套全角冒号);可选 --file-notes "path::括注 || path2" 落多行文件括注`)
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
return { stageCompleted: false, currentIdx, nextPendingIdx }
|
|
578
|
-
}
|
|
579
|
-
|
|
580
|
-
// ── Step 调度兄弟函数(W6 Step7b-2 从 run.js 搬入:skip/wait/continue + formatWaitHistory)──
|
|
581
|
-
/**
|
|
582
|
-
* plan.md checkbox 自动勾选:execute 完成 + 各 task review.json 双 verdict 非 fail → 自动勾选。
|
|
583
|
-
* 治本于"plan 全靠手动勾、易遗漏"——以 review.json pass 为客观依据勾选。供 continueStep 完成段
|
|
584
|
-
* 与 completeStep 的 execute 批量完成检测复用(避免两处复制)。
|
|
585
|
-
*
|
|
586
|
-
* @returns {{autoChecked:boolean, checkedCount:number, skippedCount:number, planTotal:number, planChecked:number}}
|
|
587
|
-
* planTotal/planChecked 在调用方于本函数之后用 readPlanCheckboxStatus 重读(勾选已落盘)。
|
|
588
|
-
*/
|
|
589
|
-
/**
|
|
590
|
-
* 读 task 卡片文本(plan.md task 行外的详细描述/allowed_paths),用于端到端 task 判定。
|
|
591
|
-
* 卡片缺失返回空串(仅靠 plan.md task 行文本判)。
|
|
592
|
-
*/
|
|
593
|
-
function readTaskCardText(changeDir, taskNum) {
|
|
594
|
-
try { return readFileSync(join(changeDir, 'tasks', `task-${taskNum}.md`), 'utf8') } catch { return '' }
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
/**
|
|
598
|
-
* W2 task-04/05 共用 helper:构造草稿零 diff 校验用的 ctx(与 task-review.js generateTaskReviewDrafts 同源)。
|
|
599
|
-
* 用于 autoCheckPlanFromReviews(勾选层)和 detectExecuteBatchFinish(批量层)。
|
|
600
|
-
* 失败返回 null(调用方降级:勾选层不勾、批量层不过滤——向后兼容)。
|
|
601
|
-
*
|
|
602
|
-
* @returns {Promise<{gitDir:string, base:string, head:string}|null>}
|
|
603
|
-
*/
|
|
604
|
-
async function buildDraftContext(cwd, changeName) {
|
|
605
|
-
try {
|
|
606
|
-
const { WorktreeManager } = await import('../worktree.js')
|
|
607
|
-
const meta = new WorktreeManager({ cwd }).getMeta(changeName)
|
|
608
|
-
const base = meta?.baselineCommit || meta?.baseHash || null
|
|
609
|
-
let gitDir = cwd
|
|
610
|
-
let head = null
|
|
611
|
-
if (meta?.worktreePath && meta.mode !== 'in-place-fallback' && existsSync(meta.worktreePath)) {
|
|
612
|
-
gitDir = meta.worktreePath
|
|
613
|
-
}
|
|
614
|
-
if (base) {
|
|
615
|
-
try {
|
|
616
|
-
head = gitQuiet(gitDir, ['rev-parse', 'HEAD'])
|
|
617
|
-
} catch (e) {
|
|
618
|
-
console.warn(`⚠️ ctx 构造失败(git rev-parse HEAD 失败:${e && e.message ? e.message : e}),跳过草稿 diff 校验`)
|
|
619
|
-
return null
|
|
620
|
-
}
|
|
621
|
-
}
|
|
622
|
-
if (base && head && gitDir) {
|
|
623
|
-
return { gitDir, base, head }
|
|
624
|
-
}
|
|
625
|
-
return null
|
|
626
|
-
} catch (e) {
|
|
627
|
-
console.warn(`⚠️ ctx 构造失败(${e && e.message ? e.message : e}),跳过草稿 diff 校验`)
|
|
628
|
-
return null
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
/**
|
|
633
|
-
* 预取 base..head 全量 diff 文件集(一次 git spawn),供草稿零 diff 守卫按 task 内存归属判定。
|
|
634
|
-
* 此前每草稿 task 一次 `git diff --name-only base..head -- <files>`(同一对 base..head 查 N 次,
|
|
635
|
-
* 8 task ≈ 8-16 次串行 spawn)。失败返回 null → 调用方回退逐 task 实测路径。
|
|
636
|
-
*/
|
|
637
|
-
function prefetchDiffFileSet(ctx) {
|
|
638
|
-
if (!ctx?.gitDir || !ctx.base || !ctx.head) return ctx
|
|
639
|
-
try {
|
|
640
|
-
const out = gitQuiet(ctx.gitDir, ['diff', '--name-only', `${ctx.base}..${ctx.head}`], { trim: true })
|
|
641
|
-
if (!out) return ctx
|
|
642
|
-
return { ...ctx, diffFileSet: new Set(out.split('\n').filter(Boolean)) }
|
|
643
|
-
} catch {
|
|
644
|
-
return ctx
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
/**
|
|
649
|
-
* 判定 task 是否该被 autoCheckPlanFromReviews 自动勾选。
|
|
650
|
-
* 端到端/deployment-critical task 要求 review spec+quality 双 pass(cannot_verify 不算,防批量完成
|
|
651
|
-
* 放行未真验的端到端 task);普通 task 非 fail 即可(保主 agent 直接实现模式体验,其 cannot_verify
|
|
652
|
-
* 草稿仍可批量收尾)。坑 execute-batch-complete-endtoend-checkbox。
|
|
653
|
-
*
|
|
654
|
-
* W2 task-04 FR-03:草稿勾选层零 diff 守卫——review 为自动草稿且 ctx 给定时,额外要求
|
|
655
|
-
* changedFiles 非空且 git diff 实测非空。防 allowed_paths 误归属他人 diff 或陈旧 review.json 导致
|
|
656
|
-
* 空任务被自动勾选/批量放行。ctx 缺省时保持现行判定(向后兼容)。
|
|
657
|
-
*
|
|
658
|
-
* @param {{ok?:boolean, review?:{specVerdict?:string, qualityVerdict?:string, reviewerNotes?:string, changedFiles?:string[]}}} r readReview 结果
|
|
659
|
-
* @param {boolean} endToEnd 是否端到端/deployment-critical task
|
|
660
|
-
* @param {{gitDir?:string, base?:string, head?:string}|null} [ctx] 实测 diff 上下文;缺省保持现行判定
|
|
661
|
-
* @returns {boolean}
|
|
662
|
-
*/
|
|
663
|
-
export function shouldAutoCheckTask(r, endToEnd, ctx = null) {
|
|
664
|
-
if (!r?.ok) return false
|
|
665
|
-
const spec = r.review?.specVerdict
|
|
666
|
-
const quality = r.review?.qualityVerdict
|
|
667
|
-
if (spec === 'fail' || quality === 'fail') return false
|
|
668
|
-
if (endToEnd) return spec === 'pass' && quality === 'pass'
|
|
669
|
-
|
|
670
|
-
// W2 task-04 草稿零 diff 守卫(FR-03)
|
|
671
|
-
// ctx 给定且 review 为自动草稿时,要求 changedFiles 非空且实测 diff 非空
|
|
672
|
-
if (ctx && r.review?.reviewerNotes && r.review.reviewerNotes.includes('auto-generated draft')) {
|
|
673
|
-
const changedFiles = r.review.changedFiles || []
|
|
674
|
-
if (changedFiles.length === 0) {
|
|
675
|
-
console.warn(`⚠️ 草稿 review changedFiles 为空,跳过自动勾选`)
|
|
676
|
-
return false
|
|
677
|
-
}
|
|
678
|
-
if (!ctx.gitDir || !ctx.base || !ctx.head) {
|
|
679
|
-
console.warn(`⚠️ ctx 信息不完整(gitDir=${ctx.gitDir}, base=${ctx.base}, head=${ctx.head}),跳过草稿 diff 校验,保守不勾`)
|
|
680
|
-
return false
|
|
681
|
-
}
|
|
682
|
-
// 预取路径:一次全量 diff 文件集内存归属(autoCheckPlanFromReviews/批量路径已 prefetch)
|
|
683
|
-
if (ctx.diffFileSet) {
|
|
684
|
-
const hit = changedFiles.filter(f => ctx.diffFileSet.has(f))
|
|
685
|
-
if (hit.length === 0) {
|
|
686
|
-
console.warn(`⚠️ 草稿 review 实测 diff 为空(base=${ctx.base.slice(0, 8)}, head=${ctx.head.slice(0, 8)}, files=${changedFiles.length}),跳过自动勾选`)
|
|
687
|
-
return false
|
|
688
|
-
}
|
|
689
|
-
console.log(` ✓ 草稿 diff 校验通过(实测 ${hit.length}/${changedFiles.length} 个声明文件有改动)`)
|
|
690
|
-
return true
|
|
691
|
-
}
|
|
692
|
-
try {
|
|
693
|
-
// 实测 diff:git diff --name-only <base>..<head> -- <changedFiles>
|
|
694
|
-
// 用数组参数避免 shell 拆词,复用 git-helper 安全模式
|
|
695
|
-
const diffResult = gitQuiet(ctx.gitDir, ['diff', '--name-only', `${ctx.base}..${ctx.head}`, '--', ...changedFiles], { trim: true })
|
|
696
|
-
if (!diffResult || diffResult.trim() === '') {
|
|
697
|
-
console.warn(`⚠️ 草稿 review 实测 diff 为空(base=${ctx.base.slice(0,8)}, head=${ctx.head.slice(0,8)}, files=${changedFiles.length}),跳过自动勾选`)
|
|
698
|
-
return false
|
|
699
|
-
}
|
|
700
|
-
console.log(` ✓ 草稿 diff 校验通过(${diffResult.trim().split('\n').length} 个文件有改动)`)
|
|
701
|
-
} catch (e) {
|
|
702
|
-
console.warn(`⚠️ 草稿 diff 校验失败(${e && e.message ? e.message : e}),保守不勾`)
|
|
703
|
-
return false
|
|
704
|
-
}
|
|
705
|
-
}
|
|
706
|
-
|
|
707
|
-
return true
|
|
708
|
-
}
|
|
709
|
-
async function autoCheckPlanFromReviews({ stageName, changeName, cwd, platformOpts }) {
|
|
710
|
-
if (stageName !== 'execute' || !changeName) {
|
|
711
|
-
return { autoChecked: false, checkedCount: 0, skippedCount: 0 }
|
|
712
|
-
}
|
|
713
|
-
try {
|
|
714
|
-
// 勾选写入目标漂移锚定(坑 autocheck-worktree-tasks-lost,2026-08-23 实证:agent 在
|
|
715
|
-
// worktree 内跑 execute --done 且 drift 守卫未拦(非平台模式+无 specDriftAnchor 透传的
|
|
716
|
-
// 直调路径)时,tasks.md 勾选写进 worktree 的 .sillyspec/changes/ 副本——worktree 被
|
|
717
|
-
// cleanup 整目录删除后勾选丢失,主仓 tasks.md 停在未勾态需手动补。runtimeRoot 已走
|
|
718
|
-
// resolveRuntimeRoot(drift-aware),changeDir 同步对齐:specDriftAnchor > specRoot > cwd。
|
|
719
|
-
const specBaseLc = platformOpts?.specDriftAnchor || platformOpts?.specRoot || join(cwd, '.sillyspec')
|
|
720
|
-
const changeDir = join(specBaseLc, 'changes', changeName)
|
|
721
|
-
// 2026-08-20-task-truth-unify D-001@v1:勾选写入目标从 plan.md 迁 tasks.md(任务唯一真相;
|
|
722
|
-
// plan.md Wave 引用行无 checkbox,无处可勾)。tasks.md 存在性作前置。
|
|
723
|
-
const tasksMdPath = join(changeDir, 'tasks.md')
|
|
724
|
-
const runtimeRoot = resolveRuntimeRoot(platformOpts, specBaseLc)
|
|
725
|
-
const runIdFile = join(runtimeRoot, `current-execute-run-id-${changeName}`)
|
|
726
|
-
if (!existsSync(tasksMdPath) || !existsSync(runIdFile)) {
|
|
727
|
-
return { autoChecked: false, checkedCount: 0, skippedCount: 0 }
|
|
728
|
-
}
|
|
729
|
-
const c = readFileSync(runIdFile, 'utf8').trim()
|
|
730
|
-
const { readReview, isValidExecuteRunId } = await import('../task-review.js')
|
|
731
|
-
// marker 是 agent 可写内容:格式校验防注入/穿越,非法视为缺失(跳过 autoCheck,不误勾)
|
|
732
|
-
if (c && !isValidExecuteRunId(c)) {
|
|
733
|
-
console.warn(`⚠️ execute run marker 内容非法(期望 exec-YYYY-MM-DD-HHMMSS,实得 ${JSON.stringify(c.slice(0, 60))}),跳过 review 自动勾选`)
|
|
734
|
-
return { autoChecked: false, checkedCount: 0, skippedCount: 0 }
|
|
735
|
-
}
|
|
736
|
-
const executeRunId = c
|
|
737
|
-
|
|
738
|
-
// W2 task-04 FR-03:构造 ctx 供草稿零 diff 守卫用(与 task-review.js generateTaskReviewDrafts 同源)
|
|
739
|
-
const ctx = prefetchDiffFileSet(await buildDraftContext(cwd, changeName))
|
|
740
|
-
|
|
741
|
-
// tasks.md 是 agent 与 CLI 都会写的共享文件(agent 勾 checkbox、此处 autoCheck 也勾选)。
|
|
742
|
-
// 读-改-写必须整体持锁(withFileLock 串行化多进程),否则并发 execute --done / 手动勾选互相覆盖
|
|
743
|
-
// (后到者覆盖先到者);写入用 writeAtomicSync(tmp+rename 原子),防 Windows 整文件覆盖被读半截
|
|
744
|
-
// (fs-atomic.js 头注明的 reader-writer 竞态坑)。锁文件放 changeDir,与 QUICKLOG 同机制。
|
|
745
|
-
const lockPath = join(changeDir, '.tasks.md.lock')
|
|
746
|
-
return await withFileLock(lockPath, async () => {
|
|
747
|
-
const tasksContent = readFileSync(tasksMdPath, 'utf8')
|
|
748
|
-
let checkedCount = 0
|
|
749
|
-
let skippedCount = 0
|
|
750
|
-
const updated = tasksContent.replace(/^(\s*[-*]\s*\[)\s(\]\s*task-\d+)/gim, (match, p1, p2) => {
|
|
751
|
-
const taskNum = match.match(/task-(\d+)/)[1].padStart(2, '0')
|
|
752
|
-
const reviewPath = join(runtimeRoot, 'execute-runs', executeRunId, 'tasks', `task-${taskNum}`, 'review.json')
|
|
753
|
-
const r = readReview(reviewPath)
|
|
754
|
-
// 端到端 task:必须 pass(cannot_verify 不算);普通 task:非 fail 即可(坑 execute-batch-complete-endtoend-checkbox)
|
|
755
|
-
const endToEnd = isEndToEndTaskText(match + ' ' + readTaskCardText(changeDir, taskNum))
|
|
756
|
-
if (shouldAutoCheckTask(r, endToEnd, ctx)) {
|
|
757
|
-
checkedCount++
|
|
758
|
-
return `${p1}x${p2}` // 勾选
|
|
759
|
-
}
|
|
760
|
-
skippedCount++
|
|
761
|
-
return match // 不勾
|
|
762
|
-
})
|
|
763
|
-
if (checkedCount > 0) {
|
|
764
|
-
writeAtomicSync(tasksMdPath, updated)
|
|
765
|
-
}
|
|
766
|
-
return { autoChecked: checkedCount > 0, checkedCount, skippedCount }
|
|
767
|
-
})
|
|
768
|
-
} catch (err) {
|
|
769
|
-
console.warn(`⚠️ autoCheckPlanFromReviews 异常(跳过自动勾选): ${err && err.message ? err.message : err}`);
|
|
770
|
-
return { autoChecked: false, checkedCount: 0, skippedCount: 0 }
|
|
771
|
-
}
|
|
772
|
-
}
|
|
773
|
-
|
|
774
|
-
/**
|
|
775
|
-
* execute 批量完成检测:tasks.md 所有 task checkbox 已勾 + 代码客观核验非零变更 →
|
|
776
|
-
* 把剩余 pending/in-progress step 一次性标 completed,使 completeStep 本次 --done 即进入阶段完成
|
|
777
|
-
* 分支(而非逐次 +1)。治"3 Wave 全做完仍显示未开工、需重走 7 次 --done"。
|
|
778
|
-
* 复用现成能力:readPlanCheckboxStatus(勾选状态,2026-08-20-task-truth-unify 起读 tasks.md)
|
|
779
|
-
* + checkExecuteCodeEvidence(代码客观核验,与 doctor --align-execute-progress 同源,D-002/D-004)。
|
|
780
|
-
* 仅在 stageName==='execute' && changeName 触发。
|
|
781
|
-
*
|
|
782
|
-
* W2 task-05 FR-04:全勾后逐 task 复核——review 缺失或草稿零 diff → 阻断批量,
|
|
783
|
-
* 返回 blockedTasks 列表(task id 数组),调用方打印 reason。
|
|
784
|
-
*
|
|
785
|
-
* 安全门:注册表零 checkbox / 未全勾 / 代码零变更(unchanged)均不批量——信任声明但用代码核验兜底。
|
|
786
|
-
* @returns {Promise<{batched:boolean, aligned:number, reason?:string, blockedTasks?:string[]}>}
|
|
787
|
-
*/
|
|
788
|
-
async function detectExecuteBatchFinish({ pm, stageName, changeName, cwd, specBase, steps }) {
|
|
789
|
-
if (stageName !== 'execute' || !changeName) return { batched: false, aligned: 0 }
|
|
790
|
-
try {
|
|
791
|
-
const changeDir = join(specBase, 'changes', changeName)
|
|
792
|
-
const { total: planTotal, checked: planChecked } = pm.readPlanCheckboxStatus(changeDir)
|
|
793
|
-
if (planTotal === 0) return { batched: false, aligned: 0, reason: 'tasks.md 无 task checkbox' }
|
|
794
|
-
if (planChecked < planTotal) {
|
|
795
|
-
return { batched: false, aligned: 0, reason: `tasks.md 未全勾(${planChecked}/${planTotal})` }
|
|
796
|
-
}
|
|
797
|
-
// 全勾 → 代码客观核验(防手动勾伪造导致空完成)
|
|
798
|
-
const { checkExecuteCodeEvidence } = await import('../stage-contract.js')
|
|
799
|
-
const evidence = checkExecuteCodeEvidence(cwd, changeName)
|
|
800
|
-
if (evidence.status === 'unchanged') {
|
|
801
|
-
return { batched: false, aligned: 0, reason: `代码零变更(${evidence.detail})` }
|
|
802
|
-
}
|
|
803
|
-
|
|
804
|
-
// W2 task-05 FR-04:逐 task 复核(草稿零 diff 守卫——批量层)
|
|
805
|
-
// 读取 tasks.md 提取已勾 task id 列表(正则 `- [x] task-NN`;勾选唯一落点 tasks.md)
|
|
806
|
-
const tasksMdPath = join(changeDir, 'tasks.md')
|
|
807
|
-
const tasksContent = readFileSync(tasksMdPath, 'utf8')
|
|
808
|
-
const taskCheckboxRegex = /-\s\[x\]\s+task-(\d+)/gi
|
|
809
|
-
const taskMatches = [...tasksContent.matchAll(taskCheckboxRegex)]
|
|
810
|
-
const taskIds = taskMatches.map(m => `task-${m[1].padStart(2, '0')}`)
|
|
811
|
-
|
|
812
|
-
if (taskIds.length === 0) {
|
|
813
|
-
return { batched: false, aligned: 0, reason: 'tasks.md 无已勾 task checkbox' }
|
|
814
|
-
}
|
|
815
|
-
|
|
816
|
-
// 构造 ctx 供草稿零 diff 校验用(与 task-04 同源)
|
|
817
|
-
const ctx = prefetchDiffFileSet(await buildDraftContext(cwd, changeName))
|
|
818
|
-
const runtimeRoot = resolveRuntimeRoot({ specRoot: specBase }, specBase)
|
|
819
|
-
const runIdFile = join(runtimeRoot, `current-execute-run-id-${changeName}`)
|
|
820
|
-
const blockedTasks = []
|
|
821
|
-
|
|
822
|
-
for (const taskId of taskIds) {
|
|
823
|
-
let review = null
|
|
824
|
-
try {
|
|
825
|
-
const { readReview, isValidExecuteRunId } = await import('../task-review.js')
|
|
826
|
-
const c = readFileSync(runIdFile, 'utf8').trim()
|
|
827
|
-
if (!c || !isValidExecuteRunId(c)) {
|
|
828
|
-
blockedTasks.push(taskId)
|
|
829
|
-
continue
|
|
830
|
-
}
|
|
831
|
-
const executeRunId = c
|
|
832
|
-
const reviewPath = join(runtimeRoot, 'execute-runs', executeRunId, 'tasks', taskId, 'review.json')
|
|
833
|
-
const r = readReview(reviewPath)
|
|
834
|
-
if (!r?.ok) {
|
|
835
|
-
blockedTasks.push(taskId)
|
|
836
|
-
continue
|
|
837
|
-
}
|
|
838
|
-
review = r.review
|
|
839
|
-
} catch {
|
|
840
|
-
blockedTasks.push(taskId)
|
|
841
|
-
continue
|
|
842
|
-
}
|
|
843
|
-
|
|
844
|
-
// review 存在:判定是否为自动草稿且零 diff
|
|
845
|
-
if (review?.reviewerNotes && review.reviewerNotes.includes('auto-generated draft')) {
|
|
846
|
-
const changedFiles = review.changedFiles || []
|
|
847
|
-
// 草稿且 changedFiles 为空 → 阻断
|
|
848
|
-
if (changedFiles.length === 0) {
|
|
849
|
-
blockedTasks.push(taskId)
|
|
850
|
-
continue
|
|
851
|
-
}
|
|
852
|
-
// 草稿且有 changedFiles → 实测 diff 校验(ctx 与 task-04 同源;优先用预取全量集,
|
|
853
|
-
// 免去每 task 一次 spawn——与 shouldAutoCheckTask 同口径)
|
|
854
|
-
if (ctx && ctx.gitDir && ctx.base && ctx.head) {
|
|
855
|
-
try {
|
|
856
|
-
let hit = null
|
|
857
|
-
if (ctx.diffFileSet) {
|
|
858
|
-
hit = changedFiles.filter(f => ctx.diffFileSet.has(f))
|
|
859
|
-
} else {
|
|
860
|
-
const diffResult = gitQuiet(ctx.gitDir, ['diff', '--name-only', `${ctx.base}..${ctx.head}`, '--', ...changedFiles], { trim: true })
|
|
861
|
-
hit = diffResult && diffResult.trim() !== '' ? changedFiles : []
|
|
862
|
-
}
|
|
863
|
-
if (hit.length === 0) {
|
|
864
|
-
blockedTasks.push(taskId)
|
|
865
|
-
}
|
|
866
|
-
} catch (e) {
|
|
867
|
-
// diff 校验失败保守处理:阻断(避免误批量)
|
|
868
|
-
blockedTasks.push(taskId)
|
|
869
|
-
}
|
|
870
|
-
}
|
|
871
|
-
}
|
|
872
|
-
}
|
|
873
|
-
|
|
874
|
-
// blockedTasks 非空 → 阻断批量
|
|
875
|
-
if (blockedTasks.length > 0) {
|
|
876
|
-
const reason = `以下 task 复核未过(review 缺失或草稿零 diff):${blockedTasks.join(', ')}`
|
|
877
|
-
console.warn(`⚠️ 批量完成被阻断:${reason}`)
|
|
878
|
-
return { batched: false, aligned: 0, reason, blockedTasks }
|
|
879
|
-
}
|
|
880
|
-
|
|
881
|
-
// 全部复核通过 → 批量标 completed
|
|
882
|
-
const now = new Date().toLocaleString('zh-CN', { hour12: false })
|
|
883
|
-
let aligned = 0
|
|
884
|
-
for (const step of steps) {
|
|
885
|
-
if (step.status === 'pending' || step.status === 'in-progress') {
|
|
886
|
-
step.status = 'completed'
|
|
887
|
-
step.completedAt = now
|
|
888
|
-
aligned++
|
|
889
|
-
}
|
|
890
|
-
}
|
|
891
|
-
return { batched: true, aligned }
|
|
892
|
-
} catch (e) {
|
|
893
|
-
// 异常 fail-open:不批量,reason 带错误信息
|
|
894
|
-
return { batched: false, aligned: 0, reason: `批量完成检测异常:${e && e.message ? e.message : e}` }
|
|
895
|
-
}
|
|
896
|
-
}
|
|
897
|
-
|
|
898
|
-
function formatWaitHistory(step) {
|
|
899
|
-
const answers = Array.isArray(step.waitAnswers) ? step.waitAnswers : []
|
|
900
|
-
if (answers.length === 0) return null
|
|
901
|
-
let text = `本步骤历史用户回答(共 ${answers.length} 轮):\n`
|
|
902
|
-
for (const item of answers) {
|
|
903
|
-
text += `\n${item.round}. ${item.answer}`
|
|
904
|
-
if (item.question) {
|
|
905
|
-
text += `\n 对应问题/摘要:${item.question}`
|
|
906
|
-
}
|
|
907
|
-
}
|
|
908
|
-
const maxRounds = step.maxWaitRounds || null
|
|
909
|
-
if (maxRounds && answers.length >= maxRounds) {
|
|
910
|
-
text += `\n\n已达到 maxWaitRounds=${maxRounds}。请基于以上回答总结需求;除非仍有阻塞问题,否则完成本步骤并进入方案讨论。`
|
|
911
|
-
} else {
|
|
912
|
-
text += `\n\n请判断信息是否足够:如果足够,完成本步骤;如果仍缺关键约束,再提出一个问题并 --wait。`
|
|
913
|
-
}
|
|
914
|
-
return text
|
|
915
|
-
}
|
|
916
|
-
|
|
917
|
-
export async function waitStep(pm, progress, stageName, cwd, outputText, waitReason, waitOptions, options = {}) {
|
|
918
|
-
const { changeName, nonInteractive = false, platformOpts = {} } = options
|
|
919
|
-
const specBase = platformOpts.specRoot || join(cwd, '.sillyspec')
|
|
920
|
-
const stageData = progress.stages[stageName]
|
|
921
|
-
|
|
922
|
-
if (!stageData || !stageData.steps) {
|
|
923
|
-
console.error(`❌ 阶段 ${stageName} 未初始化`)
|
|
924
|
-
process.exit(1)
|
|
925
|
-
}
|
|
926
|
-
|
|
927
|
-
// 查找下一个 pending 或 in-progress 的步骤
|
|
928
|
-
const currentIdx = stageData.steps.findIndex(s => s.status === 'pending' || s.status === 'in-progress')
|
|
929
|
-
if (currentIdx === -1) {
|
|
930
|
-
console.error(`没有可以等待的步骤(阶段 ${stageName} 已无 pending/in-progress 步骤)。当前阶段状态:${stageData?.status ?? '未知'}。用 \`sillyspec run ${stageName} --status\` 查看进度,或 \`sillyspec progress show\` 看全局下一步。`)
|
|
931
|
-
process.exit(1)
|
|
932
|
-
}
|
|
933
|
-
|
|
934
|
-
// 前置检查:不允许已有 waiting 步骤时再 --wait
|
|
935
|
-
const existingWaitingIdx = stageData.steps.findIndex(s => s.status === 'waiting')
|
|
936
|
-
if (existingWaitingIdx !== -1) {
|
|
937
|
-
const ws = stageData.steps[existingWaitingIdx]
|
|
938
|
-
console.error(`❌ 已有步骤处于等待状态:Step ${existingWaitingIdx + 1} "${ws.name}"`)
|
|
939
|
-
console.error(` 请先 --continue 或 --reset 该步骤,再开始新的 --wait`)
|
|
940
|
-
process.exit(1)
|
|
941
|
-
}
|
|
942
|
-
|
|
943
|
-
// maxWaitRounds 硬上限:达到后拒绝继续 --wait
|
|
944
|
-
const currentStep = stageData.steps[currentIdx]
|
|
945
|
-
const defSteps = await getStageSteps(stageName, cwd, progress, platformOpts?.specRoot || null)
|
|
946
|
-
const stepDef = defSteps?.[currentIdx] || {}
|
|
947
|
-
const maxWaitRounds = currentStep.maxWaitRounds ?? stepDef.maxWaitRounds
|
|
948
|
-
const currentWaitRound = currentStep.waitRound || 0
|
|
949
|
-
if (maxWaitRounds && currentWaitRound >= maxWaitRounds) {
|
|
950
|
-
console.error(`❌ Step "${currentStep.name}" 已达到最大等待轮次(maxWaitRounds=${maxWaitRounds})`)
|
|
951
|
-
console.error(` 请基于已有回答完成本步骤:`)
|
|
952
|
-
console.error(` sillyspec run ${stageName} --done${changeName ? ` --change ${changeName}` : ''} --output "需求理解摘要"`)
|
|
953
|
-
process.exit(1)
|
|
954
|
-
}
|
|
955
|
-
|
|
956
|
-
// 非交互模式下拒绝等待
|
|
957
|
-
if (nonInteractive) {
|
|
958
|
-
console.error(`❌ Human decision required in non-interactive mode.`)
|
|
959
|
-
console.error(` Reason: ${waitReason || '(unknown)'}`)
|
|
960
|
-
if (waitOptions) console.error(` Options: ${formatWaitOptions(waitOptions)}`)
|
|
961
|
-
console.error(` Fix: rerun with --interactive or provide decision via sillyspec run ${stageName} --continue --answer "..."`)
|
|
962
|
-
process.exit(2)
|
|
963
|
-
}
|
|
964
|
-
|
|
965
|
-
const now = new Date().toLocaleString('zh-CN', { hour12: false })
|
|
966
|
-
stageData.steps[currentIdx].status = 'waiting'
|
|
967
|
-
stageData.steps[currentIdx].waitedAt = now
|
|
968
|
-
if (outputText) {
|
|
969
|
-
const MAX_OUTPUT = 200
|
|
970
|
-
stageData.steps[currentIdx].output = outputText.length > MAX_OUTPUT
|
|
971
|
-
? outputText.slice(0, MAX_OUTPUT) + '…' : outputText
|
|
972
|
-
}
|
|
973
|
-
if (waitReason) stageData.steps[currentIdx].waitReason = waitReason
|
|
974
|
-
if (waitOptions) {
|
|
975
|
-
// 统一存为 JSON 数组
|
|
976
|
-
try {
|
|
977
|
-
const parsed = JSON.parse(waitOptions)
|
|
978
|
-
if (Array.isArray(parsed)) {
|
|
979
|
-
stageData.steps[currentIdx].waitOptions = JSON.stringify(parsed)
|
|
980
|
-
} else {
|
|
981
|
-
stageData.steps[currentIdx].waitOptions = JSON.stringify(waitOptions.split(',').map(o => o.trim()))
|
|
982
|
-
}
|
|
983
|
-
} catch {
|
|
984
|
-
stageData.steps[currentIdx].waitOptions = JSON.stringify(waitOptions.split(',').map(o => o.trim()))
|
|
985
|
-
}
|
|
986
|
-
}
|
|
987
|
-
|
|
988
|
-
progress.lastActive = now
|
|
989
|
-
pm._write(cwd, progress, changeName)
|
|
990
|
-
triggerSync(cwd, changeName, platformOpts)
|
|
991
|
-
|
|
992
|
-
console.log(`⏸️ Step ${currentIdx + 1}/${stageData.steps.length} 已暂停等待:${stageData.steps[currentIdx].name}`)
|
|
993
|
-
if (waitReason) console.log(` 原因:${waitReason}`)
|
|
994
|
-
if (waitOptions) console.log(` 选项:${formatWaitOptions(waitOptions)}`)
|
|
995
|
-
console.log(` 继续时执行:sillyspec run ${stageName} --continue --answer "你的选择"${changeName ? ` --change ${changeName}` : ''}`)
|
|
996
|
-
// requiresWait 语义前置(坑 archive-step3-wait-answer-hint-late):--continue --answer 只是中继回答,
|
|
997
|
-
// 本步会回到待执行(回答后还需执行动作再 --done 收尾);不想两段式可用 --done --answer 一步完成。
|
|
998
|
-
// 提示落在标记 --wait 的此刻,而非等 agent 撞 --done 报错才知道。
|
|
999
|
-
// conditionalWait(坑 archive-subconfirm-redundant 后 archive step3 降级软门)+ repeatableWait 的
|
|
1000
|
-
// --wait 同样回 pending(continueStep shouldReturnToCurrentStep),提示同样适用。
|
|
1001
|
-
if (stepDef.requiresWait === true || currentStep.requiresWait === true
|
|
1002
|
-
|| stepDef.conditionalWait === true || currentStep.conditionalWait === true) {
|
|
1003
|
-
console.log(` 注:本步为需回执的等待步骤(requiresWait/conditionalWait)——--continue --answer 后本步回到待执行,完成动作后需再 --done 收尾`)
|
|
1004
|
-
console.log(` 或一步完成:sillyspec run ${stageName} --done --answer "你的选择"${changeName ? ` --change ${changeName}` : ''} --output "你的摘要"`)
|
|
1005
|
-
}
|
|
1006
|
-
}
|
|
1007
|
-
|
|
1008
|
-
export async function continueStep(pm, progress, stageName, cwd, answer, options = {}) {
|
|
1009
|
-
const { changeName, platformOpts = {}, fromStep } = options
|
|
1010
|
-
const specBase = platformOpts.specRoot || join(cwd, '.sillyspec')
|
|
1011
|
-
const stageData = progress.stages[stageName]
|
|
1012
|
-
|
|
1013
|
-
if (!stageData || !stageData.steps) {
|
|
1014
|
-
console.error(`❌ 阶段 ${stageName} 未初始化`)
|
|
1015
|
-
process.exit(1)
|
|
1016
|
-
}
|
|
1017
|
-
|
|
1018
|
-
if (!answer) {
|
|
1019
|
-
console.error('❌ --continue 需要 --answer 参数')
|
|
1020
|
-
process.exit(2) // 用法错 → exit 2
|
|
1021
|
-
}
|
|
1022
|
-
|
|
1023
|
-
// 查找 waiting 的步骤
|
|
1024
|
-
const waitingSteps = stageData.steps.map((s, i) => ({ ...s, idx: i })).filter(s => s.status === 'waiting')
|
|
1025
|
-
if (waitingSteps.length === 0) {
|
|
1026
|
-
console.error(`没有处于等待状态的步骤(阶段 ${stageName} 当前无 waiting 步骤,--continue 无目标)。当前阶段状态:${stageData?.status ?? '未知'}。用 \`sillyspec run ${stageName} --status\` 查看进度,或 \`sillyspec progress show\` 看全局下一步。`)
|
|
1027
|
-
process.exit(1)
|
|
1028
|
-
}
|
|
1029
|
-
|
|
1030
|
-
// --from-step 支持在多个 waiting 时指定恢复哪一个(避免被迫 --reset 破坏性重置)。
|
|
1031
|
-
let currentIdx
|
|
1032
|
-
if (fromStep != null) {
|
|
1033
|
-
let targetIdx
|
|
1034
|
-
if (/^\d+$/.test(String(fromStep))) {
|
|
1035
|
-
targetIdx = parseInt(String(fromStep), 10) - 1 // 1-based → 0-based
|
|
1036
|
-
} else {
|
|
1037
|
-
targetIdx = stageData.steps.findIndex(s => s.name === fromStep)
|
|
1038
|
-
}
|
|
1039
|
-
const target = targetIdx >= 0 ? stageData.steps[targetIdx] : null
|
|
1040
|
-
if (!target || target.status !== 'waiting') {
|
|
1041
|
-
console.error(`❌ --from-step 指定的步骤「${fromStep}」不处于等待状态。当前 waiting:`)
|
|
1042
|
-
for (const ws of waitingSteps) console.error(` Step ${ws.idx + 1}: ${ws.name}`)
|
|
1043
|
-
process.exit(1)
|
|
1044
|
-
}
|
|
1045
|
-
currentIdx = targetIdx
|
|
1046
|
-
} else if (waitingSteps.length > 1) {
|
|
1047
|
-
// 多 waiting 且未指定 fromStep:给出渐进出路(逐个 continue),而非只建议破坏性 reset。
|
|
1048
|
-
console.error(`❌ 检测到 ${waitingSteps.length} 个等待中的步骤,无法确定恢复目标:`)
|
|
1049
|
-
for (const ws of waitingSteps) {
|
|
1050
|
-
console.error(` Step ${ws.idx + 1}: ${ws.name}${ws.waitReason ? `(${ws.waitReason})` : ''}`)
|
|
1051
|
-
}
|
|
1052
|
-
console.error(` 出路(二选一):`)
|
|
1053
|
-
console.error(` ① 逐个恢复(推荐,非破坏性):sillyspec run ${stageName} --continue --from-step <序号|名称> --answer "..."${changeName ? ` --change ${changeName}` : ''},每次解一个 waiting,降到 1 个后即可不带 --from-step 继续`)
|
|
1054
|
-
console.error(` ② 全部重来(破坏性、不可逆):sillyspec run ${stageName} --reset${changeName ? ` --change ${changeName}` : ''}`)
|
|
1055
|
-
process.exit(1)
|
|
1056
|
-
} else {
|
|
1057
|
-
currentIdx = waitingSteps[0].idx
|
|
1058
|
-
}
|
|
1059
|
-
const defSteps = await getStageSteps(stageName, cwd, progress, platformOpts?.specRoot || null)
|
|
1060
|
-
const currentStepDef = defSteps?.[currentIdx] || {}
|
|
1061
|
-
const currentStep = stageData.steps[currentIdx]
|
|
1062
|
-
const isRepeatableWait = currentStepDef.repeatableWait === true || currentStep.repeatableWait === true
|
|
1063
|
-
const requiresWait = currentStepDef.requiresWait === true || currentStep.requiresWait === true
|
|
1064
|
-
const shouldReturnToCurrentStep = isRepeatableWait || requiresWait
|
|
1065
|
-
|
|
1066
|
-
const now = new Date().toLocaleString('zh-CN', { hour12: false })
|
|
1067
|
-
const prevOutput = currentStep.output || ''
|
|
1068
|
-
const waitRound = (currentStep.waitRound || 0) + 1
|
|
1069
|
-
currentStep.waitRound = waitRound
|
|
1070
|
-
currentStep.waitAnswer = answer
|
|
1071
|
-
currentStep.waitAnswers = Array.isArray(currentStep.waitAnswers) ? currentStep.waitAnswers : []
|
|
1072
|
-
currentStep.waitAnswers.push({
|
|
1073
|
-
round: waitRound,
|
|
1074
|
-
answer,
|
|
1075
|
-
question: prevOutput || null,
|
|
1076
|
-
answeredAt: now,
|
|
1077
|
-
})
|
|
1078
|
-
currentStep.maxWaitRounds = currentStepDef.maxWaitRounds ?? currentStep.maxWaitRounds
|
|
1079
|
-
|
|
1080
|
-
// 合并 waiting 信息到 output
|
|
1081
|
-
const waitInfo = currentStep.waitReason || ''
|
|
1082
|
-
if (waitInfo) {
|
|
1083
|
-
currentStep.output = prevOutput
|
|
1084
|
-
? `${prevOutput} | 用户回答#${waitRound}:${answer}`
|
|
1085
|
-
: `用户回答#${waitRound}:${answer}`
|
|
1086
|
-
}
|
|
1087
|
-
|
|
1088
|
-
// 清除等待状态
|
|
1089
|
-
delete currentStep.waitReason
|
|
1090
|
-
delete currentStep.waitOptions
|
|
1091
|
-
delete currentStep.waitedAt
|
|
1092
|
-
|
|
1093
|
-
if (shouldReturnToCurrentStep) {
|
|
1094
|
-
currentStep.status = 'pending'
|
|
1095
|
-
currentStep.completedAt = null
|
|
1096
|
-
} else {
|
|
1097
|
-
currentStep.status = 'completed'
|
|
1098
|
-
currentStep.completedAt = now
|
|
1099
|
-
}
|
|
1100
|
-
|
|
1101
|
-
progress.lastActive = now
|
|
1102
|
-
pm._write(cwd, progress, changeName)
|
|
1103
|
-
triggerSync(cwd, changeName, platformOpts)
|
|
1104
|
-
// wait 解除持久化点(含 repeatable 多轮)同样刷新 change title——多轮确认期间 design.md 已存在
|
|
1105
|
-
refreshChangeTitleFromArtifacts(pm, cwd, specBase, changeName)
|
|
1106
|
-
|
|
1107
|
-
console.log(`✅ Step ${currentIdx + 1}/${stageData.steps.length} 已继续:${currentStep.name}`)
|
|
1108
|
-
console.log(` 回答:${answer}`)
|
|
1109
|
-
|
|
1110
|
-
// Append to user-inputs.md
|
|
1111
|
-
const inputsPath = join(specBase, '.runtime', 'user-inputs.md')
|
|
1112
|
-
const entry = `\n## ${now} | ${changeName || '?'} | ${stageName}: ${currentStep.name} [CONTINUED]\n- 回答:${answer}\n`
|
|
1113
|
-
try {
|
|
1114
|
-
appendFileSync(inputsPath, entry)
|
|
1115
|
-
} catch (e) {
|
|
1116
|
-
console.warn('⚠️ user-inputs.md 追加失败(不阻断):', e.message)
|
|
1117
|
-
}
|
|
1118
|
-
|
|
1119
|
-
// shouldReturnToCurrentStep: 回到当前步骤继续执行(repeatable=多轮探索,requiresWait=确认后执行动作)
|
|
1120
|
-
if (shouldReturnToCurrentStep) {
|
|
1121
|
-
console.log(`\n🔁 Step ${currentIdx + 1}/${stageData.steps.length} 已收到用户输入,回到当前步骤继续执行。`)
|
|
1122
|
-
if (isRepeatableWait) {
|
|
1123
|
-
console.log(` 已收集回答轮次:${waitRound}${currentStep.maxWaitRounds ? `/${currentStep.maxWaitRounds}` : ''}`)
|
|
1124
|
-
}
|
|
1125
|
-
if (defSteps && defSteps[currentIdx]) {
|
|
1126
|
-
console.log('')
|
|
1127
|
-
await outputStep(
|
|
1128
|
-
stageName,
|
|
1129
|
-
currentIdx,
|
|
1130
|
-
defSteps,
|
|
1131
|
-
cwd,
|
|
1132
|
-
changeName,
|
|
1133
|
-
progress.project || null,
|
|
1134
|
-
platformOpts,
|
|
1135
|
-
formatWaitHistory(currentStep)
|
|
1136
|
-
)
|
|
1137
|
-
}
|
|
1138
|
-
return { stageCompleted: false, currentIdx, nextPendingIdx: currentIdx }
|
|
1139
|
-
}
|
|
1140
|
-
|
|
1141
|
-
// 检查阶段是否全部完成
|
|
1142
|
-
const nextPendingIdx = stageData.steps.findIndex(s => s.status === 'pending')
|
|
1143
|
-
const nextWaitingIdx = stageData.steps.findIndex(s => s.status === 'waiting')
|
|
1144
|
-
if (nextPendingIdx === -1 && nextWaitingIdx === -1) {
|
|
1145
|
-
stageData.status = 'completed'
|
|
1146
|
-
stageData.completedAt = now
|
|
1147
|
-
// persist _write 移到 completeStageGates 成功之后(task-03 / review-2026-08-09 #2):gate 异常/失败 → rollback 回 in-progress 落盘,此处未到 _write,DB 不留假 completed。
|
|
1148
|
-
// 阶段完成收尾共享管线(含 execute worktree cleanup),消除 continueStep 完成分支绕过 gate 的 S2(task-01 抽出)。
|
|
1149
|
-
// gate 失败已 rollback,early-return 跳过下方"阶段已完成/下一步"提示(与 completeStep 同语义)。
|
|
1150
|
-
// W3 task-09:best-effort 构造 ctx 透传(D-013),与 completeStep 完成分支同语义。
|
|
1151
|
-
let _contCtx = null
|
|
1152
|
-
try {
|
|
1153
|
-
_contCtx = await getOrCreateMultiRepoContext({ cwd, changeName, platformOpts })
|
|
1154
|
-
} catch (e) {
|
|
1155
|
-
console.warn('⚠️ 阶段完成 ctx 构造失败,降级单仓 gate(' + (e && e.message ? e.message : e) + ')')
|
|
1156
|
-
}
|
|
1157
|
-
const _stageGatesResult = await completeStageGates({ stageName, cwd, changeName, platformOpts, specBase, progress, pm, stageData, steps: stageData.steps, currentIdx, outputText: null, ctx: _contCtx })
|
|
1158
|
-
// task-04 / A5:gate 失败(stageCompleted===false)设进程退出码 1(与 completeStep 完成分支同语义)。
|
|
1159
|
-
if (_stageGatesResult?.stageCompleted === false) process.exitCode = 1
|
|
1160
|
-
if (_stageGatesResult) return _stageGatesResult
|
|
1161
|
-
// 完整流程 change title 刷新(同 completeStep 完成分支,wait 解除后阶段完成也刷新)。
|
|
1162
|
-
refreshChangeTitleFromArtifacts(pm, cwd, specBase, changeName)
|
|
1163
|
-
// gate 全过:persist completed(task-03 移后;此处无 triggerSync)。
|
|
1164
|
-
pm._write(cwd, progress, changeName)
|
|
1165
|
-
console.log(`\n✅ ${stageName} 阶段已完成(${stageData.steps.length}/${stageData.steps.length} 步)`)
|
|
1166
|
-
// 阶段完成后明确下一步(agent 常卡:stageData completed 但不知要 run <下一阶段> 推进 currentStage)
|
|
1167
|
-
const nextStageHint = { brainstorm: 'plan', plan: 'execute', execute: 'verify', verify: 'archive' }[stageName]
|
|
1168
|
-
if (nextStageHint) {
|
|
1169
|
-
// brainstorm 按 design.md frontmatter 的 scale 分叉(与末步 prompt 对齐):
|
|
1170
|
-
// small → quick --linked-changes(小变更免走完整 plan);large / 读不到 scale → plan(保守默认)。
|
|
1171
|
-
// 修历史 bug:此处曾硬编码 brainstorm→plan 不读 scale,small 档与末步 prompt(quick)矛盾、误导小变更进 plan。
|
|
1172
|
-
let hintStage = nextStageHint
|
|
1173
|
-
let hintChangeFlag = changeName ? ` --change ${changeName}` : ''
|
|
1174
|
-
if (stageName === 'brainstorm' && changeName && readDesignScale(specBase, changeName) === 'small') {
|
|
1175
|
-
hintStage = 'quick'
|
|
1176
|
-
hintChangeFlag = ` --linked-changes ${changeName}`
|
|
1177
|
-
}
|
|
1178
|
-
console.log(`\n👉 ${stageName} 已完成。下一步:sillyspec run ${hintStage}${hintChangeFlag}`)
|
|
1179
|
-
if (stageName === 'execute') {
|
|
1180
|
-
console.log(` ⚠️ 若 worktree 改动还没 apply 到主工作区,先:sillyspec worktree apply ${changeName}`)
|
|
1181
|
-
console.log(` (apply 不需要先 commit,支持 working tree 未提交改动)`)
|
|
1182
|
-
// plan.md checkbox auto-check:execute 完成 + review.json pass → 自动勾选(治本,比警告可靠)
|
|
1183
|
-
const _ac = await autoCheckPlanFromReviews({ stageName, changeName, cwd, platformOpts })
|
|
1184
|
-
if (_ac.autoChecked) {
|
|
1185
|
-
console.log(` ✅ 自动勾选 ${_ac.checkedCount} 个 task checkbox(基于 review.json pass)`)
|
|
1186
|
-
}
|
|
1187
|
-
if (_ac.skippedCount > 0) {
|
|
1188
|
-
console.warn(` ⚠️ ${_ac.skippedCount} 个 task 未勾(review.json 缺失/fail)→ archive 会拦。补 review 后重跑 execute --done 触发自动勾`)
|
|
1189
|
-
}
|
|
1190
|
-
}
|
|
1191
|
-
}
|
|
1192
|
-
return { stageCompleted: true, currentIdx, nextPendingIdx: -1 }
|
|
1193
|
-
}
|
|
1194
|
-
|
|
1195
|
-
// 输出下一步
|
|
1196
|
-
if (nextPendingIdx !== -1 && defSteps) {
|
|
1197
|
-
console.log('')
|
|
1198
|
-
await outputStep(stageName, nextPendingIdx, defSteps, cwd, changeName, progress.project || null, platformOpts, answer)
|
|
1199
|
-
} else if (nextWaitingIdx !== -1 && defSteps) {
|
|
1200
|
-
// 下一个步骤也在等待状态
|
|
1201
|
-
const ws = stageData.steps[nextWaitingIdx]
|
|
1202
|
-
console.log(`\n⏸️ Step ${nextWaitingIdx + 1}/${stageData.steps.length} 仍在等待:${ws.name}`)
|
|
1203
|
-
if (ws.waitReason) console.log(` 原因:${ws.waitReason}`)
|
|
1204
|
-
console.log(` 继续:sillyspec run ${stageName} --continue --answer "..."${changeName ? ` --change ${changeName}` : ''}`)
|
|
1205
|
-
}
|
|
1206
|
-
|
|
1207
|
-
return { stageCompleted: false, currentIdx, nextPendingIdx: nextPendingIdx }
|
|
1208
|
-
}
|
|
1209
|
-
|
|
1210
|
-
export async function skipStep(pm, progress, stageName, cwd, changeName, platformOpts = {}) {
|
|
1211
|
-
const stageData = progress.stages[stageName]
|
|
1212
|
-
if (!stageData || !stageData.steps) {
|
|
1213
|
-
console.error(`❌ 阶段 ${stageName} 未初始化`)
|
|
1214
|
-
process.exit(1)
|
|
1215
|
-
}
|
|
1216
|
-
|
|
1217
|
-
const steps = stageData.steps
|
|
1218
|
-
const currentIdx = steps.findIndex(s => s.status === 'pending' || s.status === 'in-progress')
|
|
1219
|
-
|
|
1220
|
-
if (currentIdx === -1) {
|
|
1221
|
-
const wsIdx = steps.findIndex(s => s.status === 'waiting')
|
|
1222
|
-
if (wsIdx !== -1) {
|
|
1223
|
-
console.error(`⏸️ Step ${wsIdx + 1} 正在等待用户输入,不能跳过。`)
|
|
1224
|
-
console.error(` 请先使用 --continue --answer "..." 继续,或用 --reset 重置。`)
|
|
1225
|
-
} else {
|
|
1226
|
-
console.error(`没有待跳过的步骤(阶段 ${stageName} 已无 pending/in-progress 步骤)。当前阶段状态:${stageData?.status ?? '未知'}。用 \`sillyspec run ${stageName} --status\` 查看进度,或 \`sillyspec progress show\` 看全局下一步。`)
|
|
1227
|
-
}
|
|
1228
|
-
process.exit(1)
|
|
1229
|
-
}
|
|
1230
|
-
|
|
1231
|
-
const defSteps = await getStageSteps(stageName, cwd, progress, platformOpts?.specRoot || null)
|
|
1232
|
-
const stepDef = defSteps ? defSteps[currentIdx] : null
|
|
1233
|
-
if (stepDef && !stepDef.optional) {
|
|
1234
|
-
console.error(`❌ 步骤 "${steps[currentIdx].name}" 不可跳过`)
|
|
1235
|
-
process.exit(1)
|
|
1236
|
-
}
|
|
1237
|
-
|
|
1238
|
-
steps[currentIdx].status = 'skipped'
|
|
1239
|
-
steps[currentIdx].skippedAt = new Date().toLocaleString('zh-CN',{hour12:false})
|
|
1240
|
-
progress.lastActive = new Date().toLocaleString('zh-CN',{hour12:false})
|
|
1241
|
-
pm._write(cwd, progress, changeName)
|
|
1242
|
-
triggerSync(cwd, changeName, platformOpts)
|
|
1243
|
-
|
|
1244
|
-
console.log(`⏭️ Step ${currentIdx + 1}/${steps.length} 已跳过:${steps[currentIdx].name}`)
|
|
1245
|
-
|
|
1246
|
-
const nextPendingIdx = steps.findIndex(s => s.status === 'pending' || s.status === 'in-progress')
|
|
1247
|
-
if (nextPendingIdx !== -1 && defSteps) {
|
|
1248
|
-
console.log('')
|
|
1249
|
-
await outputStep(stageName, nextPendingIdx, defSteps, cwd, changeName, progress.project || null, platformOpts)
|
|
1250
|
-
} else {
|
|
1251
|
-
const wsIdx = steps.findIndex(s => s.status === 'waiting')
|
|
1252
|
-
if (wsIdx !== -1) {
|
|
1253
|
-
console.log(`\n⏸️ Step ${wsIdx + 1}/${steps.length} 正在等待:${steps[wsIdx].name}`)
|
|
1254
|
-
if (steps[wsIdx].waitReason) console.log(` 原因:${steps[wsIdx].waitReason}`)
|
|
1255
|
-
console.log(` 继续:sillyspec run ${stageName} --continue --answer "..."${changeName ? ` --change ${changeName}` : ''}`)
|
|
1256
|
-
}
|
|
1257
|
-
}
|
|
1258
|
-
}
|
|
1259
|
-
|