sillyspec 3.27.6 → 3.27.9
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-archive/SKILL.md +87 -87
- package/.claude/skills/sillyspec-auto/SKILL.md +93 -93
- package/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -114
- package/.claude/skills/sillyspec-commit/SKILL.md +67 -67
- package/.claude/skills/sillyspec-continue/SKILL.md +47 -47
- package/.claude/skills/sillyspec-doctor/SKILL.md +76 -76
- package/.claude/skills/sillyspec-execute/SKILL.md +214 -214
- package/.claude/skills/sillyspec-explore/SKILL.md +102 -102
- package/.claude/skills/sillyspec-export/SKILL.md +57 -57
- package/.claude/skills/sillyspec-init/SKILL.md +177 -177
- package/.claude/skills/sillyspec-knowledge/SKILL.md +269 -269
- package/.claude/skills/sillyspec-plan/SKILL.md +156 -156
- package/.claude/skills/sillyspec-propose/SKILL.md +87 -0
- package/.claude/skills/sillyspec-quick/SKILL.md +116 -116
- package/.claude/skills/sillyspec-resume/SKILL.md +70 -70
- package/.claude/skills/sillyspec-scan/SKILL.md +79 -79
- package/.claude/skills/sillyspec-state/SKILL.md +64 -64
- package/.claude/skills/sillyspec-status/SKILL.md +54 -54
- package/.claude/skills/sillyspec-verify/SKILL.md +87 -87
- package/.claude/skills/sillyspec-workspace/SKILL.md +175 -175
- package/.claude/skills/verify-per-user/SKILL.md +6 -0
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-archive/SKILL.md +87 -0
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-auto/SKILL.md +93 -0
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -0
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-commit/SKILL.md +67 -0
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-continue/SKILL.md +47 -0
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-doctor/SKILL.md +76 -0
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-execute/SKILL.md +214 -0
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-explore/SKILL.md +102 -0
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-export/SKILL.md +57 -0
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-init/SKILL.md +177 -0
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-knowledge/SKILL.md +270 -0
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-plan/SKILL.md +156 -0
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-propose/SKILL.md +87 -0
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-quick/SKILL.md +116 -0
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-resume/SKILL.md +70 -0
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-scan/SKILL.md +79 -0
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-state/SKILL.md +64 -0
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-status/SKILL.md +54 -0
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-verify/SKILL.md +87 -0
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-workspace/SKILL.md +175 -0
- package/.worktrees/2c37b1d7/.claude/skills/verify-per-user/SKILL.md +6 -0
- package/.worktrees/2c37b1d7/.gitattributes +2 -0
- package/.worktrees/2c37b1d7/.husky/pre-push +20 -0
- package/.worktrees/2c37b1d7/README.md +203 -0
- package/.worktrees/2c37b1d7/SKILL.md +91 -0
- package/.worktrees/2c37b1d7/architecture-analysis.md +448 -0
- package/.worktrees/2c37b1d7/bin/sillyspec.js +2 -0
- package/.worktrees/2c37b1d7/eval/README.md +86 -0
- package/.worktrees/2c37b1d7/eval/eval.config.json +28 -0
- package/.worktrees/2c37b1d7/eval/lib/adapters/cli.mjs +63 -0
- package/.worktrees/2c37b1d7/eval/lib/adapters/dryrun.mjs +27 -0
- package/.worktrees/2c37b1d7/eval/lib/config.mjs +82 -0
- package/.worktrees/2c37b1d7/eval/lib/db.mjs +76 -0
- package/.worktrees/2c37b1d7/eval/lib/report.mjs +120 -0
- package/.worktrees/2c37b1d7/eval/lib/runner.mjs +157 -0
- package/.worktrees/2c37b1d7/eval/lib/tasks.mjs +73 -0
- package/.worktrees/2c37b1d7/eval/lib/util.mjs +107 -0
- package/.worktrees/2c37b1d7/eval/lib/workdir.mjs +30 -0
- package/.worktrees/2c37b1d7/eval/run.mjs +83 -0
- package/.worktrees/2c37b1d7/eval/tasks/001-slugify/files/package.json +6 -0
- package/.worktrees/2c37b1d7/eval/tasks/001-slugify/solution/src/slugify.mjs +26 -0
- package/.worktrees/2c37b1d7/eval/tasks/001-slugify/task.json +6 -0
- package/.worktrees/2c37b1d7/eval/tasks/001-slugify/verify.mjs +28 -0
- package/.worktrees/2c37b1d7/eval/tasks/002-each-day/files/package.json +6 -0
- package/.worktrees/2c37b1d7/eval/tasks/002-each-day/files/src/dates.mjs +4 -0
- package/.worktrees/2c37b1d7/eval/tasks/002-each-day/solution/src/dates.mjs +30 -0
- package/.worktrees/2c37b1d7/eval/tasks/002-each-day/task.json +6 -0
- package/.worktrees/2c37b1d7/eval/tasks/002-each-day/verify.mjs +31 -0
- package/.worktrees/2c37b1d7/eval/tasks/003-word-report/files/data/notes.txt +5 -0
- package/.worktrees/2c37b1d7/eval/tasks/003-word-report/files/package.json +6 -0
- package/.worktrees/2c37b1d7/eval/tasks/003-word-report/solution/bin/report.mjs +36 -0
- package/.worktrees/2c37b1d7/eval/tasks/003-word-report/task.json +6 -0
- package/.worktrees/2c37b1d7/eval/tasks/003-word-report/verify.mjs +38 -0
- package/.worktrees/2c37b1d7/logo.jpg +0 -0
- package/.worktrees/2c37b1d7/package-lock.json +977 -0
- package/.worktrees/2c37b1d7/package.json +41 -0
- package/.worktrees/2c37b1d7/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -0
- package/.worktrees/2c37b1d7/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -0
- package/.worktrees/2c37b1d7/packages/dashboard/dist/favicon.jpg +0 -0
- package/.worktrees/2c37b1d7/packages/dashboard/dist/index.html +16 -0
- package/.worktrees/2c37b1d7/packages/dashboard/dist/logo.jpg +0 -0
- package/.worktrees/2c37b1d7/packages/dashboard/dist/prototype-dashboard.html +836 -0
- package/.worktrees/2c37b1d7/packages/dashboard/dist/prototype-overview.html +256 -0
- package/.worktrees/2c37b1d7/packages/dashboard/package.json +25 -0
- package/.worktrees/2c37b1d7/packages/dashboard/server/executor.js +95 -0
- package/.worktrees/2c37b1d7/packages/dashboard/server/index.js +679 -0
- package/.worktrees/2c37b1d7/packages/dashboard/server/parser.js +526 -0
- package/.worktrees/2c37b1d7/packages/dashboard/server/watcher.js +357 -0
- package/.worktrees/2c37b1d7/src/agent-session-log.js +803 -0
- package/.worktrees/2c37b1d7/src/change-list.js +290 -0
- package/.worktrees/2c37b1d7/src/change-risk-profile.js +339 -0
- package/.worktrees/2c37b1d7/src/check-primitives.js +65 -0
- package/.worktrees/2c37b1d7/src/classify-change.js +109 -0
- package/.worktrees/2c37b1d7/src/commit-suggest.js +202 -0
- package/.worktrees/2c37b1d7/src/config-cat.js +88 -0
- package/.worktrees/2c37b1d7/src/config-schema.js +328 -0
- package/.worktrees/2c37b1d7/src/constants.js +97 -0
- package/.worktrees/2c37b1d7/src/contract-matrix.js +533 -0
- package/.worktrees/2c37b1d7/src/datetime.js +20 -0
- package/.worktrees/2c37b1d7/src/db-engine.js +55 -0
- package/.worktrees/2c37b1d7/src/db.js +381 -0
- package/.worktrees/2c37b1d7/src/decision-distill.js +517 -0
- package/.worktrees/2c37b1d7/src/dispatch/backends/local-agent.js +155 -0
- package/.worktrees/2c37b1d7/src/dispatch/backends/sillyhub-mcp.js +245 -0
- package/.worktrees/2c37b1d7/src/dispatch/probe.js +246 -0
- package/.worktrees/2c37b1d7/src/dispatch/strategy.js +121 -0
- package/.worktrees/2c37b1d7/src/docs-check.js +825 -0
- package/.worktrees/2c37b1d7/src/docs-debt.js +393 -0
- package/.worktrees/2c37b1d7/src/docs-gate.js +107 -0
- package/.worktrees/2c37b1d7/src/doctor-diagnostics.js +1099 -0
- package/.worktrees/2c37b1d7/src/endpoint-extractor.js +409 -0
- package/.worktrees/2c37b1d7/src/foreign-declared.js +155 -0
- package/.worktrees/2c37b1d7/src/fs-atomic.js +73 -0
- package/.worktrees/2c37b1d7/src/git-helper.js +150 -0
- package/.worktrees/2c37b1d7/src/hooks/claude-pre-tool-use.cjs +130 -0
- package/.worktrees/2c37b1d7/src/hooks/worktree-guard.js +892 -0
- package/.worktrees/2c37b1d7/src/index.js +2854 -0
- package/.worktrees/2c37b1d7/src/init.js +626 -0
- package/.worktrees/2c37b1d7/src/knowledge-match.js +231 -0
- package/.worktrees/2c37b1d7/src/local-detect.js +128 -0
- package/.worktrees/2c37b1d7/src/local-register.js +104 -0
- package/.worktrees/2c37b1d7/src/machine-interface.js +543 -0
- package/.worktrees/2c37b1d7/src/migrate.js +127 -0
- package/.worktrees/2c37b1d7/src/module-impact.js +166 -0
- package/.worktrees/2c37b1d7/src/module-resolve.js +222 -0
- package/.worktrees/2c37b1d7/src/modules.js +580 -0
- package/.worktrees/2c37b1d7/src/plan-adopt-waves.js +126 -0
- package/.worktrees/2c37b1d7/src/progress/change-registry.js +336 -0
- package/.worktrees/2c37b1d7/src/progress/consistency-doctor.js +355 -0
- package/.worktrees/2c37b1d7/src/progress/shared.js +36 -0
- package/.worktrees/2c37b1d7/src/progress/stage-machine.js +594 -0
- package/.worktrees/2c37b1d7/src/progress/step-store.js +265 -0
- package/.worktrees/2c37b1d7/src/progress.js +1304 -0
- package/.worktrees/2c37b1d7/src/quick-recommend.js +115 -0
- package/.worktrees/2c37b1d7/src/quicklog.js +883 -0
- package/.worktrees/2c37b1d7/src/review-tier.js +77 -0
- package/.worktrees/2c37b1d7/src/run/command.js +1641 -0
- package/.worktrees/2c37b1d7/src/run/complete-handlers.js +1552 -0
- package/.worktrees/2c37b1d7/src/run/complete.js +1259 -0
- package/.worktrees/2c37b1d7/src/run/concurrent-detect.js +156 -0
- package/.worktrees/2c37b1d7/src/run/gates.js +1111 -0
- package/.worktrees/2c37b1d7/src/run/multi-repo-context.js +208 -0
- package/.worktrees/2c37b1d7/src/run/next.js +128 -0
- package/.worktrees/2c37b1d7/src/run/prompt.js +843 -0
- package/.worktrees/2c37b1d7/src/run/quick-audit.js +186 -0
- package/.worktrees/2c37b1d7/src/run/scan-profile.js +269 -0
- package/.worktrees/2c37b1d7/src/run/shared.js +1562 -0
- package/.worktrees/2c37b1d7/src/run/stage.js +587 -0
- package/.worktrees/2c37b1d7/src/run.js +23 -0
- package/.worktrees/2c37b1d7/src/scan-diff.js +388 -0
- package/.worktrees/2c37b1d7/src/scan-postcheck.js +524 -0
- package/.worktrees/2c37b1d7/src/scan-staleness.js +95 -0
- package/.worktrees/2c37b1d7/src/setup.js +414 -0
- package/.worktrees/2c37b1d7/src/sillyhub-mcp/client.js +597 -0
- package/.worktrees/2c37b1d7/src/sillyhub-mcp/config.js +62 -0
- package/.worktrees/2c37b1d7/src/spec-dir-typo.js +50 -0
- package/.worktrees/2c37b1d7/src/spec-sync.js +358 -0
- package/.worktrees/2c37b1d7/src/stage-contract-engine.js +171 -0
- package/.worktrees/2c37b1d7/src/stage-contract-spec.js +551 -0
- package/.worktrees/2c37b1d7/src/stage-contract.js +948 -0
- package/.worktrees/2c37b1d7/src/stage-review.js +597 -0
- package/.worktrees/2c37b1d7/src/stages/archive.js +199 -0
- package/.worktrees/2c37b1d7/src/stages/brainstorm-auto.js +285 -0
- package/.worktrees/2c37b1d7/src/stages/brainstorm.js +624 -0
- package/.worktrees/2c37b1d7/src/stages/cmd-existence.js +145 -0
- package/.worktrees/2c37b1d7/src/stages/doctor.js +540 -0
- package/.worktrees/2c37b1d7/src/stages/execute.js +1277 -0
- package/.worktrees/2c37b1d7/src/stages/explore.js +43 -0
- package/.worktrees/2c37b1d7/src/stages/index.js +29 -0
- package/.worktrees/2c37b1d7/src/stages/knowledge.js +514 -0
- package/.worktrees/2c37b1d7/src/stages/plan-postcheck.js +1398 -0
- package/.worktrees/2c37b1d7/src/stages/plan.js +655 -0
- package/.worktrees/2c37b1d7/src/stages/quick.js +167 -0
- package/.worktrees/2c37b1d7/src/stages/scan.js +608 -0
- package/.worktrees/2c37b1d7/src/stages/status.js +64 -0
- package/.worktrees/2c37b1d7/src/stages/verify.js +246 -0
- package/.worktrees/2c37b1d7/src/sync.js +1470 -0
- package/.worktrees/2c37b1d7/src/task-review.js +1498 -0
- package/.worktrees/2c37b1d7/src/taskcard-placeholders.js +21 -0
- package/.worktrees/2c37b1d7/src/taskcard.js +250 -0
- package/.worktrees/2c37b1d7/src/verify-postcheck.js +1718 -0
- package/.worktrees/2c37b1d7/src/verify-probes.js +327 -0
- package/.worktrees/2c37b1d7/src/version.js +19 -0
- package/.worktrees/2c37b1d7/src/workflow.js +600 -0
- package/.worktrees/2c37b1d7/src/workspace.js +125 -0
- package/.worktrees/2c37b1d7/src/worktree-apply.js +1611 -0
- package/.worktrees/2c37b1d7/src/worktree-deps.js +668 -0
- package/.worktrees/2c37b1d7/src/worktree.js +1849 -0
- package/.worktrees/2c37b1d7/templates/claude-instruction.md +23 -0
- package/.worktrees/2c37b1d7/templates/prompts/taskcard-rules.md +29 -0
- package/.worktrees/2c37b1d7/templates/prompts/testcase-design.md +12 -0
- package/.worktrees/2c37b1d7/templates/prompts/verify-probes.md +32 -0
- package/.worktrees/2c37b1d7/templates/workflows/archive-impact.yaml +79 -0
- package/.worktrees/2c37b1d7/templates/workflows/scan-docs.yaml +132 -0
- package/.worktrees/542c4415/.claude/skills/sillyspec-archive/SKILL.md +87 -0
- package/.worktrees/542c4415/.claude/skills/sillyspec-auto/SKILL.md +93 -0
- package/.worktrees/542c4415/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -0
- package/.worktrees/542c4415/.claude/skills/sillyspec-commit/SKILL.md +67 -0
- package/.worktrees/542c4415/.claude/skills/sillyspec-continue/SKILL.md +47 -0
- package/.worktrees/542c4415/.claude/skills/sillyspec-doctor/SKILL.md +76 -0
- package/.worktrees/542c4415/.claude/skills/sillyspec-execute/SKILL.md +214 -0
- package/.worktrees/542c4415/.claude/skills/sillyspec-explore/SKILL.md +102 -0
- package/.worktrees/542c4415/.claude/skills/sillyspec-export/SKILL.md +57 -0
- package/.worktrees/542c4415/.claude/skills/sillyspec-init/SKILL.md +177 -0
- package/.worktrees/542c4415/.claude/skills/sillyspec-knowledge/SKILL.md +270 -0
- package/.worktrees/542c4415/.claude/skills/sillyspec-plan/SKILL.md +156 -0
- package/.worktrees/542c4415/.claude/skills/sillyspec-quick/SKILL.md +116 -0
- package/.worktrees/542c4415/.claude/skills/sillyspec-resume/SKILL.md +70 -0
- package/.worktrees/542c4415/.claude/skills/sillyspec-scan/SKILL.md +79 -0
- package/.worktrees/542c4415/.claude/skills/sillyspec-state/SKILL.md +64 -0
- package/.worktrees/542c4415/.claude/skills/sillyspec-status/SKILL.md +54 -0
- package/.worktrees/542c4415/.claude/skills/sillyspec-verify/SKILL.md +87 -0
- package/.worktrees/542c4415/.claude/skills/sillyspec-workspace/SKILL.md +175 -0
- package/.worktrees/542c4415/.gitattributes +2 -0
- package/.worktrees/542c4415/.husky/pre-push +20 -0
- package/.worktrees/542c4415/README.md +203 -0
- package/.worktrees/542c4415/SKILL.md +91 -0
- package/.worktrees/542c4415/architecture-analysis.md +448 -0
- package/.worktrees/542c4415/bin/sillyspec.js +2 -0
- package/.worktrees/542c4415/eval/README.md +86 -0
- package/.worktrees/542c4415/eval/eval.config.json +28 -0
- package/.worktrees/542c4415/eval/lib/adapters/cli.mjs +63 -0
- package/.worktrees/542c4415/eval/lib/adapters/dryrun.mjs +27 -0
- package/.worktrees/542c4415/eval/lib/config.mjs +82 -0
- package/.worktrees/542c4415/eval/lib/db.mjs +76 -0
- package/.worktrees/542c4415/eval/lib/report.mjs +120 -0
- package/.worktrees/542c4415/eval/lib/runner.mjs +157 -0
- package/.worktrees/542c4415/eval/lib/tasks.mjs +73 -0
- package/.worktrees/542c4415/eval/lib/util.mjs +107 -0
- package/.worktrees/542c4415/eval/lib/workdir.mjs +30 -0
- package/.worktrees/542c4415/eval/run.mjs +83 -0
- package/.worktrees/542c4415/eval/tasks/001-slugify/files/package.json +6 -0
- package/.worktrees/542c4415/eval/tasks/001-slugify/solution/src/slugify.mjs +26 -0
- package/.worktrees/542c4415/eval/tasks/001-slugify/task.json +6 -0
- package/.worktrees/542c4415/eval/tasks/001-slugify/verify.mjs +28 -0
- package/.worktrees/542c4415/eval/tasks/002-each-day/files/package.json +6 -0
- package/.worktrees/542c4415/eval/tasks/002-each-day/files/src/dates.mjs +4 -0
- package/.worktrees/542c4415/eval/tasks/002-each-day/solution/src/dates.mjs +30 -0
- package/.worktrees/542c4415/eval/tasks/002-each-day/task.json +6 -0
- package/.worktrees/542c4415/eval/tasks/002-each-day/verify.mjs +31 -0
- package/.worktrees/542c4415/eval/tasks/003-word-report/files/data/notes.txt +5 -0
- package/.worktrees/542c4415/eval/tasks/003-word-report/files/package.json +6 -0
- package/.worktrees/542c4415/eval/tasks/003-word-report/solution/bin/report.mjs +36 -0
- package/.worktrees/542c4415/eval/tasks/003-word-report/task.json +6 -0
- package/.worktrees/542c4415/eval/tasks/003-word-report/verify.mjs +38 -0
- package/.worktrees/542c4415/logo.jpg +0 -0
- package/.worktrees/542c4415/package-lock.json +977 -0
- package/.worktrees/542c4415/package.json +41 -0
- package/.worktrees/542c4415/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -0
- package/.worktrees/542c4415/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -0
- package/.worktrees/542c4415/packages/dashboard/dist/favicon.jpg +0 -0
- package/.worktrees/542c4415/packages/dashboard/dist/index.html +16 -0
- package/.worktrees/542c4415/packages/dashboard/dist/logo.jpg +0 -0
- package/.worktrees/542c4415/packages/dashboard/dist/prototype-dashboard.html +836 -0
- package/.worktrees/542c4415/packages/dashboard/dist/prototype-overview.html +256 -0
- package/.worktrees/542c4415/packages/dashboard/package.json +25 -0
- package/.worktrees/542c4415/packages/dashboard/server/executor.js +95 -0
- package/.worktrees/542c4415/packages/dashboard/server/index.js +679 -0
- package/.worktrees/542c4415/packages/dashboard/server/parser.js +526 -0
- package/.worktrees/542c4415/packages/dashboard/server/watcher.js +357 -0
- package/.worktrees/542c4415/src/agent-session-log.js +803 -0
- package/.worktrees/542c4415/src/change-list.js +290 -0
- package/.worktrees/542c4415/src/change-risk-profile.js +339 -0
- package/.worktrees/542c4415/src/check-primitives.js +65 -0
- package/.worktrees/542c4415/src/classify-change.js +109 -0
- package/.worktrees/542c4415/src/commit-suggest.js +202 -0
- package/.worktrees/542c4415/src/config-cat.js +88 -0
- package/.worktrees/542c4415/src/config-schema.js +328 -0
- package/.worktrees/542c4415/src/constants.js +97 -0
- package/.worktrees/542c4415/src/contract-matrix.js +533 -0
- package/.worktrees/542c4415/src/datetime.js +20 -0
- package/.worktrees/542c4415/src/db-engine.js +55 -0
- package/.worktrees/542c4415/src/db.js +381 -0
- package/.worktrees/542c4415/src/decision-distill.js +517 -0
- package/.worktrees/542c4415/src/dispatch/backends/local-agent.js +155 -0
- package/.worktrees/542c4415/src/dispatch/backends/sillyhub-mcp.js +245 -0
- package/.worktrees/542c4415/src/dispatch/probe.js +246 -0
- package/.worktrees/542c4415/src/dispatch/strategy.js +121 -0
- package/.worktrees/542c4415/src/docs-check.js +825 -0
- package/.worktrees/542c4415/src/docs-debt.js +393 -0
- package/.worktrees/542c4415/src/docs-gate.js +107 -0
- package/.worktrees/542c4415/src/doctor-diagnostics.js +1099 -0
- package/.worktrees/542c4415/src/endpoint-extractor.js +409 -0
- package/.worktrees/542c4415/src/foreign-declared.js +155 -0
- package/.worktrees/542c4415/src/fs-atomic.js +73 -0
- package/.worktrees/542c4415/src/git-helper.js +150 -0
- package/.worktrees/542c4415/src/hooks/claude-pre-tool-use.cjs +130 -0
- package/.worktrees/542c4415/src/hooks/worktree-guard.js +892 -0
- package/.worktrees/542c4415/src/index.js +2854 -0
- package/.worktrees/542c4415/src/init.js +626 -0
- package/.worktrees/542c4415/src/knowledge-match.js +231 -0
- package/.worktrees/542c4415/src/local-detect.js +128 -0
- package/.worktrees/542c4415/src/local-register.js +104 -0
- package/.worktrees/542c4415/src/machine-interface.js +543 -0
- package/.worktrees/542c4415/src/migrate.js +127 -0
- package/.worktrees/542c4415/src/module-impact.js +166 -0
- package/.worktrees/542c4415/src/module-resolve.js +222 -0
- package/.worktrees/542c4415/src/modules.js +580 -0
- package/.worktrees/542c4415/src/plan-adopt-waves.js +126 -0
- package/.worktrees/542c4415/src/progress/change-registry.js +336 -0
- package/.worktrees/542c4415/src/progress/consistency-doctor.js +355 -0
- package/.worktrees/542c4415/src/progress/shared.js +36 -0
- package/.worktrees/542c4415/src/progress/stage-machine.js +594 -0
- package/.worktrees/542c4415/src/progress/step-store.js +265 -0
- package/.worktrees/542c4415/src/progress.js +1304 -0
- package/.worktrees/542c4415/src/quick-recommend.js +115 -0
- package/.worktrees/542c4415/src/quicklog.js +883 -0
- package/.worktrees/542c4415/src/review-tier.js +77 -0
- package/.worktrees/542c4415/src/run/command.js +1641 -0
- package/.worktrees/542c4415/src/run/complete-handlers.js +1552 -0
- package/.worktrees/542c4415/src/run/complete.js +1259 -0
- package/.worktrees/542c4415/src/run/concurrent-detect.js +156 -0
- package/.worktrees/542c4415/src/run/gates.js +1111 -0
- package/.worktrees/542c4415/src/run/multi-repo-context.js +208 -0
- package/.worktrees/542c4415/src/run/next.js +128 -0
- package/.worktrees/542c4415/src/run/prompt.js +843 -0
- package/.worktrees/542c4415/src/run/quick-audit.js +186 -0
- package/.worktrees/542c4415/src/run/scan-profile.js +269 -0
- package/.worktrees/542c4415/src/run/shared.js +1562 -0
- package/.worktrees/542c4415/src/run/stage.js +587 -0
- package/.worktrees/542c4415/src/run.js +23 -0
- package/.worktrees/542c4415/src/scan-diff.js +388 -0
- package/.worktrees/542c4415/src/scan-postcheck.js +524 -0
- package/.worktrees/542c4415/src/scan-staleness.js +95 -0
- package/.worktrees/542c4415/src/setup.js +414 -0
- package/.worktrees/542c4415/src/sillyhub-mcp/client.js +597 -0
- package/.worktrees/542c4415/src/sillyhub-mcp/config.js +62 -0
- package/.worktrees/542c4415/src/spec-dir-typo.js +50 -0
- package/.worktrees/542c4415/src/spec-sync.js +358 -0
- package/.worktrees/542c4415/src/stage-contract-engine.js +171 -0
- package/.worktrees/542c4415/src/stage-contract-spec.js +551 -0
- package/.worktrees/542c4415/src/stage-contract.js +948 -0
- package/.worktrees/542c4415/src/stage-review.js +597 -0
- package/.worktrees/542c4415/src/stages/archive.js +199 -0
- package/.worktrees/542c4415/src/stages/brainstorm-auto.js +285 -0
- package/.worktrees/542c4415/src/stages/brainstorm.js +624 -0
- package/.worktrees/542c4415/src/stages/cmd-existence.js +145 -0
- package/.worktrees/542c4415/src/stages/doctor.js +540 -0
- package/.worktrees/542c4415/src/stages/execute.js +1277 -0
- package/.worktrees/542c4415/src/stages/explore.js +43 -0
- package/.worktrees/542c4415/src/stages/index.js +29 -0
- package/.worktrees/542c4415/src/stages/knowledge.js +514 -0
- package/.worktrees/542c4415/src/stages/plan-postcheck.js +1398 -0
- package/.worktrees/542c4415/src/stages/plan.js +655 -0
- package/.worktrees/542c4415/src/stages/quick.js +167 -0
- package/.worktrees/542c4415/src/stages/scan.js +608 -0
- package/.worktrees/542c4415/src/stages/status.js +64 -0
- package/.worktrees/542c4415/src/stages/verify.js +246 -0
- package/.worktrees/542c4415/src/sync.js +1470 -0
- package/.worktrees/542c4415/src/task-review.js +1498 -0
- package/.worktrees/542c4415/src/taskcard-placeholders.js +21 -0
- package/.worktrees/542c4415/src/taskcard.js +250 -0
- package/.worktrees/542c4415/src/verify-postcheck.js +1718 -0
- package/.worktrees/542c4415/src/verify-probes.js +327 -0
- package/.worktrees/542c4415/src/version.js +19 -0
- package/.worktrees/542c4415/src/workflow.js +600 -0
- package/.worktrees/542c4415/src/workspace.js +125 -0
- package/.worktrees/542c4415/src/worktree-apply.js +1611 -0
- package/.worktrees/542c4415/src/worktree-deps.js +668 -0
- package/.worktrees/542c4415/src/worktree.js +1849 -0
- package/.worktrees/542c4415/templates/claude-instruction.md +23 -0
- package/.worktrees/542c4415/templates/prompts/taskcard-rules.md +29 -0
- package/.worktrees/542c4415/templates/prompts/testcase-design.md +12 -0
- package/.worktrees/542c4415/templates/prompts/verify-probes.md +32 -0
- package/.worktrees/542c4415/templates/workflows/archive-impact.yaml +79 -0
- package/.worktrees/542c4415/templates/workflows/scan-docs.yaml +132 -0
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-archive/SKILL.md +87 -0
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-auto/SKILL.md +93 -0
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -0
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-commit/SKILL.md +67 -0
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-continue/SKILL.md +47 -0
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-doctor/SKILL.md +76 -0
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-execute/SKILL.md +214 -0
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-explore/SKILL.md +102 -0
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-export/SKILL.md +57 -0
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-init/SKILL.md +177 -0
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-knowledge/SKILL.md +270 -0
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-plan/SKILL.md +156 -0
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-quick/SKILL.md +116 -0
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-resume/SKILL.md +70 -0
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-scan/SKILL.md +79 -0
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-state/SKILL.md +64 -0
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-status/SKILL.md +54 -0
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-verify/SKILL.md +87 -0
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-workspace/SKILL.md +175 -0
- package/.worktrees/c1eae35e/.gitattributes +2 -0
- package/.worktrees/c1eae35e/.husky/pre-push +20 -0
- package/.worktrees/c1eae35e/README.md +203 -0
- package/.worktrees/c1eae35e/SKILL.md +91 -0
- package/.worktrees/c1eae35e/architecture-analysis.md +448 -0
- package/.worktrees/c1eae35e/bin/sillyspec.js +2 -0
- package/.worktrees/c1eae35e/eval/README.md +86 -0
- package/.worktrees/c1eae35e/eval/eval.config.json +28 -0
- package/.worktrees/c1eae35e/eval/lib/adapters/cli.mjs +63 -0
- package/.worktrees/c1eae35e/eval/lib/adapters/dryrun.mjs +27 -0
- package/.worktrees/c1eae35e/eval/lib/config.mjs +82 -0
- package/.worktrees/c1eae35e/eval/lib/db.mjs +76 -0
- package/.worktrees/c1eae35e/eval/lib/report.mjs +120 -0
- package/.worktrees/c1eae35e/eval/lib/runner.mjs +157 -0
- package/.worktrees/c1eae35e/eval/lib/tasks.mjs +73 -0
- package/.worktrees/c1eae35e/eval/lib/util.mjs +107 -0
- package/.worktrees/c1eae35e/eval/lib/workdir.mjs +30 -0
- package/.worktrees/c1eae35e/eval/run.mjs +83 -0
- package/.worktrees/c1eae35e/eval/tasks/001-slugify/files/package.json +6 -0
- package/.worktrees/c1eae35e/eval/tasks/001-slugify/solution/src/slugify.mjs +26 -0
- package/.worktrees/c1eae35e/eval/tasks/001-slugify/task.json +6 -0
- package/.worktrees/c1eae35e/eval/tasks/001-slugify/verify.mjs +28 -0
- package/.worktrees/c1eae35e/eval/tasks/002-each-day/files/package.json +6 -0
- package/.worktrees/c1eae35e/eval/tasks/002-each-day/files/src/dates.mjs +4 -0
- package/.worktrees/c1eae35e/eval/tasks/002-each-day/solution/src/dates.mjs +30 -0
- package/.worktrees/c1eae35e/eval/tasks/002-each-day/task.json +6 -0
- package/.worktrees/c1eae35e/eval/tasks/002-each-day/verify.mjs +31 -0
- package/.worktrees/c1eae35e/eval/tasks/003-word-report/files/data/notes.txt +5 -0
- package/.worktrees/c1eae35e/eval/tasks/003-word-report/files/package.json +6 -0
- package/.worktrees/c1eae35e/eval/tasks/003-word-report/solution/bin/report.mjs +36 -0
- package/.worktrees/c1eae35e/eval/tasks/003-word-report/task.json +6 -0
- package/.worktrees/c1eae35e/eval/tasks/003-word-report/verify.mjs +38 -0
- package/.worktrees/c1eae35e/logo.jpg +0 -0
- package/.worktrees/c1eae35e/package-lock.json +977 -0
- package/.worktrees/c1eae35e/package.json +41 -0
- package/.worktrees/c1eae35e/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -0
- package/.worktrees/c1eae35e/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -0
- package/.worktrees/c1eae35e/packages/dashboard/dist/favicon.jpg +0 -0
- package/.worktrees/c1eae35e/packages/dashboard/dist/index.html +16 -0
- package/.worktrees/c1eae35e/packages/dashboard/dist/logo.jpg +0 -0
- package/.worktrees/c1eae35e/packages/dashboard/dist/prototype-dashboard.html +836 -0
- package/.worktrees/c1eae35e/packages/dashboard/dist/prototype-overview.html +256 -0
- package/.worktrees/c1eae35e/packages/dashboard/package.json +25 -0
- package/.worktrees/c1eae35e/packages/dashboard/server/executor.js +95 -0
- package/.worktrees/c1eae35e/packages/dashboard/server/index.js +679 -0
- package/.worktrees/c1eae35e/packages/dashboard/server/parser.js +526 -0
- package/.worktrees/c1eae35e/packages/dashboard/server/watcher.js +357 -0
- package/.worktrees/c1eae35e/src/agent-session-log.js +803 -0
- package/.worktrees/c1eae35e/src/change-list.js +290 -0
- package/.worktrees/c1eae35e/src/change-risk-profile.js +339 -0
- package/.worktrees/c1eae35e/src/check-primitives.js +65 -0
- package/.worktrees/c1eae35e/src/classify-change.js +109 -0
- package/.worktrees/c1eae35e/src/commit-suggest.js +202 -0
- package/.worktrees/c1eae35e/src/config-cat.js +88 -0
- package/.worktrees/c1eae35e/src/config-schema.js +328 -0
- package/.worktrees/c1eae35e/src/constants.js +97 -0
- package/.worktrees/c1eae35e/src/contract-matrix.js +533 -0
- package/.worktrees/c1eae35e/src/datetime.js +20 -0
- package/.worktrees/c1eae35e/src/db-engine.js +55 -0
- package/.worktrees/c1eae35e/src/db.js +381 -0
- package/.worktrees/c1eae35e/src/decision-distill.js +517 -0
- package/.worktrees/c1eae35e/src/dispatch/backends/local-agent.js +155 -0
- package/.worktrees/c1eae35e/src/dispatch/backends/sillyhub-mcp.js +245 -0
- package/.worktrees/c1eae35e/src/dispatch/probe.js +246 -0
- package/.worktrees/c1eae35e/src/dispatch/strategy.js +121 -0
- package/.worktrees/c1eae35e/src/docs-check.js +825 -0
- package/.worktrees/c1eae35e/src/docs-debt.js +393 -0
- package/.worktrees/c1eae35e/src/docs-gate.js +107 -0
- package/.worktrees/c1eae35e/src/doctor-diagnostics.js +1099 -0
- package/.worktrees/c1eae35e/src/endpoint-extractor.js +409 -0
- package/.worktrees/c1eae35e/src/foreign-declared.js +155 -0
- package/.worktrees/c1eae35e/src/fs-atomic.js +73 -0
- package/.worktrees/c1eae35e/src/git-helper.js +150 -0
- package/.worktrees/c1eae35e/src/hooks/claude-pre-tool-use.cjs +130 -0
- package/.worktrees/c1eae35e/src/hooks/worktree-guard.js +892 -0
- package/.worktrees/c1eae35e/src/index.js +2854 -0
- package/.worktrees/c1eae35e/src/init.js +626 -0
- package/.worktrees/c1eae35e/src/knowledge-match.js +231 -0
- package/.worktrees/c1eae35e/src/local-detect.js +128 -0
- package/.worktrees/c1eae35e/src/local-register.js +104 -0
- package/.worktrees/c1eae35e/src/machine-interface.js +543 -0
- package/.worktrees/c1eae35e/src/migrate.js +127 -0
- package/.worktrees/c1eae35e/src/module-impact.js +166 -0
- package/.worktrees/c1eae35e/src/module-resolve.js +222 -0
- package/.worktrees/c1eae35e/src/modules.js +580 -0
- package/.worktrees/c1eae35e/src/plan-adopt-waves.js +126 -0
- package/.worktrees/c1eae35e/src/progress/change-registry.js +336 -0
- package/.worktrees/c1eae35e/src/progress/consistency-doctor.js +355 -0
- package/.worktrees/c1eae35e/src/progress/shared.js +36 -0
- package/.worktrees/c1eae35e/src/progress/stage-machine.js +594 -0
- package/.worktrees/c1eae35e/src/progress/step-store.js +265 -0
- package/.worktrees/c1eae35e/src/progress.js +1304 -0
- package/.worktrees/c1eae35e/src/quick-recommend.js +115 -0
- package/.worktrees/c1eae35e/src/quicklog.js +883 -0
- package/.worktrees/c1eae35e/src/review-tier.js +77 -0
- package/.worktrees/c1eae35e/src/run/command.js +1641 -0
- package/.worktrees/c1eae35e/src/run/complete-handlers.js +1552 -0
- package/.worktrees/c1eae35e/src/run/complete.js +1259 -0
- package/.worktrees/c1eae35e/src/run/concurrent-detect.js +156 -0
- package/.worktrees/c1eae35e/src/run/gates.js +1111 -0
- package/.worktrees/c1eae35e/src/run/multi-repo-context.js +208 -0
- package/.worktrees/c1eae35e/src/run/next.js +128 -0
- package/.worktrees/c1eae35e/src/run/prompt.js +843 -0
- package/.worktrees/c1eae35e/src/run/quick-audit.js +186 -0
- package/.worktrees/c1eae35e/src/run/scan-profile.js +269 -0
- package/.worktrees/c1eae35e/src/run/shared.js +1562 -0
- package/.worktrees/c1eae35e/src/run/stage.js +587 -0
- package/.worktrees/c1eae35e/src/run.js +23 -0
- package/.worktrees/c1eae35e/src/scan-diff.js +388 -0
- package/.worktrees/c1eae35e/src/scan-postcheck.js +524 -0
- package/.worktrees/c1eae35e/src/scan-staleness.js +95 -0
- package/.worktrees/c1eae35e/src/setup.js +414 -0
- package/.worktrees/c1eae35e/src/sillyhub-mcp/client.js +597 -0
- package/.worktrees/c1eae35e/src/sillyhub-mcp/config.js +62 -0
- package/.worktrees/c1eae35e/src/spec-dir-typo.js +50 -0
- package/.worktrees/c1eae35e/src/spec-sync.js +358 -0
- package/.worktrees/c1eae35e/src/stage-contract-engine.js +171 -0
- package/.worktrees/c1eae35e/src/stage-contract-spec.js +551 -0
- package/.worktrees/c1eae35e/src/stage-contract.js +948 -0
- package/.worktrees/c1eae35e/src/stage-review.js +597 -0
- package/.worktrees/c1eae35e/src/stages/archive.js +199 -0
- package/.worktrees/c1eae35e/src/stages/brainstorm-auto.js +285 -0
- package/.worktrees/c1eae35e/src/stages/brainstorm.js +624 -0
- package/.worktrees/c1eae35e/src/stages/cmd-existence.js +145 -0
- package/.worktrees/c1eae35e/src/stages/doctor.js +540 -0
- package/.worktrees/c1eae35e/src/stages/execute.js +1277 -0
- package/.worktrees/c1eae35e/src/stages/explore.js +43 -0
- package/.worktrees/c1eae35e/src/stages/index.js +29 -0
- package/.worktrees/c1eae35e/src/stages/knowledge.js +514 -0
- package/.worktrees/c1eae35e/src/stages/plan-postcheck.js +1398 -0
- package/.worktrees/c1eae35e/src/stages/plan.js +655 -0
- package/.worktrees/c1eae35e/src/stages/quick.js +167 -0
- package/.worktrees/c1eae35e/src/stages/scan.js +608 -0
- package/.worktrees/c1eae35e/src/stages/status.js +64 -0
- package/.worktrees/c1eae35e/src/stages/verify.js +246 -0
- package/.worktrees/c1eae35e/src/sync.js +1470 -0
- package/.worktrees/c1eae35e/src/task-review.js +1498 -0
- package/.worktrees/c1eae35e/src/taskcard-placeholders.js +21 -0
- package/.worktrees/c1eae35e/src/taskcard.js +250 -0
- package/.worktrees/c1eae35e/src/verify-postcheck.js +1718 -0
- package/.worktrees/c1eae35e/src/verify-probes.js +327 -0
- package/.worktrees/c1eae35e/src/version.js +19 -0
- package/.worktrees/c1eae35e/src/workflow.js +600 -0
- package/.worktrees/c1eae35e/src/workspace.js +125 -0
- package/.worktrees/c1eae35e/src/worktree-apply.js +1611 -0
- package/.worktrees/c1eae35e/src/worktree-deps.js +668 -0
- package/.worktrees/c1eae35e/src/worktree.js +1849 -0
- package/.worktrees/c1eae35e/templates/claude-instruction.md +23 -0
- package/.worktrees/c1eae35e/templates/prompts/taskcard-rules.md +29 -0
- package/.worktrees/c1eae35e/templates/prompts/testcase-design.md +12 -0
- package/.worktrees/c1eae35e/templates/prompts/verify-probes.md +32 -0
- package/.worktrees/c1eae35e/templates/workflows/archive-impact.yaml +79 -0
- package/.worktrees/c1eae35e/templates/workflows/scan-docs.yaml +132 -0
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-archive/SKILL.md +87 -0
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-auto/SKILL.md +93 -0
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -0
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-commit/SKILL.md +67 -0
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-continue/SKILL.md +47 -0
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-doctor/SKILL.md +76 -0
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-execute/SKILL.md +214 -0
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-explore/SKILL.md +102 -0
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-export/SKILL.md +57 -0
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-init/SKILL.md +177 -0
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-knowledge/SKILL.md +270 -0
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-plan/SKILL.md +156 -0
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-propose/SKILL.md +87 -0
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-quick/SKILL.md +116 -0
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-resume/SKILL.md +70 -0
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-scan/SKILL.md +79 -0
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-state/SKILL.md +64 -0
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-status/SKILL.md +54 -0
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-verify/SKILL.md +87 -0
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-workspace/SKILL.md +175 -0
- package/.worktrees/dafc71ad/.gitattributes +2 -0
- package/.worktrees/dafc71ad/.husky/pre-push +20 -0
- package/.worktrees/dafc71ad/README.md +203 -0
- package/.worktrees/dafc71ad/SKILL.md +91 -0
- package/.worktrees/dafc71ad/analysis.md +366 -0
- package/.worktrees/dafc71ad/architecture-analysis.md +448 -0
- package/.worktrees/dafc71ad/bin/sillyspec.js +2 -0
- package/.worktrees/dafc71ad/eval/README.md +86 -0
- package/.worktrees/dafc71ad/eval/eval.config.json +28 -0
- package/.worktrees/dafc71ad/eval/lib/adapters/cli.mjs +63 -0
- package/.worktrees/dafc71ad/eval/lib/adapters/dryrun.mjs +27 -0
- package/.worktrees/dafc71ad/eval/lib/config.mjs +82 -0
- package/.worktrees/dafc71ad/eval/lib/db.mjs +76 -0
- package/.worktrees/dafc71ad/eval/lib/report.mjs +120 -0
- package/.worktrees/dafc71ad/eval/lib/runner.mjs +157 -0
- package/.worktrees/dafc71ad/eval/lib/tasks.mjs +73 -0
- package/.worktrees/dafc71ad/eval/lib/util.mjs +107 -0
- package/.worktrees/dafc71ad/eval/lib/workdir.mjs +30 -0
- package/.worktrees/dafc71ad/eval/run.mjs +83 -0
- package/.worktrees/dafc71ad/eval/tasks/001-slugify/files/package.json +6 -0
- package/.worktrees/dafc71ad/eval/tasks/001-slugify/solution/src/slugify.mjs +26 -0
- package/.worktrees/dafc71ad/eval/tasks/001-slugify/task.json +6 -0
- package/.worktrees/dafc71ad/eval/tasks/001-slugify/verify.mjs +28 -0
- package/.worktrees/dafc71ad/eval/tasks/002-each-day/files/package.json +6 -0
- package/.worktrees/dafc71ad/eval/tasks/002-each-day/files/src/dates.mjs +4 -0
- package/.worktrees/dafc71ad/eval/tasks/002-each-day/solution/src/dates.mjs +30 -0
- package/.worktrees/dafc71ad/eval/tasks/002-each-day/task.json +6 -0
- package/.worktrees/dafc71ad/eval/tasks/002-each-day/verify.mjs +31 -0
- package/.worktrees/dafc71ad/eval/tasks/003-word-report/files/data/notes.txt +5 -0
- package/.worktrees/dafc71ad/eval/tasks/003-word-report/files/package.json +6 -0
- package/.worktrees/dafc71ad/eval/tasks/003-word-report/solution/bin/report.mjs +36 -0
- package/.worktrees/dafc71ad/eval/tasks/003-word-report/task.json +6 -0
- package/.worktrees/dafc71ad/eval/tasks/003-word-report/verify.mjs +38 -0
- package/.worktrees/dafc71ad/logo.jpg +0 -0
- package/.worktrees/dafc71ad/package-lock.json +977 -0
- package/.worktrees/dafc71ad/package.json +41 -0
- package/.worktrees/dafc71ad/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -0
- package/.worktrees/dafc71ad/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -0
- package/.worktrees/dafc71ad/packages/dashboard/dist/favicon.jpg +0 -0
- package/.worktrees/dafc71ad/packages/dashboard/dist/index.html +16 -0
- package/.worktrees/dafc71ad/packages/dashboard/dist/logo.jpg +0 -0
- package/.worktrees/dafc71ad/packages/dashboard/dist/prototype-dashboard.html +836 -0
- package/.worktrees/dafc71ad/packages/dashboard/dist/prototype-overview.html +256 -0
- package/.worktrees/dafc71ad/packages/dashboard/package.json +25 -0
- package/.worktrees/dafc71ad/packages/dashboard/server/executor.js +95 -0
- package/.worktrees/dafc71ad/packages/dashboard/server/index.js +679 -0
- package/.worktrees/dafc71ad/packages/dashboard/server/parser.js +526 -0
- package/.worktrees/dafc71ad/packages/dashboard/server/watcher.js +357 -0
- package/.worktrees/dafc71ad/src/agent-session-log.js +803 -0
- package/.worktrees/dafc71ad/src/change-list.js +290 -0
- package/.worktrees/dafc71ad/src/change-risk-profile.js +339 -0
- package/.worktrees/dafc71ad/src/check-primitives.js +65 -0
- package/.worktrees/dafc71ad/src/classify-change.js +109 -0
- package/.worktrees/dafc71ad/src/commit-suggest.js +202 -0
- package/.worktrees/dafc71ad/src/config-cat.js +88 -0
- package/.worktrees/dafc71ad/src/config-schema.js +328 -0
- package/.worktrees/dafc71ad/src/constants.js +97 -0
- package/.worktrees/dafc71ad/src/contract-matrix.js +533 -0
- package/.worktrees/dafc71ad/src/datetime.js +20 -0
- package/.worktrees/dafc71ad/src/db-engine.js +55 -0
- package/.worktrees/dafc71ad/src/db.js +381 -0
- package/.worktrees/dafc71ad/src/decision-distill.js +517 -0
- package/.worktrees/dafc71ad/src/dispatch/backends/local-agent.js +155 -0
- package/.worktrees/dafc71ad/src/dispatch/backends/sillyhub-mcp.js +245 -0
- package/.worktrees/dafc71ad/src/dispatch/probe.js +246 -0
- package/.worktrees/dafc71ad/src/dispatch/strategy.js +121 -0
- package/.worktrees/dafc71ad/src/docs-check.js +825 -0
- package/.worktrees/dafc71ad/src/docs-debt.js +393 -0
- package/.worktrees/dafc71ad/src/docs-gate.js +107 -0
- package/.worktrees/dafc71ad/src/doctor-diagnostics.js +1099 -0
- package/.worktrees/dafc71ad/src/endpoint-extractor.js +409 -0
- package/.worktrees/dafc71ad/src/foreign-declared.js +155 -0
- package/.worktrees/dafc71ad/src/fs-atomic.js +73 -0
- package/.worktrees/dafc71ad/src/git-helper.js +150 -0
- package/.worktrees/dafc71ad/src/hooks/claude-pre-tool-use.cjs +130 -0
- package/.worktrees/dafc71ad/src/hooks/worktree-guard.js +892 -0
- package/.worktrees/dafc71ad/src/index.js +2854 -0
- package/.worktrees/dafc71ad/src/init.js +626 -0
- package/.worktrees/dafc71ad/src/knowledge-match.js +231 -0
- package/.worktrees/dafc71ad/src/local-detect.js +128 -0
- package/.worktrees/dafc71ad/src/local-register.js +104 -0
- package/.worktrees/dafc71ad/src/machine-interface.js +543 -0
- package/.worktrees/dafc71ad/src/migrate.js +127 -0
- package/.worktrees/dafc71ad/src/module-impact.js +166 -0
- package/.worktrees/dafc71ad/src/module-resolve.js +222 -0
- package/.worktrees/dafc71ad/src/modules.js +580 -0
- package/.worktrees/dafc71ad/src/plan-adopt-waves.js +126 -0
- package/.worktrees/dafc71ad/src/progress/change-registry.js +336 -0
- package/.worktrees/dafc71ad/src/progress/consistency-doctor.js +355 -0
- package/.worktrees/dafc71ad/src/progress/shared.js +36 -0
- package/.worktrees/dafc71ad/src/progress/stage-machine.js +594 -0
- package/.worktrees/dafc71ad/src/progress/step-store.js +265 -0
- package/.worktrees/dafc71ad/src/progress.js +1304 -0
- package/.worktrees/dafc71ad/src/quick-recommend.js +115 -0
- package/.worktrees/dafc71ad/src/quicklog.js +883 -0
- package/.worktrees/dafc71ad/src/review-tier.js +77 -0
- package/.worktrees/dafc71ad/src/run/command.js +1641 -0
- package/.worktrees/dafc71ad/src/run/complete-handlers.js +1552 -0
- package/.worktrees/dafc71ad/src/run/complete.js +1259 -0
- package/.worktrees/dafc71ad/src/run/concurrent-detect.js +156 -0
- package/.worktrees/dafc71ad/src/run/gates.js +1111 -0
- package/.worktrees/dafc71ad/src/run/multi-repo-context.js +208 -0
- package/.worktrees/dafc71ad/src/run/next.js +128 -0
- package/.worktrees/dafc71ad/src/run/prompt.js +843 -0
- package/.worktrees/dafc71ad/src/run/quick-audit.js +186 -0
- package/.worktrees/dafc71ad/src/run/scan-profile.js +269 -0
- package/.worktrees/dafc71ad/src/run/shared.js +1562 -0
- package/.worktrees/dafc71ad/src/run/stage.js +587 -0
- package/.worktrees/dafc71ad/src/run.js +23 -0
- package/.worktrees/dafc71ad/src/scan-diff.js +388 -0
- package/.worktrees/dafc71ad/src/scan-postcheck.js +524 -0
- package/.worktrees/dafc71ad/src/scan-staleness.js +95 -0
- package/.worktrees/dafc71ad/src/setup.js +414 -0
- package/.worktrees/dafc71ad/src/sillyhub-mcp/client.js +597 -0
- package/.worktrees/dafc71ad/src/sillyhub-mcp/config.js +62 -0
- package/.worktrees/dafc71ad/src/spec-dir-typo.js +50 -0
- package/.worktrees/dafc71ad/src/spec-sync.js +358 -0
- package/.worktrees/dafc71ad/src/stage-contract-engine.js +171 -0
- package/.worktrees/dafc71ad/src/stage-contract-spec.js +551 -0
- package/.worktrees/dafc71ad/src/stage-contract.js +948 -0
- package/.worktrees/dafc71ad/src/stage-review.js +597 -0
- package/.worktrees/dafc71ad/src/stages/archive.js +199 -0
- package/.worktrees/dafc71ad/src/stages/brainstorm-auto.js +285 -0
- package/.worktrees/dafc71ad/src/stages/brainstorm.js +624 -0
- package/.worktrees/dafc71ad/src/stages/cmd-existence.js +145 -0
- package/.worktrees/dafc71ad/src/stages/doctor.js +540 -0
- package/.worktrees/dafc71ad/src/stages/execute.js +1277 -0
- package/.worktrees/dafc71ad/src/stages/explore.js +43 -0
- package/.worktrees/dafc71ad/src/stages/index.js +29 -0
- package/.worktrees/dafc71ad/src/stages/knowledge.js +514 -0
- package/.worktrees/dafc71ad/src/stages/plan-postcheck.js +1398 -0
- package/.worktrees/dafc71ad/src/stages/plan.js +655 -0
- package/.worktrees/dafc71ad/src/stages/quick.js +167 -0
- package/.worktrees/dafc71ad/src/stages/scan.js +608 -0
- package/.worktrees/dafc71ad/src/stages/status.js +64 -0
- package/.worktrees/dafc71ad/src/stages/verify.js +246 -0
- package/.worktrees/dafc71ad/src/sync.js +1470 -0
- package/.worktrees/dafc71ad/src/task-review.js +1498 -0
- package/.worktrees/dafc71ad/src/taskcard-placeholders.js +21 -0
- package/.worktrees/dafc71ad/src/taskcard.js +250 -0
- package/.worktrees/dafc71ad/src/verify-postcheck.js +1718 -0
- package/.worktrees/dafc71ad/src/verify-probes.js +327 -0
- package/.worktrees/dafc71ad/src/version.js +19 -0
- package/.worktrees/dafc71ad/src/workflow.js +600 -0
- package/.worktrees/dafc71ad/src/workspace.js +125 -0
- package/.worktrees/dafc71ad/src/worktree-apply.js +1611 -0
- package/.worktrees/dafc71ad/src/worktree-deps.js +668 -0
- package/.worktrees/dafc71ad/src/worktree.js +1849 -0
- package/.worktrees/dafc71ad/templates/claude-instruction.md +23 -0
- package/.worktrees/dafc71ad/templates/prompts/taskcard-rules.md +29 -0
- package/.worktrees/dafc71ad/templates/prompts/testcase-design.md +12 -0
- package/.worktrees/dafc71ad/templates/prompts/verify-probes.md +32 -0
- package/.worktrees/dafc71ad/templates/workflows/archive-impact.yaml +79 -0
- package/.worktrees/dafc71ad/templates/workflows/scan-docs.yaml +132 -0
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-archive/SKILL.md +87 -0
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-auto/SKILL.md +93 -0
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -0
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-commit/SKILL.md +67 -0
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-continue/SKILL.md +47 -0
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-doctor/SKILL.md +76 -0
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-execute/SKILL.md +214 -0
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-explore/SKILL.md +102 -0
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-export/SKILL.md +57 -0
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-init/SKILL.md +177 -0
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-knowledge/SKILL.md +270 -0
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-plan/SKILL.md +156 -0
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-propose/SKILL.md +87 -0
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-quick/SKILL.md +116 -0
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-resume/SKILL.md +70 -0
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-scan/SKILL.md +79 -0
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-state/SKILL.md +64 -0
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-status/SKILL.md +54 -0
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-verify/SKILL.md +87 -0
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-workspace/SKILL.md +175 -0
- package/.worktrees/e58fcc4c/.gitattributes +2 -0
- package/.worktrees/e58fcc4c/.husky/pre-push +20 -0
- package/.worktrees/e58fcc4c/README.md +203 -0
- package/.worktrees/e58fcc4c/SKILL.md +91 -0
- package/.worktrees/e58fcc4c/architecture-analysis.md +503 -0
- package/.worktrees/e58fcc4c/bin/sillyspec.js +2 -0
- package/.worktrees/e58fcc4c/eval/README.md +86 -0
- package/.worktrees/e58fcc4c/eval/eval.config.json +28 -0
- package/.worktrees/e58fcc4c/eval/lib/adapters/cli.mjs +63 -0
- package/.worktrees/e58fcc4c/eval/lib/adapters/dryrun.mjs +27 -0
- package/.worktrees/e58fcc4c/eval/lib/config.mjs +82 -0
- package/.worktrees/e58fcc4c/eval/lib/db.mjs +76 -0
- package/.worktrees/e58fcc4c/eval/lib/report.mjs +120 -0
- package/.worktrees/e58fcc4c/eval/lib/runner.mjs +157 -0
- package/.worktrees/e58fcc4c/eval/lib/tasks.mjs +73 -0
- package/.worktrees/e58fcc4c/eval/lib/util.mjs +107 -0
- package/.worktrees/e58fcc4c/eval/lib/workdir.mjs +30 -0
- package/.worktrees/e58fcc4c/eval/run.mjs +83 -0
- package/.worktrees/e58fcc4c/eval/tasks/001-slugify/files/package.json +6 -0
- package/.worktrees/e58fcc4c/eval/tasks/001-slugify/solution/src/slugify.mjs +26 -0
- package/.worktrees/e58fcc4c/eval/tasks/001-slugify/task.json +6 -0
- package/.worktrees/e58fcc4c/eval/tasks/001-slugify/verify.mjs +28 -0
- package/.worktrees/e58fcc4c/eval/tasks/002-each-day/files/package.json +6 -0
- package/.worktrees/e58fcc4c/eval/tasks/002-each-day/files/src/dates.mjs +4 -0
- package/.worktrees/e58fcc4c/eval/tasks/002-each-day/solution/src/dates.mjs +30 -0
- package/.worktrees/e58fcc4c/eval/tasks/002-each-day/task.json +6 -0
- package/.worktrees/e58fcc4c/eval/tasks/002-each-day/verify.mjs +31 -0
- package/.worktrees/e58fcc4c/eval/tasks/003-word-report/files/data/notes.txt +5 -0
- package/.worktrees/e58fcc4c/eval/tasks/003-word-report/files/package.json +6 -0
- package/.worktrees/e58fcc4c/eval/tasks/003-word-report/solution/bin/report.mjs +36 -0
- package/.worktrees/e58fcc4c/eval/tasks/003-word-report/task.json +6 -0
- package/.worktrees/e58fcc4c/eval/tasks/003-word-report/verify.mjs +38 -0
- package/.worktrees/e58fcc4c/logo.jpg +0 -0
- package/.worktrees/e58fcc4c/package-lock.json +977 -0
- package/.worktrees/e58fcc4c/package.json +41 -0
- package/.worktrees/e58fcc4c/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -0
- package/.worktrees/e58fcc4c/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -0
- package/.worktrees/e58fcc4c/packages/dashboard/dist/favicon.jpg +0 -0
- package/.worktrees/e58fcc4c/packages/dashboard/dist/index.html +16 -0
- package/.worktrees/e58fcc4c/packages/dashboard/dist/logo.jpg +0 -0
- package/.worktrees/e58fcc4c/packages/dashboard/dist/prototype-dashboard.html +836 -0
- package/.worktrees/e58fcc4c/packages/dashboard/dist/prototype-overview.html +256 -0
- package/.worktrees/e58fcc4c/packages/dashboard/package.json +25 -0
- package/.worktrees/e58fcc4c/packages/dashboard/server/executor.js +95 -0
- package/.worktrees/e58fcc4c/packages/dashboard/server/index.js +679 -0
- package/.worktrees/e58fcc4c/packages/dashboard/server/parser.js +526 -0
- package/.worktrees/e58fcc4c/packages/dashboard/server/watcher.js +357 -0
- package/.worktrees/e58fcc4c/src/agent-session-log.js +803 -0
- package/.worktrees/e58fcc4c/src/change-list.js +290 -0
- package/.worktrees/e58fcc4c/src/change-risk-profile.js +339 -0
- package/.worktrees/e58fcc4c/src/check-primitives.js +65 -0
- package/.worktrees/e58fcc4c/src/classify-change.js +109 -0
- package/.worktrees/e58fcc4c/src/commit-suggest.js +202 -0
- package/.worktrees/e58fcc4c/src/config-cat.js +88 -0
- package/.worktrees/e58fcc4c/src/config-schema.js +328 -0
- package/.worktrees/e58fcc4c/src/constants.js +97 -0
- package/.worktrees/e58fcc4c/src/contract-matrix.js +533 -0
- package/.worktrees/e58fcc4c/src/datetime.js +20 -0
- package/.worktrees/e58fcc4c/src/db-engine.js +55 -0
- package/.worktrees/e58fcc4c/src/db.js +381 -0
- package/.worktrees/e58fcc4c/src/decision-distill.js +517 -0
- package/.worktrees/e58fcc4c/src/dispatch/backends/local-agent.js +155 -0
- package/.worktrees/e58fcc4c/src/dispatch/backends/sillyhub-mcp.js +245 -0
- package/.worktrees/e58fcc4c/src/dispatch/probe.js +246 -0
- package/.worktrees/e58fcc4c/src/dispatch/strategy.js +121 -0
- package/.worktrees/e58fcc4c/src/docs-check.js +825 -0
- package/.worktrees/e58fcc4c/src/docs-debt.js +393 -0
- package/.worktrees/e58fcc4c/src/docs-gate.js +107 -0
- package/.worktrees/e58fcc4c/src/doctor-diagnostics.js +1099 -0
- package/.worktrees/e58fcc4c/src/endpoint-extractor.js +409 -0
- package/.worktrees/e58fcc4c/src/foreign-declared.js +155 -0
- package/.worktrees/e58fcc4c/src/fs-atomic.js +73 -0
- package/.worktrees/e58fcc4c/src/git-helper.js +150 -0
- package/.worktrees/e58fcc4c/src/hooks/claude-pre-tool-use.cjs +130 -0
- package/.worktrees/e58fcc4c/src/hooks/worktree-guard.js +892 -0
- package/.worktrees/e58fcc4c/src/index.js +2854 -0
- package/.worktrees/e58fcc4c/src/init.js +626 -0
- package/.worktrees/e58fcc4c/src/knowledge-match.js +231 -0
- package/.worktrees/e58fcc4c/src/local-detect.js +128 -0
- package/.worktrees/e58fcc4c/src/local-register.js +104 -0
- package/.worktrees/e58fcc4c/src/machine-interface.js +543 -0
- package/.worktrees/e58fcc4c/src/migrate.js +127 -0
- package/.worktrees/e58fcc4c/src/module-impact.js +166 -0
- package/.worktrees/e58fcc4c/src/module-resolve.js +222 -0
- package/.worktrees/e58fcc4c/src/modules.js +580 -0
- package/.worktrees/e58fcc4c/src/plan-adopt-waves.js +126 -0
- package/.worktrees/e58fcc4c/src/progress/change-registry.js +336 -0
- package/.worktrees/e58fcc4c/src/progress/consistency-doctor.js +355 -0
- package/.worktrees/e58fcc4c/src/progress/shared.js +36 -0
- package/.worktrees/e58fcc4c/src/progress/stage-machine.js +594 -0
- package/.worktrees/e58fcc4c/src/progress/step-store.js +265 -0
- package/.worktrees/e58fcc4c/src/progress.js +1304 -0
- package/.worktrees/e58fcc4c/src/quick-recommend.js +115 -0
- package/.worktrees/e58fcc4c/src/quicklog.js +883 -0
- package/.worktrees/e58fcc4c/src/review-tier.js +77 -0
- package/.worktrees/e58fcc4c/src/run/command.js +1641 -0
- package/.worktrees/e58fcc4c/src/run/complete-handlers.js +1552 -0
- package/.worktrees/e58fcc4c/src/run/complete.js +1259 -0
- package/.worktrees/e58fcc4c/src/run/concurrent-detect.js +156 -0
- package/.worktrees/e58fcc4c/src/run/gates.js +1111 -0
- package/.worktrees/e58fcc4c/src/run/multi-repo-context.js +208 -0
- package/.worktrees/e58fcc4c/src/run/next.js +128 -0
- package/.worktrees/e58fcc4c/src/run/prompt.js +843 -0
- package/.worktrees/e58fcc4c/src/run/quick-audit.js +186 -0
- package/.worktrees/e58fcc4c/src/run/scan-profile.js +269 -0
- package/.worktrees/e58fcc4c/src/run/shared.js +1562 -0
- package/.worktrees/e58fcc4c/src/run/stage.js +587 -0
- package/.worktrees/e58fcc4c/src/run.js +23 -0
- package/.worktrees/e58fcc4c/src/scan-diff.js +388 -0
- package/.worktrees/e58fcc4c/src/scan-postcheck.js +524 -0
- package/.worktrees/e58fcc4c/src/scan-staleness.js +95 -0
- package/.worktrees/e58fcc4c/src/setup.js +414 -0
- package/.worktrees/e58fcc4c/src/sillyhub-mcp/client.js +597 -0
- package/.worktrees/e58fcc4c/src/sillyhub-mcp/config.js +62 -0
- package/.worktrees/e58fcc4c/src/spec-dir-typo.js +50 -0
- package/.worktrees/e58fcc4c/src/spec-sync.js +358 -0
- package/.worktrees/e58fcc4c/src/stage-contract-engine.js +171 -0
- package/.worktrees/e58fcc4c/src/stage-contract-spec.js +551 -0
- package/.worktrees/e58fcc4c/src/stage-contract.js +948 -0
- package/.worktrees/e58fcc4c/src/stage-review.js +597 -0
- package/.worktrees/e58fcc4c/src/stages/archive.js +199 -0
- package/.worktrees/e58fcc4c/src/stages/brainstorm-auto.js +285 -0
- package/.worktrees/e58fcc4c/src/stages/brainstorm.js +624 -0
- package/.worktrees/e58fcc4c/src/stages/cmd-existence.js +145 -0
- package/.worktrees/e58fcc4c/src/stages/doctor.js +540 -0
- package/.worktrees/e58fcc4c/src/stages/execute.js +1277 -0
- package/.worktrees/e58fcc4c/src/stages/explore.js +43 -0
- package/.worktrees/e58fcc4c/src/stages/index.js +29 -0
- package/.worktrees/e58fcc4c/src/stages/knowledge.js +514 -0
- package/.worktrees/e58fcc4c/src/stages/plan-postcheck.js +1398 -0
- package/.worktrees/e58fcc4c/src/stages/plan.js +655 -0
- package/.worktrees/e58fcc4c/src/stages/quick.js +167 -0
- package/.worktrees/e58fcc4c/src/stages/scan.js +608 -0
- package/.worktrees/e58fcc4c/src/stages/status.js +64 -0
- package/.worktrees/e58fcc4c/src/stages/verify.js +246 -0
- package/.worktrees/e58fcc4c/src/sync.js +1470 -0
- package/.worktrees/e58fcc4c/src/task-review.js +1498 -0
- package/.worktrees/e58fcc4c/src/taskcard-placeholders.js +21 -0
- package/.worktrees/e58fcc4c/src/taskcard.js +250 -0
- package/.worktrees/e58fcc4c/src/verify-postcheck.js +1718 -0
- package/.worktrees/e58fcc4c/src/verify-probes.js +327 -0
- package/.worktrees/e58fcc4c/src/version.js +19 -0
- package/.worktrees/e58fcc4c/src/workflow.js +600 -0
- package/.worktrees/e58fcc4c/src/workspace.js +125 -0
- package/.worktrees/e58fcc4c/src/worktree-apply.js +1611 -0
- package/.worktrees/e58fcc4c/src/worktree-deps.js +668 -0
- package/.worktrees/e58fcc4c/src/worktree.js +1849 -0
- package/.worktrees/e58fcc4c/templates/claude-instruction.md +23 -0
- package/.worktrees/e58fcc4c/templates/prompts/taskcard-rules.md +29 -0
- package/.worktrees/e58fcc4c/templates/prompts/testcase-design.md +12 -0
- package/.worktrees/e58fcc4c/templates/prompts/verify-probes.md +32 -0
- package/.worktrees/e58fcc4c/templates/workflows/archive-impact.yaml +79 -0
- package/.worktrees/e58fcc4c/templates/workflows/scan-docs.yaml +132 -0
- package/package.json +1 -1
- package/src/contract-matrix.js +45 -14
- package/src/foreign-declared.js +11 -5
- package/src/fs-atomic.js +20 -3
- package/src/hooks/worktree-guard.js +9 -3
- package/src/index.js +52 -12
- package/src/module-impact.js +1 -1
- package/src/modules.js +23 -21
- package/src/progress/stage-machine.js +26 -1
- package/src/progress.js +38 -2
- package/src/quicklog.js +7 -5
- package/src/run/command.js +51 -20
- package/src/run/complete-handlers.js +26 -2
- package/src/run/complete.js +43 -21
- package/src/run/gates.js +52 -7
- package/src/run/multi-repo-context.js +42 -4
- package/src/run/next.js +4 -3
- package/src/run/prompt.js +66 -6
- package/src/run/scan-profile.js +1 -0
- package/src/run/shared.js +12 -6
- package/src/run/stage.js +35 -9
- package/src/scan-diff.js +4 -2
- package/src/stage-contract.js +36 -15
- package/src/stages/brainstorm.js +22 -8
- package/src/stages/execute.js +69 -22
- package/src/stages/knowledge.js +18 -5
- package/src/stages/plan-postcheck.js +63 -7
- package/src/stages/plan.js +13 -2
- package/src/sync.js +27 -11
- package/src/task-review.js +12 -3
- package/src/taskcard.js +2 -0
- package/src/verify-postcheck.js +24 -13
- package/src/verify-probes.js +12 -7
- package/src/worktree-apply.js +234 -18
- package/src/worktree-cross.js +294 -0
- package/src/worktree-deps.js +157 -59
- package/src/worktree.js +7 -2
package/src/worktree-apply.js
CHANGED
|
@@ -16,6 +16,7 @@ import { existsSync, unlinkSync, writeFileSync, mkdtempSync, rmSync, readdirSync
|
|
|
16
16
|
import { join, resolve } from 'path';
|
|
17
17
|
import { tmpdir } from 'os';
|
|
18
18
|
import { WorktreeManager } from './worktree.js';
|
|
19
|
+
import { getCrossWorktreeMeta, cleanupCrossWorktrees } from './worktree-cross.js';
|
|
19
20
|
import { parseFileChangeList, parseFileChangeListDetailed, pathMatches } from './change-list.js';
|
|
20
21
|
import { parseAllowedPaths, parseRepo } from './stages/plan-postcheck.js';
|
|
21
22
|
import { git, gitQuiet } from './git-helper.js';
|
|
@@ -23,6 +24,22 @@ import { resolveLatestExecuteRunId, resolveLatestExecuteRunIdWithTasks, readRevi
|
|
|
23
24
|
|
|
24
25
|
const CHANGES_REL = '.sillyspec/changes';
|
|
25
26
|
|
|
27
|
+
/**
|
|
28
|
+
* cleanup 返回值必须消费(坑 ghost-dir-junction-pierce,2026-08-23 实证:apply 后 partial
|
|
29
|
+
* 残留被静默丢弃,用户以为已干净、人工 rm -rf 时穿透 junction 删主仓 node_modules)。
|
|
30
|
+
* 模块级共享:applyWorktree 无变更早退 / skip-overlap / applyByMerge 成功路径三处统一走此消费。
|
|
31
|
+
*/
|
|
32
|
+
function consumeCleanupResult(cr, result) {
|
|
33
|
+
if (cr && (cr.result === 'partial' || (Array.isArray(cr.residual) && cr.residual.length > 0))) {
|
|
34
|
+
result.warnings = result.warnings || [];
|
|
35
|
+
result.warnings.push(
|
|
36
|
+
`⚠️ worktree 部分清理残留(${cr.result}):${(cr.residual || []).join('; ') || 'worktree 目录'}` +
|
|
37
|
+
`——Windows 勿直接 rm -rf(会穿透 node_modules junction 删主仓依赖):先 cmd /c rmdir "<worktree>\\node_modules" 解链再删目录,或跑 sillyspec worktree doctor --fix`
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
return cr;
|
|
41
|
+
}
|
|
42
|
+
|
|
26
43
|
/**
|
|
27
44
|
* 过滤掉 worktree 基础设施文件(非交付物),让 apply 只关心真正的变更产出:
|
|
28
45
|
* - meta.json:worktree 元数据,baseline commit 中被跟踪、working-tree 被 CLI 改写
|
|
@@ -424,6 +441,182 @@ export async function withMainRepoLock(projectRoot, changeName, purpose, fn, opt
|
|
|
424
441
|
}
|
|
425
442
|
}
|
|
426
443
|
|
|
444
|
+
/**
|
|
445
|
+
* 跨仓 worktree 真实 apply(坑 cross-repo-no-worktree-isolation,2026-08-27)。
|
|
446
|
+
*
|
|
447
|
+
* 对有 worktree meta 的跨仓仓(worktree-cross.js 创建)执行与主仓 A5 同构的 patch 回落:
|
|
448
|
+
* deliverables(diff baselineCommit||baseHash + untracked,filterDeliverableFiles 排除基础设施)
|
|
449
|
+
* → 清单校验(resolveApplyAllowSet 按 repo 切片 ∪ review 声明切片)
|
|
450
|
+
* → 跨仓主工作副本 dirty 重叠拦截
|
|
451
|
+
* → patch(tracked diff + untracked add/diff --cached/reset,Buffer 防二进制损坏)
|
|
452
|
+
* → git apply --3way 回跨仓主工作副本;成功后 cleanup 该跨仓 worktree(分支保留作锚)。
|
|
453
|
+
*
|
|
454
|
+
* 与主仓 apply 的顺序契约:本函数在主仓 patch 动作**之前**调用——任一跨仓失败即整体报错返回,
|
|
455
|
+
* 主仓工作区不动(不留半套状态)。legacy 直写模式的跨仓仓无 meta,不走本函数(原 no-op 校验)。
|
|
456
|
+
*
|
|
457
|
+
* @param {string} changeName
|
|
458
|
+
* @param {string} projectRoot 主仓根
|
|
459
|
+
* @param {object} ctx MultiRepoContext
|
|
460
|
+
* @param {{ checkOnly?: boolean }} opts
|
|
461
|
+
* @returns {{ repos: string[], applied: Array<{repoKey, changedFiles}>, errors: string[], warnings: string[], crossCleanups: string[] }}
|
|
462
|
+
*/
|
|
463
|
+
function applyCrossRepoWorktrees(changeName, projectRoot, ctx, { checkOnly = false } = {}) {
|
|
464
|
+
const specBase = (ctx.platformOpts && ctx.platformOpts.specRoot) || join(projectRoot, '.sillyspec');
|
|
465
|
+
const out = { repos: [], applied: [], errors: [], warnings: [], crossCleanups: [] };
|
|
466
|
+
for (const [repoKey, entry] of ctx.repos) {
|
|
467
|
+
if (entry.isMain) continue;
|
|
468
|
+
const cm = getCrossWorktreeMeta(specBase, changeName, repoKey);
|
|
469
|
+
if (!cm || !cm.isCross || !cm.worktreePath || !existsSync(cm.worktreePath)) continue;
|
|
470
|
+
out.repos.push(repoKey);
|
|
471
|
+
const crossRoot = cm.crossRepoRoot || entry.projectRoot;
|
|
472
|
+
const deliverableBase = cm.baselineCommit || cm.baseHash;
|
|
473
|
+
|
|
474
|
+
// 交付集合(与主仓 step2 同口径:--name-status 捕 rename/delete + untracked,过滤基础设施文件)
|
|
475
|
+
let changedFiles = [];
|
|
476
|
+
const deletedFiles = [];
|
|
477
|
+
try {
|
|
478
|
+
const statusRaw = git(cm.worktreePath, ['diff', '--name-status', deliverableBase]);
|
|
479
|
+
const statusFiles = new Set();
|
|
480
|
+
if (statusRaw) {
|
|
481
|
+
for (const line of statusRaw.split('\n').filter(Boolean)) {
|
|
482
|
+
const parts = line.split('\t');
|
|
483
|
+
if (parts.length >= 2) statusFiles.add(parts[parts.length - 1]);
|
|
484
|
+
if (parts.length >= 3) statusFiles.add(parts[parts.length - 2]);
|
|
485
|
+
if (parts[0].startsWith('D')) deletedFiles.push(parts[parts.length - 1]);
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
const untrackedRaw = gitQuiet(cm.worktreePath, ['ls-files', '--others', '--exclude-standard']) || '';
|
|
489
|
+
changedFiles = filterDeliverableFiles([...new Set([...statusFiles, ...untrackedRaw.split('\n').filter(Boolean)])]);
|
|
490
|
+
} catch (e) {
|
|
491
|
+
out.errors.push(`跨仓 ${repoKey}:获取变更文件列表失败(${cm.worktreePath}): ${e.message}`);
|
|
492
|
+
continue;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
if (changedFiles.length === 0) {
|
|
496
|
+
if (!checkOnly) {
|
|
497
|
+
const cr = cleanupCrossWorktrees({ cwd: crossRoot, changeName, specBase, force: true });
|
|
498
|
+
for (const r of cr.results) {
|
|
499
|
+
if (r.result === 'cleaned') out.crossCleanups.push(`${repoKey}(无变更,worktree 已清理)`);
|
|
500
|
+
else out.warnings.push(`跨仓 ${repoKey} 无变更但清理 partial:${(r.details || []).join('; ')}`);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
out.applied.push({ repoKey, changedFiles: [] });
|
|
504
|
+
continue;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
// 清单校验(per-repo 切片 + review 声明切片并入,与主仓 Gate1/3b 同语义)
|
|
508
|
+
const allowMap = resolveApplyAllowSet(projectRoot, changeName);
|
|
509
|
+
let allowSet = allowMap.get(repoKey) || new Set();
|
|
510
|
+
const reviewDeclared = collectReviewDeclaredFiles(projectRoot, changeName).get(repoKey);
|
|
511
|
+
if (reviewDeclared) {
|
|
512
|
+
const merged = new Set([...allowSet]);
|
|
513
|
+
for (const f of reviewDeclared) {
|
|
514
|
+
if (![...merged].some(ap => pathMatches(f, ap))) merged.add(f);
|
|
515
|
+
}
|
|
516
|
+
allowSet = merged;
|
|
517
|
+
}
|
|
518
|
+
if (allowSet.size > 0) {
|
|
519
|
+
const violations = classifyAllowListViolations(changedFiles, allowSet);
|
|
520
|
+
if (violations.length > 0) {
|
|
521
|
+
out.errors.push(
|
|
522
|
+
`跨仓 ${repoKey}:文件清单校验失败——以下变更文件不在 design.md 清单、也不在该仓 task review.json changedFiles 声明中:\n ${violations.join('\n ')}`
|
|
523
|
+
);
|
|
524
|
+
if (!checkOnly) continue;
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
if (checkOnly) {
|
|
529
|
+
out.applied.push({ repoKey, changedFiles });
|
|
530
|
+
continue;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
// 跨仓主工作副本 dirty 重叠拦截(与主仓 step4.5 同语义:重叠 = git apply 无法安全应用)
|
|
534
|
+
try {
|
|
535
|
+
const dirtyFiles = [...new Set(
|
|
536
|
+
((gitQuiet(crossRoot, ['diff', '--name-only', 'HEAD']) || '').split('\n').filter(Boolean))
|
|
537
|
+
.concat((gitQuiet(crossRoot, ['ls-files', '--others', '--exclude-standard']) || '').split('\n').filter(Boolean))
|
|
538
|
+
)].filter(f => !f.startsWith('.sillyspec/') && f !== 'meta.json');
|
|
539
|
+
const overlap = dirtyFiles.filter(f => changedFiles.includes(f));
|
|
540
|
+
if (overlap.length > 0) {
|
|
541
|
+
out.errors.push(
|
|
542
|
+
`跨仓 ${repoKey}(${crossRoot})主工作副本以下未提交文件与本次 apply 重叠,无法安全应用:\n ${overlap.join('\n ')}\n` +
|
|
543
|
+
`请先在跨仓仓提交或 stash 这些改动后重试 apply。`
|
|
544
|
+
);
|
|
545
|
+
continue;
|
|
546
|
+
}
|
|
547
|
+
} catch (e) {
|
|
548
|
+
out.errors.push(`跨仓 ${repoKey}:dirty 重叠检测失败(${crossRoot}): ${e.message}`);
|
|
549
|
+
continue;
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
// patch 生成 + apply --3way(tracked/untracked 分流与 Buffer 聚合,与主仓 step7 同款)
|
|
553
|
+
const patchFiles = allowSet.size > 0
|
|
554
|
+
? resolvePatchFiles(changedFiles, allowSet, true)
|
|
555
|
+
: changedFiles;
|
|
556
|
+
const tmpDir = mkdtempSync(join(tmpdir(), 'sillyspec-cross-'));
|
|
557
|
+
const patchPath = join(tmpDir, 'apply.patch');
|
|
558
|
+
try {
|
|
559
|
+
const inTree = new Set(
|
|
560
|
+
(gitQuiet(cm.worktreePath, ['ls-tree', '-r', '--name-only', deliverableBase]) || '').split('\n').filter(Boolean)
|
|
561
|
+
);
|
|
562
|
+
const inIndexRaw = patchFiles.length > 0
|
|
563
|
+
? (gitQuiet(cm.worktreePath, ['ls-files', '--', ...patchFiles]) || '')
|
|
564
|
+
: '';
|
|
565
|
+
const inIndex = new Set(inIndexRaw.split('\n').filter(Boolean));
|
|
566
|
+
const trackedFiles = patchFiles.filter(f => inTree.has(f) || inIndex.has(f));
|
|
567
|
+
const untrackedPatchFiles = patchFiles.filter(f => !trackedFiles.includes(f));
|
|
568
|
+
const patchParts = [];
|
|
569
|
+
if (trackedFiles.length > 0) {
|
|
570
|
+
patchParts.push(git(cm.worktreePath, ['diff', '--binary', deliverableBase, '--', ...trackedFiles], { encoding: 'buffer', timeout: 60000 }));
|
|
571
|
+
}
|
|
572
|
+
if (untrackedPatchFiles.length > 0) {
|
|
573
|
+
git(cm.worktreePath, ['add', '--', ...untrackedPatchFiles]);
|
|
574
|
+
try {
|
|
575
|
+
patchParts.push(git(cm.worktreePath, ['diff', '--binary', '--cached', '--', ...untrackedPatchFiles], { encoding: 'buffer', timeout: 60000 }));
|
|
576
|
+
} finally {
|
|
577
|
+
gitQuiet(cm.worktreePath, ['reset', 'HEAD', '--', ...untrackedPatchFiles]);
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
const patchContent = Buffer.concat(patchParts);
|
|
581
|
+
if (patchContent.length === 0) {
|
|
582
|
+
out.applied.push({ repoKey, changedFiles: [] });
|
|
583
|
+
continue;
|
|
584
|
+
}
|
|
585
|
+
writeFileSync(patchPath, patchContent);
|
|
586
|
+
try {
|
|
587
|
+
git(crossRoot, ['apply', '--3way', patchPath], { timeout: 30000 });
|
|
588
|
+
} catch (e) {
|
|
589
|
+
// 冲突回滚:tracked 文件还原 HEAD 版,--3way 新建的部分文件删除(与主仓 rollbackApply 同语义)
|
|
590
|
+
const rawStderr = e.message || '';
|
|
591
|
+
for (const f of patchFiles) {
|
|
592
|
+
try {
|
|
593
|
+
if (gitQuiet(crossRoot, ['cat-file', '-e', `HEAD:${f}`]) !== null) {
|
|
594
|
+
gitQuiet(crossRoot, ['checkout', 'HEAD', '--', f]);
|
|
595
|
+
} else {
|
|
596
|
+
try { rmSync(join(crossRoot, f), { force: true }) } catch { /* 新文件删除失败留残,rescue 提示 */ }
|
|
597
|
+
}
|
|
598
|
+
} catch { /* 回滚尽力而为 */ }
|
|
599
|
+
}
|
|
600
|
+
out.errors.push(
|
|
601
|
+
`跨仓 ${repoKey}:apply --3way 失败(已回滚跨仓主工作副本到 apply 前状态):${rawStderr}\n` +
|
|
602
|
+
`可选:进 ${crossRoot} 手工合并 worktree 分支 ${cm.branch}(git merge ${cm.branch}),完成后手动清理跨仓 worktree。`
|
|
603
|
+
);
|
|
604
|
+
continue;
|
|
605
|
+
}
|
|
606
|
+
out.applied.push({ repoKey, changedFiles: patchFiles });
|
|
607
|
+
// 成功 → 清理该跨仓 worktree(分支保留作 review 锚点)
|
|
608
|
+
const cr = cleanupCrossWorktrees({ cwd: crossRoot, changeName, specBase, force: true });
|
|
609
|
+
for (const r of cr.results) {
|
|
610
|
+
if (r.result === 'cleaned') out.crossCleanups.push(repoKey);
|
|
611
|
+
else out.warnings.push(`跨仓 ${repoKey} apply 成功但清理 partial:${(r.details || []).join('; ')}${(r.residual || []).length ? ';残留: ' + r.residual.join('; ') : ''}`);
|
|
612
|
+
}
|
|
613
|
+
} finally {
|
|
614
|
+
try { rmSync(tmpDir, { recursive: true, force: true }) } catch { /* 临时目录清理尽力而为 */ }
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
return out;
|
|
618
|
+
}
|
|
619
|
+
|
|
427
620
|
export function applyWorktree(changeName, { cwd, checkOnly = false, merge = false, base = 'merge-base', ctx = null, skipOverlap = false, stashDirty = false } = {}) {
|
|
428
621
|
const projectRoot = cwd || process.cwd();
|
|
429
622
|
const wm = new WorktreeManager({ cwd: projectRoot });
|
|
@@ -442,11 +635,26 @@ export function applyWorktree(changeName, { cwd, checkOnly = false, merge = fals
|
|
|
442
635
|
skippedOverlapFiles: [],
|
|
443
636
|
};
|
|
444
637
|
|
|
445
|
-
// --- 0.
|
|
446
|
-
//
|
|
447
|
-
//
|
|
448
|
-
//
|
|
638
|
+
// --- 0. 跨仓处理(task-05 / D-009 + 坑 cross-repo-no-worktree-isolation) ---
|
|
639
|
+
// 0a. worktree 模式的跨仓仓:真实 apply(patch 回跨仓主工作副本 + 成功后 cleanup worktree)。
|
|
640
|
+
// 在主仓任何动作之前跑——任一跨仓失败即整体返回,主仓工作区不动(不留半套状态)。
|
|
641
|
+
// 0b. legacy 直写模式的跨仓仓:no-op 校验(review.head 是跨仓真实 commit + 不 cleanup)。
|
|
642
|
+
// 单仓 ctx 缺省 / 无跨仓 entry → 两步都空转(零回归)。
|
|
449
643
|
if (ctx) {
|
|
644
|
+
const crossApplied = applyCrossRepoWorktrees(changeName, projectRoot, ctx, { checkOnly });
|
|
645
|
+
if (crossApplied.repos.length > 0) {
|
|
646
|
+
result.crossRepoApplied = crossApplied.applied;
|
|
647
|
+
for (const w of crossApplied.warnings) result.warnings = (result.warnings || []).concat([w]);
|
|
648
|
+
if (crossApplied.crossCleanups.length > 0) {
|
|
649
|
+
result.warnings = (result.warnings || []).concat([
|
|
650
|
+
`跨仓 worktree 已 apply 并清理:${crossApplied.crossCleanups.join(', ')}(分支保留作 review 锚点)`
|
|
651
|
+
]);
|
|
652
|
+
}
|
|
653
|
+
if (crossApplied.errors.length > 0) {
|
|
654
|
+
result.errors.push(...crossApplied.errors);
|
|
655
|
+
return result; // 跨仓未落地 = 该仓 task 实际未完成,主仓 apply 不可继续
|
|
656
|
+
}
|
|
657
|
+
}
|
|
450
658
|
const cross = validateCrossRepoNoOp(ctx, projectRoot, changeName);
|
|
451
659
|
for (const e of cross.errors) result.errors.push(e);
|
|
452
660
|
if (cross.warnings.length > 0) result.warnings = (result.warnings || []).concat(cross.warnings);
|
|
@@ -496,6 +704,10 @@ export function applyWorktree(changeName, { cwd, checkOnly = false, merge = fals
|
|
|
496
704
|
// 同时检测 untracked 新文件(git diff 不包含 untracked)
|
|
497
705
|
let changedFiles;
|
|
498
706
|
const deletedFiles = [];
|
|
707
|
+
// merge 后应「不存在于 main HEAD」的文件(D 删除 + R/C rename/copy 源路径):
|
|
708
|
+
// applyByMerge 落地校验按此分流——原实现一律要求 cat-file 存在,含删除文件的变更
|
|
709
|
+
// merge 成功也恒报「未落地」失败、worktree 永不清理(坑 apply-merge-deleted-misjudged)
|
|
710
|
+
const absentAfterMerge = [];
|
|
499
711
|
try {
|
|
500
712
|
// 用 --name-status 捕获 rename/delete(--name-only 会丢失 rename 源文件)
|
|
501
713
|
// 交付集合判定:用 deliverableBase(baselineCommit||baseHash),保「只合子代理改动」语义
|
|
@@ -509,8 +721,11 @@ export function applyWorktree(changeName, { cwd, checkOnly = false, merge = fals
|
|
|
509
721
|
if (parts.length >= 3) statusFiles.add(parts[parts.length - 2]);
|
|
510
722
|
// 删除文件(status D / D100)→ 收集到 deletedFiles(rescue DELETE 分类用,design §逐文件分类)
|
|
511
723
|
if (parts[0].startsWith('D')) deletedFiles.push(parts[parts.length - 1]);
|
|
724
|
+
// rename/copy 源路径(R100/C99 old new 三段式)→ 同删除语义:merge 后 HEAD 中不应存在
|
|
725
|
+
if (parts.length >= 3 && !parts[0].startsWith('D')) absentAfterMerge.push(parts[parts.length - 2]);
|
|
512
726
|
}
|
|
513
727
|
}
|
|
728
|
+
for (const f of deletedFiles) absentAfterMerge.push(f);
|
|
514
729
|
|
|
515
730
|
// untracked 新文件(deliverableBase 中不存在的文件)
|
|
516
731
|
const untrackedRaw = gitQuiet(worktreePath, ['ls-files', '--others', '--exclude-standard']);
|
|
@@ -527,11 +742,12 @@ export function applyWorktree(changeName, { cwd, checkOnly = false, merge = fals
|
|
|
527
742
|
|
|
528
743
|
result.changedFiles = changedFiles;
|
|
529
744
|
result.deletedFiles = deletedFiles;
|
|
745
|
+
result.absentAfterMerge = absentAfterMerge;
|
|
530
746
|
|
|
531
747
|
if (changedFiles.length === 0) {
|
|
532
748
|
// 没有变更
|
|
533
749
|
if (!checkOnly) {
|
|
534
|
-
wm.cleanup(changeName, { force: true });
|
|
750
|
+
consumeCleanupResult(wm.cleanup(changeName, { force: true }), result);
|
|
535
751
|
}
|
|
536
752
|
result.ok = true;
|
|
537
753
|
return result;
|
|
@@ -936,15 +1152,9 @@ export function applyWorktree(changeName, { cwd, checkOnly = false, merge = fals
|
|
|
936
1152
|
// cleanup 的拦截横幅吓人,主动判断 + 温和提示);全部已落地(无跳过残留)才照常清理。
|
|
937
1153
|
// cleanup 返回值必须消费(坑 ghost-dir-junction-pierce,2026-08-23 实证:apply 后 partial
|
|
938
1154
|
// 残留被静默丢弃,用户以为已干净、人工 rm -rf 时穿透 junction 删主仓 node_modules)。
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
`⚠️ worktree 部分清理残留(${cr.result}):${(cr.residual || []).join('; ') || 'worktree 目录'}` +
|
|
943
|
-
`——Windows 勿直接 rm -rf(会穿透 node_modules junction 删主仓依赖):先 cmd /c rmdir "<worktree>\\node_modules" 解链再删目录,或跑 sillyspec worktree doctor --fix`
|
|
944
|
-
)
|
|
945
|
-
}
|
|
946
|
-
return cr
|
|
947
|
-
}
|
|
1155
|
+
// cleanup 返回值必须消费(坑 ghost-dir-junction-pierce)——实现提升为模块级 consumeCleanupResult,
|
|
1156
|
+
// 与无变更早退 / applyByMerge 成功路径三处共用
|
|
1157
|
+
const consumeCleanup = (cr) => consumeCleanupResult(cr, result)
|
|
948
1158
|
try {
|
|
949
1159
|
if (skipOverlap) {
|
|
950
1160
|
const unapplied = wm.hasUnappliedChanges(changeName);
|
|
@@ -1329,13 +1539,19 @@ export function applyByMerge(result, changeName, projectRoot, wm, opts = {}) {
|
|
|
1329
1539
|
|
|
1330
1540
|
// 落地校验:merge 报成功(exit 0)不代表交付物真进 main——
|
|
1331
1541
|
// 分支可能只含 baseline checkpoint(子代理改动未 commit),merge 产生空内容合并,文件零落地。
|
|
1332
|
-
//
|
|
1542
|
+
// 落地语义按文件类型分流:普通交付文件应存在于 main HEAD;删除/rename 源文件(absentAfterMerge)
|
|
1543
|
+
// 应「不存在」——原实现一律要求存在,含删除文件的变更 merge 成功也恒报失败(坑 apply-merge-deleted-misjudged)。
|
|
1544
|
+
// 任一未按预期落地 → 不 cleanup(fail-open:保留 worktree 唯一副本)。
|
|
1333
1545
|
result.merged = true;
|
|
1334
|
-
const
|
|
1546
|
+
const absentExpected = new Set(result.absentAfterMerge || []);
|
|
1547
|
+
const notLanded = changedFiles.filter(f => {
|
|
1548
|
+
const inHead = gitQuiet(projectRoot, ['cat-file', '-e', `HEAD:${f}`]) !== null;
|
|
1549
|
+
return absentExpected.has(f) ? inHead : !inHead;
|
|
1550
|
+
});
|
|
1335
1551
|
if (notLanded.length > 0) {
|
|
1336
1552
|
result.ok = false;
|
|
1337
1553
|
result.errors.push(
|
|
1338
|
-
`git merge ${branch} 报成功,但 ${notLanded.length}/${changedFiles.length}
|
|
1554
|
+
`git merge ${branch} 报成功,但 ${notLanded.length}/${changedFiles.length} 个交付文件未按预期落地 main HEAD` +
|
|
1339
1555
|
`(分支可能只含 baseline checkpoint,子代理改动未 commit)。worktree 已保留(未 cleanup),` +
|
|
1340
1556
|
`请用 git cherry-pick 或手动 cp 落地:\n ${notLanded.join('\n ')}`
|
|
1341
1557
|
);
|
|
@@ -1345,7 +1561,7 @@ export function applyByMerge(result, changeName, projectRoot, wm, opts = {}) {
|
|
|
1345
1561
|
result.ok = true;
|
|
1346
1562
|
try { result.mergeSummary = git(projectRoot, ['log', '--oneline', '-1']); } catch {}
|
|
1347
1563
|
try {
|
|
1348
|
-
wm.cleanup(changeName, { force: true });
|
|
1564
|
+
consumeCleanupResult(wm.cleanup(changeName, { force: true }), result);
|
|
1349
1565
|
} catch (cleanupErr) {
|
|
1350
1566
|
result.warnings = result.warnings || [];
|
|
1351
1567
|
result.warnings.push(`cleanup 失败(不影响 merge 结果): ${cleanupErr.message}`);
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* worktree-cross.js — 跨仓仓 worktree 隔离(坑 cross-repo-no-worktree-isolation,2026-08-27 用户实证)。
|
|
3
|
+
*
|
|
4
|
+
* 背景:跨仓 task 的原设计(multi-repo W1 D-005/D-006/D-009)是子代理直写跨仓仓主工作副本、
|
|
5
|
+
* commit 直落该仓主干,apply 对跨仓 no-op。实战暴露三类事故面:
|
|
6
|
+
* 1. 并行混流:跨仓主工作副本常有用户/其他变更的在途改动,子代理产物与之混在同一工作区,
|
|
7
|
+
* 无法区分归属、无法整体回滚(实证:sub-grid-security 主工作副本 task-05 产物与
|
|
8
|
+
* .gitignore/.webpackrc.js/yarn.lock 并行改动混流,无法核对);
|
|
9
|
+
* 2. 无 base 锚:跨仓仓无 meta/baseHash,base 只能靠 task 卡 base_commit 锡点;
|
|
10
|
+
* 3. 误伤面大:子代理在主工作副本可误改/误删用户未提交文件,无护栏。
|
|
11
|
+
*
|
|
12
|
+
* 本模块把跨仓仓纳入与主仓同构的 worktree 隔离(D-009 就地翻新,向后兼容):
|
|
13
|
+
* - worktree 落位 <主仓 specBase>/.runtime/worktrees/<change>--<repoKey>:主仓侧该目录已被
|
|
14
|
+
* .gitignore 覆盖(主仓 create 已强制检查),不要求跨仓仓自配 .gitignore;git worktree
|
|
15
|
+
* 的注册信息在跨仓 .git/worktrees/,目录本身可在仓外任意路径;
|
|
16
|
+
* - meta.json 与主仓同 schema + repoKey/crossRepoRoot/isCross 标识(唯一写入方 = 本模块,
|
|
17
|
+
* multi-repo-context.js 只读且路径公式与此处 crossWorktreePath 保持同步);
|
|
18
|
+
* - base 锚 meta.baseHash(跨仓仓 HEAD 快照);dirty baseline overlay 沿用主仓同款
|
|
19
|
+
* (跨仓主工作副本的在途改动进 baseline,不算交付 diff,apply 不覆盖它们);
|
|
20
|
+
* - deps 供给 provisionDeps(worktree, 跨仓根, {specBase:null})——sniff worktree 自身项目
|
|
21
|
+
* 类型(package.json→nodejs 链主工作副本 node_modules;不沿用主仓 local.yaml 的
|
|
22
|
+
* project.type,主仓与跨仓类型常不同,如实测 maven 主仓 + nodejs 前端仓);
|
|
23
|
+
* - cleanup:解链 node_modules junction → git worktree remove --force → 保留分支
|
|
24
|
+
* sillyspec/<change> 作 review 锚点(对齐主仓 cleanup 的分支保护哲学)。
|
|
25
|
+
*
|
|
26
|
+
* 兼容:无跨仓 worktree meta 的旧变更(legacy 直写主干模式)各链路继续走原路径,零回归。
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import { existsSync, readFileSync, readdirSync, mkdirSync } from 'fs';
|
|
30
|
+
import { join } from 'path';
|
|
31
|
+
import { git, gitQuiet } from './git-helper.js';
|
|
32
|
+
import { writeAtomicSync } from './fs-atomic.js';
|
|
33
|
+
import { WorktreeManager, unlinkNodeModulesLinks, safeRemoveWorktreeDir } from './worktree.js';
|
|
34
|
+
import { provisionDeps } from './worktree-deps.js';
|
|
35
|
+
import { aggregateDeclaredRepos } from './run/shared.js';
|
|
36
|
+
import { parseRepoRegistry } from './stages/plan-postcheck.js';
|
|
37
|
+
|
|
38
|
+
const META_FILE = 'meta.json';
|
|
39
|
+
const BRANCH_PREFIX = 'sillyspec/';
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* 跨仓 worktree 路径(唯一路径公式;multi-repo-context.js 的 meta 只读逻辑与此同步)。
|
|
43
|
+
* @param {string} specBase 主仓 spec 根(<主仓>/.sillyspec)
|
|
44
|
+
* @param {string} changeName 变更名
|
|
45
|
+
* @param {string} repoKey 跨仓 repo 键(local.yaml repos: 段的 key)
|
|
46
|
+
*/
|
|
47
|
+
export function crossWorktreePath(specBase, changeName, repoKey) {
|
|
48
|
+
return join(specBase, '.runtime', 'worktrees', `${changeName}--${repoKey}`);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* 读跨仓 worktree meta(不存在/损坏返 null = legacy 直写模式)。
|
|
53
|
+
* @returns {object|null}
|
|
54
|
+
*/
|
|
55
|
+
export function getCrossWorktreeMeta(specBase, changeName, repoKey) {
|
|
56
|
+
const metaPath = join(crossWorktreePath(specBase, changeName, repoKey), META_FILE);
|
|
57
|
+
if (!existsSync(metaPath)) return null;
|
|
58
|
+
try {
|
|
59
|
+
return JSON.parse(readFileSync(metaPath, 'utf8'));
|
|
60
|
+
} catch {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* 列出某变更已建的全部跨仓 worktree meta(扫描 worktrees 目录下 `<change>--*` 且 isCross 的 meta)。
|
|
67
|
+
* @returns {Array<{repoKey: string, meta: object}>}
|
|
68
|
+
*/
|
|
69
|
+
export function listCrossWorktreeMetas(specBase, changeName) {
|
|
70
|
+
const base = join(specBase, '.runtime', 'worktrees');
|
|
71
|
+
if (!existsSync(base)) return [];
|
|
72
|
+
const out = [];
|
|
73
|
+
for (const name of readdirSync(base)) {
|
|
74
|
+
if (!name.startsWith(`${changeName}--`)) continue;
|
|
75
|
+
const metaPath = join(base, name, META_FILE);
|
|
76
|
+
if (!existsSync(metaPath)) continue;
|
|
77
|
+
try {
|
|
78
|
+
const meta = JSON.parse(readFileSync(metaPath, 'utf8'));
|
|
79
|
+
if (meta && meta.isCross && meta.repoKey) out.push({ repoKey: meta.repoKey, meta });
|
|
80
|
+
} catch { /* 损坏 meta 跳过(cleanup 阶段仍按目录处理) */ }
|
|
81
|
+
}
|
|
82
|
+
return out;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* 聚合声明跨仓 key(plan.md 内联卡片 + tasks/ 独立卡片双源,与 shared.js getOrCreateMultiRepoContext 同口径)。
|
|
87
|
+
* @param {string} specBase
|
|
88
|
+
* @param {string} changeName
|
|
89
|
+
* @returns {string[]} 除 'main' 外的跨仓 key(未注册/配置错由 MultiRepoContext fail-closed,此处只聚合)
|
|
90
|
+
*/
|
|
91
|
+
function aggregateCrossRepoKeys(specBase, changeName) {
|
|
92
|
+
const planFile = join(specBase, 'changes', changeName, 'plan.md');
|
|
93
|
+
let planContent = '';
|
|
94
|
+
if (existsSync(planFile)) {
|
|
95
|
+
try { planContent = readFileSync(planFile, 'utf8') } catch { planContent = '' }
|
|
96
|
+
}
|
|
97
|
+
// tasks/ 独立卡片兜底(与 run/shared.js collectTaskCardReposFallback 同口径,该函数未导出)
|
|
98
|
+
const tasksDir = join(specBase, 'changes', changeName, 'tasks');
|
|
99
|
+
if (existsSync(tasksDir)) {
|
|
100
|
+
for (const f of readdirSync(tasksDir)) {
|
|
101
|
+
if (!/^task-\d+\.md$/i.test(f)) continue;
|
|
102
|
+
try { planContent += '\n' + readFileSync(join(tasksDir, f), 'utf8') + '\n' } catch { /* 兜底源不阻断 */ }
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return aggregateDeclaredRepos(planContent).filter(k => k !== 'main');
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* 读主仓 local.yaml 的 repos: 段(路径口径与 run/shared.js readLocalYamlRaw 一致:cwd/.sillyspec/local.yaml)。
|
|
110
|
+
* @returns {Map<string,string>}
|
|
111
|
+
*/
|
|
112
|
+
function readRepoRegistry(cwd) {
|
|
113
|
+
const p = join(cwd, '.sillyspec', 'local.yaml');
|
|
114
|
+
let text = '';
|
|
115
|
+
if (existsSync(p)) {
|
|
116
|
+
try { text = readFileSync(p, 'utf8') } catch { text = '' }
|
|
117
|
+
}
|
|
118
|
+
return parseRepoRegistry(text);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* execute 启动时为每个声明的跨仓仓建 worktree(幂等:meta 在即复用)。
|
|
123
|
+
*
|
|
124
|
+
* 失败语义 fail-closed(对齐主仓 create:隔离建不起来就不该开工):任何仓创建失败 → 抛错,
|
|
125
|
+
* 由调用方(run/stage.js execute 启动)exit(1) 并给修复指引。已建成功的仓保留(重跑幂等复用)。
|
|
126
|
+
*
|
|
127
|
+
* @param {{ cwd: string, changeName: string, specBase?: string }} opts
|
|
128
|
+
* @returns {{ created: Array<{repoKey,worktreePath}>, reused: Array<{repoKey,worktreePath}>, skippedLegacy: string[] }}
|
|
129
|
+
* @throws {Error} 跨仓仓未注册 / git 不可达 / worktree add 失败 / 分支冲突
|
|
130
|
+
*/
|
|
131
|
+
export function ensureCrossWorktrees({ cwd, changeName, specBase }) {
|
|
132
|
+
const base = specBase || join(cwd, '.sillyspec');
|
|
133
|
+
const keys = aggregateCrossRepoKeys(base, changeName);
|
|
134
|
+
const registry = readRepoRegistry(cwd);
|
|
135
|
+
const created = [];
|
|
136
|
+
const reused = [];
|
|
137
|
+
const skippedLegacy = [];
|
|
138
|
+
|
|
139
|
+
for (const key of keys) {
|
|
140
|
+
const repoRoot = registry.get(key);
|
|
141
|
+
if (!repoRoot) {
|
|
142
|
+
// 与 MultiRepoContext 约束②同语义:声明的 repo 必须已注册,配置错不降级
|
|
143
|
+
throw new Error(
|
|
144
|
+
`跨仓 repo "${key}" 未在 local.yaml repos: 段注册。` +
|
|
145
|
+
`一键注册:sillyspec local register-repo ${key} <${key} 仓根路径>(勿手编 YAML),补注册后重跑 execute。`
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
const existing = getCrossWorktreeMeta(base, changeName, key);
|
|
149
|
+
if (existing && existing.worktreePath && existsSync(existing.worktreePath)) {
|
|
150
|
+
reused.push({ repoKey: key, worktreePath: existing.worktreePath });
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
// meta 在但目录没了(外部误删):走重建(下方 git worktree add 会因注册残留失败,
|
|
154
|
+
// 先 prune 掉悬空注册再建——目录不在则 prune 无损)
|
|
155
|
+
if (existing) {
|
|
156
|
+
try { gitQuiet(repoRoot, ['worktree', 'prune'], { timeout: 30000 }) } catch {}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const worktreePath = crossWorktreePath(base, changeName, key);
|
|
160
|
+
const branch = BRANCH_PREFIX + changeName;
|
|
161
|
+
|
|
162
|
+
// base 快照:跨仓仓当前 HEAD(与主仓 create 的默认 base 语义一致)
|
|
163
|
+
let baseHash;
|
|
164
|
+
try {
|
|
165
|
+
baseHash = git(repoRoot, ['rev-parse', 'HEAD']);
|
|
166
|
+
} catch (e) {
|
|
167
|
+
throw new Error(`跨仓 repo "${key}"(${repoRoot})git 不可达(rev-parse HEAD 失败:${e.message})。请检查 local.yaml repos: 段路径。`);
|
|
168
|
+
}
|
|
169
|
+
const branchExists = !!gitQuiet(repoRoot, ['rev-parse', '--verify', `refs/heads/${branch}`]);
|
|
170
|
+
if (branchExists) {
|
|
171
|
+
throw new Error(
|
|
172
|
+
`跨仓仓 ${key} 已有分支 ${branch}(疑似上次 execute 残留)。三选一:\n` +
|
|
173
|
+
` ① 确认残留作废:git -C ${repoRoot} branch -D ${branch} 后重跑;\n` +
|
|
174
|
+
` ② 分支内容已 apply 落地或不再需要:sillyspec worktree cleanup ${changeName} --force(跨仓 worktree 一并清理后重跑);\n` +
|
|
175
|
+
` ③ 换变更名重跑。`
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
mkdirSync(join(base, '.runtime', 'worktrees'), { recursive: true });
|
|
179
|
+
try {
|
|
180
|
+
git(repoRoot, ['worktree', 'add', worktreePath, '-b', branch, baseHash], { timeout: 120000 });
|
|
181
|
+
} catch (e) {
|
|
182
|
+
throw new Error(`跨仓仓 ${key} worktree 创建失败(${worktreePath}):${e.stderr || e.message}`);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const meta = {
|
|
186
|
+
name_zh: 'worktree 元数据',
|
|
187
|
+
changeName,
|
|
188
|
+
repoKey: key,
|
|
189
|
+
crossRepoRoot: repoRoot,
|
|
190
|
+
isCross: true,
|
|
191
|
+
branch,
|
|
192
|
+
baseBranch: gitQuiet(repoRoot, ['symbolic-ref', '--short', 'HEAD']) || 'HEAD',
|
|
193
|
+
baseHash,
|
|
194
|
+
actualBaseHash: gitQuiet(worktreePath, ['rev-parse', 'HEAD']) || baseHash,
|
|
195
|
+
createdAt: new Date().toISOString(),
|
|
196
|
+
worktreePath,
|
|
197
|
+
mode: 'worktree',
|
|
198
|
+
};
|
|
199
|
+
writeAtomicSync(join(worktreePath, META_FILE), JSON.stringify(meta, null, 2) + '\n');
|
|
200
|
+
|
|
201
|
+
// dirty baseline overlay:跨仓主工作副本在途改动 → worktree baseline(借主仓同款实现,
|
|
202
|
+
// 只用其参数化逻辑,不用实例路径状态)
|
|
203
|
+
try {
|
|
204
|
+
const wmHelper = new WorktreeManager({ cwd: repoRoot });
|
|
205
|
+
const baselineResult = wmHelper._overlayBaseline(repoRoot, worktreePath);
|
|
206
|
+
meta.baselineFiles = baselineResult.files;
|
|
207
|
+
meta.baselineHash = baselineResult.baselineHash;
|
|
208
|
+
if (baselineResult.files.length > 0) {
|
|
209
|
+
meta.baselineCommit = wmHelper._createBaselineCheckpoint(worktreePath, `${changeName}--${key}`, baselineResult.files);
|
|
210
|
+
}
|
|
211
|
+
if (baselineResult.errors && baselineResult.errors.length > 0) {
|
|
212
|
+
console.warn(`⚠️ 跨仓 ${key} baseline overlay 部分失败(${baselineResult.errors.join('; ')})——在途改动未全量进 baseline,apply 前请人工核对跨仓主工作副本`);
|
|
213
|
+
}
|
|
214
|
+
writeAtomicSync(join(worktreePath, META_FILE), JSON.stringify(meta, null, 2) + '\n');
|
|
215
|
+
} catch (e) {
|
|
216
|
+
console.warn(`⚠️ 跨仓 ${key} baseline overlay 失败(${e.message})——跨仓主工作副本如有在途改动,worktree 不含它们`);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// deps 供给:specBase 传 null —— sniff worktree 自身(主仓 local.yaml 的 project.type/install
|
|
220
|
+
// 描述的是主仓,跨仓仓类型常不同,如实测 maven 主仓 + nodejs 前端仓,沿用会把 mvn 命令
|
|
221
|
+
// 打到前端仓上)。失败不阻断(与主仓 create 同语义,doctor --fix 可修)
|
|
222
|
+
try {
|
|
223
|
+
const deps = provisionDeps(worktreePath, repoRoot, { specBase: null }) || {};
|
|
224
|
+
Object.assign(meta, {
|
|
225
|
+
depsStatus: deps.depsStatus,
|
|
226
|
+
depsMethod: deps.depsMethod || null,
|
|
227
|
+
depsSource: deps.depsSource || null,
|
|
228
|
+
depsLockHash: deps.depsLockHash || null,
|
|
229
|
+
depsCheckedAt: deps.depsCheckedAt || null,
|
|
230
|
+
...(deps.depsError ? { depsError: deps.depsError } : {}),
|
|
231
|
+
});
|
|
232
|
+
writeAtomicSync(join(worktreePath, META_FILE), JSON.stringify(meta, null, 2) + '\n');
|
|
233
|
+
} catch (e) {
|
|
234
|
+
meta.depsStatus = 'failed';
|
|
235
|
+
meta.depsError = `provisionDeps crashed: ${e.message}`;
|
|
236
|
+
writeAtomicSync(join(worktreePath, META_FILE), JSON.stringify(meta, null, 2) + '\n');
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
created.push({ repoKey: key, worktreePath });
|
|
240
|
+
}
|
|
241
|
+
return { created, reused, skippedLegacy };
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* 清理某变更的全部跨仓 worktree(幂等)。
|
|
246
|
+
*
|
|
247
|
+
* 顺序对齐主仓 cleanup 的 Windows 防护:先解 node_modules junction(裸删会穿透删跨仓主工作
|
|
248
|
+
* 副本的 node_modules),再 git worktree remove --force,最后**保留分支** sillyspec/<change>
|
|
249
|
+
* 作 review 锚点(分支删除在主仓侧有 review 锚点 + 双保护,跨仓侧 v1 保守不删,残 branch
|
|
250
|
+
* 可人工清理)。目录残留(remove 失败)走 safeRemoveWorktreeDir 兜底 + residual 上报。
|
|
251
|
+
*
|
|
252
|
+
* @param {{ cwd: string, changeName: string, specBase?: string, force?: boolean }} opts
|
|
253
|
+
* @returns {{ results: Array<{repoKey, result: 'cleaned'|'skipped'|'partial', details: string[], residual: string[]}> }}
|
|
254
|
+
*/
|
|
255
|
+
export function cleanupCrossWorktrees({ cwd, changeName, specBase, force = false }) {
|
|
256
|
+
const base = specBase || join(cwd, '.sillyspec');
|
|
257
|
+
const results = [];
|
|
258
|
+
for (const { repoKey, meta } of listCrossWorktreeMetas(base, changeName)) {
|
|
259
|
+
const details = [];
|
|
260
|
+
const residual = [];
|
|
261
|
+
const repoRoot = meta.crossRepoRoot;
|
|
262
|
+
const wtPath = meta.worktreePath || crossWorktreePath(base, changeName, repoKey);
|
|
263
|
+
if (!existsSync(wtPath)) {
|
|
264
|
+
try { if (repoRoot) gitQuiet(repoRoot, ['worktree', 'prune'], { timeout: 30000 }) } catch {}
|
|
265
|
+
results.push({ repoKey, result: 'skipped', details: ['目录不存在(已清理)'], residual });
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
if (!force) {
|
|
269
|
+
// fail-closed:worktree 内还有未落地交付(相对 baseHash 有 diff)时拒绝清理(对齐主仓
|
|
270
|
+
// hasUnappliedChanges 哲学;跨仓侧以「分支上有交付 diff 且未 apply」近似)
|
|
271
|
+
try {
|
|
272
|
+
const diff = gitQuiet(wtPath, ['diff', '--name-only', meta.baseHash]) || '';
|
|
273
|
+
const untracked = gitQuiet(wtPath, ['ls-files', '--others', '--exclude-standard']) || '';
|
|
274
|
+
if (diff.trim() || untracked.trim()) {
|
|
275
|
+
results.push({ repoKey, result: 'partial', details: [`blocked: 跨仓 worktree 有未 apply 的交付改动(git diff ${String(meta.baseHash).slice(0, 8)} 非空)——先 apply 或显式 --force`], residual: [wtPath] });
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
} catch (e) {
|
|
279
|
+
details.push(`未落地检测失败(${e.message}),按 force 处理`);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
try { unlinkNodeModulesLinks(wtPath, meta, details) } catch (e) { details.push(`junction 解链失败: ${e.message}`) }
|
|
283
|
+
try {
|
|
284
|
+
git(repoRoot, ['worktree', 'remove', '--force', wtPath], { timeout: 60000 });
|
|
285
|
+
} catch {
|
|
286
|
+
// remove 失败(脏文件/锁):解链后安全删目录 + prune 注册
|
|
287
|
+
try { safeRemoveWorktreeDir(wtPath, meta) } catch (e) { residual.push(`目录残留 ${wtPath}: ${e.message}`) }
|
|
288
|
+
try { gitQuiet(repoRoot, ['worktree', 'prune'], { timeout: 30000 }) } catch { residual.push(`git worktree prune 失败(${repoRoot})`) }
|
|
289
|
+
}
|
|
290
|
+
details.push(`分支 ${meta.branch} 保留作 review 锚点(确认无需回溯后可 git -C ${repoRoot} branch -D ${meta.branch})`);
|
|
291
|
+
results.push({ repoKey, result: residual.length > 0 ? 'partial' : 'cleaned', details, residual });
|
|
292
|
+
}
|
|
293
|
+
return { results };
|
|
294
|
+
}
|