sillyspec 3.27.11 → 3.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/sillyspec-execute/SKILL.md +1 -1
- package/README.md +3 -2
- package/package.json +1 -1
- package/src/agent-session-log.js +77 -10
- package/src/change-delete.js +181 -0
- package/src/config-schema.js +2 -2
- package/src/contract-matrix.js +15 -2
- package/src/docs-check.js +126 -0
- package/src/doctor-diagnostics.js +64 -1
- package/src/endpoint-extractor.js +107 -28
- package/src/index.js +208 -13
- package/src/init.js +104 -27
- package/src/machine-interface.js +63 -0
- package/src/module-changelog.js +116 -0
- package/src/progress/change-registry.js +28 -0
- package/src/progress/shared.js +6 -0
- package/src/progress/stage-machine.js +191 -9
- package/src/progress.js +6 -0
- package/src/run/command.js +26 -1
- package/src/run/complete-handlers.js +42 -4
- package/src/run/complete.js +12 -4
- package/src/run/prompt.js +12 -1
- package/src/run/quick-audit.js +98 -0
- package/src/run/shared.js +86 -0
- package/src/run/stage.js +18 -11
- package/src/spec-sync.js +191 -14
- package/src/stages/archive.js +5 -0
- package/src/stages/execute.js +7 -2
- package/src/sync.js +575 -21
- package/src/task-review.js +51 -4
- package/src/verify-postcheck.js +60 -8
- package/src/verify-probes.js +3 -0
- package/src/workflow.js +4 -0
- package/src/worktree-apply.js +4 -4
- package/src/worktree.js +6 -4
- package/{.worktrees/542c4415/templates/claude-instruction.md → templates/agents-instruction.md} +2 -2
- 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/.npmrc-temp +0 -1
- 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/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
- package/templates/claude-instruction.md +0 -23
package/src/sync.js
CHANGED
|
@@ -8,13 +8,14 @@
|
|
|
8
8
|
* HTTP 请求:Node.js 原生 fetch(Node 22+)
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync, unlinkSync, chmodSync } from 'fs';
|
|
11
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync, unlinkSync, chmodSync, rmSync } from 'fs';
|
|
12
|
+
import { createHash } from 'crypto';
|
|
12
13
|
import { writeAtomicSync } from './fs-atomic.js';
|
|
13
|
-
import { join } from 'path';
|
|
14
|
+
import { join, dirname, basename, isAbsolute, relative } from 'path';
|
|
14
15
|
import { resolvePlatformSpecDir } from './progress.js';
|
|
15
16
|
import { safeGit } from './git-helper.js';
|
|
16
17
|
import { openDatabase } from './db-engine.js';
|
|
17
|
-
import { PLATFORM_MANAGED_FILENAME } from './run/shared.js';
|
|
18
|
+
import { PLATFORM_MANAGED_FILENAME, QUICK_SID_RE } from './run/shared.js';
|
|
18
19
|
import { syncSpecTree } from './spec-sync.js';
|
|
19
20
|
|
|
20
21
|
// sync 是 best-effort(网络失败只 warn):平台指针失效时不抛,跳过平台、回退本地。
|
|
@@ -29,6 +30,9 @@ function safePlatformSpecDir(cwd) {
|
|
|
29
30
|
|
|
30
31
|
const LOCAL_YAML = '.sillyspec/local.yaml';
|
|
31
32
|
const REQUEST_TIMEOUT_MS = 10_000;
|
|
33
|
+
// X2 spec bundle 整树下载(tar 流式响应体,审计 B2):大树/慢网远超常规 JSON 轮询口径,
|
|
34
|
+
// 独立大超时(daemon 同端点 30s;CLI 面向交互式大仓更宽)。
|
|
35
|
+
const PULL_BUNDLE_TIMEOUT_MS = 120_000;
|
|
32
36
|
|
|
33
37
|
// 未连接平台是本地独立用户的合法默认状态。sync / checkApproval 由 run 流程在后台 best-effort
|
|
34
38
|
// 触发(每步完成、execute 阶段启动);syncDocuments 仅由手动 `sillyspec platform sync-docs`
|
|
@@ -205,8 +209,10 @@ function resolvePlatformUser(cwd, explicitUser) {
|
|
|
205
209
|
// HUB-09:单请求超时与外部 signal 合并——自动同步熔断(run/shared.js trigger* 的 race)
|
|
206
210
|
// 触发 abort 时在飞 fetch 被真实取消,而不是熔断后任由请求自行完成(平台可能已接受,
|
|
207
211
|
// 客户端却当作超时放弃;spec 树推送无 base_ts 自愈兜底)。AbortSignal.any 需 Node ≥20.3。
|
|
208
|
-
|
|
209
|
-
|
|
212
|
+
// timeoutMs 可选:pullSpecBundle 整树下载走 PULL_BUNDLE_TIMEOUT_MS 大口径(审计 B2),
|
|
213
|
+
// 其余调用缺省 REQUEST_TIMEOUT_MS。
|
|
214
|
+
function combineSignals(external, timeoutMs = REQUEST_TIMEOUT_MS) {
|
|
215
|
+
const timeoutSignal = AbortSignal.timeout(timeoutMs);
|
|
210
216
|
return external ? AbortSignal.any([timeoutSignal, external]) : timeoutSignal;
|
|
211
217
|
}
|
|
212
218
|
|
|
@@ -262,6 +268,129 @@ async function fetchJsonWithStatus(url, options = {}) {
|
|
|
262
268
|
}
|
|
263
269
|
}
|
|
264
270
|
|
|
271
|
+
// ── X2 spec bundle tar 解析(task-14 / design §7.1)──
|
|
272
|
+
|
|
273
|
+
// 平台 build_bundle(spec_workspace/service.py,Python tarfile mode "w")输出未压缩 tar,
|
|
274
|
+
// Python 3.8+ 默认 PAX 格式:路径 ≤100 字符是纯 ustar 头,超限走 typeflag 'x' 的 PAX
|
|
275
|
+
// 扩展头(path 记录)+ 截断名条目;GNU tar 长名走 'L'。仓内无三方 tar 库(package.json
|
|
276
|
+
// deps 无 tar/zlib 需求),按 512 字节头极简自实现——tar-slip 双重校验照搬 daemon
|
|
277
|
+
// extractTar(sillyhub-daemon/src/spec-sync.ts:982)同款范式,两仓行为对齐。
|
|
278
|
+
|
|
279
|
+
/** tar 头字符串字段读:截到首个 NUL,去首尾空白。 */
|
|
280
|
+
function _readTarString(buf) {
|
|
281
|
+
const end = buf.indexOf(0);
|
|
282
|
+
const s = (end === -1 ? buf : buf.subarray(0, end)).toString('utf8');
|
|
283
|
+
return s.replace(/\0/g, '').trim();
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/** tar 头 size 字段(12 字节八进制)→ 字节数。 */
|
|
287
|
+
function _readTarSize(field) {
|
|
288
|
+
const s = _readTarString(field);
|
|
289
|
+
if (!s) return 0;
|
|
290
|
+
return parseInt(s, 8) || 0;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* PAX 扩展头 data 解析为 {key: value}:记录形态 "<len> <key>=<value>\n" 重复,
|
|
295
|
+
* len 十进制**字节数**且含自身位数、空格与尾部 \n。
|
|
296
|
+
* 必须在 Buffer 上按字节偏移推进/切片:value 含非 ASCII(中文文件名)时 len(字节)
|
|
297
|
+
* > JS 字符串长度(UTF-16 码元),按码元校验会首记录即 break、path 丢失 → 文件落
|
|
298
|
+
* 实体头 name 的 ascii/replace 混淆路径并互相覆盖(与 daemon spec-sync.ts 同款修复)。
|
|
299
|
+
*/
|
|
300
|
+
function _parsePaxRecords(data) {
|
|
301
|
+
const out = {};
|
|
302
|
+
let pos = 0;
|
|
303
|
+
while (pos < data.length) {
|
|
304
|
+
const sp = data.indexOf(0x20, pos);
|
|
305
|
+
if (sp === -1) break;
|
|
306
|
+
const len = parseInt(data.toString('utf8', pos, sp), 10);
|
|
307
|
+
if (!Number.isInteger(len) || len <= 0 || pos + len > data.length) break;
|
|
308
|
+
const record = data.toString('utf8', sp + 1, pos + len - 1); // 尾部 \n 不属于 value
|
|
309
|
+
const eq = record.indexOf('=');
|
|
310
|
+
if (eq > 0) out[record.slice(0, eq)] = record.slice(eq + 1);
|
|
311
|
+
pos += len;
|
|
312
|
+
}
|
|
313
|
+
return out;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* tar-slip 双重校验(daemon extractTar 同款):显式穿越模式 + join 后 relative 复核。
|
|
318
|
+
* 通过返回安全相对路径的原样 name;命中穿越抛 Error(调用方转为失败 reason,不落盘)。
|
|
319
|
+
*/
|
|
320
|
+
function _assertSafeTarName(name, targetDir) {
|
|
321
|
+
if (name.includes('..') || isAbsolute(name) || /^[A-Za-z]:[\\/]/.test(name)) {
|
|
322
|
+
throw new Error(`tar 路径越界已拦截: ${name}`);
|
|
323
|
+
}
|
|
324
|
+
const fullPath = join(targetDir, name);
|
|
325
|
+
const rel = relative(targetDir, fullPath);
|
|
326
|
+
if (rel.startsWith('..') || isAbsolute(rel)) {
|
|
327
|
+
throw new Error(`tar 路径逃逸目标目录已拦截: ${name} -> ${fullPath}`);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* 解析整只未压缩 tar 为条目列表 [{ name, isDir, data }](先全量解析校验,后落盘——
|
|
333
|
+
* 恶意/损坏 tar 在任何本地删除动作之前暴露,见 pullSpecBundle 覆盖顺序)。
|
|
334
|
+
* 容忍并落地 tar 顶层 PLATFORM-BUNDLE.json(task-08 快照元数据,design §7.3);
|
|
335
|
+
* symlink/fifo/dev 等非常规条目跳过(spec 树不应含,daemon 同款)。
|
|
336
|
+
* @param {Buffer} tarBuf
|
|
337
|
+
* @returns {Array<{name: string, isDir: boolean, data: Buffer}>}
|
|
338
|
+
*/
|
|
339
|
+
function _parseSpecTar(tarBuf) {
|
|
340
|
+
const entries = [];
|
|
341
|
+
let offset = 0;
|
|
342
|
+
let pendingPath = null; // PAX 'x' path 记录 / GNU 'L' 长名,覆盖下一实条目的 name
|
|
343
|
+
while (offset + 512 <= tarBuf.length) {
|
|
344
|
+
const header = tarBuf.subarray(offset, offset + 512);
|
|
345
|
+
if (header.every((b) => b === 0)) break; // 结尾 zero block → 结束
|
|
346
|
+
const typeflag = String.fromCharCode(header[156] ?? 0);
|
|
347
|
+
const size = _readTarSize(header.subarray(124, 136));
|
|
348
|
+
offset += 512;
|
|
349
|
+
const data = tarBuf.subarray(offset, offset + size);
|
|
350
|
+
offset += Math.ceil(size / 512) * 512;
|
|
351
|
+
|
|
352
|
+
let name = _readTarString(header.subarray(0, 100));
|
|
353
|
+
// POSIX ustar prefix 字段(magic 'ustar\0' + version '00' 时有效);GNU 长名走 'L' 条目
|
|
354
|
+
const magic = header.subarray(257, 263).toString('latin1');
|
|
355
|
+
const version = header.subarray(263, 265).toString('latin1');
|
|
356
|
+
if (magic.startsWith('ustar') && version === '00') {
|
|
357
|
+
const prefix = _readTarString(header.subarray(345, 500));
|
|
358
|
+
if (prefix) name = `${prefix}/${name}`;
|
|
359
|
+
}
|
|
360
|
+
if (pendingPath) { name = pendingPath; pendingPath = null; }
|
|
361
|
+
|
|
362
|
+
if (typeflag === 'x' || typeflag === 'X') {
|
|
363
|
+
const recs = _parsePaxRecords(data);
|
|
364
|
+
if (recs.path) pendingPath = recs.path;
|
|
365
|
+
continue;
|
|
366
|
+
}
|
|
367
|
+
if (typeflag === 'L') { // GNU LongLink(长文件名)
|
|
368
|
+
pendingPath = _readTarString(data);
|
|
369
|
+
continue;
|
|
370
|
+
}
|
|
371
|
+
if (typeflag === 'K') continue; // GNU 长链接目标:spec 树无符号链接,跳过
|
|
372
|
+
if (!name) continue;
|
|
373
|
+
|
|
374
|
+
if (typeflag === '5' || name.endsWith('/')) {
|
|
375
|
+
_assertSafeTarName(name.replace(/\/+$/, ''), '.'); // 目录条目同样过穿越校验(相对假根)
|
|
376
|
+
entries.push({ name, isDir: true, data: Buffer.alloc(0) });
|
|
377
|
+
continue;
|
|
378
|
+
}
|
|
379
|
+
if (typeflag === '0' || typeflag === '\0') {
|
|
380
|
+
_assertSafeTarName(name, '.');
|
|
381
|
+
entries.push({ name, isDir: false, data });
|
|
382
|
+
continue;
|
|
383
|
+
}
|
|
384
|
+
debugLog(`[sync] spec bundle tar 跳过非常规条目: ${name} (typeflag ${typeflag})`);
|
|
385
|
+
}
|
|
386
|
+
return entries;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/** 目录有内容判定(daemon dirHasContent 同语义):不存在/读失败/空均视为无内容。 */
|
|
390
|
+
function _dirHasContent(dir) {
|
|
391
|
+
try { return readdirSync(dir).length > 0; } catch { return false }
|
|
392
|
+
}
|
|
393
|
+
|
|
265
394
|
// ── SyncManager ──
|
|
266
395
|
|
|
267
396
|
export class SyncManager {
|
|
@@ -438,18 +567,29 @@ export class SyncManager {
|
|
|
438
567
|
const changeDir = join(specBase, 'changes', changeName);
|
|
439
568
|
let archivedQuietly = false;
|
|
440
569
|
if (!existsSync(changeDir)) {
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
if (
|
|
444
|
-
console.log(`[sync]
|
|
570
|
+
// change-delete(2026-08-30):DB status='deleted' 的行目录已随删除移除,属正常时序,
|
|
571
|
+
// 单行 info 提示后继续推删除终态/墓碑(不落入「目录不存在」warn)
|
|
572
|
+
if (this._changeDbStatus(changeName) === 'deleted') {
|
|
573
|
+
console.log(`[sync] 变更已删除(DB status=deleted),继续推送删除终态/墓碑: ${changeName}`);
|
|
445
574
|
} else {
|
|
446
|
-
|
|
575
|
+
archivedQuietly = existsSync(join(specBase, 'changes', 'archive', changeName))
|
|
576
|
+
|| this._changeDbStatus(changeName) === 'archived';
|
|
577
|
+
if (archivedQuietly) {
|
|
578
|
+
console.log(`[sync] 变更已归档(目录在 archive/),继续从 DB 推送最终状态: ${changeName}`);
|
|
579
|
+
} else {
|
|
580
|
+
console.warn(`[sync] 变更目录不存在(可能是已归档,继续从 DB 同步最终状态): ${changeName}`);
|
|
581
|
+
}
|
|
447
582
|
}
|
|
448
583
|
}
|
|
449
584
|
// 透传给本次 sync 链内的 syncDocuments(best-effort 四件套直推:归档后目录已移走,
|
|
450
585
|
// 其「变更不存在」warn 属正常时序,静默化)
|
|
451
586
|
this._suppressDocsMissingWarn = archivedQuietly;
|
|
452
587
|
|
|
588
|
+
// X1 墓碑(design §5.5,变更 2026-08-29-change-delete-closure-and-spec-pull task-13):
|
|
589
|
+
// 触发判据见循环内 tombstoneDue(DB status='archived')。
|
|
590
|
+
// 常规终态推送保持原语义(archived/active 原值照推,platform-sync-archive-final-state 钉死),
|
|
591
|
+
// 墓碑作为推送链成功后的追加 POST(见 _pushTombstone)。
|
|
592
|
+
|
|
453
593
|
const MAX_PUSH_ATTEMPTS = 2;
|
|
454
594
|
for (let attempt = 1; attempt <= MAX_PUSH_ATTEMPTS; attempt++) {
|
|
455
595
|
// 读取 progress 数据(serializeForSync 六表裸 JSON,task-02 / D-005@v2,替代 read() 聚合视图)。
|
|
@@ -468,6 +608,25 @@ export class SyncManager {
|
|
|
468
608
|
return { synced: 0, errors: [`变更无进度数据: ${changeName}`] };
|
|
469
609
|
}
|
|
470
610
|
|
|
611
|
+
// X1 墓碑判定(design §5.5 / task-13;审计 B1 收窄):仅 DB status='archived'
|
|
612
|
+
// (unregisterChange 链——归档收尾/自愈/quick 收尾均置该值)或 status='deleted'
|
|
613
|
+
// (change-delete 命令,2026-08-30——载荷本身携带 deleted,平台 _apply_cli_tombstone
|
|
614
|
+
// 见该值即置 location='deleted';追加墓碑 POST 幂等兜底)触发,常规推送成功后追加
|
|
615
|
+
// 一次 changes[].status='deleted' 墓碑(平台 task-04 写路径置 location='deleted' 收敛镜像)。
|
|
616
|
+
// 不再把「实体目录双失」当裸删发墓碑:platform pull(进度同步)只写 DB 不建目录 →
|
|
617
|
+
// DB active + 目录双失是合法态,误发墓碑会让平台把活跃变更软删(全体成员生效)。
|
|
618
|
+
// 真实裸删(用户手动 rm -rf 目录)由平台镜像收敛兜底(spec-sync delete ops → scoped
|
|
619
|
+
// 定向删除,computeSpecOps 护栏只拦整树/changes 整删,不拦单变更 scoped 删除),
|
|
620
|
+
// CLI 不发墓碑不损失收敛。quick 会话豁免:triggerSync 对 quick 已降级 syncSpecTreeOnly,
|
|
621
|
+
// 直调也不给孤儿 key 造墓碑。
|
|
622
|
+
const tombstoneDue = !QUICK_SID_RE.test(changeName)
|
|
623
|
+
&& (progressData.changes?.[0]?.status === 'archived'
|
|
624
|
+
|| progressData.changes?.[0]?.status === 'deleted');
|
|
625
|
+
|
|
626
|
+
// X3 步骤开始上报(design §8.2 / task-13):opts.stepStart 时把 current_stage 的第一个
|
|
627
|
+
// 未完成步投影为 in-progress(仅载荷不写 DB;triggerStepStartSync 是唯一传该 flag 的入口)
|
|
628
|
+
if (opts.stepStart) this._projectStepStart(progressData, changeName);
|
|
629
|
+
|
|
471
630
|
// 元字段走 HTTP header(D-015 / task-09):body 保持裸六表 JSON,sillyhub 老版忽略 header 零回归
|
|
472
631
|
const headers = {
|
|
473
632
|
'Content-Type': 'application/json',
|
|
@@ -493,6 +652,14 @@ export class SyncManager {
|
|
|
493
652
|
signal: opts.signal, // HUB-09:熔断 abort 传到底层请求
|
|
494
653
|
});
|
|
495
654
|
|
|
655
|
+
// X1(task-04 契约):409 + code='change_deleted' = 平台已删 key 拒收——不是 base_ts 冲突。
|
|
656
|
+
// 单行提示即可,不落冲突文件、不打全幅横幅:墓碑已收敛后的重复上行(归档收尾多步各推一次)、
|
|
657
|
+
// 多用户下他端删除后本地仍在推进,都是可预期态,按冲突卡死人工 resolve 反而是误报。
|
|
658
|
+
if (res.status === 409 && res.body && res.body.code === 'change_deleted') {
|
|
659
|
+
console.warn(`⚠️ [sync] 平台已删除变更「${changeName}」,本次进度上行被拒收(change_deleted);本地如仍需推进请在平台侧确认`);
|
|
660
|
+
return { synced: 0, errors: [], platformDeleted: true, reason: '平台已删除(change_deleted 拒收)' };
|
|
661
|
+
}
|
|
662
|
+
|
|
496
663
|
if (res.ok) {
|
|
497
664
|
// 更新 platform_last_sync + 推进 base_ts(ql-20260818-008:值优先平台回执 last_pushed_at,
|
|
498
665
|
// 缺省用本次 pushedAt——服务器 _apply 存的就是客户端 X-SillySpec-Pushed-At 原值,回写一致。
|
|
@@ -541,6 +708,18 @@ export class SyncManager {
|
|
|
541
708
|
debugLog(`[sync] spec 树增量同步失败(不影响进度): ${changeName}: ${err.message}`);
|
|
542
709
|
}
|
|
543
710
|
|
|
711
|
+
// X1 墓碑上行(收敛加速器,best-effort):常规终态 + 文档/spec 树都推完后追加一次
|
|
712
|
+
// changes[].status='deleted'(顺序在后——常规推送保持 archived/active 原语义是既有
|
|
713
|
+
// 契约,platform-sync-archive-final-state 钉死)。失败静默:平台闭环走方案 A 镜像驱动
|
|
714
|
+
// 收敛(design §5.5),墓碑只是让收敛即时。
|
|
715
|
+
if (tombstoneDue) {
|
|
716
|
+
try {
|
|
717
|
+
await this._pushTombstone(changeName, { signal: opts.signal });
|
|
718
|
+
} catch (err) {
|
|
719
|
+
debugLog(`[sync] 墓碑上行失败(不影响主推送): ${changeName}: ${err.message}`);
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
|
|
544
723
|
return { synced: 1, errors: [] };
|
|
545
724
|
}
|
|
546
725
|
|
|
@@ -620,6 +799,92 @@ export class SyncManager {
|
|
|
620
799
|
return { synced: 0, errors: [`同步重试耗尽(仍冲突): ${changeName}`] };
|
|
621
800
|
}
|
|
622
801
|
|
|
802
|
+
/**
|
|
803
|
+
* X3 步骤开始上报的载荷投影(design §8.2,变更 2026-08-29-change-delete-closure-and-spec-pull
|
|
804
|
+
* task-13):把 current_stage 下第一个未完成步(completed/skipped 之外,含 waiting——等待中
|
|
805
|
+
* 的步同样「在跑」)的 status 改为 'in-progress'。
|
|
806
|
+
*
|
|
807
|
+
* 仅改本次上行载荷,不写 DB——步骤行 DB 种子是 pending,completeStep 的
|
|
808
|
+
* findIndex(pending||in-progress) 两者等价,但保持 DB 不被推送侧污染(--done 推送路径
|
|
809
|
+
* 行为不变,回归约束)。六表 steps[].status 状态机本就含 in-progress 值(step-store
|
|
810
|
+
* VALID_STATUSES),平台侧裸 JSON 透传(design §8.2 已核实后端零改动)。
|
|
811
|
+
* @param {object} progressData serializeForSync 输出(原地修改)
|
|
812
|
+
* @param {string} changeName
|
|
813
|
+
*/
|
|
814
|
+
_projectStepStart(progressData, changeName) {
|
|
815
|
+
try {
|
|
816
|
+
const row = progressData && progressData.changes && progressData.changes[0];
|
|
817
|
+
if (!row || !row.current_stage || !Array.isArray(progressData.steps)) return;
|
|
818
|
+
const idx = progressData.steps.findIndex(s =>
|
|
819
|
+
s.change_name === changeName && s.stage === row.current_stage
|
|
820
|
+
&& s.status !== 'completed' && s.status !== 'skipped');
|
|
821
|
+
if (idx !== -1) progressData.steps[idx].status = 'in-progress';
|
|
822
|
+
} catch { /* 投影失败按原载荷推送(best-effort) */ }
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
/**
|
|
826
|
+
* X1:把墓碑状态写进载荷——changes[0].status='deleted'(对齐既有 'archived' 状态语义,
|
|
827
|
+
* design §5.5)。平台写路径(服务端 task-04 `_apply_cli_tombstone`)见到该值即置
|
|
828
|
+
* Change.location='deleted' 并触发镜像软删收敛。
|
|
829
|
+
* @param {object} progressData serializeForSync 输出(原地修改,返回同一引用)
|
|
830
|
+
*/
|
|
831
|
+
_applyTombstoneStatus(progressData) {
|
|
832
|
+
if (progressData && Array.isArray(progressData.changes) && progressData.changes[0]) {
|
|
833
|
+
progressData.changes[0].status = 'deleted';
|
|
834
|
+
}
|
|
835
|
+
return progressData;
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
/**
|
|
839
|
+
* X1 墓碑上行(design §5.5 / task-13):同端点同结构的一次追加 POST(changes[].status='deleted')。
|
|
840
|
+
*
|
|
841
|
+
* 由 sync() 成功路径在常规推送 + 文档/spec 树链之后触发(CLI 单进程顺序推送,base_ts 进程内
|
|
842
|
+
* 单调,无乐观锁冲突)。fresh 重读 DB 序列化——常规推送成功的 base_ts 回填已落库,本推送带上
|
|
843
|
+
* 该 base_ts;重复墓碑(平台已删)收到 409 code='change_deleted' 属预期,静默返回。
|
|
844
|
+
* Best-effort:任何失败只 debugLog,不影响 sync() 主结果(平台闭环走方案 A 兜底)。
|
|
845
|
+
* @param {string} changeName
|
|
846
|
+
* @param {{signal?: object}} [opts]
|
|
847
|
+
* @returns {Promise<{synced: number}>}
|
|
848
|
+
*/
|
|
849
|
+
async _pushTombstone(changeName, opts = {}) {
|
|
850
|
+
const platform = this._getPlatform();
|
|
851
|
+
if (!platform) return { synced: 0 };
|
|
852
|
+
const { ProgressManager } = await import('./progress.js');
|
|
853
|
+
const pm = new ProgressManager({ specDir: safePlatformSpecDir(this.cwd) });
|
|
854
|
+
const progressData = pm.serializeForSync(this.cwd, changeName);
|
|
855
|
+
if (progressData === null) return { synced: 0 }; // DB 行已不在(彻底删除),无墓碑可推,方案 A 兜底
|
|
856
|
+
this._applyTombstoneStatus(progressData);
|
|
857
|
+
|
|
858
|
+
const headers = {
|
|
859
|
+
'Content-Type': 'application/json',
|
|
860
|
+
Authorization: `Bearer ${platform.token}`,
|
|
861
|
+
};
|
|
862
|
+
const pushedAt = new Date().toISOString();
|
|
863
|
+
const pushUser = platform.user || resolvePlatformUser(this.cwd) || null;
|
|
864
|
+
if (pushUser) headers['X-SillySpec-User'] = pushUser;
|
|
865
|
+
const baseTs = progressData.changes?.[0]?.last_synced_platform_ts;
|
|
866
|
+
if (baseTs) headers['X-SillySpec-Base-Ts'] = baseTs;
|
|
867
|
+
headers['X-SillySpec-Pushed-At'] = pushedAt;
|
|
868
|
+
|
|
869
|
+
const syncUrl = `${platform.url}/api/changes/${encodeURIComponent(changeName)}/progress`;
|
|
870
|
+
const res = await fetchJsonWithStatus(syncUrl, {
|
|
871
|
+
method: 'POST',
|
|
872
|
+
headers,
|
|
873
|
+
body: JSON.stringify(progressData),
|
|
874
|
+
signal: opts.signal,
|
|
875
|
+
});
|
|
876
|
+
if (res.ok) {
|
|
877
|
+
console.log(`[sync] 已上行墓碑(status=deleted): ${changeName}`);
|
|
878
|
+
try {
|
|
879
|
+
const ackTs = res.body && typeof res.body.last_pushed_at === 'string' ? res.body.last_pushed_at : pushedAt;
|
|
880
|
+
pm._updatePlatformLastSync(this.cwd, changeName, ackTs);
|
|
881
|
+
} catch { /* 回填失败下次 push 409 由自竞态自愈收敛 */ }
|
|
882
|
+
return { synced: 1 };
|
|
883
|
+
}
|
|
884
|
+
debugLog(`[sync] 墓碑上行未成功: ${changeName} (status=${res.status},平台方案 A 兜底)`);
|
|
885
|
+
return { synced: 0 };
|
|
886
|
+
}
|
|
887
|
+
|
|
623
888
|
/**
|
|
624
889
|
* 自竞态判定辅助:fresh 读本地 DB 的 last_synced_platform_ts(base_ts),判断它是否已覆盖
|
|
625
890
|
* 平台 409 回执的 last_pushed_at(字符串字典序比较,契约 §4.2——ISO 8601 字典序 == 时间序)。
|
|
@@ -806,22 +1071,23 @@ export class SyncManager {
|
|
|
806
1071
|
}
|
|
807
1072
|
|
|
808
1073
|
/**
|
|
809
|
-
* DB
|
|
1074
|
+
* DB 侧变更状态探测(坑 post-archive-sync-noise;2026-08-30 泛化):只读直查 changes.status,
|
|
1075
|
+
* 供「目录缺失」降噪分支区分 archived(归档终态照推)与 deleted(change-delete 删除终态)。
|
|
810
1076
|
* 只读直查(node:sqlite,不经 ProgressManager——sync 是短进程,惰性 import 无收益且
|
|
811
|
-
* 本调用点在同步代码段);DB 不存在/无行/读失败 →
|
|
1077
|
+
* 本调用点在同步代码段);DB 不存在/无行/读失败 → null(保守退回普通 warn 措辞)。
|
|
812
1078
|
* @param {string} changeName
|
|
813
|
-
* @returns {
|
|
1079
|
+
* @returns {string|null}
|
|
814
1080
|
*/
|
|
815
|
-
|
|
1081
|
+
_changeDbStatus(changeName) {
|
|
816
1082
|
try {
|
|
817
1083
|
const dbPath = join(safePlatformSpecDir(this.cwd) || join(this.cwd, '.sillyspec'), '.runtime', 'sillyspec.db');
|
|
818
|
-
if (!existsSync(dbPath)) return
|
|
1084
|
+
if (!existsSync(dbPath)) return null;
|
|
819
1085
|
const db = openDatabase(dbPath, { readOnly: true });
|
|
820
1086
|
try {
|
|
821
1087
|
const row = db.prepare("SELECT status FROM changes WHERE name = ?").get(changeName);
|
|
822
|
-
return row?.status
|
|
1088
|
+
return row?.status || null;
|
|
823
1089
|
} finally { try { db.close() } catch {} }
|
|
824
|
-
} catch { return
|
|
1090
|
+
} catch { return null }
|
|
825
1091
|
}
|
|
826
1092
|
|
|
827
1093
|
/**
|
|
@@ -1115,6 +1381,262 @@ export class SyncManager {
|
|
|
1115
1381
|
}
|
|
1116
1382
|
}
|
|
1117
1383
|
|
|
1384
|
+
/**
|
|
1385
|
+
* X2(task-14 / design §7.1 / FR-07 / FR-08):拉平台 spec 整树快照并解压到 specDir。
|
|
1386
|
+
*
|
|
1387
|
+
* 与既有 pull()(进度六表 DB import)正交:本方法操作的是 .sillyspec **文件树**——
|
|
1388
|
+
* GET {platform.url}/api/changes/-/spec-bundle(task-08 端点,Bearer shpsync token,
|
|
1389
|
+
* application/x-tar 流 + X-Spec-Version 响应头)下载未压缩 tar 后解包。
|
|
1390
|
+
*
|
|
1391
|
+
* 覆盖语义对齐 daemon pullSpecBundle(sillyhub-daemon/src/spec-sync.ts):
|
|
1392
|
+
* - specDir 为空(或不存在)→ 直接解压;
|
|
1393
|
+
* - 非空且无 force → 拒绝并明确提示(fail-fast,不发网络请求);
|
|
1394
|
+
* - force → rm 整树 + 解包(先下载并全量解析校验 tar,成功后才 rm——恶意/损坏
|
|
1395
|
+
* bundle 不先删本地)。local.yaml 是唯一保留例外:本机连接凭据,服务端 bundle
|
|
1396
|
+
* 恒排除它(spec-sync.js UPLOAD_EXCLUDE_FILENAMES),rm 前读出、解包落定后
|
|
1397
|
+
* 原样恢复——删它零收益纯断连。崩溃安全(审计 B3):rm 前凭据先原子备份到树外
|
|
1398
|
+
* `<specDir 根名>.local.yaml.bak`,成功后自动清理;恢复失败时从 .bak 兜底复制,
|
|
1399
|
+
* 兜底也失败则 .bak 留在现场供手工恢复(凭据不因覆盖中断永久丢失)。
|
|
1400
|
+
*
|
|
1401
|
+
* 快照语义(design §7.4):主动拉取服务器**打包时刻**快照,无自动同步、无会话中
|
|
1402
|
+
* 刷新;daemon 模式任务/会话开始时按 latest_spec_version 自动取新(本方法不涉)。
|
|
1403
|
+
*
|
|
1404
|
+
* Best Effort:未连接平台静默跳过(本地合法状态);网络/解包失败返回 ok:false 不抛。
|
|
1405
|
+
* @param {{force?: boolean, specDir?: string|null, signal?: AbortSignal}} [opts]
|
|
1406
|
+
* force 整树覆盖;specDir 显式覆盖树根(--spec-dir 全局选项通道;缺省与 sync()
|
|
1407
|
+
* 同源:平台模式锚 specRoot,本地模式 cwd/.sillyspec);signal 外部熔断
|
|
1408
|
+
* @returns {Promise<{ok: boolean, pulled: boolean, specDir?: string, specVersion?: string|null, reason?: string}>}
|
|
1409
|
+
*/
|
|
1410
|
+
async pullSpecBundle(opts = {}) {
|
|
1411
|
+
const { force = false } = opts;
|
|
1412
|
+
const platform = this._getPlatform();
|
|
1413
|
+
if (!platform) {
|
|
1414
|
+
debugLog('[sync] 未连接平台(本地合法状态);pullSpecBundle 跳过');
|
|
1415
|
+
return { ok: false, pulled: false, reason: '未连接平台' };
|
|
1416
|
+
}
|
|
1417
|
+
// 树根与 sync()/spec 树推送同源(BUG-01:平台模式必须锚 specRoot,勿硬编码 cwd/.sillyspec)
|
|
1418
|
+
const specDir = opts.specDir || safePlatformSpecDir(this.cwd) || join(this.cwd, '.sillyspec');
|
|
1419
|
+
|
|
1420
|
+
// 覆盖守卫(daemon 同款):非空且无 --force 拒绝——先于网络请求,本地不可逆动作前 fail-fast
|
|
1421
|
+
if (_dirHasContent(specDir) && !force) {
|
|
1422
|
+
return {
|
|
1423
|
+
ok: false, pulled: false, specDir,
|
|
1424
|
+
reason: `specDir 非空(${specDir}),拒绝整树覆盖;确认用平台快照替换本地请加 --force`,
|
|
1425
|
+
};
|
|
1426
|
+
}
|
|
1427
|
+
|
|
1428
|
+
// 下载流式 tar(spec 树小,整只缓冲与 daemon getSpecBundle 同口径)。
|
|
1429
|
+
// 审计 B2:下载(含响应体读取)走 PULL_BUNDLE_TIMEOUT_MS 独立大口径——大树/慢网下
|
|
1430
|
+
// 10s 常规轮询口径必超时;仍尊重外部熔断 signal(两者 combine)。
|
|
1431
|
+
const bundleUrl = `${platform.url}/api/changes/-/spec-bundle`;
|
|
1432
|
+
let res;
|
|
1433
|
+
try {
|
|
1434
|
+
res = await fetch(bundleUrl, {
|
|
1435
|
+
headers: { Authorization: `Bearer ${platform.token}` },
|
|
1436
|
+
signal: combineSignals(opts.signal, PULL_BUNDLE_TIMEOUT_MS),
|
|
1437
|
+
});
|
|
1438
|
+
} catch (err) {
|
|
1439
|
+
// AbortSignal.timeout 到期抛 TimeoutError,外部 signal abort 抛 AbortError,两者都是超时/中断口径
|
|
1440
|
+
const why = (err.name === 'AbortError' || err.name === 'TimeoutError')
|
|
1441
|
+
? `下载超时/中断 (${PULL_BUNDLE_TIMEOUT_MS / 1000}s 上限或外部熔断)`
|
|
1442
|
+
: err.message;
|
|
1443
|
+
console.warn(`[sync] GET ${bundleUrl} 请求失败: ${why}`);
|
|
1444
|
+
return { ok: false, pulled: false, specDir, reason: `拉取 spec bundle 失败: ${why}` };
|
|
1445
|
+
}
|
|
1446
|
+
if (!res.ok) {
|
|
1447
|
+
const why = res.status === 404
|
|
1448
|
+
? '平台工作区尚无 spec 内容(HTTP 404,空 bundle)'
|
|
1449
|
+
: `HTTP ${res.status}`;
|
|
1450
|
+
console.warn(`[sync] GET ${bundleUrl} → ${res.status}`);
|
|
1451
|
+
return { ok: false, pulled: false, specDir, reason: `拉取 spec bundle 失败: ${why}` };
|
|
1452
|
+
}
|
|
1453
|
+
const specVersion = res.headers.get('x-spec-version');
|
|
1454
|
+
let tarBuf;
|
|
1455
|
+
try {
|
|
1456
|
+
tarBuf = Buffer.from(await res.arrayBuffer());
|
|
1457
|
+
} catch (err) {
|
|
1458
|
+
console.warn(`[sync] 读取 spec bundle 响应体失败: ${err.message}`);
|
|
1459
|
+
return { ok: false, pulled: false, specDir, reason: `读取 spec bundle 失败: ${err.message}` };
|
|
1460
|
+
}
|
|
1461
|
+
|
|
1462
|
+
// 全量解析 + 穿越校验在 rm 之前(tar-slip 命中时本地原样保留)
|
|
1463
|
+
let entries;
|
|
1464
|
+
try {
|
|
1465
|
+
entries = _parseSpecTar(tarBuf);
|
|
1466
|
+
} catch (err) {
|
|
1467
|
+
console.warn(`[sync] spec bundle 无效: ${err.message}`);
|
|
1468
|
+
return { ok: false, pulled: false, specDir, reason: `spec bundle 无效: ${err.message}` };
|
|
1469
|
+
}
|
|
1470
|
+
|
|
1471
|
+
// 覆盖语义:rm 整树(容忍不存在)→ 逐条目落盘(join 后 relative 双重校验再走一道)
|
|
1472
|
+
// local.yaml 唯一豁免(rm 前校验存在性并读出,解包落定后原样恢复 + 校验回存在):
|
|
1473
|
+
// 本机连接凭据(platform/mcp 段含 shpsync token),服务端 bundle 恒排除它
|
|
1474
|
+
// (spec-sync.js UPLOAD_EXCLUDE_FILENAMES)——rm 整树删它零收益纯断连。恢复放在
|
|
1475
|
+
// 条目循环之后,即便异常 bundle 携带同名条目也以本地为准(凭据永不取自服务端)。
|
|
1476
|
+
//
|
|
1477
|
+
// 审计 B3 崩溃安全(三层):rm 整树后凭据只剩内存 Buffer,任一步失败(条目写失败/
|
|
1478
|
+
// 恢复写失败——Windows EPERM·AV 锁·磁盘满)或进程崩溃即凭据永久丢失。三层防护:
|
|
1479
|
+
// ①rm 前先把内容原子写到树外 `<specDir 根名>.local.yaml.bak`(树内会被 rm 一并删掉,
|
|
1480
|
+
// 故放父目录);②恢复主路径不变,失败时从 .bak 再兜底复制一次;③成功路径末尾
|
|
1481
|
+
// 清理 .bak(明文 token 不留第二份;顺带清历史失败残留)。
|
|
1482
|
+
const localYamlPath = join(specDir, 'local.yaml');
|
|
1483
|
+
const localYamlBakPath = join(dirname(specDir), `${basename(specDir)}.local.yaml.bak`);
|
|
1484
|
+
let localYamlSaved = null; // null = 本无此文件,无需恢复
|
|
1485
|
+
if (existsSync(localYamlPath)) {
|
|
1486
|
+
try {
|
|
1487
|
+
localYamlSaved = readFileSync(localYamlPath); // Buffer 字节级:注释/CRLF 原样
|
|
1488
|
+
} catch (err) {
|
|
1489
|
+
// fail-closed:读不出就无从恢复,继续 rm = 确定性丢凭据断连,宁可整单拒绝
|
|
1490
|
+
console.warn(`[sync] local.yaml 存在但读取失败,拒绝 --force 整树覆盖: ${err.message}`);
|
|
1491
|
+
return { ok: false, pulled: false, specDir, reason: `local.yaml 读取失败,已拒绝整树覆盖(防丢连接凭据): ${err.message}` };
|
|
1492
|
+
}
|
|
1493
|
+
try {
|
|
1494
|
+
writeAtomicSync(localYamlBakPath, localYamlSaved);
|
|
1495
|
+
try { chmodSync(localYamlBakPath, 0o600); } catch { /* best-effort,同 local.yaml SEC-04 */ }
|
|
1496
|
+
} catch (err) {
|
|
1497
|
+
// 兜底都写不进(磁盘满等):继续 rm = 凭据只剩内存一份,恢复再失败即永久丢失,拒绝整单
|
|
1498
|
+
console.warn(`[sync] local.yaml 备份写入失败,拒绝 --force 整树覆盖: ${err.message}`);
|
|
1499
|
+
return { ok: false, pulled: false, specDir, reason: `local.yaml 备份失败,已拒绝整树覆盖(防丢连接凭据): ${err.message}` };
|
|
1500
|
+
}
|
|
1501
|
+
}
|
|
1502
|
+
try {
|
|
1503
|
+
rmSync(specDir, { recursive: true, force: true });
|
|
1504
|
+
} catch (err) {
|
|
1505
|
+
// Windows EPERM/EBUSY:整树内 .runtime/sillyspec.db 被运行中 daemon/CLI 持有时 rm 必失败
|
|
1506
|
+
//(本地树未被删除,可安全整单退出;.bak 留待下次成功覆盖时清理)
|
|
1507
|
+
const holdHint = err.code === 'EBUSY' || err.code === 'EPERM'
|
|
1508
|
+
? '(可能被运行中的 daemon/CLI 持有 .runtime/sillyspec.db,请先停止相关进程再 --force)' : '';
|
|
1509
|
+
console.warn(`[sync] 删除本地 specDir 失败${holdHint}: ${err.message}`);
|
|
1510
|
+
return { ok: false, pulled: false, specDir, reason: `删除本地 specDir 失败${holdHint}: ${err.message}` };
|
|
1511
|
+
}
|
|
1512
|
+
try {
|
|
1513
|
+
for (const e of entries) {
|
|
1514
|
+
_assertSafeTarName(e.name.replace(/\/+$/, ''), specDir);
|
|
1515
|
+
const fullPath = join(specDir, e.name);
|
|
1516
|
+
if (e.isDir) {
|
|
1517
|
+
mkdirSync(fullPath, { recursive: true });
|
|
1518
|
+
} else {
|
|
1519
|
+
mkdirSync(dirname(fullPath), { recursive: true });
|
|
1520
|
+
writeFileSync(fullPath, e.data);
|
|
1521
|
+
}
|
|
1522
|
+
}
|
|
1523
|
+
if (localYamlSaved !== null) {
|
|
1524
|
+
mkdirSync(specDir, { recursive: true }); // 空 bundle(零条目)时树根未被条目重建
|
|
1525
|
+
writeAtomicSync(localYamlPath, localYamlSaved); // fs-atomic 契约:hook/probe 并发读 local.yaml
|
|
1526
|
+
try { chmodSync(localYamlPath, 0o600); } catch { /* SEC-04 best-effort,同 writeLocalYamlRaw */ }
|
|
1527
|
+
if (!existsSync(localYamlPath)) throw new Error('local.yaml 恢复后校验缺失');
|
|
1528
|
+
}
|
|
1529
|
+
// ③ 成功路径:兜底使命完成,清理 .bak(force:true 容忍本就无 .bak 的路径)
|
|
1530
|
+
rmSync(localYamlBakPath, { force: true });
|
|
1531
|
+
} catch (err) {
|
|
1532
|
+
// ② 恢复兜底:主路径失败(条目写失败中断恢复 / 恢复自身失败)时从 .bak 再试一次,
|
|
1533
|
+
// 仍失败不掩盖——.bak 留在树外原处,用户可手工复制为 local.yaml(凭据不因本次失败丢失)
|
|
1534
|
+
if (localYamlSaved !== null && existsSync(localYamlBakPath)) {
|
|
1535
|
+
try {
|
|
1536
|
+
mkdirSync(specDir, { recursive: true });
|
|
1537
|
+
writeAtomicSync(localYamlPath, readFileSync(localYamlBakPath));
|
|
1538
|
+
try { chmodSync(localYamlPath, 0o600); } catch { /* best-effort */ }
|
|
1539
|
+
} catch { /* .bak 兜底也失败:保留 .bak 现场供手工恢复 */ }
|
|
1540
|
+
console.warn(`[sync] 连接凭据已备份于 ${localYamlBakPath},恢复失败可手工复制为 local.yaml`);
|
|
1541
|
+
}
|
|
1542
|
+
console.warn(`[sync] 解压 spec bundle 失败: ${err.message}`);
|
|
1543
|
+
return { ok: false, pulled: false, specDir, reason: `解压 spec bundle 失败: ${err.message}` };
|
|
1544
|
+
}
|
|
1545
|
+
console.log(`[sync] 已拉取 spec 快照并解压到 ${specDir}${specVersion ? `(平台 spec_version: ${specVersion},打包时刻快照非实时)` : ''}`);
|
|
1546
|
+
return { ok: true, pulled: true, specDir, specVersion };
|
|
1547
|
+
}
|
|
1548
|
+
|
|
1549
|
+
/**
|
|
1550
|
+
* spec 树 take-platform 落地(坑 spec-sync-conflict-no-take-platform,2026-09-03 用户实证
|
|
1551
|
+
* 「冲突没有接受服务器版本选项」):拉平台整树 bundle(GET /changes/-/spec-bundle,与
|
|
1552
|
+
* pullSpecBundle 同端点同鉴权),但**只覆盖冲突文件列出的路径**——不整树替换,本会话/
|
|
1553
|
+
* 他端的其他本地改动不动。服务器已无该路径(远端删除)→ 删本地对应文件。
|
|
1554
|
+
*
|
|
1555
|
+
* 覆盖后同步刷新内容基线快照(spec-sync-base.json)中被覆盖路径的 hash:下次
|
|
1556
|
+
* syncSpecTree 的 dropFollowServerUpdates 判「本地未改动」不再回推——take-platform =
|
|
1557
|
+
* 服务器胜出,本地内容即服务器内容,回推同值无害但走基线豁免更干净。
|
|
1558
|
+
*
|
|
1559
|
+
* fail-closed:路径越界(../、绝对路径)逐条跳过计入 skipped 不中断其余;bundle 拉取/
|
|
1560
|
+
* 解析失败整体 ok:false(本地不动)。
|
|
1561
|
+
* @param {string} specDir spec 树根
|
|
1562
|
+
* @param {string[]} paths 冲突路径(POSIX 相对 specDir,来自冲突文件 conflicting_paths)
|
|
1563
|
+
* @returns {Promise<{ok: boolean, overwritten?: number, removed?: number, skipped?: string[], reason?: string}>}
|
|
1564
|
+
*/
|
|
1565
|
+
async _takePlatformSpecPaths(specDir, paths) {
|
|
1566
|
+
const platform = this._getPlatform();
|
|
1567
|
+
if (!platform) return { ok: false, reason: '未连接平台(take-platform 需拉平台 bundle)' };
|
|
1568
|
+
if (!Array.isArray(paths) || paths.length === 0) return { ok: false, reason: '冲突文件缺 conflicting_paths,无可接受路径' };
|
|
1569
|
+
|
|
1570
|
+
const bundleUrl = `${platform.url}/api/changes/-/spec-bundle`;
|
|
1571
|
+
let res;
|
|
1572
|
+
try {
|
|
1573
|
+
res = await fetch(bundleUrl, {
|
|
1574
|
+
headers: { Authorization: `Bearer ${platform.token}` },
|
|
1575
|
+
// 大树/慢网同 pullSpecBundle 口径(审计 B2),不与外部熔断组合(resolve 是用户显式动作)
|
|
1576
|
+
signal: AbortSignal.timeout(PULL_BUNDLE_TIMEOUT_MS),
|
|
1577
|
+
});
|
|
1578
|
+
} catch (err) {
|
|
1579
|
+
const why = (err.name === 'AbortError' || err.name === 'TimeoutError') ? `下载超时/中断(${PULL_BUNDLE_TIMEOUT_MS / 1000}s 上限)` : err.message;
|
|
1580
|
+
return { ok: false, reason: `拉取 spec bundle 失败: ${why}` };
|
|
1581
|
+
}
|
|
1582
|
+
if (!res.ok) {
|
|
1583
|
+
const why = res.status === 404 ? '平台工作区尚无 spec 内容(HTTP 404)' : `HTTP ${res.status}`;
|
|
1584
|
+
return { ok: false, reason: `拉取 spec bundle 失败: ${why}` };
|
|
1585
|
+
}
|
|
1586
|
+
let tarBuf;
|
|
1587
|
+
try { tarBuf = Buffer.from(await res.arrayBuffer()); }
|
|
1588
|
+
catch (err) { return { ok: false, reason: `读取 spec bundle 失败: ${err.message}` }; }
|
|
1589
|
+
let entries;
|
|
1590
|
+
try { entries = _parseSpecTar(tarBuf); }
|
|
1591
|
+
catch (err) { return { ok: false, reason: `spec bundle 无效: ${err.message}` }; }
|
|
1592
|
+
|
|
1593
|
+
const serverFiles = new Map();
|
|
1594
|
+
for (const e of entries) {
|
|
1595
|
+
if (e.isDir || e.name === 'PLATFORM-BUNDLE.json') continue;
|
|
1596
|
+
serverFiles.set(e.name.replace(/^\.\//, ''), e.data);
|
|
1597
|
+
}
|
|
1598
|
+
|
|
1599
|
+
const normalized = [...new Set(paths.map((p) => String(p).replace(/\\/g, '/')).filter(Boolean))];
|
|
1600
|
+
let overwritten = 0;
|
|
1601
|
+
let removed = 0;
|
|
1602
|
+
const skipped = [];
|
|
1603
|
+
for (const p of normalized) {
|
|
1604
|
+
try {
|
|
1605
|
+
_assertSafeTarName(p, specDir);
|
|
1606
|
+
const data = serverFiles.get(p);
|
|
1607
|
+
if (data !== undefined) {
|
|
1608
|
+
const full = join(specDir, p);
|
|
1609
|
+
mkdirSync(dirname(full), { recursive: true });
|
|
1610
|
+
writeFileSync(full, data);
|
|
1611
|
+
overwritten++;
|
|
1612
|
+
} else if (existsSync(join(specDir, p))) {
|
|
1613
|
+
// 服务器已无该文件(远端删除)→ 接受服务器 = 删本地
|
|
1614
|
+
rmSync(join(specDir, p), { force: true });
|
|
1615
|
+
removed++;
|
|
1616
|
+
}
|
|
1617
|
+
} catch {
|
|
1618
|
+
skipped.push(p);
|
|
1619
|
+
}
|
|
1620
|
+
}
|
|
1621
|
+
|
|
1622
|
+
// 基线快照刷新(best-effort):被覆盖路径回写当前盘面 hash(= 服务器内容 hash)、被删
|
|
1623
|
+
// 路径移除条目——下次同步这些路径按「本地未改动」豁免回推(take-platform 语义闭环)。
|
|
1624
|
+
try {
|
|
1625
|
+
const baseFile = join(specDir, '.runtime', 'spec-sync-base.json');
|
|
1626
|
+
let base = null;
|
|
1627
|
+
try { base = JSON.parse(readFileSync(baseFile, 'utf8')); } catch { base = null; }
|
|
1628
|
+
const hashes = base && typeof base.hashes === 'object' ? base.hashes : {};
|
|
1629
|
+
for (const p of normalized) {
|
|
1630
|
+
try { hashes[p] = createHash('sha256').update(readFileSync(join(specDir, p))).digest('hex'); }
|
|
1631
|
+
catch { delete hashes[p]; }
|
|
1632
|
+
}
|
|
1633
|
+
mkdirSync(join(specDir, '.runtime'), { recursive: true });
|
|
1634
|
+
writeFileSync(baseFile, JSON.stringify({ ts: Date.now(), hashes }, null, 2) + '\n', 'utf8');
|
|
1635
|
+
} catch { /* 快照失败只损失下次的防回推精度,覆盖结果本身已成立 */ }
|
|
1636
|
+
|
|
1637
|
+
return { ok: true, overwritten, removed, skipped };
|
|
1638
|
+
}
|
|
1639
|
+
|
|
1118
1640
|
/**
|
|
1119
1641
|
* 冲突解决三选一(task-13 / D-002 / D-010 / D-013 / FR-05)。
|
|
1120
1642
|
* 读 task-12 写的 sync-conflict-<change>.json,按 mode 处理后必清冲突文件防累积(R-04 / constraints)。
|
|
@@ -1206,9 +1728,11 @@ export class SyncManager {
|
|
|
1206
1728
|
let specOutcome = null;
|
|
1207
1729
|
if (specCf && mode === 'keep-local') {
|
|
1208
1730
|
// keep-local = 本地胜出:重新 GET 清单重定 base 后 POST 本地内容(last-writer-wins),
|
|
1209
|
-
//
|
|
1731
|
+
// 成功清冲突文件闭环;仍冲突(平台又有更新)保留文件待下次裁决。
|
|
1732
|
+
// forcePush(坑 quicksync-conflict-granularity):用户显式裁决后本地意志高于
|
|
1733
|
+
// 「未改动跟随服务器」语义——强制重推不得被内容基线/mtime 防回推过滤削掉。
|
|
1210
1734
|
try {
|
|
1211
|
-
const r = await syncSpecTree(safePlatformSpecDir(this.cwd) || join(this.cwd, '.sillyspec'), this._getPlatform(), changeName);
|
|
1735
|
+
const r = await syncSpecTree(safePlatformSpecDir(this.cwd) || join(this.cwd, '.sillyspec'), this._getPlatform(), changeName, { forcePush: true });
|
|
1212
1736
|
if (!r.conflict) {
|
|
1213
1737
|
this.clearSpecConflictFile(changeName);
|
|
1214
1738
|
specOutcome = { ok: true, resolved: true, reason: 'spec 树已以本地为准重定基线重推,冲突闭环' };
|
|
@@ -1219,8 +1743,32 @@ export class SyncManager {
|
|
|
1219
1743
|
specOutcome = { ok: false, resolved: false, reason: `spec 树重推异常: ${err.message}` };
|
|
1220
1744
|
}
|
|
1221
1745
|
} else if (specCf && mode === 'take-platform') {
|
|
1222
|
-
//
|
|
1223
|
-
|
|
1746
|
+
// spec 树 take-platform(坑 spec-sync-conflict-no-take-platform,2026-09-03 用户实证反馈
|
|
1747
|
+
// 「冲突没有接受服务器版本选项」):平台已有 CLI 可用的整树下载端点(GET /changes/-/
|
|
1748
|
+
// spec-bundle,X2 task-08)——拉 bundle 只覆盖冲突文件列出的路径(不整树替换,本地其他
|
|
1749
|
+
// 改动不动),基线快照同步刷新防回推,清冲突文件闭环。此前 fail-closed 报「平台无文件
|
|
1750
|
+
// 下载端点」是端点落地前的旧事实。
|
|
1751
|
+
try {
|
|
1752
|
+
const specDir = safePlatformSpecDir(this.cwd) || join(this.cwd, '.sillyspec');
|
|
1753
|
+
const paths = Array.isArray(specCf.conflicting_paths) && specCf.conflicting_paths.length > 0
|
|
1754
|
+
? specCf.conflicting_paths
|
|
1755
|
+
: Object.keys(specCf.server_versions || {});
|
|
1756
|
+
const r = await this._takePlatformSpecPaths(specDir, paths);
|
|
1757
|
+
if (r.ok) {
|
|
1758
|
+
this.clearSpecConflictFile(changeName);
|
|
1759
|
+
const skippedNote = r.skipped && r.skipped.length > 0
|
|
1760
|
+
? `,${r.skipped.length} 个路径异常跳过(${r.skipped.slice(0, 3).join(', ')}${r.skipped.length > 3 ? ' 等' : ''})`
|
|
1761
|
+
: '';
|
|
1762
|
+
specOutcome = {
|
|
1763
|
+
ok: true, resolved: true,
|
|
1764
|
+
reason: `spec 树已接受服务器版本:覆盖 ${r.overwritten} 个冲突文件${r.removed > 0 ? `、删除 ${r.removed} 个(服务器已删)` : ''}${skippedNote},本地改动已放弃`,
|
|
1765
|
+
};
|
|
1766
|
+
} else {
|
|
1767
|
+
specOutcome = { ok: false, resolved: false, reason: `spec 树 take-platform 失败: ${r.reason}(可重试;或手动对齐本地文件后 --keep-local)` };
|
|
1768
|
+
}
|
|
1769
|
+
} catch (err) {
|
|
1770
|
+
specOutcome = { ok: false, resolved: false, reason: `spec 树 take-platform 异常: ${err.message}` };
|
|
1771
|
+
}
|
|
1224
1772
|
}
|
|
1225
1773
|
|
|
1226
1774
|
// ── abort:两类标记一并清(本地 DB 与文件均不变,下次 push/pull 重新检测)──
|
|
@@ -1369,6 +1917,12 @@ export async function pullList(cwd) {
|
|
|
1369
1917
|
return new SyncManager(cwd).pullList();
|
|
1370
1918
|
}
|
|
1371
1919
|
|
|
1920
|
+
// X2(task-14 / FR-07 / FR-08):spec 整树快照拉取便捷导出(index.js 顶层 pull --spec 命令用,
|
|
1921
|
+
// 与 SyncManager.pullSpecBundle 实例方法共用实现)。快照语义见实例方法 docstring(design §7.4)。
|
|
1922
|
+
export async function pullSpecBundle(cwd, opts) {
|
|
1923
|
+
return new SyncManager(cwd).pullSpecBundle(opts);
|
|
1924
|
+
}
|
|
1925
|
+
|
|
1372
1926
|
// task-13 / D-002 / D-010 / D-013 / FR-05:冲突解决三选一(index.js platform resolve 子命令用)
|
|
1373
1927
|
export async function resolve(changeName, mode, cwd) {
|
|
1374
1928
|
return new SyncManager(cwd).resolve(changeName, mode);
|