lsd-pi 1.0.0 → 1.1.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/README.md +283 -648
- package/dist/cli-theme.d.ts +1 -1
- package/dist/cli-theme.js +4 -4
- package/dist/cli.js +2 -2
- package/dist/headless.js +4 -6
- package/dist/help-text.js +1 -3
- package/dist/loader.js +8 -7
- package/dist/logo.d.ts +9 -0
- package/dist/logo.js +18 -8
- package/dist/lsd-brand.d.ts +14 -0
- package/dist/lsd-brand.js +42 -0
- package/dist/onboarding.js +51 -0
- package/dist/resource-loader.d.ts +2 -3
- package/dist/resource-loader.js +18 -20
- package/dist/resources/agents/generic.md +29 -0
- package/dist/resources/agents/scout.md +1 -0
- package/dist/resources/extensions/ask-user-questions.js +0 -4
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +6 -0
- package/dist/resources/extensions/get-secrets-from-user.js +2 -3
- package/dist/resources/extensions/remote-questions/config.js +3 -3
- package/dist/resources/extensions/remote-questions/remote-command.js +4 -27
- package/dist/resources/extensions/search-the-web/native-search.js +1 -1
- package/dist/resources/extensions/search-the-web/provider.js +4 -12
- package/dist/resources/extensions/shared/debug-logger.js +103 -0
- package/dist/resources/extensions/shared/env-utils.js +17 -0
- package/dist/resources/extensions/shared/paths.js +17 -0
- package/dist/resources/extensions/shared/preferences.js +90 -0
- package/dist/resources/extensions/shared/remote-questions-config.js +27 -0
- package/dist/resources/extensions/shared/rtk-session-stats.js +2 -2
- package/dist/resources/extensions/shared/secrets-manifest.js +115 -0
- package/dist/resources/extensions/slash-commands/extension-manifest.json +2 -1
- package/dist/resources/extensions/slash-commands/index.js +2 -0
- package/dist/resources/extensions/slash-commands/plan.js +284 -0
- package/dist/resources/extensions/subagent/agents.js +1 -1
- package/dist/resources/extensions/subagent/approval-proxy.js +34 -0
- package/dist/resources/extensions/subagent/configured-model.js +9 -0
- package/dist/resources/extensions/subagent/index.js +95 -144
- package/dist/resources/extensions/subagent/model-resolution.js +12 -0
- package/dist/resources/extensions/ttsr/ttsr-manager.js +1 -1
- package/dist/resources/skills/create-skill/SKILL.md +2 -2
- package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +8 -7
- package/dist/resources/skills/create-skill/workflows/audit-skill.md +4 -4
- package/dist/resources/skills/create-skill/workflows/create-new-skill.md +6 -5
- package/dist/shared-paths.d.ts +1 -0
- package/dist/shared-paths.js +17 -0
- package/dist/shared-preferences.d.ts +37 -0
- package/dist/shared-preferences.js +102 -0
- package/dist/welcome-screen.js +24 -18
- package/dist/worktree-cli.d.ts +4 -49
- package/dist/worktree-cli.js +197 -113
- package/package.json +6 -6
- package/packages/pi-coding-agent/dist/cli/args.d.ts +1 -1
- package/packages/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/cli/args.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +13 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +35 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +24 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +8 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts +12 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +77 -15
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js +76 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/keybindings.js +2 -2
- package/packages/pi-coding-agent/dist/core/keybindings.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.js +8 -8
- package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader-lsd-md.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/resource-loader-lsd-md.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/resource-loader-lsd-md.test.js +59 -0
- package/packages/pi-coding-agent/dist/core/resource-loader-lsd-md.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +32 -14
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +13 -3
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts +4 -6
- package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.js +18 -13
- package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tool-approval.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/tool-approval.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tool-approval.js +2 -0
- package/packages/pi-coding-agent/dist/core/tool-approval.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +1 -1
- package/packages/pi-coding-agent/dist/main.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +5 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +11 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +11 -4
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +7 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +33 -3
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +6 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +129 -57
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +12 -3
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +46 -6
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +28 -20
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/cli/args.ts +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +14 -1
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +30 -0
- package/packages/pi-coding-agent/src/core/auth-storage.ts +36 -0
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +9 -0
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.test.ts +87 -0
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +84 -16
- package/packages/pi-coding-agent/src/core/keybindings.ts +2 -2
- package/packages/pi-coding-agent/src/core/package-manager.ts +8 -8
- package/packages/pi-coding-agent/src/core/resource-loader-lsd-md.test.ts +67 -0
- package/packages/pi-coding-agent/src/core/resource-loader.ts +32 -13
- package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -5
- package/packages/pi-coding-agent/src/core/skills.ts +20 -14
- package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -1
- package/packages/pi-coding-agent/src/core/tool-approval.js +111 -0
- package/packages/pi-coding-agent/src/core/tool-approval.ts +2 -1
- package/packages/pi-coding-agent/src/index.ts +2 -0
- package/packages/pi-coding-agent/src/main.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +14 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +11 -5
- package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +40 -3
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +135 -66
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +12 -3
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +70 -6
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +28 -20
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +28 -20
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/agents/generic.md +29 -0
- package/src/resources/agents/scout.md +1 -0
- package/src/resources/extensions/ask-user-questions.ts +0 -3
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +6 -0
- package/src/resources/extensions/cmux/index.ts +29 -10
- package/src/resources/extensions/get-secrets-from-user.ts +2 -4
- package/src/resources/extensions/gsd/tests/test-helpers.ts +44 -44
- package/src/resources/extensions/remote-questions/config.ts +3 -3
- package/src/resources/extensions/remote-questions/remote-command.ts +4 -30
- package/src/resources/extensions/search-the-web/native-search.ts +2 -1
- package/src/resources/extensions/search-the-web/provider.ts +3 -10
- package/src/resources/extensions/shared/debug-logger.ts +102 -0
- package/src/resources/extensions/shared/env-utils.ts +18 -0
- package/src/resources/extensions/shared/paths.ts +15 -0
- package/src/resources/extensions/shared/preferences.ts +122 -0
- package/src/resources/extensions/shared/remote-questions-config.ts +30 -0
- package/src/resources/extensions/shared/rtk-session-stats.ts +2 -2
- package/src/resources/extensions/shared/secrets-manifest.ts +130 -0
- package/src/resources/extensions/slash-commands/extension-manifest.json +2 -1
- package/src/resources/extensions/slash-commands/index.ts +2 -0
- package/src/resources/extensions/slash-commands/plan.ts +328 -0
- package/src/resources/extensions/subagent/agents.ts +1 -1
- package/src/resources/extensions/subagent/approval-proxy.ts +70 -0
- package/src/resources/extensions/subagent/configured-model.ts +15 -0
- package/src/resources/extensions/subagent/index.ts +126 -185
- package/src/resources/extensions/subagent/model-resolution.ts +26 -0
- package/src/resources/extensions/ttsr/ttsr-manager.ts +1 -1
- package/src/resources/skills/create-skill/SKILL.md +2 -2
- package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +8 -7
- package/src/resources/skills/create-skill/workflows/audit-skill.md +4 -4
- package/src/resources/skills/create-skill/workflows/create-new-skill.md +6 -5
- package/dist/resources/extensions/github-sync/cli.js +0 -284
- package/dist/resources/extensions/github-sync/index.js +0 -73
- package/dist/resources/extensions/github-sync/mapping.js +0 -67
- package/dist/resources/extensions/github-sync/sync.js +0 -425
- package/dist/resources/extensions/github-sync/templates.js +0 -118
- package/dist/resources/extensions/github-sync/types.js +0 -7
- package/dist/resources/extensions/gsd/activity-log.js +0 -153
- package/dist/resources/extensions/gsd/atomic-write.js +0 -134
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +0 -49
- package/dist/resources/extensions/gsd/auto/infra-errors.js +0 -49
- package/dist/resources/extensions/gsd/auto/loop-deps.js +0 -6
- package/dist/resources/extensions/gsd/auto/loop.js +0 -256
- package/dist/resources/extensions/gsd/auto/phases.js +0 -942
- package/dist/resources/extensions/gsd/auto/resolve.js +0 -90
- package/dist/resources/extensions/gsd/auto/run-unit.js +0 -106
- package/dist/resources/extensions/gsd/auto/session.js +0 -171
- package/dist/resources/extensions/gsd/auto/types.js +0 -23
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +0 -116
- package/dist/resources/extensions/gsd/auto-budget.js +0 -30
- package/dist/resources/extensions/gsd/auto-dashboard.js +0 -751
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +0 -212
- package/dist/resources/extensions/gsd/auto-dispatch.js +0 -627
- package/dist/resources/extensions/gsd/auto-loop.js +0 -13
- package/dist/resources/extensions/gsd/auto-model-selection.js +0 -192
- package/dist/resources/extensions/gsd/auto-observability.js +0 -54
- package/dist/resources/extensions/gsd/auto-post-unit.js +0 -548
- package/dist/resources/extensions/gsd/auto-prompts.js +0 -1686
- package/dist/resources/extensions/gsd/auto-recovery.js +0 -533
- package/dist/resources/extensions/gsd/auto-start.js +0 -544
- package/dist/resources/extensions/gsd/auto-supervisor.js +0 -73
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +0 -180
- package/dist/resources/extensions/gsd/auto-timers.js +0 -261
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +0 -77
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +0 -30
- package/dist/resources/extensions/gsd/auto-utils.js +0 -20
- package/dist/resources/extensions/gsd/auto-verification.js +0 -163
- package/dist/resources/extensions/gsd/auto-worktree.js +0 -1645
- package/dist/resources/extensions/gsd/auto.js +0 -1087
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +0 -191
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +0 -1207
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +0 -149
- package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +0 -62
- package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +0 -18
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +0 -53
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +0 -267
- package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +0 -45
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +0 -367
- package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +0 -75
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +0 -105
- package/dist/resources/extensions/gsd/branch-patterns.js +0 -13
- package/dist/resources/extensions/gsd/cache.js +0 -27
- package/dist/resources/extensions/gsd/captures.js +0 -414
- package/dist/resources/extensions/gsd/changelog.js +0 -162
- package/dist/resources/extensions/gsd/claude-import.js +0 -591
- package/dist/resources/extensions/gsd/collision-diagnostics.js +0 -226
- package/dist/resources/extensions/gsd/commands/catalog.js +0 -336
- package/dist/resources/extensions/gsd/commands/context.js +0 -87
- package/dist/resources/extensions/gsd/commands/dispatcher.js +0 -21
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +0 -175
- package/dist/resources/extensions/gsd/commands/handlers/core.js +0 -249
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +0 -207
- package/dist/resources/extensions/gsd/commands/handlers/parallel.js +0 -106
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +0 -253
- package/dist/resources/extensions/gsd/commands/index.js +0 -11
- package/dist/resources/extensions/gsd/commands-bootstrap.js +0 -224
- package/dist/resources/extensions/gsd/commands-cmux.js +0 -120
- package/dist/resources/extensions/gsd/commands-config.js +0 -94
- package/dist/resources/extensions/gsd/commands-extensions.js +0 -260
- package/dist/resources/extensions/gsd/commands-handlers.js +0 -318
- package/dist/resources/extensions/gsd/commands-inspect.js +0 -77
- package/dist/resources/extensions/gsd/commands-logs.js +0 -468
- package/dist/resources/extensions/gsd/commands-maintenance.js +0 -485
- package/dist/resources/extensions/gsd/commands-mcp-status.js +0 -187
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +0 -664
- package/dist/resources/extensions/gsd/commands-rate.js +0 -31
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +0 -408
- package/dist/resources/extensions/gsd/commands.js +0 -9
- package/dist/resources/extensions/gsd/complexity-classifier.js +0 -259
- package/dist/resources/extensions/gsd/constants.js +0 -15
- package/dist/resources/extensions/gsd/context-budget.js +0 -179
- package/dist/resources/extensions/gsd/context-injector.js +0 -74
- package/dist/resources/extensions/gsd/context-store.js +0 -166
- package/dist/resources/extensions/gsd/crash-recovery.js +0 -112
- package/dist/resources/extensions/gsd/custom-execution-policy.js +0 -48
- package/dist/resources/extensions/gsd/custom-verification.js +0 -147
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +0 -165
- package/dist/resources/extensions/gsd/dashboard-overlay.js +0 -539
- package/dist/resources/extensions/gsd/db-writer.js +0 -518
- package/dist/resources/extensions/gsd/debug-logger.js +0 -161
- package/dist/resources/extensions/gsd/definition-loader.js +0 -352
- package/dist/resources/extensions/gsd/detection.js +0 -977
- package/dist/resources/extensions/gsd/dev-execution-policy.js +0 -24
- package/dist/resources/extensions/gsd/dev-workflow-engine.js +0 -82
- package/dist/resources/extensions/gsd/diff-context.js +0 -168
- package/dist/resources/extensions/gsd/dispatch-guard.js +0 -114
- package/dist/resources/extensions/gsd/docs/claude-marketplace-import.md +0 -214
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +0 -671
- package/dist/resources/extensions/gsd/doctor-checks.js +0 -5
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +0 -168
- package/dist/resources/extensions/gsd/doctor-environment.js +0 -565
- package/dist/resources/extensions/gsd/doctor-format.js +0 -86
- package/dist/resources/extensions/gsd/doctor-git-checks.js +0 -433
- package/dist/resources/extensions/gsd/doctor-global-checks.js +0 -74
- package/dist/resources/extensions/gsd/doctor-proactive.js +0 -349
- package/dist/resources/extensions/gsd/doctor-providers.js +0 -356
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +0 -601
- package/dist/resources/extensions/gsd/doctor-types.js +0 -15
- package/dist/resources/extensions/gsd/doctor.js +0 -765
- package/dist/resources/extensions/gsd/engine-resolver.js +0 -40
- package/dist/resources/extensions/gsd/engine-types.js +0 -8
- package/dist/resources/extensions/gsd/env-utils.js +0 -29
- package/dist/resources/extensions/gsd/error-classifier.js +0 -108
- package/dist/resources/extensions/gsd/error-utils.js +0 -6
- package/dist/resources/extensions/gsd/errors.js +0 -24
- package/dist/resources/extensions/gsd/execution-policy.js +0 -8
- package/dist/resources/extensions/gsd/exit-command.js +0 -22
- package/dist/resources/extensions/gsd/export-html.js +0 -1271
- package/dist/resources/extensions/gsd/export.js +0 -264
- package/dist/resources/extensions/gsd/extension-manifest.json +0 -33
- package/dist/resources/extensions/gsd/file-watcher.js +0 -80
- package/dist/resources/extensions/gsd/files.js +0 -863
- package/dist/resources/extensions/gsd/forensics.js +0 -996
- package/dist/resources/extensions/gsd/git-constants.js +0 -11
- package/dist/resources/extensions/gsd/git-self-heal.js +0 -113
- package/dist/resources/extensions/gsd/git-service.js +0 -586
- package/dist/resources/extensions/gsd/gitignore.js +0 -285
- package/dist/resources/extensions/gsd/graph.js +0 -225
- package/dist/resources/extensions/gsd/gsd-db.js +0 -1808
- package/dist/resources/extensions/gsd/guided-flow-queue.js +0 -365
- package/dist/resources/extensions/gsd/guided-flow.js +0 -1456
- package/dist/resources/extensions/gsd/health-widget-core.js +0 -89
- package/dist/resources/extensions/gsd/health-widget.js +0 -126
- package/dist/resources/extensions/gsd/history.js +0 -119
- package/dist/resources/extensions/gsd/index.js +0 -5
- package/dist/resources/extensions/gsd/init-wizard.js +0 -487
- package/dist/resources/extensions/gsd/journal.js +0 -85
- package/dist/resources/extensions/gsd/json-persistence.js +0 -70
- package/dist/resources/extensions/gsd/jsonl-utils.js +0 -24
- package/dist/resources/extensions/gsd/key-manager.js +0 -820
- package/dist/resources/extensions/gsd/markdown-renderer.js +0 -891
- package/dist/resources/extensions/gsd/marketplace-discovery.js +0 -356
- package/dist/resources/extensions/gsd/md-importer.js +0 -623
- package/dist/resources/extensions/gsd/memory-extractor.js +0 -302
- package/dist/resources/extensions/gsd/memory-store.js +0 -366
- package/dist/resources/extensions/gsd/metrics.js +0 -419
- package/dist/resources/extensions/gsd/migrate/command.js +0 -157
- package/dist/resources/extensions/gsd/migrate/index.js +0 -7
- package/dist/resources/extensions/gsd/migrate/parser.js +0 -268
- package/dist/resources/extensions/gsd/migrate/parsers.js +0 -477
- package/dist/resources/extensions/gsd/migrate/preview.js +0 -47
- package/dist/resources/extensions/gsd/migrate/transformer.js +0 -278
- package/dist/resources/extensions/gsd/migrate/types.js +0 -4
- package/dist/resources/extensions/gsd/migrate/validator.js +0 -41
- package/dist/resources/extensions/gsd/migrate/writer.js +0 -477
- package/dist/resources/extensions/gsd/migrate-external.js +0 -207
- package/dist/resources/extensions/gsd/milestone-actions.js +0 -130
- package/dist/resources/extensions/gsd/milestone-id-utils.js +0 -28
- package/dist/resources/extensions/gsd/milestone-ids.js +0 -116
- package/dist/resources/extensions/gsd/milestone-validation-gates.js +0 -45
- package/dist/resources/extensions/gsd/model-cost-table.js +0 -66
- package/dist/resources/extensions/gsd/model-router.js +0 -246
- package/dist/resources/extensions/gsd/namespaced-registry.js +0 -322
- package/dist/resources/extensions/gsd/namespaced-resolver.js +0 -176
- package/dist/resources/extensions/gsd/native-git-bridge.js +0 -992
- package/dist/resources/extensions/gsd/native-parser-bridge.js +0 -156
- package/dist/resources/extensions/gsd/notifications.js +0 -105
- package/dist/resources/extensions/gsd/observability-validator.js +0 -422
- package/dist/resources/extensions/gsd/package.json +0 -11
- package/dist/resources/extensions/gsd/parallel-eligibility.js +0 -188
- package/dist/resources/extensions/gsd/parallel-merge.js +0 -194
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +0 -413
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +0 -850
- package/dist/resources/extensions/gsd/parsers-legacy.js +0 -256
- package/dist/resources/extensions/gsd/paths.js +0 -527
- package/dist/resources/extensions/gsd/plugin-importer.js +0 -254
- package/dist/resources/extensions/gsd/post-unit-hooks.js +0 -48
- package/dist/resources/extensions/gsd/preferences-models.js +0 -295
- package/dist/resources/extensions/gsd/preferences-skills.js +0 -160
- package/dist/resources/extensions/gsd/preferences-types.js +0 -82
- package/dist/resources/extensions/gsd/preferences-validation.js +0 -852
- package/dist/resources/extensions/gsd/preferences.js +0 -432
- package/dist/resources/extensions/gsd/progress-score.js +0 -121
- package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +0 -150
- package/dist/resources/extensions/gsd/prompt-loader.js +0 -156
- package/dist/resources/extensions/gsd/prompt-ordering.js +0 -170
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +0 -66
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +0 -40
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +0 -253
- package/dist/resources/extensions/gsd/prompts/discuss.md +0 -290
- package/dist/resources/extensions/gsd/prompts/doctor-heal.md +0 -29
- package/dist/resources/extensions/gsd/prompts/execute-task.md +0 -80
- package/dist/resources/extensions/gsd/prompts/forensics.md +0 -196
- package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +0 -32
- package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +0 -3
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +0 -110
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +0 -62
- package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +0 -3
- package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +0 -30
- package/dist/resources/extensions/gsd/prompts/guided-plan-slice.md +0 -3
- package/dist/resources/extensions/gsd/prompts/guided-research-slice.md +0 -15
- package/dist/resources/extensions/gsd/prompts/guided-resume-task.md +0 -1
- package/dist/resources/extensions/gsd/prompts/heal-skill.md +0 -45
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +0 -108
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +0 -89
- package/dist/resources/extensions/gsd/prompts/queue.md +0 -132
- package/dist/resources/extensions/gsd/prompts/quick-task.md +0 -44
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +0 -44
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +0 -66
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +0 -39
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +0 -47
- package/dist/resources/extensions/gsd/prompts/research-slice.md +0 -57
- package/dist/resources/extensions/gsd/prompts/rethink.md +0 -83
- package/dist/resources/extensions/gsd/prompts/review-migration.md +0 -66
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +0 -31
- package/dist/resources/extensions/gsd/prompts/run-uat.md +0 -89
- package/dist/resources/extensions/gsd/prompts/system.md +0 -220
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +0 -63
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +0 -47
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +0 -28
- package/dist/resources/extensions/gsd/prompts/worktree-merge.md +0 -123
- package/dist/resources/extensions/gsd/provider-error-pause.js +0 -31
- package/dist/resources/extensions/gsd/queue-order.js +0 -178
- package/dist/resources/extensions/gsd/queue-reorder-ui.js +0 -235
- package/dist/resources/extensions/gsd/quick.js +0 -206
- package/dist/resources/extensions/gsd/reactive-graph.js +0 -257
- package/dist/resources/extensions/gsd/repo-identity.js +0 -641
- package/dist/resources/extensions/gsd/reports.js +0 -409
- package/dist/resources/extensions/gsd/rethink.js +0 -120
- package/dist/resources/extensions/gsd/roadmap-mutations.js +0 -110
- package/dist/resources/extensions/gsd/roadmap-slices.js +0 -255
- package/dist/resources/extensions/gsd/routing-history.js +0 -210
- package/dist/resources/extensions/gsd/rtk-status.js +0 -43
- package/dist/resources/extensions/gsd/rule-registry.js +0 -488
- package/dist/resources/extensions/gsd/rule-types.js +0 -6
- package/dist/resources/extensions/gsd/run-manager.js +0 -134
- package/dist/resources/extensions/gsd/safe-fs.js +0 -52
- package/dist/resources/extensions/gsd/service-tier.js +0 -158
- package/dist/resources/extensions/gsd/session-forensics.js +0 -435
- package/dist/resources/extensions/gsd/session-lock.js +0 -554
- package/dist/resources/extensions/gsd/session-status-io.js +0 -134
- package/dist/resources/extensions/gsd/skill-catalog.js +0 -1026
- package/dist/resources/extensions/gsd/skill-discovery.js +0 -122
- package/dist/resources/extensions/gsd/skill-health.js +0 -326
- package/dist/resources/extensions/gsd/skill-telemetry.js +0 -121
- package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +0 -242
- package/dist/resources/extensions/gsd/skills/gsd-headless/references/answer-injection.md +0 -83
- package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +0 -64
- package/dist/resources/extensions/gsd/skills/gsd-headless/references/multi-session.md +0 -176
- package/dist/resources/extensions/gsd/state.js +0 -1407
- package/dist/resources/extensions/gsd/status-guards.js +0 -12
- package/dist/resources/extensions/gsd/structured-data-formatter.js +0 -98
- package/dist/resources/extensions/gsd/sync-lock.js +0 -89
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +0 -80
- package/dist/resources/extensions/gsd/templates/context.md +0 -76
- package/dist/resources/extensions/gsd/templates/decisions.md +0 -8
- package/dist/resources/extensions/gsd/templates/knowledge.md +0 -19
- package/dist/resources/extensions/gsd/templates/milestone-summary.md +0 -81
- package/dist/resources/extensions/gsd/templates/milestone-validation.md +0 -74
- package/dist/resources/extensions/gsd/templates/plan.md +0 -148
- package/dist/resources/extensions/gsd/templates/project.md +0 -31
- package/dist/resources/extensions/gsd/templates/reassessment.md +0 -29
- package/dist/resources/extensions/gsd/templates/requirements.md +0 -81
- package/dist/resources/extensions/gsd/templates/research.md +0 -79
- package/dist/resources/extensions/gsd/templates/roadmap.md +0 -131
- package/dist/resources/extensions/gsd/templates/runtime.md +0 -21
- package/dist/resources/extensions/gsd/templates/secrets-manifest.md +0 -22
- package/dist/resources/extensions/gsd/templates/slice-context.md +0 -58
- package/dist/resources/extensions/gsd/templates/slice-summary.md +0 -108
- package/dist/resources/extensions/gsd/templates/state.md +0 -17
- package/dist/resources/extensions/gsd/templates/task-plan.md +0 -87
- package/dist/resources/extensions/gsd/templates/task-summary.md +0 -66
- package/dist/resources/extensions/gsd/templates/uat.md +0 -54
- package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +0 -53
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +0 -112
- package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +0 -23
- package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +0 -5
- package/dist/resources/extensions/gsd/token-counter.js +0 -54
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +0 -172
- package/dist/resources/extensions/gsd/tools/complete-slice.js +0 -276
- package/dist/resources/extensions/gsd/tools/complete-task.js +0 -205
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +0 -250
- package/dist/resources/extensions/gsd/tools/plan-slice.js +0 -199
- package/dist/resources/extensions/gsd/tools/plan-task.js +0 -121
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +0 -219
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +0 -87
- package/dist/resources/extensions/gsd/tools/reopen-task.js +0 -91
- package/dist/resources/extensions/gsd/tools/replan-slice.js +0 -188
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +0 -110
- package/dist/resources/extensions/gsd/triage-resolution.js +0 -322
- package/dist/resources/extensions/gsd/triage-ui.js +0 -135
- package/dist/resources/extensions/gsd/types.js +0 -4
- package/dist/resources/extensions/gsd/undo.js +0 -400
- package/dist/resources/extensions/gsd/unit-id.js +0 -7
- package/dist/resources/extensions/gsd/unit-ownership.js +0 -216
- package/dist/resources/extensions/gsd/unit-runtime.js +0 -132
- package/dist/resources/extensions/gsd/validate-directory.js +0 -143
- package/dist/resources/extensions/gsd/validation.js +0 -21
- package/dist/resources/extensions/gsd/verdict-parser.js +0 -96
- package/dist/resources/extensions/gsd/verification-evidence.js +0 -122
- package/dist/resources/extensions/gsd/verification-gate.js +0 -519
- package/dist/resources/extensions/gsd/visualizer-data.js +0 -674
- package/dist/resources/extensions/gsd/visualizer-overlay.js +0 -501
- package/dist/resources/extensions/gsd/visualizer-views.js +0 -945
- package/dist/resources/extensions/gsd/workflow-engine.js +0 -7
- package/dist/resources/extensions/gsd/workflow-events.js +0 -102
- package/dist/resources/extensions/gsd/workflow-logger.js +0 -192
- package/dist/resources/extensions/gsd/workflow-manifest.js +0 -263
- package/dist/resources/extensions/gsd/workflow-migration.js +0 -280
- package/dist/resources/extensions/gsd/workflow-projections.js +0 -405
- package/dist/resources/extensions/gsd/workflow-reconcile.js +0 -441
- package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +0 -87
- package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +0 -74
- package/dist/resources/extensions/gsd/workflow-templates/full-project.md +0 -40
- package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +0 -45
- package/dist/resources/extensions/gsd/workflow-templates/refactor.md +0 -83
- package/dist/resources/extensions/gsd/workflow-templates/registry.json +0 -85
- package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +0 -73
- package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +0 -81
- package/dist/resources/extensions/gsd/workflow-templates/spike.md +0 -69
- package/dist/resources/extensions/gsd/workflow-templates.js +0 -200
- package/dist/resources/extensions/gsd/workspace-index.js +0 -190
- package/dist/resources/extensions/gsd/worktree-command-bootstrap.js +0 -40
- package/dist/resources/extensions/gsd/worktree-command.js +0 -702
- package/dist/resources/extensions/gsd/worktree-health.js +0 -126
- package/dist/resources/extensions/gsd/worktree-manager.js +0 -518
- package/dist/resources/extensions/gsd/worktree-resolver.js +0 -480
- package/dist/resources/extensions/gsd/worktree.js +0 -310
- package/dist/resources/extensions/gsd/write-intercept.js +0 -84
- package/src/resources/extensions/github-sync/cli.ts +0 -364
- package/src/resources/extensions/github-sync/index.ts +0 -93
- package/src/resources/extensions/github-sync/mapping.ts +0 -81
- package/src/resources/extensions/github-sync/sync.ts +0 -557
- package/src/resources/extensions/github-sync/templates.ts +0 -183
- package/src/resources/extensions/github-sync/tests/cli.test.ts +0 -20
- package/src/resources/extensions/github-sync/tests/commit-linking.test.ts +0 -43
- package/src/resources/extensions/github-sync/tests/mapping.test.ts +0 -104
- package/src/resources/extensions/github-sync/tests/templates.test.ts +0 -110
- package/src/resources/extensions/github-sync/types.ts +0 -47
- package/src/resources/extensions/gsd/activity-log.ts +0 -163
- package/src/resources/extensions/gsd/atomic-write.ts +0 -185
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +0 -60
- package/src/resources/extensions/gsd/auto/infra-errors.ts +0 -48
- package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -268
- package/src/resources/extensions/gsd/auto/loop.ts +0 -318
- package/src/resources/extensions/gsd/auto/phases.ts +0 -1327
- package/src/resources/extensions/gsd/auto/resolve.ts +0 -106
- package/src/resources/extensions/gsd/auto/run-unit.ts +0 -136
- package/src/resources/extensions/gsd/auto/session.ts +0 -237
- package/src/resources/extensions/gsd/auto/types.ts +0 -117
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +0 -135
- package/src/resources/extensions/gsd/auto-budget.ts +0 -32
- package/src/resources/extensions/gsd/auto-dashboard.ts +0 -880
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +0 -256
- package/src/resources/extensions/gsd/auto-dispatch.ts +0 -781
- package/src/resources/extensions/gsd/auto-loop.ts +0 -16
- package/src/resources/extensions/gsd/auto-model-selection.ts +0 -251
- package/src/resources/extensions/gsd/auto-observability.ts +0 -72
- package/src/resources/extensions/gsd/auto-post-unit.ts +0 -687
- package/src/resources/extensions/gsd/auto-prompts.ts +0 -1896
- package/src/resources/extensions/gsd/auto-recovery.ts +0 -594
- package/src/resources/extensions/gsd/auto-start.ts +0 -737
- package/src/resources/extensions/gsd/auto-supervisor.ts +0 -79
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +0 -262
- package/src/resources/extensions/gsd/auto-timers.ts +0 -313
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +0 -85
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +0 -48
- package/src/resources/extensions/gsd/auto-utils.ts +0 -25
- package/src/resources/extensions/gsd/auto-verification.ts +0 -225
- package/src/resources/extensions/gsd/auto-worktree.ts +0 -1897
- package/src/resources/extensions/gsd/auto.ts +0 -1477
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +0 -219
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +0 -1286
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +0 -194
- package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +0 -62
- package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +0 -53
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +0 -61
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +0 -282
- package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +0 -56
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +0 -416
- package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +0 -91
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +0 -126
- package/src/resources/extensions/gsd/branch-patterns.ts +0 -16
- package/src/resources/extensions/gsd/cache.ts +0 -29
- package/src/resources/extensions/gsd/captures.ts +0 -502
- package/src/resources/extensions/gsd/changelog.ts +0 -213
- package/src/resources/extensions/gsd/claude-import.ts +0 -705
- package/src/resources/extensions/gsd/collision-diagnostics.ts +0 -332
- package/src/resources/extensions/gsd/commands/catalog.ts +0 -359
- package/src/resources/extensions/gsd/commands/context.ts +0 -108
- package/src/resources/extensions/gsd/commands/dispatcher.ts +0 -32
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +0 -184
- package/src/resources/extensions/gsd/commands/handlers/core.ts +0 -277
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +0 -210
- package/src/resources/extensions/gsd/commands/handlers/parallel.ts +0 -135
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +0 -281
- package/src/resources/extensions/gsd/commands/index.ts +0 -14
- package/src/resources/extensions/gsd/commands-bootstrap.ts +0 -253
- package/src/resources/extensions/gsd/commands-cmux.ts +0 -143
- package/src/resources/extensions/gsd/commands-config.ts +0 -108
- package/src/resources/extensions/gsd/commands-extensions.ts +0 -330
- package/src/resources/extensions/gsd/commands-handlers.ts +0 -404
- package/src/resources/extensions/gsd/commands-inspect.ts +0 -98
- package/src/resources/extensions/gsd/commands-logs.ts +0 -536
- package/src/resources/extensions/gsd/commands-maintenance.ts +0 -535
- package/src/resources/extensions/gsd/commands-mcp-status.ts +0 -247
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +0 -784
- package/src/resources/extensions/gsd/commands-rate.ts +0 -55
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +0 -543
- package/src/resources/extensions/gsd/commands.ts +0 -17
- package/src/resources/extensions/gsd/complexity-classifier.ts +0 -322
- package/src/resources/extensions/gsd/constants.ts +0 -21
- package/src/resources/extensions/gsd/context-budget.ts +0 -256
- package/src/resources/extensions/gsd/context-injector.ts +0 -100
- package/src/resources/extensions/gsd/context-store.ts +0 -196
- package/src/resources/extensions/gsd/crash-recovery.ts +0 -120
- package/src/resources/extensions/gsd/custom-execution-policy.ts +0 -74
- package/src/resources/extensions/gsd/custom-verification.ts +0 -182
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +0 -217
- package/src/resources/extensions/gsd/dashboard-overlay.ts +0 -659
- package/src/resources/extensions/gsd/db-writer.ts +0 -612
- package/src/resources/extensions/gsd/debug-logger.ts +0 -178
- package/src/resources/extensions/gsd/definition-loader.ts +0 -462
- package/src/resources/extensions/gsd/detection.ts +0 -1148
- package/src/resources/extensions/gsd/dev-execution-policy.ts +0 -51
- package/src/resources/extensions/gsd/dev-workflow-engine.ts +0 -110
- package/src/resources/extensions/gsd/diff-context.ts +0 -214
- package/src/resources/extensions/gsd/dispatch-guard.ts +0 -120
- package/src/resources/extensions/gsd/docs/claude-marketplace-import.md +0 -214
- package/src/resources/extensions/gsd/docs/preferences-reference.md +0 -671
- package/src/resources/extensions/gsd/doctor-checks.ts +0 -5
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +0 -182
- package/src/resources/extensions/gsd/doctor-environment.ts +0 -642
- package/src/resources/extensions/gsd/doctor-format.ts +0 -98
- package/src/resources/extensions/gsd/doctor-git-checks.ts +0 -441
- package/src/resources/extensions/gsd/doctor-global-checks.ts +0 -84
- package/src/resources/extensions/gsd/doctor-proactive.ts +0 -431
- package/src/resources/extensions/gsd/doctor-providers.ts +0 -415
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +0 -627
- package/src/resources/extensions/gsd/doctor-types.ts +0 -123
- package/src/resources/extensions/gsd/doctor.ts +0 -808
- package/src/resources/extensions/gsd/engine-resolver.ts +0 -57
- package/src/resources/extensions/gsd/engine-types.ts +0 -71
- package/src/resources/extensions/gsd/env-utils.ts +0 -31
- package/src/resources/extensions/gsd/error-classifier.ts +0 -142
- package/src/resources/extensions/gsd/error-utils.ts +0 -6
- package/src/resources/extensions/gsd/errors.ts +0 -29
- package/src/resources/extensions/gsd/execution-policy.ts +0 -43
- package/src/resources/extensions/gsd/exit-command.ts +0 -30
- package/src/resources/extensions/gsd/export-html.ts +0 -1408
- package/src/resources/extensions/gsd/export.ts +0 -310
- package/src/resources/extensions/gsd/extension-manifest.json +0 -33
- package/src/resources/extensions/gsd/file-watcher.ts +0 -100
- package/src/resources/extensions/gsd/files.ts +0 -971
- package/src/resources/extensions/gsd/forensics.ts +0 -1178
- package/src/resources/extensions/gsd/git-constants.ts +0 -12
- package/src/resources/extensions/gsd/git-self-heal.ts +0 -127
- package/src/resources/extensions/gsd/git-service.ts +0 -755
- package/src/resources/extensions/gsd/gitignore.ts +0 -315
- package/src/resources/extensions/gsd/graph.ts +0 -312
- package/src/resources/extensions/gsd/gsd-db.ts +0 -2205
- package/src/resources/extensions/gsd/guided-flow-queue.ts +0 -439
- package/src/resources/extensions/gsd/guided-flow.ts +0 -1666
- package/src/resources/extensions/gsd/health-widget-core.ts +0 -111
- package/src/resources/extensions/gsd/health-widget.ts +0 -143
- package/src/resources/extensions/gsd/history.ts +0 -144
- package/src/resources/extensions/gsd/index.ts +0 -14
- package/src/resources/extensions/gsd/init-wizard.ts +0 -595
- package/src/resources/extensions/gsd/journal.ts +0 -139
- package/src/resources/extensions/gsd/json-persistence.ts +0 -75
- package/src/resources/extensions/gsd/jsonl-utils.ts +0 -21
- package/src/resources/extensions/gsd/key-manager.ts +0 -987
- package/src/resources/extensions/gsd/markdown-renderer.ts +0 -1132
- package/src/resources/extensions/gsd/marketplace-discovery.ts +0 -508
- package/src/resources/extensions/gsd/md-importer.ts +0 -742
- package/src/resources/extensions/gsd/memory-extractor.ts +0 -360
- package/src/resources/extensions/gsd/memory-store.ts +0 -452
- package/src/resources/extensions/gsd/metrics.ts +0 -575
- package/src/resources/extensions/gsd/migrate/command.ts +0 -219
- package/src/resources/extensions/gsd/migrate/index.ts +0 -42
- package/src/resources/extensions/gsd/migrate/parser.ts +0 -323
- package/src/resources/extensions/gsd/migrate/parsers.ts +0 -539
- package/src/resources/extensions/gsd/migrate/preview.ts +0 -48
- package/src/resources/extensions/gsd/migrate/transformer.ts +0 -346
- package/src/resources/extensions/gsd/migrate/types.ts +0 -370
- package/src/resources/extensions/gsd/migrate/validator.ts +0 -55
- package/src/resources/extensions/gsd/migrate/writer.ts +0 -579
- package/src/resources/extensions/gsd/migrate-external.ts +0 -210
- package/src/resources/extensions/gsd/milestone-actions.ts +0 -143
- package/src/resources/extensions/gsd/milestone-id-utils.ts +0 -32
- package/src/resources/extensions/gsd/milestone-ids.ts +0 -135
- package/src/resources/extensions/gsd/milestone-validation-gates.ts +0 -56
- package/src/resources/extensions/gsd/model-cost-table.ts +0 -84
- package/src/resources/extensions/gsd/model-router.ts +0 -315
- package/src/resources/extensions/gsd/namespaced-registry.ts +0 -467
- package/src/resources/extensions/gsd/namespaced-resolver.ts +0 -307
- package/src/resources/extensions/gsd/native-git-bridge.ts +0 -1197
- package/src/resources/extensions/gsd/native-parser-bridge.ts +0 -267
- package/src/resources/extensions/gsd/notifications.ts +0 -135
- package/src/resources/extensions/gsd/observability-validator.ts +0 -456
- package/src/resources/extensions/gsd/package.json +0 -11
- package/src/resources/extensions/gsd/parallel-eligibility.ts +0 -242
- package/src/resources/extensions/gsd/parallel-merge.ts +0 -240
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +0 -497
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +0 -1013
- package/src/resources/extensions/gsd/parsers-legacy.ts +0 -290
- package/src/resources/extensions/gsd/paths.ts +0 -561
- package/src/resources/extensions/gsd/plugin-importer.ts +0 -411
- package/src/resources/extensions/gsd/post-unit-hooks.ts +0 -86
- package/src/resources/extensions/gsd/preferences-models.ts +0 -330
- package/src/resources/extensions/gsd/preferences-skills.ts +0 -175
- package/src/resources/extensions/gsd/preferences-types.ts +0 -285
- package/src/resources/extensions/gsd/preferences-validation.ts +0 -823
- package/src/resources/extensions/gsd/preferences.ts +0 -539
- package/src/resources/extensions/gsd/progress-score.ts +0 -161
- package/src/resources/extensions/gsd/prompt-cache-optimizer.ts +0 -213
- package/src/resources/extensions/gsd/prompt-loader.ts +0 -169
- package/src/resources/extensions/gsd/prompt-ordering.ts +0 -200
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +0 -66
- package/src/resources/extensions/gsd/prompts/complete-slice.md +0 -40
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +0 -253
- package/src/resources/extensions/gsd/prompts/discuss.md +0 -290
- package/src/resources/extensions/gsd/prompts/doctor-heal.md +0 -29
- package/src/resources/extensions/gsd/prompts/execute-task.md +0 -80
- package/src/resources/extensions/gsd/prompts/forensics.md +0 -196
- package/src/resources/extensions/gsd/prompts/gate-evaluate.md +0 -32
- package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +0 -3
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +0 -110
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +0 -62
- package/src/resources/extensions/gsd/prompts/guided-execute-task.md +0 -3
- package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +0 -30
- package/src/resources/extensions/gsd/prompts/guided-plan-slice.md +0 -3
- package/src/resources/extensions/gsd/prompts/guided-research-slice.md +0 -15
- package/src/resources/extensions/gsd/prompts/guided-resume-task.md +0 -1
- package/src/resources/extensions/gsd/prompts/heal-skill.md +0 -45
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +0 -108
- package/src/resources/extensions/gsd/prompts/plan-slice.md +0 -89
- package/src/resources/extensions/gsd/prompts/queue.md +0 -132
- package/src/resources/extensions/gsd/prompts/quick-task.md +0 -44
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +0 -44
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +0 -66
- package/src/resources/extensions/gsd/prompts/replan-slice.md +0 -39
- package/src/resources/extensions/gsd/prompts/research-milestone.md +0 -47
- package/src/resources/extensions/gsd/prompts/research-slice.md +0 -57
- package/src/resources/extensions/gsd/prompts/rethink.md +0 -83
- package/src/resources/extensions/gsd/prompts/review-migration.md +0 -66
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +0 -31
- package/src/resources/extensions/gsd/prompts/run-uat.md +0 -89
- package/src/resources/extensions/gsd/prompts/system.md +0 -220
- package/src/resources/extensions/gsd/prompts/triage-captures.md +0 -63
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +0 -47
- package/src/resources/extensions/gsd/prompts/workflow-start.md +0 -28
- package/src/resources/extensions/gsd/prompts/worktree-merge.md +0 -123
- package/src/resources/extensions/gsd/provider-error-pause.ts +0 -49
- package/src/resources/extensions/gsd/queue-order.ts +0 -230
- package/src/resources/extensions/gsd/queue-reorder-ui.ts +0 -277
- package/src/resources/extensions/gsd/quick.ts +0 -257
- package/src/resources/extensions/gsd/reactive-graph.ts +0 -319
- package/src/resources/extensions/gsd/repo-identity.ts +0 -657
- package/src/resources/extensions/gsd/reports.ts +0 -504
- package/src/resources/extensions/gsd/rethink.ts +0 -160
- package/src/resources/extensions/gsd/roadmap-mutations.ts +0 -134
- package/src/resources/extensions/gsd/roadmap-slices.ts +0 -273
- package/src/resources/extensions/gsd/routing-history.ts +0 -286
- package/src/resources/extensions/gsd/rtk-status.ts +0 -53
- package/src/resources/extensions/gsd/rule-registry.ts +0 -598
- package/src/resources/extensions/gsd/rule-types.ts +0 -68
- package/src/resources/extensions/gsd/run-manager.ts +0 -180
- package/src/resources/extensions/gsd/safe-fs.ts +0 -47
- package/src/resources/extensions/gsd/service-tier.ts +0 -196
- package/src/resources/extensions/gsd/session-forensics.ts +0 -546
- package/src/resources/extensions/gsd/session-lock.ts +0 -640
- package/src/resources/extensions/gsd/session-status-io.ts +0 -179
- package/src/resources/extensions/gsd/skill-catalog.ts +0 -1085
- package/src/resources/extensions/gsd/skill-discovery.ts +0 -140
- package/src/resources/extensions/gsd/skill-health.ts +0 -418
- package/src/resources/extensions/gsd/skill-telemetry.ts +0 -137
- package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +0 -242
- package/src/resources/extensions/gsd/skills/gsd-headless/references/answer-injection.md +0 -83
- package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +0 -64
- package/src/resources/extensions/gsd/skills/gsd-headless/references/multi-session.md +0 -176
- package/src/resources/extensions/gsd/state.ts +0 -1554
- package/src/resources/extensions/gsd/status-guards.ts +0 -13
- package/src/resources/extensions/gsd/structured-data-formatter.ts +0 -146
- package/src/resources/extensions/gsd/sync-lock.ts +0 -94
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +0 -80
- package/src/resources/extensions/gsd/templates/context.md +0 -76
- package/src/resources/extensions/gsd/templates/decisions.md +0 -8
- package/src/resources/extensions/gsd/templates/knowledge.md +0 -19
- package/src/resources/extensions/gsd/templates/milestone-summary.md +0 -81
- package/src/resources/extensions/gsd/templates/milestone-validation.md +0 -74
- package/src/resources/extensions/gsd/templates/plan.md +0 -148
- package/src/resources/extensions/gsd/templates/project.md +0 -31
- package/src/resources/extensions/gsd/templates/reassessment.md +0 -29
- package/src/resources/extensions/gsd/templates/requirements.md +0 -81
- package/src/resources/extensions/gsd/templates/research.md +0 -79
- package/src/resources/extensions/gsd/templates/roadmap.md +0 -131
- package/src/resources/extensions/gsd/templates/runtime.md +0 -21
- package/src/resources/extensions/gsd/templates/secrets-manifest.md +0 -22
- package/src/resources/extensions/gsd/templates/slice-context.md +0 -58
- package/src/resources/extensions/gsd/templates/slice-summary.md +0 -108
- package/src/resources/extensions/gsd/templates/state.md +0 -17
- package/src/resources/extensions/gsd/templates/task-plan.md +0 -87
- package/src/resources/extensions/gsd/templates/task-summary.md +0 -66
- package/src/resources/extensions/gsd/templates/uat.md +0 -54
- package/src/resources/extensions/gsd/tests/active-milestone-id-guard.test.ts +0 -91
- package/src/resources/extensions/gsd/tests/activity-log.test.ts +0 -175
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +0 -143
- package/src/resources/extensions/gsd/tests/atomic-write.test.ts +0 -144
- package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +0 -50
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +0 -211
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +0 -213
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +0 -2307
- package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +0 -61
- package/src/resources/extensions/gsd/tests/auto-mode-interactive-guard.test.ts +0 -71
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +0 -209
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +0 -129
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +0 -88
- package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +0 -255
- package/src/resources/extensions/gsd/tests/auto-stale-lock-self-kill.test.ts +0 -87
- package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +0 -37
- package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +0 -28
- package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +0 -218
- package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +0 -53
- package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +0 -80
- package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +0 -83
- package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -133
- package/src/resources/extensions/gsd/tests/budget-prediction.test.ts +0 -220
- package/src/resources/extensions/gsd/tests/bundled-workflow-defs.test.ts +0 -180
- package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +0 -294
- package/src/resources/extensions/gsd/tests/captures.test.ts +0 -524
- package/src/resources/extensions/gsd/tests/claude-import-marketplace-discovery.test.ts +0 -191
- package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +0 -350
- package/src/resources/extensions/gsd/tests/cli-provider-rate-limit.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/cmux.test.ts +0 -215
- package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +0 -506
- package/src/resources/extensions/gsd/tests/collision-diagnostics.test.ts +0 -705
- package/src/resources/extensions/gsd/tests/commands-config.test.ts +0 -24
- package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +0 -46
- package/src/resources/extensions/gsd/tests/commands-logs.test.ts +0 -241
- package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +0 -283
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +0 -311
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +0 -432
- package/src/resources/extensions/gsd/tests/complete-task-rollback-evidence.test.ts +0 -106
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +0 -454
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +0 -111
- package/src/resources/extensions/gsd/tests/completion-hierarchy-guards.test.ts +0 -192
- package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +0 -181
- package/src/resources/extensions/gsd/tests/context-budget.test.ts +0 -352
- package/src/resources/extensions/gsd/tests/context-injector.test.ts +0 -313
- package/src/resources/extensions/gsd/tests/context-store.test.ts +0 -454
- package/src/resources/extensions/gsd/tests/cost-projection.test.ts +0 -120
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +0 -122
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -535
- package/src/resources/extensions/gsd/tests/custom-verification.test.ts +0 -415
- package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +0 -339
- package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +0 -329
- package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +0 -87
- package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +0 -131
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +0 -656
- package/src/resources/extensions/gsd/tests/debug-logger.test.ts +0 -185
- package/src/resources/extensions/gsd/tests/definition-loader.test.ts +0 -762
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +0 -512
- package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +0 -121
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +0 -1127
- package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +0 -641
- package/src/resources/extensions/gsd/tests/derive-state-draft.test.ts +0 -310
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +0 -982
- package/src/resources/extensions/gsd/tests/detection.test.ts +0 -1190
- package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +0 -314
- package/src/resources/extensions/gsd/tests/diff-context.test.ts +0 -136
- package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +0 -127
- package/src/resources/extensions/gsd/tests/discuss-prompt.test.ts +0 -15
- package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +0 -281
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +0 -265
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +0 -126
- package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +0 -172
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +0 -112
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +0 -603
- package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +0 -97
- package/src/resources/extensions/gsd/tests/draft-promotion.test.ts +0 -169
- package/src/resources/extensions/gsd/tests/dynamic-routing-default.test.ts +0 -20
- package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +0 -74
- package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +0 -271
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +0 -164
- package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +0 -120
- package/src/resources/extensions/gsd/tests/event-replay-idempotency.test.ts +0 -140
- package/src/resources/extensions/gsd/tests/exit-command.test.ts +0 -101
- package/src/resources/extensions/gsd/tests/export-html-all.test.ts +0 -105
- package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +0 -379
- package/src/resources/extensions/gsd/tests/extension-selector-separator.test.ts +0 -144
- package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +0 -18
- package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +0 -278
- package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -129
- package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
- package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -79
- package/src/resources/extensions/gsd/tests/forensics-error-filter.test.ts +0 -121
- package/src/resources/extensions/gsd/tests/forensics-issue-routing.test.ts +0 -43
- package/src/resources/extensions/gsd/tests/forensics-journal.test.ts +0 -162
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +0 -232
- package/src/resources/extensions/gsd/tests/gate-dispatch.test.ts +0 -189
- package/src/resources/extensions/gsd/tests/gate-storage.test.ts +0 -156
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +0 -593
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +0 -351
- package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +0 -114
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +0 -440
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +0 -406
- package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +0 -164
- package/src/resources/extensions/gsd/tests/guided-flow-dynamic-routing.test.ts +0 -135
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +0 -97
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +0 -340
- package/src/resources/extensions/gsd/tests/headless-query.test.ts +0 -184
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +0 -179
- package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +0 -107
- package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +0 -98
- package/src/resources/extensions/gsd/tests/idle-watchdog-stall-override.test.ts +0 -125
- package/src/resources/extensions/gsd/tests/in-flight-tool-tracking.test.ts +0 -32
- package/src/resources/extensions/gsd/tests/infra-error.test.ts +0 -129
- package/src/resources/extensions/gsd/tests/init-wizard.test.ts +0 -195
- package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +0 -248
- package/src/resources/extensions/gsd/tests/integration/atomic-task-closeout.test.ts +0 -72
- package/src/resources/extensions/gsd/tests/integration/auto-preflight.test.ts +0 -38
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +0 -825
- package/src/resources/extensions/gsd/tests/integration/auto-secrets-gate.test.ts +0 -194
- package/src/resources/extensions/gsd/tests/integration/auto-stash-merge.test.ts +0 -121
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +0 -759
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +0 -348
- package/src/resources/extensions/gsd/tests/integration/continue-here.test.ts +0 -281
- package/src/resources/extensions/gsd/tests/integration/doctor-completion-deferral.test.ts +0 -88
- package/src/resources/extensions/gsd/tests/integration/doctor-delimiter-fix.test.ts +0 -83
- package/src/resources/extensions/gsd/tests/integration/doctor-enhancements.test.ts +0 -243
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-worktree.test.ts +0 -164
- package/src/resources/extensions/gsd/tests/integration/doctor-environment.test.ts +0 -403
- package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +0 -243
- package/src/resources/extensions/gsd/tests/integration/doctor-fixlevel.test.ts +0 -212
- package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +0 -653
- package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +0 -325
- package/src/resources/extensions/gsd/tests/integration/doctor-roadmap-summary-atomicity.test.ts +0 -123
- package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +0 -377
- package/src/resources/extensions/gsd/tests/integration/doctor.test.ts +0 -612
- package/src/resources/extensions/gsd/tests/integration/e2e-workflow-pipeline-integration.test.ts +0 -476
- package/src/resources/extensions/gsd/tests/integration/feature-branch-lifecycle-integration.test.ts +0 -415
- package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +0 -119
- package/src/resources/extensions/gsd/tests/integration/git-self-heal.test.ts +0 -131
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +0 -1458
- package/src/resources/extensions/gsd/tests/integration/gitignore-staging-2570.test.ts +0 -150
- package/src/resources/extensions/gsd/tests/integration/gitignore-tracked-gsd.test.ts +0 -256
- package/src/resources/extensions/gsd/tests/integration/headless-command.ts +0 -534
- package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +0 -359
- package/src/resources/extensions/gsd/tests/integration/inherited-repo-home-dir.test.ts +0 -191
- package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +0 -266
- package/src/resources/extensions/gsd/tests/integration/integration-mixed-milestones.test.ts +0 -539
- package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +0 -634
- package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +0 -360
- package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -166
- package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +0 -577
- package/src/resources/extensions/gsd/tests/integration/parallel-workers-multi-milestone-e2e.test.ts +0 -337
- package/src/resources/extensions/gsd/tests/integration/paths.test.ts +0 -98
- package/src/resources/extensions/gsd/tests/integration/plugin-importer-live.test.ts +0 -481
- package/src/resources/extensions/gsd/tests/integration/queue-completed-milestone-perf.test.ts +0 -155
- package/src/resources/extensions/gsd/tests/integration/queue-reorder-e2e.test.ts +0 -335
- package/src/resources/extensions/gsd/tests/integration/quick-branch-lifecycle.test.ts +0 -253
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +0 -609
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +0 -959
- package/src/resources/extensions/gsd/tests/integration/token-savings.test.ts +0 -364
- package/src/resources/extensions/gsd/tests/integration/worktree-e2e.test.ts +0 -237
- package/src/resources/extensions/gsd/tests/integration-edge.test.ts +0 -223
- package/src/resources/extensions/gsd/tests/interactive-tool-idle-exemption.test.ts +0 -119
- package/src/resources/extensions/gsd/tests/iterate-engine-integration.test.ts +0 -429
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -601
- package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +0 -147
- package/src/resources/extensions/gsd/tests/journal.test.ts +0 -341
- package/src/resources/extensions/gsd/tests/json-persistence-atomic.test.ts +0 -183
- package/src/resources/extensions/gsd/tests/key-manager.test.ts +0 -429
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +0 -250
- package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +0 -15
- package/src/resources/extensions/gsd/tests/manifest-status.test.ts +0 -274
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +0 -1161
- package/src/resources/extensions/gsd/tests/marketplace-test-fixtures.ts +0 -91
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +0 -103
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +0 -416
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +0 -254
- package/src/resources/extensions/gsd/tests/memory-leak-guards.test.ts +0 -91
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +0 -332
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +0 -66
- package/src/resources/extensions/gsd/tests/metrics.test.ts +0 -384
- package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +0 -105
- package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +0 -429
- package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +0 -748
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +0 -619
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +0 -390
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +0 -295
- package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +0 -361
- package/src/resources/extensions/gsd/tests/milestone-id-reservation.test.ts +0 -73
- package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +0 -51
- package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +0 -140
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +0 -130
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +0 -103
- package/src/resources/extensions/gsd/tests/model-isolation.test.ts +0 -157
- package/src/resources/extensions/gsd/tests/model-router.test.ts +0 -272
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +0 -220
- package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +0 -278
- package/src/resources/extensions/gsd/tests/namespaced-registry.test.ts +0 -1027
- package/src/resources/extensions/gsd/tests/namespaced-resolver.test.ts +0 -671
- package/src/resources/extensions/gsd/tests/native-has-changes-cache.test.ts +0 -61
- package/src/resources/extensions/gsd/tests/next-milestone-id.test.ts +0 -23
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +0 -152
- package/src/resources/extensions/gsd/tests/notifications.test.ts +0 -134
- package/src/resources/extensions/gsd/tests/overrides.test.ts +0 -124
- package/src/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +0 -330
- package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +0 -159
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +0 -284
- package/src/resources/extensions/gsd/tests/parallel-eligibility-ghost.test.ts +0 -150
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +0 -60
- package/src/resources/extensions/gsd/tests/parallel-orchestration.test.ts +0 -736
- package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +0 -277
- package/src/resources/extensions/gsd/tests/parallel-worker-lock-contention.test.ts +0 -226
- package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +0 -199
- package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +0 -85
- package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +0 -253
- package/src/resources/extensions/gsd/tests/park-milestone.test.ts +0 -354
- package/src/resources/extensions/gsd/tests/parsers.test.ts +0 -1867
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +0 -103
- package/src/resources/extensions/gsd/tests/plan-milestone-queue-context.test.ts +0 -48
- package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +0 -70
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +0 -231
- package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -474
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +0 -298
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +0 -179
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +0 -145
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +0 -305
- package/src/resources/extensions/gsd/tests/plugin-importer.test.ts +0 -1383
- package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +0 -171
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +0 -300
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +0 -133
- package/src/resources/extensions/gsd/tests/preferences.test.ts +0 -463
- package/src/resources/extensions/gsd/tests/preflight-context-draft-filter.test.ts +0 -115
- package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +0 -297
- package/src/resources/extensions/gsd/tests/projection-regression.test.ts +0 -174
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +0 -464
- package/src/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +0 -314
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +0 -239
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +0 -387
- package/src/resources/extensions/gsd/tests/prompt-loader-replacement.test.ts +0 -178
- package/src/resources/extensions/gsd/tests/prompt-ordering.test.ts +0 -296
- package/src/resources/extensions/gsd/tests/prompt-tool-names.test.ts +0 -69
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +0 -479
- package/src/resources/extensions/gsd/tests/quality-gates.test.ts +0 -347
- package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +0 -100
- package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +0 -157
- package/src/resources/extensions/gsd/tests/queue-order.test.ts +0 -192
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +0 -100
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +0 -90
- package/src/resources/extensions/gsd/tests/rate-limit-model-fallback.test.ts +0 -90
- package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +0 -511
- package/src/resources/extensions/gsd/tests/reactive-graph.test.ts +0 -299
- package/src/resources/extensions/gsd/tests/reassess-detection.test.ts +0 -154
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +0 -442
- package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +0 -135
- package/src/resources/extensions/gsd/tests/reconciliation-edge-cases.test.ts +0 -162
- package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +0 -176
- package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +0 -281
- package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +0 -59
- package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +0 -110
- package/src/resources/extensions/gsd/tests/remote-questions.test.ts +0 -755
- package/src/resources/extensions/gsd/tests/remote-status.test.ts +0 -99
- package/src/resources/extensions/gsd/tests/reopen-slice.test.ts +0 -155
- package/src/resources/extensions/gsd/tests/reopen-task.test.ts +0 -165
- package/src/resources/extensions/gsd/tests/replan-handler.test.ts +0 -410
- package/src/resources/extensions/gsd/tests/replan-slice.test.ts +0 -606
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +0 -231
- package/src/resources/extensions/gsd/tests/requirements.test.ts +0 -101
- package/src/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +0 -23
- package/src/resources/extensions/gsd/tests/resolve-ts.mjs +0 -5
- package/src/resources/extensions/gsd/tests/retry-diagnostic-reasoning.test.ts +0 -161
- package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +0 -305
- package/src/resources/extensions/gsd/tests/rewrite-count-persist.test.ts +0 -82
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +0 -399
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +0 -395
- package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +0 -296
- package/src/resources/extensions/gsd/tests/routing-history.test.ts +0 -229
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +0 -411
- package/src/resources/extensions/gsd/tests/run-manager.test.ts +0 -229
- package/src/resources/extensions/gsd/tests/schema-v9-sequence.test.ts +0 -176
- package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +0 -319
- package/src/resources/extensions/gsd/tests/service-tier.test.ts +0 -127
- package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +0 -166
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +0 -315
- package/src/resources/extensions/gsd/tests/session-lock-transient-read.test.ts +0 -224
- package/src/resources/extensions/gsd/tests/shared-wal.test.ts +0 -209
- package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +0 -181
- package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +0 -103
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +0 -233
- package/src/resources/extensions/gsd/tests/skill-catalog.test.ts +0 -193
- package/src/resources/extensions/gsd/tests/skill-lifecycle.test.ts +0 -126
- package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +0 -233
- package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +0 -53
- package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +0 -123
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +0 -65
- package/src/resources/extensions/gsd/tests/stale-milestone-id-reservation.test.ts +0 -79
- package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +0 -139
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +0 -100
- package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +0 -125
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +0 -305
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +0 -405
- package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +0 -257
- package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +0 -1628
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +0 -30
- package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +0 -67
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +0 -106
- package/src/resources/extensions/gsd/tests/stop-auto-remote.test.ts +0 -158
- package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +0 -366
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +0 -174
- package/src/resources/extensions/gsd/tests/subagent-agent-discovery.test.ts +0 -44
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +0 -221
- package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +0 -108
- package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +0 -145
- package/src/resources/extensions/gsd/tests/sync-lock.test.ts +0 -122
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +0 -84
- package/src/resources/extensions/gsd/tests/test-utils.ts +0 -165
- package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +0 -118
- package/src/resources/extensions/gsd/tests/token-counter.test.ts +0 -129
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +0 -268
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +0 -166
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +0 -125
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +0 -345
- package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +0 -563
- package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +0 -289
- package/src/resources/extensions/gsd/tests/unborn-branch.test.ts +0 -85
- package/src/resources/extensions/gsd/tests/undo.test.ts +0 -462
- package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +0 -203
- package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +0 -258
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +0 -257
- package/src/resources/extensions/gsd/tests/update-command.test.ts +0 -67
- package/src/resources/extensions/gsd/tests/vacuous-truth-slices.test.ts +0 -115
- package/src/resources/extensions/gsd/tests/vacuum-recovery.test.ts +0 -154
- package/src/resources/extensions/gsd/tests/validate-directory.test.ts +0 -237
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +0 -115
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +0 -393
- package/src/resources/extensions/gsd/tests/validation-gate-patterns.test.ts +0 -166
- package/src/resources/extensions/gsd/tests/validation.test.ts +0 -72
- package/src/resources/extensions/gsd/tests/verdict-parser.test.ts +0 -156
- package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -601
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +0 -999
- package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +0 -82
- package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +0 -143
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +0 -444
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +0 -235
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +0 -716
- package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +0 -97
- package/src/resources/extensions/gsd/tests/worker-registry.test.ts +0 -146
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +0 -205
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +0 -403
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +0 -278
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +0 -173
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +0 -171
- package/src/resources/extensions/gsd/tests/workspace-index.test.ts +0 -38
- package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +0 -117
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +0 -202
- package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +0 -140
- package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +0 -175
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +0 -445
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +0 -142
- package/src/resources/extensions/gsd/tests/worktree-health.test.ts +0 -181
- package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +0 -200
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +0 -220
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +0 -238
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +0 -101
- package/src/resources/extensions/gsd/tests/worktree-post-create-hook.test.ts +0 -165
- package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +0 -155
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +0 -962
- package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +0 -65
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +0 -133
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +0 -617
- package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +0 -204
- package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +0 -206
- package/src/resources/extensions/gsd/tests/worktree.test.ts +0 -279
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +0 -193
- package/src/resources/extensions/gsd/tests/write-intercept.test.ts +0 -76
- package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +0 -95
- package/src/resources/extensions/gsd/token-counter.ts +0 -65
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +0 -229
- package/src/resources/extensions/gsd/tools/complete-slice.ts +0 -340
- package/src/resources/extensions/gsd/tools/complete-task.ts +0 -257
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +0 -304
- package/src/resources/extensions/gsd/tools/plan-slice.ts +0 -250
- package/src/resources/extensions/gsd/tools/plan-task.ts +0 -152
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +0 -288
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +0 -126
- package/src/resources/extensions/gsd/tools/reopen-task.ts +0 -130
- package/src/resources/extensions/gsd/tools/replan-slice.ts +0 -243
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +0 -156
- package/src/resources/extensions/gsd/triage-resolution.ts +0 -413
- package/src/resources/extensions/gsd/triage-ui.ts +0 -187
- package/src/resources/extensions/gsd/types.ts +0 -593
- package/src/resources/extensions/gsd/undo.ts +0 -464
- package/src/resources/extensions/gsd/unit-id.ts +0 -14
- package/src/resources/extensions/gsd/unit-ownership.ts +0 -275
- package/src/resources/extensions/gsd/unit-runtime.ts +0 -189
- package/src/resources/extensions/gsd/validate-directory.ts +0 -164
- package/src/resources/extensions/gsd/validation.ts +0 -23
- package/src/resources/extensions/gsd/verdict-parser.ts +0 -110
- package/src/resources/extensions/gsd/verification-evidence.ts +0 -202
- package/src/resources/extensions/gsd/verification-gate.ts +0 -634
- package/src/resources/extensions/gsd/visualizer-data.ts +0 -953
- package/src/resources/extensions/gsd/visualizer-overlay.ts +0 -566
- package/src/resources/extensions/gsd/visualizer-views.ts +0 -1229
- package/src/resources/extensions/gsd/workflow-engine.ts +0 -38
- package/src/resources/extensions/gsd/workflow-events.ts +0 -154
- package/src/resources/extensions/gsd/workflow-logger.ts +0 -244
- package/src/resources/extensions/gsd/workflow-manifest.ts +0 -351
- package/src/resources/extensions/gsd/workflow-migration.ts +0 -345
- package/src/resources/extensions/gsd/workflow-projections.ts +0 -458
- package/src/resources/extensions/gsd/workflow-reconcile.ts +0 -532
- package/src/resources/extensions/gsd/workflow-templates/bugfix.md +0 -87
- package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +0 -74
- package/src/resources/extensions/gsd/workflow-templates/full-project.md +0 -40
- package/src/resources/extensions/gsd/workflow-templates/hotfix.md +0 -45
- package/src/resources/extensions/gsd/workflow-templates/refactor.md +0 -83
- package/src/resources/extensions/gsd/workflow-templates/registry.json +0 -85
- package/src/resources/extensions/gsd/workflow-templates/security-audit.md +0 -73
- package/src/resources/extensions/gsd/workflow-templates/small-feature.md +0 -81
- package/src/resources/extensions/gsd/workflow-templates/spike.md +0 -69
- package/src/resources/extensions/gsd/workflow-templates.ts +0 -252
- package/src/resources/extensions/gsd/workspace-index.ts +0 -272
- package/src/resources/extensions/gsd/worktree-command-bootstrap.ts +0 -46
- package/src/resources/extensions/gsd/worktree-command.ts +0 -846
- package/src/resources/extensions/gsd/worktree-health.ts +0 -178
- package/src/resources/extensions/gsd/worktree-manager.ts +0 -630
- package/src/resources/extensions/gsd/worktree-resolver.ts +0 -640
- package/src/resources/extensions/gsd/worktree.ts +0 -336
- package/src/resources/extensions/gsd/write-intercept.ts +0 -90
|
@@ -1,1554 +0,0 @@
|
|
|
1
|
-
// GSD Extension — State Derivation
|
|
2
|
-
// DB-primary state derivation with filesystem fallback for unmigrated projects.
|
|
3
|
-
// Pure TypeScript, zero Pi dependencies.
|
|
4
|
-
|
|
5
|
-
import type {
|
|
6
|
-
GSDState,
|
|
7
|
-
ActiveRef,
|
|
8
|
-
Roadmap,
|
|
9
|
-
RoadmapSliceEntry,
|
|
10
|
-
SlicePlan,
|
|
11
|
-
MilestoneRegistryEntry,
|
|
12
|
-
} from './types.js';
|
|
13
|
-
|
|
14
|
-
import {
|
|
15
|
-
parseRoadmap,
|
|
16
|
-
parsePlan,
|
|
17
|
-
} from './parsers-legacy.js';
|
|
18
|
-
|
|
19
|
-
import {
|
|
20
|
-
parseSummary,
|
|
21
|
-
loadFile,
|
|
22
|
-
parseRequirementCounts,
|
|
23
|
-
parseContextDependsOn,
|
|
24
|
-
} from './files.js';
|
|
25
|
-
|
|
26
|
-
import {
|
|
27
|
-
resolveMilestonePath,
|
|
28
|
-
resolveMilestoneFile,
|
|
29
|
-
resolveSlicePath,
|
|
30
|
-
resolveSliceFile,
|
|
31
|
-
resolveTaskFile,
|
|
32
|
-
resolveTasksDir,
|
|
33
|
-
resolveGsdRootFile,
|
|
34
|
-
gsdRoot,
|
|
35
|
-
} from './paths.js';
|
|
36
|
-
|
|
37
|
-
import { findMilestoneIds } from './milestone-ids.js';
|
|
38
|
-
import { loadQueueOrder, sortByQueueOrder } from './queue-order.js';
|
|
39
|
-
import { nativeBatchParseGsdFiles, type BatchParsedFile } from './native-parser-bridge.js';
|
|
40
|
-
|
|
41
|
-
import { join, resolve } from 'path';
|
|
42
|
-
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
43
|
-
import { debugCount, debugTime } from './debug-logger.js';
|
|
44
|
-
import { extractVerdict } from './verdict-parser.js';
|
|
45
|
-
import { logWarning, logError } from './workflow-logger.js';
|
|
46
|
-
|
|
47
|
-
import {
|
|
48
|
-
isDbAvailable,
|
|
49
|
-
getAllMilestones,
|
|
50
|
-
getMilestone,
|
|
51
|
-
getMilestoneSlices,
|
|
52
|
-
getSliceTasks,
|
|
53
|
-
getReplanHistory,
|
|
54
|
-
getSlice,
|
|
55
|
-
insertMilestone,
|
|
56
|
-
insertSlice,
|
|
57
|
-
updateTaskStatus,
|
|
58
|
-
getPendingSliceGateCount,
|
|
59
|
-
type MilestoneRow,
|
|
60
|
-
type SliceRow,
|
|
61
|
-
type TaskRow,
|
|
62
|
-
} from './gsd-db.js';
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* A "ghost" milestone directory contains only META.json (and no substantive
|
|
66
|
-
* files like CONTEXT, CONTEXT-DRAFT, ROADMAP, or SUMMARY). These appear when
|
|
67
|
-
* a milestone is created but never initialised. Treating them as active causes
|
|
68
|
-
* auto-mode to stall or falsely declare completion.
|
|
69
|
-
*
|
|
70
|
-
* However, a milestone is NOT a ghost if:
|
|
71
|
-
* - It has a DB row with a meaningful status (queued, active, etc.) — the DB
|
|
72
|
-
* knows about it even if content files haven't been created yet.
|
|
73
|
-
* - It has a worktree directory — a worktree proves the milestone was
|
|
74
|
-
* legitimately created and is expected to be populated.
|
|
75
|
-
*
|
|
76
|
-
* Fixes #2921: queued milestones with worktrees were incorrectly classified
|
|
77
|
-
* as ghosts, causing auto-mode to skip them entirely.
|
|
78
|
-
*/
|
|
79
|
-
export function isGhostMilestone(basePath: string, mid: string): boolean {
|
|
80
|
-
// If the milestone has a DB row, it's a known milestone — not a ghost.
|
|
81
|
-
if (isDbAvailable()) {
|
|
82
|
-
const dbRow = getMilestone(mid);
|
|
83
|
-
if (dbRow) return false;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// If a worktree exists for this milestone, it was legitimately created.
|
|
87
|
-
const root = gsdRoot(basePath);
|
|
88
|
-
const wtPath = join(root, 'worktrees', mid);
|
|
89
|
-
if (existsSync(wtPath)) return false;
|
|
90
|
-
|
|
91
|
-
// Fall back to content-file check: no substantive files means ghost.
|
|
92
|
-
const context = resolveMilestoneFile(basePath, mid, "CONTEXT");
|
|
93
|
-
const draft = resolveMilestoneFile(basePath, mid, "CONTEXT-DRAFT");
|
|
94
|
-
const roadmap = resolveMilestoneFile(basePath, mid, "ROADMAP");
|
|
95
|
-
const summary = resolveMilestoneFile(basePath, mid, "SUMMARY");
|
|
96
|
-
return !context && !draft && !roadmap && !summary;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// ─── Query Functions ───────────────────────────────────────────────────────
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Check if all tasks in a slice plan are done.
|
|
103
|
-
*/
|
|
104
|
-
export function isSliceComplete(plan: SlicePlan): boolean {
|
|
105
|
-
return plan.tasks.length > 0 && plan.tasks.every(t => t.done);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Check if all slices in a roadmap are done.
|
|
110
|
-
*/
|
|
111
|
-
export function isMilestoneComplete(roadmap: Roadmap): boolean {
|
|
112
|
-
return roadmap.slices.length > 0 && roadmap.slices.every(s => s.done);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Check whether a VALIDATION file's verdict is terminal.
|
|
117
|
-
* Any successfully extracted verdict (pass, needs-attention, needs-remediation,
|
|
118
|
-
* fail, etc.) means validation completed. Only return false when no verdict
|
|
119
|
-
* could be parsed — i.e. extractVerdict() returns undefined (#2769).
|
|
120
|
-
*/
|
|
121
|
-
export function isValidationTerminal(validationContent: string): boolean {
|
|
122
|
-
return extractVerdict(validationContent) != null;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// ─── State Derivation ──────────────────────────────────────────────────────
|
|
126
|
-
|
|
127
|
-
// ── deriveState memoization ─────────────────────────────────────────────────
|
|
128
|
-
// Cache the most recent deriveState() result keyed by basePath. Within a single
|
|
129
|
-
// dispatch cycle (~100ms window), repeated calls return the cached value instead
|
|
130
|
-
// of re-reading the entire .gsd/ tree from disk.
|
|
131
|
-
|
|
132
|
-
interface StateCache {
|
|
133
|
-
basePath: string;
|
|
134
|
-
result: GSDState;
|
|
135
|
-
timestamp: number;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
const CACHE_TTL_MS = 100;
|
|
139
|
-
let _stateCache: StateCache | null = null;
|
|
140
|
-
|
|
141
|
-
// ── Telemetry counters for derive-path observability ────────────────────────
|
|
142
|
-
let _telemetry = { dbDeriveCount: 0, markdownDeriveCount: 0 };
|
|
143
|
-
export function getDeriveTelemetry() { return { ..._telemetry }; }
|
|
144
|
-
export function resetDeriveTelemetry() { _telemetry = { dbDeriveCount: 0, markdownDeriveCount: 0 }; }
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Invalidate the deriveState() cache. Call this whenever planning files on disk
|
|
148
|
-
* may have changed (unit completion, merges, file writes).
|
|
149
|
-
*/
|
|
150
|
-
export function invalidateStateCache(): void {
|
|
151
|
-
_stateCache = null;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
/**
|
|
155
|
-
* Returns the ID of the first incomplete milestone, or null if all are complete.
|
|
156
|
-
*/
|
|
157
|
-
export async function getActiveMilestoneId(basePath: string): Promise<string | null> {
|
|
158
|
-
// Parallel worker isolation
|
|
159
|
-
const milestoneLock = process.env.GSD_MILESTONE_LOCK;
|
|
160
|
-
if (milestoneLock) {
|
|
161
|
-
const milestoneIds = findMilestoneIds(basePath);
|
|
162
|
-
if (!milestoneIds.includes(milestoneLock)) return null;
|
|
163
|
-
const lockedParked = resolveMilestoneFile(basePath, milestoneLock, "PARKED");
|
|
164
|
-
if (lockedParked) return null;
|
|
165
|
-
return milestoneLock;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// DB-first: query milestones table for the first non-complete, non-parked milestone
|
|
169
|
-
if (isDbAvailable()) {
|
|
170
|
-
const allMilestones = getAllMilestones();
|
|
171
|
-
if (allMilestones.length > 0) {
|
|
172
|
-
// Respect queue-order.json so /gsd queue reordering is honored (#2556).
|
|
173
|
-
// Without this, the DB path uses lexicographic sort while the dispatch
|
|
174
|
-
// guard uses queue order — causing a deadlock.
|
|
175
|
-
const customOrder = loadQueueOrder(basePath);
|
|
176
|
-
const sortedIds = sortByQueueOrder(allMilestones.map(m => m.id), customOrder);
|
|
177
|
-
const byId = new Map(allMilestones.map(m => [m.id, m]));
|
|
178
|
-
for (const id of sortedIds) {
|
|
179
|
-
const m = byId.get(id)!;
|
|
180
|
-
if (m.status === "complete" || m.status === "done" || m.status === "parked") continue;
|
|
181
|
-
return m.id;
|
|
182
|
-
}
|
|
183
|
-
return null;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
// Filesystem fallback for unmigrated projects or empty DB
|
|
188
|
-
const milestoneIds = findMilestoneIds(basePath);
|
|
189
|
-
for (const mid of milestoneIds) {
|
|
190
|
-
const parkedFile = resolveMilestoneFile(basePath, mid, "PARKED");
|
|
191
|
-
if (parkedFile) continue;
|
|
192
|
-
|
|
193
|
-
const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
|
|
194
|
-
const content = roadmapFile ? await loadFile(roadmapFile) : null;
|
|
195
|
-
if (!content) {
|
|
196
|
-
const summaryFile = resolveMilestoneFile(basePath, mid, "SUMMARY");
|
|
197
|
-
if (summaryFile) continue;
|
|
198
|
-
if (isGhostMilestone(basePath, mid)) continue;
|
|
199
|
-
return mid;
|
|
200
|
-
}
|
|
201
|
-
const roadmap = parseRoadmap(content);
|
|
202
|
-
if (!isMilestoneComplete(roadmap)) {
|
|
203
|
-
const summaryFile = resolveMilestoneFile(basePath, mid, "SUMMARY");
|
|
204
|
-
if (!summaryFile) return mid;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
return null;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* Reconstruct GSD state from DB (primary) or filesystem (fallback).
|
|
212
|
-
* STATE.md is a rendered cache of this output.
|
|
213
|
-
*
|
|
214
|
-
* When DB is available, queries milestone/slice/task tables directly.
|
|
215
|
-
* Falls back to filesystem parsing for unmigrated projects or when DB
|
|
216
|
-
* has zero milestones (e.g. first run before migration).
|
|
217
|
-
*/
|
|
218
|
-
export async function deriveState(basePath: string): Promise<GSDState> {
|
|
219
|
-
// Return cached result if within the TTL window for the same basePath
|
|
220
|
-
if (
|
|
221
|
-
_stateCache &&
|
|
222
|
-
_stateCache.basePath === basePath &&
|
|
223
|
-
Date.now() - _stateCache.timestamp < CACHE_TTL_MS
|
|
224
|
-
) {
|
|
225
|
-
return _stateCache.result;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
const stopTimer = debugTime("derive-state-impl");
|
|
229
|
-
let result: GSDState;
|
|
230
|
-
|
|
231
|
-
// Dual-path: try DB-backed derivation first when hierarchy tables are populated
|
|
232
|
-
if (isDbAvailable()) {
|
|
233
|
-
const dbMilestones = getAllMilestones();
|
|
234
|
-
if (dbMilestones.length > 0) {
|
|
235
|
-
const stopDbTimer = debugTime("derive-state-db");
|
|
236
|
-
result = await deriveStateFromDb(basePath);
|
|
237
|
-
stopDbTimer({ phase: result.phase, milestone: result.activeMilestone?.id });
|
|
238
|
-
_telemetry.dbDeriveCount++;
|
|
239
|
-
} else {
|
|
240
|
-
// DB open but empty hierarchy tables — pre-migration project, use filesystem
|
|
241
|
-
result = await _deriveStateImpl(basePath);
|
|
242
|
-
_telemetry.markdownDeriveCount++;
|
|
243
|
-
}
|
|
244
|
-
} else {
|
|
245
|
-
result = await _deriveStateImpl(basePath);
|
|
246
|
-
_telemetry.markdownDeriveCount++;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
stopTimer({ phase: result.phase, milestone: result.activeMilestone?.id });
|
|
250
|
-
debugCount("deriveStateCalls");
|
|
251
|
-
_stateCache = { basePath, result, timestamp: Date.now() };
|
|
252
|
-
return result;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
/**
|
|
256
|
-
* Extract milestone title from CONTEXT.md or CONTEXT-DRAFT.md heading.
|
|
257
|
-
* Falls back to the provided fallback (usually the milestone ID).
|
|
258
|
-
*/
|
|
259
|
-
/**
|
|
260
|
-
* Strip the "M001: " prefix from a milestone title to get the human-readable name.
|
|
261
|
-
* Used by both DB and filesystem paths for consistency.
|
|
262
|
-
*/
|
|
263
|
-
function stripMilestonePrefix(title: string): string {
|
|
264
|
-
return title.replace(/^M\d+(?:-[a-z0-9]{6})?[^:]*:\s*/, '') || title;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
function extractContextTitle(content: string | null, fallback: string): string {
|
|
268
|
-
if (!content) return fallback;
|
|
269
|
-
const h1 = content.split('\n').find(line => line.startsWith('# '));
|
|
270
|
-
if (!h1) return fallback;
|
|
271
|
-
// Extract title from "# M005: Platform Foundation & Separation" format
|
|
272
|
-
return stripMilestonePrefix(h1.slice(2).trim()) || fallback;
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
// ─── DB-backed State Derivation ────────────────────────────────────────────
|
|
276
|
-
|
|
277
|
-
/**
|
|
278
|
-
* Helper: check if a DB status counts as "done" (handles K002 ambiguity).
|
|
279
|
-
*/
|
|
280
|
-
function isStatusDone(status: string): boolean {
|
|
281
|
-
return status === 'complete' || status === 'done';
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
/**
|
|
285
|
-
* Derive GSD state from the milestones/slices/tasks DB tables.
|
|
286
|
-
* Flag files (PARKED, VALIDATION, CONTINUE, REPLAN, REPLAN-TRIGGER, CONTEXT-DRAFT)
|
|
287
|
-
* are still checked on the filesystem since they aren't in DB tables.
|
|
288
|
-
* Requirements also stay file-based via parseRequirementCounts().
|
|
289
|
-
*
|
|
290
|
-
* Must produce field-identical GSDState to _deriveStateImpl() for the same project.
|
|
291
|
-
*/
|
|
292
|
-
export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
|
|
293
|
-
const requirements = parseRequirementCounts(await loadFile(resolveGsdRootFile(basePath, "REQUIREMENTS")));
|
|
294
|
-
|
|
295
|
-
let allMilestones = getAllMilestones();
|
|
296
|
-
|
|
297
|
-
// Incremental disk→DB sync: milestone directories created outside the DB
|
|
298
|
-
// write path (via /gsd queue, manual mkdir, or complete-milestone writing the
|
|
299
|
-
// next CONTEXT.md) are never inserted by the initial migration guard in
|
|
300
|
-
// auto-start.ts because that guard only runs when gsd.db doesn't exist yet.
|
|
301
|
-
// Reconcile here so deriveStateFromDb never silently misses queued milestones.
|
|
302
|
-
// insertMilestone uses INSERT OR IGNORE, so this is safe to call every time.
|
|
303
|
-
const dbIdSet = new Set(allMilestones.map(m => m.id));
|
|
304
|
-
const diskIds = findMilestoneIds(basePath);
|
|
305
|
-
let synced = false;
|
|
306
|
-
for (const diskId of diskIds) {
|
|
307
|
-
if (!dbIdSet.has(diskId) && !isGhostMilestone(basePath, diskId)) {
|
|
308
|
-
insertMilestone({ id: diskId, status: 'active' });
|
|
309
|
-
synced = true;
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
if (synced) allMilestones = getAllMilestones();
|
|
313
|
-
|
|
314
|
-
// Disk→DB slice reconciliation (#2533): slices defined in ROADMAP.md but
|
|
315
|
-
// missing from the DB cause permanent "No slice eligible" blocks because
|
|
316
|
-
// the dependency resolver only sees DB rows. Parse each milestone's roadmap
|
|
317
|
-
// and insert any missing slices, checking SUMMARY files to set correct status.
|
|
318
|
-
// insertSlice uses INSERT OR IGNORE, so existing rows are never overwritten.
|
|
319
|
-
for (const mid of diskIds) {
|
|
320
|
-
if (isGhostMilestone(basePath, mid)) continue;
|
|
321
|
-
const roadmapPath = resolveMilestoneFile(basePath, mid, "ROADMAP");
|
|
322
|
-
if (!roadmapPath) continue;
|
|
323
|
-
|
|
324
|
-
const dbSlices = getMilestoneSlices(mid);
|
|
325
|
-
const dbSliceIds = new Set(dbSlices.map(s => s.id));
|
|
326
|
-
|
|
327
|
-
let roadmapContent: string;
|
|
328
|
-
try { roadmapContent = readFileSync(roadmapPath, "utf-8"); }
|
|
329
|
-
catch { continue; }
|
|
330
|
-
|
|
331
|
-
const parsed = parseRoadmap(roadmapContent);
|
|
332
|
-
for (const s of parsed.slices) {
|
|
333
|
-
if (dbSliceIds.has(s.id)) continue;
|
|
334
|
-
const summaryPath = resolveSliceFile(basePath, mid, s.id, "SUMMARY");
|
|
335
|
-
const sliceStatus = (s.done || summaryPath) ? "complete" : "pending";
|
|
336
|
-
insertSlice({
|
|
337
|
-
id: s.id, milestoneId: mid, title: s.title,
|
|
338
|
-
status: sliceStatus, risk: s.risk,
|
|
339
|
-
depends: s.depends, demo: s.demo,
|
|
340
|
-
});
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
// Reconcile: discover milestones that exist on disk but are missing from
|
|
345
|
-
// the DB. This happens when milestones were created before the DB migration
|
|
346
|
-
// or were manually added to the filesystem. Without this, disk-only
|
|
347
|
-
// milestones are invisible after migration (#2416).
|
|
348
|
-
const dbMilestoneIds = new Set(allMilestones.map(m => m.id));
|
|
349
|
-
const diskMilestoneIds = findMilestoneIds(basePath);
|
|
350
|
-
for (const diskId of diskMilestoneIds) {
|
|
351
|
-
if (!dbMilestoneIds.has(diskId)) {
|
|
352
|
-
// Synthesize a minimal MilestoneRow for the disk-only milestone.
|
|
353
|
-
// Title and status will be resolved from disk files in the loop below.
|
|
354
|
-
allMilestones.push({
|
|
355
|
-
id: diskId,
|
|
356
|
-
title: diskId,
|
|
357
|
-
status: 'active',
|
|
358
|
-
depends_on: [] as string[],
|
|
359
|
-
created_at: new Date().toISOString(),
|
|
360
|
-
} as MilestoneRow);
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
// Re-sort so milestones follow queue order (same as dispatch guard) (#2556)
|
|
364
|
-
const customOrder = loadQueueOrder(basePath);
|
|
365
|
-
const sortedIds = sortByQueueOrder(allMilestones.map(m => m.id), customOrder);
|
|
366
|
-
const byId = new Map(allMilestones.map(m => [m.id, m]));
|
|
367
|
-
allMilestones.length = 0;
|
|
368
|
-
for (const id of sortedIds) allMilestones.push(byId.get(id)!);
|
|
369
|
-
|
|
370
|
-
// Parallel worker isolation: when locked, filter to just the locked milestone
|
|
371
|
-
const milestoneLock = process.env.GSD_MILESTONE_LOCK;
|
|
372
|
-
const milestones = milestoneLock
|
|
373
|
-
? allMilestones.filter(m => m.id === milestoneLock)
|
|
374
|
-
: allMilestones;
|
|
375
|
-
|
|
376
|
-
if (milestones.length === 0) {
|
|
377
|
-
return {
|
|
378
|
-
activeMilestone: null,
|
|
379
|
-
activeSlice: null,
|
|
380
|
-
activeTask: null,
|
|
381
|
-
phase: 'pre-planning',
|
|
382
|
-
recentDecisions: [],
|
|
383
|
-
blockers: [],
|
|
384
|
-
nextAction: 'No milestones found. Run /gsd to create one.',
|
|
385
|
-
registry: [],
|
|
386
|
-
requirements,
|
|
387
|
-
progress: { milestones: { done: 0, total: 0 } },
|
|
388
|
-
};
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
// Phase 1: Build completeness set (which milestones count as "done" for dep resolution)
|
|
392
|
-
const completeMilestoneIds = new Set<string>();
|
|
393
|
-
const parkedMilestoneIds = new Set<string>();
|
|
394
|
-
|
|
395
|
-
for (const m of milestones) {
|
|
396
|
-
// Check disk for PARKED flag (not stored in DB status reliably — disk is truth for flag files)
|
|
397
|
-
const parkedFile = resolveMilestoneFile(basePath, m.id, "PARKED");
|
|
398
|
-
if (parkedFile || m.status === 'parked') {
|
|
399
|
-
parkedMilestoneIds.add(m.id);
|
|
400
|
-
continue;
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
if (isStatusDone(m.status)) {
|
|
404
|
-
completeMilestoneIds.add(m.id);
|
|
405
|
-
continue;
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
// Check if milestone has a summary on disk (terminal artifact per #864)
|
|
409
|
-
const summaryFile = resolveMilestoneFile(basePath, m.id, "SUMMARY");
|
|
410
|
-
if (summaryFile) {
|
|
411
|
-
completeMilestoneIds.add(m.id);
|
|
412
|
-
continue;
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
// Check roadmap: all slices done means milestone is complete
|
|
416
|
-
const slices = getMilestoneSlices(m.id);
|
|
417
|
-
if (slices.length > 0 && slices.every(s => isStatusDone(s.status))) {
|
|
418
|
-
// All slices done but no summary — still counts as complete for dep resolution
|
|
419
|
-
// if a summary file exists
|
|
420
|
-
// Note: without summary file, the milestone is in validating/completing state, not complete
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
// Phase 2: Build registry and find active milestone
|
|
425
|
-
const registry: MilestoneRegistryEntry[] = [];
|
|
426
|
-
let activeMilestone: ActiveRef | null = null;
|
|
427
|
-
let activeMilestoneSlices: SliceRow[] = [];
|
|
428
|
-
let activeMilestoneFound = false;
|
|
429
|
-
let activeMilestoneHasDraft = false;
|
|
430
|
-
|
|
431
|
-
for (const m of milestones) {
|
|
432
|
-
if (parkedMilestoneIds.has(m.id)) {
|
|
433
|
-
registry.push({ id: m.id, title: stripMilestonePrefix(m.title) || m.id, status: 'parked' });
|
|
434
|
-
continue;
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
// Ghost milestone check: no slices in DB AND no substantive files on disk
|
|
438
|
-
const slices = getMilestoneSlices(m.id);
|
|
439
|
-
if (slices.length === 0 && !isStatusDone(m.status)) {
|
|
440
|
-
// Check disk for ghost detection
|
|
441
|
-
if (isGhostMilestone(basePath, m.id)) continue;
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
const summaryFile = resolveMilestoneFile(basePath, m.id, "SUMMARY");
|
|
445
|
-
|
|
446
|
-
// Determine if this milestone is complete
|
|
447
|
-
if (completeMilestoneIds.has(m.id) || (summaryFile !== null)) {
|
|
448
|
-
// Get title from DB or summary
|
|
449
|
-
let title = stripMilestonePrefix(m.title) || m.id;
|
|
450
|
-
if (summaryFile && !m.title) {
|
|
451
|
-
const summaryContent = await loadFile(summaryFile);
|
|
452
|
-
if (summaryContent) {
|
|
453
|
-
title = parseSummary(summaryContent).title || m.id;
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
registry.push({ id: m.id, title, status: 'complete' });
|
|
457
|
-
completeMilestoneIds.add(m.id); // ensure it's in the set
|
|
458
|
-
continue;
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
// Not complete — determine if it should be active
|
|
462
|
-
const allSlicesDone = slices.length > 0 && slices.every(s => isStatusDone(s.status));
|
|
463
|
-
|
|
464
|
-
// Get title — prefer DB, fall back to context file extraction
|
|
465
|
-
let title = stripMilestonePrefix(m.title) || m.id;
|
|
466
|
-
if (title === m.id) {
|
|
467
|
-
const contextFile = resolveMilestoneFile(basePath, m.id, "CONTEXT");
|
|
468
|
-
const draftFile = resolveMilestoneFile(basePath, m.id, "CONTEXT-DRAFT");
|
|
469
|
-
const contextContent = contextFile ? await loadFile(contextFile) : null;
|
|
470
|
-
const draftContent = draftFile && !contextContent ? await loadFile(draftFile) : null;
|
|
471
|
-
title = extractContextTitle(contextContent || draftContent, m.id);
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
if (!activeMilestoneFound) {
|
|
475
|
-
// Check milestone-level dependencies
|
|
476
|
-
const deps = m.depends_on;
|
|
477
|
-
const depsUnmet = deps.some(dep => !completeMilestoneIds.has(dep));
|
|
478
|
-
|
|
479
|
-
if (depsUnmet) {
|
|
480
|
-
registry.push({ id: m.id, title, status: 'pending', dependsOn: deps });
|
|
481
|
-
continue;
|
|
482
|
-
}
|
|
483
|
-
|
|
484
|
-
// Handle all-slices-done case (validating/completing)
|
|
485
|
-
if (allSlicesDone) {
|
|
486
|
-
const validationFile = resolveMilestoneFile(basePath, m.id, "VALIDATION");
|
|
487
|
-
const validationContent = validationFile ? await loadFile(validationFile) : null;
|
|
488
|
-
const validationTerminal = validationContent ? isValidationTerminal(validationContent) : false;
|
|
489
|
-
|
|
490
|
-
if (!validationTerminal || (validationTerminal && !summaryFile)) {
|
|
491
|
-
// Validating or completing — still active
|
|
492
|
-
activeMilestone = { id: m.id, title };
|
|
493
|
-
activeMilestoneSlices = slices;
|
|
494
|
-
activeMilestoneFound = true;
|
|
495
|
-
registry.push({ id: m.id, title, status: 'active', ...(deps.length > 0 ? { dependsOn: deps } : {}) });
|
|
496
|
-
continue;
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
// Check for context draft (needs-discussion phase)
|
|
501
|
-
const contextFile = resolveMilestoneFile(basePath, m.id, "CONTEXT");
|
|
502
|
-
const draftFile = resolveMilestoneFile(basePath, m.id, "CONTEXT-DRAFT");
|
|
503
|
-
if (!contextFile && draftFile) activeMilestoneHasDraft = true;
|
|
504
|
-
|
|
505
|
-
activeMilestone = { id: m.id, title };
|
|
506
|
-
activeMilestoneSlices = slices;
|
|
507
|
-
activeMilestoneFound = true;
|
|
508
|
-
registry.push({ id: m.id, title, status: 'active', ...(deps.length > 0 ? { dependsOn: deps } : {}) });
|
|
509
|
-
} else {
|
|
510
|
-
// After active milestone found — rest are pending
|
|
511
|
-
const deps = m.depends_on;
|
|
512
|
-
registry.push({ id: m.id, title, status: 'pending', ...(deps.length > 0 ? { dependsOn: deps } : {}) });
|
|
513
|
-
}
|
|
514
|
-
}
|
|
515
|
-
|
|
516
|
-
const milestoneProgress = {
|
|
517
|
-
done: registry.filter(e => e.status === 'complete').length,
|
|
518
|
-
total: registry.length,
|
|
519
|
-
};
|
|
520
|
-
|
|
521
|
-
// ── No active milestone ──────────────────────────────────────────────
|
|
522
|
-
if (!activeMilestone) {
|
|
523
|
-
const pendingEntries = registry.filter(e => e.status === 'pending');
|
|
524
|
-
const parkedEntries = registry.filter(e => e.status === 'parked');
|
|
525
|
-
|
|
526
|
-
if (pendingEntries.length > 0) {
|
|
527
|
-
const blockerDetails = pendingEntries
|
|
528
|
-
.filter(e => e.dependsOn && e.dependsOn.length > 0)
|
|
529
|
-
.map(e => `${e.id} is waiting on unmet deps: ${e.dependsOn!.join(', ')}`);
|
|
530
|
-
return {
|
|
531
|
-
activeMilestone: null, activeSlice: null, activeTask: null,
|
|
532
|
-
phase: 'blocked',
|
|
533
|
-
recentDecisions: [], blockers: blockerDetails.length > 0
|
|
534
|
-
? blockerDetails
|
|
535
|
-
: ['All remaining milestones are dep-blocked but no deps listed — check CONTEXT.md files'],
|
|
536
|
-
nextAction: 'Resolve milestone dependencies before proceeding.',
|
|
537
|
-
registry, requirements,
|
|
538
|
-
progress: { milestones: milestoneProgress },
|
|
539
|
-
};
|
|
540
|
-
}
|
|
541
|
-
|
|
542
|
-
if (parkedEntries.length > 0) {
|
|
543
|
-
const parkedIds = parkedEntries.map(e => e.id).join(', ');
|
|
544
|
-
return {
|
|
545
|
-
activeMilestone: null, activeSlice: null, activeTask: null,
|
|
546
|
-
phase: 'pre-planning',
|
|
547
|
-
recentDecisions: [], blockers: [],
|
|
548
|
-
nextAction: `All remaining milestones are parked (${parkedIds}). Run /gsd unpark <id> or create a new milestone.`,
|
|
549
|
-
registry, requirements,
|
|
550
|
-
progress: { milestones: milestoneProgress },
|
|
551
|
-
};
|
|
552
|
-
}
|
|
553
|
-
|
|
554
|
-
if (registry.length === 0) {
|
|
555
|
-
return {
|
|
556
|
-
activeMilestone: null, activeSlice: null, activeTask: null,
|
|
557
|
-
phase: 'pre-planning',
|
|
558
|
-
recentDecisions: [], blockers: [],
|
|
559
|
-
nextAction: 'No milestones found. Run /gsd to create one.',
|
|
560
|
-
registry: [], requirements,
|
|
561
|
-
progress: { milestones: { done: 0, total: 0 } },
|
|
562
|
-
};
|
|
563
|
-
}
|
|
564
|
-
|
|
565
|
-
// All milestones complete
|
|
566
|
-
const lastEntry = registry[registry.length - 1];
|
|
567
|
-
const activeReqs = requirements.active ?? 0;
|
|
568
|
-
const completionNote = activeReqs > 0
|
|
569
|
-
? `All milestones complete. ${activeReqs} active requirement${activeReqs === 1 ? '' : 's'} in REQUIREMENTS.md ${activeReqs === 1 ? 'has' : 'have'} not been mapped to a milestone.`
|
|
570
|
-
: 'All milestones complete.';
|
|
571
|
-
return {
|
|
572
|
-
activeMilestone: null,
|
|
573
|
-
lastCompletedMilestone: lastEntry ? { id: lastEntry.id, title: lastEntry.title } : null,
|
|
574
|
-
activeSlice: null, activeTask: null,
|
|
575
|
-
phase: 'complete',
|
|
576
|
-
recentDecisions: [], blockers: [],
|
|
577
|
-
nextAction: completionNote,
|
|
578
|
-
registry, requirements,
|
|
579
|
-
progress: { milestones: milestoneProgress },
|
|
580
|
-
};
|
|
581
|
-
}
|
|
582
|
-
|
|
583
|
-
// ── Active milestone has no slices or no roadmap ────────────────────
|
|
584
|
-
const hasRoadmap = resolveMilestoneFile(basePath, activeMilestone.id, "ROADMAP") !== null;
|
|
585
|
-
|
|
586
|
-
if (activeMilestoneSlices.length === 0) {
|
|
587
|
-
if (!hasRoadmap) {
|
|
588
|
-
const phase = activeMilestoneHasDraft ? 'needs-discussion' as const : 'pre-planning' as const;
|
|
589
|
-
const nextAction = activeMilestoneHasDraft
|
|
590
|
-
? `Discuss draft context for milestone ${activeMilestone.id}.`
|
|
591
|
-
: `Plan milestone ${activeMilestone.id}.`;
|
|
592
|
-
return {
|
|
593
|
-
activeMilestone, activeSlice: null, activeTask: null,
|
|
594
|
-
phase, recentDecisions: [], blockers: [],
|
|
595
|
-
nextAction, registry, requirements,
|
|
596
|
-
progress: { milestones: milestoneProgress },
|
|
597
|
-
};
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
// Has roadmap file but zero slices in DB — pre-planning (zero-slice roadmap guard)
|
|
601
|
-
return {
|
|
602
|
-
activeMilestone, activeSlice: null, activeTask: null,
|
|
603
|
-
phase: 'pre-planning',
|
|
604
|
-
recentDecisions: [], blockers: [],
|
|
605
|
-
nextAction: `Milestone ${activeMilestone.id} has a roadmap but no slices defined. Add slices to the roadmap.`,
|
|
606
|
-
registry, requirements,
|
|
607
|
-
progress: {
|
|
608
|
-
milestones: milestoneProgress,
|
|
609
|
-
slices: { done: 0, total: 0 },
|
|
610
|
-
},
|
|
611
|
-
};
|
|
612
|
-
}
|
|
613
|
-
|
|
614
|
-
// ── All slices done → validating/completing ─────────────────────────
|
|
615
|
-
const allSlicesDone = activeMilestoneSlices.every(s => isStatusDone(s.status));
|
|
616
|
-
if (allSlicesDone) {
|
|
617
|
-
const validationFile = resolveMilestoneFile(basePath, activeMilestone.id, "VALIDATION");
|
|
618
|
-
const validationContent = validationFile ? await loadFile(validationFile) : null;
|
|
619
|
-
const validationTerminal = validationContent ? isValidationTerminal(validationContent) : false;
|
|
620
|
-
const sliceProgress = {
|
|
621
|
-
done: activeMilestoneSlices.length,
|
|
622
|
-
total: activeMilestoneSlices.length,
|
|
623
|
-
};
|
|
624
|
-
|
|
625
|
-
if (!validationTerminal) {
|
|
626
|
-
return {
|
|
627
|
-
activeMilestone, activeSlice: null, activeTask: null,
|
|
628
|
-
phase: 'validating-milestone',
|
|
629
|
-
recentDecisions: [], blockers: [],
|
|
630
|
-
nextAction: `Validate milestone ${activeMilestone.id} before completion.`,
|
|
631
|
-
registry, requirements,
|
|
632
|
-
progress: { milestones: milestoneProgress, slices: sliceProgress },
|
|
633
|
-
};
|
|
634
|
-
}
|
|
635
|
-
|
|
636
|
-
return {
|
|
637
|
-
activeMilestone, activeSlice: null, activeTask: null,
|
|
638
|
-
phase: 'completing-milestone',
|
|
639
|
-
recentDecisions: [], blockers: [],
|
|
640
|
-
nextAction: `All slices complete in ${activeMilestone.id}. Write milestone summary.`,
|
|
641
|
-
registry, requirements,
|
|
642
|
-
progress: { milestones: milestoneProgress, slices: sliceProgress },
|
|
643
|
-
};
|
|
644
|
-
}
|
|
645
|
-
|
|
646
|
-
// ── Find active slice (first incomplete with deps satisfied) ─────────
|
|
647
|
-
const sliceProgress = {
|
|
648
|
-
done: activeMilestoneSlices.filter(s => isStatusDone(s.status)).length,
|
|
649
|
-
total: activeMilestoneSlices.length,
|
|
650
|
-
};
|
|
651
|
-
|
|
652
|
-
const doneSliceIds = new Set(
|
|
653
|
-
activeMilestoneSlices.filter(s => isStatusDone(s.status)).map(s => s.id)
|
|
654
|
-
);
|
|
655
|
-
|
|
656
|
-
let activeSlice: ActiveRef | null = null;
|
|
657
|
-
let activeSliceRow: SliceRow | null = null;
|
|
658
|
-
|
|
659
|
-
for (const s of activeMilestoneSlices) {
|
|
660
|
-
if (isStatusDone(s.status)) continue;
|
|
661
|
-
if (s.depends.every(dep => doneSliceIds.has(dep))) {
|
|
662
|
-
activeSlice = { id: s.id, title: s.title };
|
|
663
|
-
activeSliceRow = s;
|
|
664
|
-
break;
|
|
665
|
-
}
|
|
666
|
-
}
|
|
667
|
-
|
|
668
|
-
if (!activeSlice) {
|
|
669
|
-
return {
|
|
670
|
-
activeMilestone, activeSlice: null, activeTask: null,
|
|
671
|
-
phase: 'blocked',
|
|
672
|
-
recentDecisions: [], blockers: ['No slice eligible — check dependency ordering'],
|
|
673
|
-
nextAction: 'Resolve dependency blockers or plan next slice.',
|
|
674
|
-
registry, requirements,
|
|
675
|
-
progress: { milestones: milestoneProgress, slices: sliceProgress },
|
|
676
|
-
};
|
|
677
|
-
}
|
|
678
|
-
|
|
679
|
-
// ── Check for slice plan file on disk ────────────────────────────────
|
|
680
|
-
const planFile = resolveSliceFile(basePath, activeMilestone.id, activeSlice.id, "PLAN");
|
|
681
|
-
if (!planFile) {
|
|
682
|
-
return {
|
|
683
|
-
activeMilestone, activeSlice, activeTask: null,
|
|
684
|
-
phase: 'planning',
|
|
685
|
-
recentDecisions: [], blockers: [],
|
|
686
|
-
nextAction: `Plan slice ${activeSlice.id} (${activeSlice.title}).`,
|
|
687
|
-
registry, requirements,
|
|
688
|
-
progress: { milestones: milestoneProgress, slices: sliceProgress },
|
|
689
|
-
};
|
|
690
|
-
}
|
|
691
|
-
|
|
692
|
-
// ── Get tasks from DB ────────────────────────────────────────────────
|
|
693
|
-
let tasks = getSliceTasks(activeMilestone.id, activeSlice.id);
|
|
694
|
-
|
|
695
|
-
// ── Reconcile stale task status (#2514) ──────────────────────────────
|
|
696
|
-
// When a session disconnects after the agent writes SUMMARY + VERIFY
|
|
697
|
-
// artifacts but before postUnitPostVerification updates the DB, tasks
|
|
698
|
-
// remain "pending" in the DB despite being complete on disk. Without
|
|
699
|
-
// reconciliation, deriveState keeps returning the stale task as active,
|
|
700
|
-
// causing the dispatcher to re-dispatch the same completed task forever.
|
|
701
|
-
let reconciled = false;
|
|
702
|
-
for (const t of tasks) {
|
|
703
|
-
if (isStatusDone(t.status)) continue;
|
|
704
|
-
const summaryPath = resolveTaskFile(basePath, activeMilestone.id, activeSlice.id, t.id, "SUMMARY");
|
|
705
|
-
if (summaryPath && existsSync(summaryPath)) {
|
|
706
|
-
try {
|
|
707
|
-
updateTaskStatus(activeMilestone.id, activeSlice.id, t.id, "complete");
|
|
708
|
-
logWarning("reconcile", `task ${activeMilestone.id}/${activeSlice.id}/${t.id} status reconciled from "${t.status}" to "complete" (#2514)`, { mid: activeMilestone.id, sid: activeSlice.id, tid: t.id });
|
|
709
|
-
reconciled = true;
|
|
710
|
-
} catch (e) {
|
|
711
|
-
// DB write failed — continue with stale status rather than crash
|
|
712
|
-
logError("reconcile", `failed to update task ${t.id}`, { tid: t.id, error: (e as Error).message });
|
|
713
|
-
}
|
|
714
|
-
}
|
|
715
|
-
}
|
|
716
|
-
// Re-fetch tasks if any were reconciled so downstream logic sees fresh status
|
|
717
|
-
if (reconciled) {
|
|
718
|
-
tasks = getSliceTasks(activeMilestone.id, activeSlice.id);
|
|
719
|
-
}
|
|
720
|
-
|
|
721
|
-
const taskProgress = {
|
|
722
|
-
done: tasks.filter(t => isStatusDone(t.status)).length,
|
|
723
|
-
total: tasks.length,
|
|
724
|
-
};
|
|
725
|
-
|
|
726
|
-
const activeTaskRow = tasks.find(t => !isStatusDone(t.status));
|
|
727
|
-
|
|
728
|
-
if (!activeTaskRow && tasks.length > 0) {
|
|
729
|
-
// All tasks done but slice not marked complete → summarizing
|
|
730
|
-
return {
|
|
731
|
-
activeMilestone, activeSlice, activeTask: null,
|
|
732
|
-
phase: 'summarizing',
|
|
733
|
-
recentDecisions: [], blockers: [],
|
|
734
|
-
nextAction: `All tasks done in ${activeSlice.id}. Write slice summary and complete slice.`,
|
|
735
|
-
registry, requirements,
|
|
736
|
-
progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
|
|
737
|
-
};
|
|
738
|
-
}
|
|
739
|
-
|
|
740
|
-
// Empty plan — no tasks defined yet
|
|
741
|
-
if (!activeTaskRow) {
|
|
742
|
-
return {
|
|
743
|
-
activeMilestone, activeSlice, activeTask: null,
|
|
744
|
-
phase: 'planning',
|
|
745
|
-
recentDecisions: [], blockers: [],
|
|
746
|
-
nextAction: `Slice ${activeSlice.id} has a plan file but no tasks. Add tasks to the plan.`,
|
|
747
|
-
registry, requirements,
|
|
748
|
-
progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
|
|
749
|
-
};
|
|
750
|
-
}
|
|
751
|
-
|
|
752
|
-
const activeTask: ActiveRef = { id: activeTaskRow.id, title: activeTaskRow.title };
|
|
753
|
-
|
|
754
|
-
// ── Task plan file check (#909) ─────────────────────────────────────
|
|
755
|
-
const tasksDir = resolveTasksDir(basePath, activeMilestone.id, activeSlice.id);
|
|
756
|
-
if (tasksDir && existsSync(tasksDir) && tasks.length > 0) {
|
|
757
|
-
const allFiles = readdirSync(tasksDir).filter(f => f.endsWith(".md"));
|
|
758
|
-
if (allFiles.length === 0) {
|
|
759
|
-
return {
|
|
760
|
-
activeMilestone, activeSlice, activeTask: null,
|
|
761
|
-
phase: 'planning',
|
|
762
|
-
recentDecisions: [], blockers: [],
|
|
763
|
-
nextAction: `Task plan files missing for ${activeSlice.id}. Run plan-slice to generate task plans.`,
|
|
764
|
-
registry, requirements,
|
|
765
|
-
progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
|
|
766
|
-
};
|
|
767
|
-
}
|
|
768
|
-
}
|
|
769
|
-
|
|
770
|
-
// ── Quality gate evaluation check ──────────────────────────────────
|
|
771
|
-
// If slice-scoped gates (Q3/Q4) are still pending, pause before execution
|
|
772
|
-
// so the gate-evaluate dispatch rule can run parallel sub-agents.
|
|
773
|
-
// Slices with zero gate rows (pre-feature or simple) skip straight through.
|
|
774
|
-
const pendingGateCount = getPendingSliceGateCount(activeMilestone.id, activeSlice.id);
|
|
775
|
-
if (pendingGateCount > 0) {
|
|
776
|
-
return {
|
|
777
|
-
activeMilestone, activeSlice, activeTask: null,
|
|
778
|
-
phase: 'evaluating-gates',
|
|
779
|
-
recentDecisions: [], blockers: [],
|
|
780
|
-
nextAction: `Evaluate ${pendingGateCount} quality gate(s) for ${activeSlice.id} before execution.`,
|
|
781
|
-
registry, requirements,
|
|
782
|
-
progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
|
|
783
|
-
};
|
|
784
|
-
}
|
|
785
|
-
|
|
786
|
-
// ── Blocker detection: check completed tasks for blocker_discovered ──
|
|
787
|
-
const completedTasks = tasks.filter(t => isStatusDone(t.status));
|
|
788
|
-
let blockerTaskId: string | null = null;
|
|
789
|
-
for (const ct of completedTasks) {
|
|
790
|
-
if (ct.blocker_discovered) {
|
|
791
|
-
blockerTaskId = ct.id;
|
|
792
|
-
break;
|
|
793
|
-
}
|
|
794
|
-
// Also check disk summary in case DB doesn't have the flag
|
|
795
|
-
const summaryFile = resolveTaskFile(basePath, activeMilestone.id, activeSlice.id, ct.id, "SUMMARY");
|
|
796
|
-
if (!summaryFile) continue;
|
|
797
|
-
const summaryContent = await loadFile(summaryFile);
|
|
798
|
-
if (!summaryContent) continue;
|
|
799
|
-
const summary = parseSummary(summaryContent);
|
|
800
|
-
if (summary.frontmatter.blocker_discovered) {
|
|
801
|
-
blockerTaskId = ct.id;
|
|
802
|
-
break;
|
|
803
|
-
}
|
|
804
|
-
}
|
|
805
|
-
|
|
806
|
-
if (blockerTaskId) {
|
|
807
|
-
// Loop protection: if replan_history has entries for this slice, a replan
|
|
808
|
-
// was already performed — don't re-enter replanning phase.
|
|
809
|
-
const replanHistory = getReplanHistory(activeMilestone.id, activeSlice.id);
|
|
810
|
-
if (replanHistory.length === 0) {
|
|
811
|
-
return {
|
|
812
|
-
activeMilestone, activeSlice, activeTask,
|
|
813
|
-
phase: 'replanning-slice',
|
|
814
|
-
recentDecisions: [],
|
|
815
|
-
blockers: [`Task ${blockerTaskId} discovered a blocker requiring slice replan`],
|
|
816
|
-
nextAction: `Task ${blockerTaskId} reported blocker_discovered. Replan slice ${activeSlice.id} before continuing.`,
|
|
817
|
-
activeWorkspace: undefined,
|
|
818
|
-
registry, requirements,
|
|
819
|
-
progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
|
|
820
|
-
};
|
|
821
|
-
}
|
|
822
|
-
}
|
|
823
|
-
|
|
824
|
-
// ── REPLAN-TRIGGER detection ─────────────────────────────────────────
|
|
825
|
-
if (!blockerTaskId) {
|
|
826
|
-
const sliceRow = getSlice(activeMilestone.id, activeSlice.id);
|
|
827
|
-
if (sliceRow?.replan_triggered_at) {
|
|
828
|
-
// Loop protection: if replan_history has entries, replan was already done
|
|
829
|
-
const replanHistory = getReplanHistory(activeMilestone.id, activeSlice.id);
|
|
830
|
-
if (replanHistory.length === 0) {
|
|
831
|
-
return {
|
|
832
|
-
activeMilestone, activeSlice, activeTask,
|
|
833
|
-
phase: 'replanning-slice',
|
|
834
|
-
recentDecisions: [],
|
|
835
|
-
blockers: ['Triage replan trigger detected — slice replan required'],
|
|
836
|
-
nextAction: `Triage replan triggered for slice ${activeSlice.id}. Replan before continuing.`,
|
|
837
|
-
activeWorkspace: undefined,
|
|
838
|
-
registry, requirements,
|
|
839
|
-
progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
|
|
840
|
-
};
|
|
841
|
-
}
|
|
842
|
-
}
|
|
843
|
-
}
|
|
844
|
-
|
|
845
|
-
// ── Check for interrupted work ───────────────────────────────────────
|
|
846
|
-
const sDir = resolveSlicePath(basePath, activeMilestone.id, activeSlice.id);
|
|
847
|
-
const continueFile = sDir ? resolveSliceFile(basePath, activeMilestone.id, activeSlice.id, "CONTINUE") : null;
|
|
848
|
-
const hasInterrupted = !!(continueFile && await loadFile(continueFile)) ||
|
|
849
|
-
!!(sDir && await loadFile(join(sDir, "continue.md")));
|
|
850
|
-
|
|
851
|
-
return {
|
|
852
|
-
activeMilestone, activeSlice, activeTask,
|
|
853
|
-
phase: 'executing',
|
|
854
|
-
recentDecisions: [], blockers: [],
|
|
855
|
-
nextAction: hasInterrupted
|
|
856
|
-
? `Resume interrupted work on ${activeTask.id}: ${activeTask.title} in slice ${activeSlice.id}. Read continue.md first.`
|
|
857
|
-
: `Execute ${activeTask.id}: ${activeTask.title} in slice ${activeSlice.id}.`,
|
|
858
|
-
registry, requirements,
|
|
859
|
-
progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
|
|
860
|
-
};
|
|
861
|
-
}
|
|
862
|
-
|
|
863
|
-
// LEGACY: Filesystem-based state derivation for unmigrated projects.
|
|
864
|
-
// DB-backed projects use deriveStateFromDb() above. Target: extract to
|
|
865
|
-
// state-legacy.ts when all projects are DB-backed.
|
|
866
|
-
export async function _deriveStateImpl(basePath: string): Promise<GSDState> {
|
|
867
|
-
const milestoneIds = findMilestoneIds(basePath);
|
|
868
|
-
|
|
869
|
-
// ── Parallel worker isolation ──────────────────────────────────────────
|
|
870
|
-
// When GSD_MILESTONE_LOCK is set, this process is a parallel worker
|
|
871
|
-
// scoped to a single milestone. Filter the milestone list so this worker
|
|
872
|
-
// only sees its assigned milestone (all others are treated as if they
|
|
873
|
-
// don't exist). This gives each worker complete isolation without
|
|
874
|
-
// modifying any other state derivation logic.
|
|
875
|
-
const milestoneLock = process.env.GSD_MILESTONE_LOCK;
|
|
876
|
-
if (milestoneLock && milestoneIds.includes(milestoneLock)) {
|
|
877
|
-
milestoneIds.length = 0;
|
|
878
|
-
milestoneIds.push(milestoneLock);
|
|
879
|
-
}
|
|
880
|
-
|
|
881
|
-
// ── Batch-parse file cache ──────────────────────────────────────────────
|
|
882
|
-
// When the native Rust parser is available, read every .md file under .gsd/
|
|
883
|
-
// in one call and build an in-memory content map keyed by absolute path.
|
|
884
|
-
// This eliminates O(N) individual fs.readFile calls during traversal.
|
|
885
|
-
const fileContentCache = new Map<string, string>();
|
|
886
|
-
const gsdDir = gsdRoot(basePath);
|
|
887
|
-
|
|
888
|
-
// Filesystem fallback: used when deriveStateFromDb() is not available
|
|
889
|
-
// (pre-migration projects). The DB-backed path is preferred when available
|
|
890
|
-
// — see deriveStateFromDb() above.
|
|
891
|
-
const batchFiles = nativeBatchParseGsdFiles(gsdDir);
|
|
892
|
-
if (batchFiles) {
|
|
893
|
-
for (const f of batchFiles) {
|
|
894
|
-
const absPath = resolve(gsdDir, f.path);
|
|
895
|
-
fileContentCache.set(absPath, f.rawContent);
|
|
896
|
-
}
|
|
897
|
-
}
|
|
898
|
-
|
|
899
|
-
/**
|
|
900
|
-
* Load file content from batch cache first, falling back to disk read.
|
|
901
|
-
* Resolves the path to absolute before cache lookup.
|
|
902
|
-
*/
|
|
903
|
-
async function cachedLoadFile(path: string): Promise<string | null> {
|
|
904
|
-
const abs = resolve(path);
|
|
905
|
-
const cached = fileContentCache.get(abs);
|
|
906
|
-
if (cached !== undefined) return cached;
|
|
907
|
-
return loadFile(path);
|
|
908
|
-
}
|
|
909
|
-
|
|
910
|
-
const requirements = parseRequirementCounts(await cachedLoadFile(resolveGsdRootFile(basePath, "REQUIREMENTS")));
|
|
911
|
-
|
|
912
|
-
if (milestoneIds.length === 0) {
|
|
913
|
-
return {
|
|
914
|
-
activeMilestone: null,
|
|
915
|
-
activeSlice: null,
|
|
916
|
-
activeTask: null,
|
|
917
|
-
phase: 'pre-planning',
|
|
918
|
-
recentDecisions: [],
|
|
919
|
-
blockers: [],
|
|
920
|
-
nextAction: 'No milestones found. Run /gsd to create one.',
|
|
921
|
-
registry: [],
|
|
922
|
-
requirements,
|
|
923
|
-
progress: {
|
|
924
|
-
milestones: { done: 0, total: 0 },
|
|
925
|
-
},
|
|
926
|
-
};
|
|
927
|
-
}
|
|
928
|
-
|
|
929
|
-
// ── Single-pass milestone scan ──────────────────────────────────────────
|
|
930
|
-
// Parse each milestone's roadmap once, caching results. First pass determines
|
|
931
|
-
// completeness for dependency resolution; second pass builds the registry.
|
|
932
|
-
// With the batch cache, all file reads hit memory instead of disk.
|
|
933
|
-
|
|
934
|
-
// Phase 1: Build roadmap cache and completeness set
|
|
935
|
-
const roadmapCache = new Map<string, Roadmap>();
|
|
936
|
-
const completeMilestoneIds = new Set<string>();
|
|
937
|
-
|
|
938
|
-
// Track parked milestone IDs so Phase 2 can check without re-reading disk
|
|
939
|
-
const parkedMilestoneIds = new Set<string>();
|
|
940
|
-
|
|
941
|
-
for (const mid of milestoneIds) {
|
|
942
|
-
// Skip parked milestones — they do NOT count as complete (don't satisfy depends_on)
|
|
943
|
-
// But still parse their roadmap for title extraction in Phase 2.
|
|
944
|
-
const parkedFile = resolveMilestoneFile(basePath, mid, "PARKED");
|
|
945
|
-
if (parkedFile) {
|
|
946
|
-
parkedMilestoneIds.add(mid);
|
|
947
|
-
// Cache roadmap for title extraction (but don't add to completeMilestoneIds)
|
|
948
|
-
const prf = resolveMilestoneFile(basePath, mid, "ROADMAP");
|
|
949
|
-
const prc = prf ? await cachedLoadFile(prf) : null;
|
|
950
|
-
if (prc) roadmapCache.set(mid, parseRoadmap(prc));
|
|
951
|
-
continue;
|
|
952
|
-
}
|
|
953
|
-
|
|
954
|
-
const rf = resolveMilestoneFile(basePath, mid, "ROADMAP");
|
|
955
|
-
const rc = rf ? await cachedLoadFile(rf) : null;
|
|
956
|
-
if (!rc) {
|
|
957
|
-
const sf = resolveMilestoneFile(basePath, mid, "SUMMARY");
|
|
958
|
-
if (sf) completeMilestoneIds.add(mid);
|
|
959
|
-
continue;
|
|
960
|
-
}
|
|
961
|
-
const rmap = parseRoadmap(rc);
|
|
962
|
-
roadmapCache.set(mid, rmap);
|
|
963
|
-
if (!isMilestoneComplete(rmap)) {
|
|
964
|
-
// Summary is the terminal artifact — if it exists, the milestone is
|
|
965
|
-
// complete even when roadmap checkboxes weren't ticked (#864).
|
|
966
|
-
const sf = resolveMilestoneFile(basePath, mid, "SUMMARY");
|
|
967
|
-
if (sf) completeMilestoneIds.add(mid);
|
|
968
|
-
continue;
|
|
969
|
-
}
|
|
970
|
-
const sf = resolveMilestoneFile(basePath, mid, "SUMMARY");
|
|
971
|
-
if (sf) completeMilestoneIds.add(mid);
|
|
972
|
-
}
|
|
973
|
-
|
|
974
|
-
// Phase 2: Build registry using cached roadmaps (no re-parsing or re-reading)
|
|
975
|
-
const registry: MilestoneRegistryEntry[] = [];
|
|
976
|
-
let activeMilestone: ActiveRef | null = null;
|
|
977
|
-
let activeRoadmap: Roadmap | null = null;
|
|
978
|
-
let activeMilestoneFound = false;
|
|
979
|
-
let activeMilestoneHasDraft = false;
|
|
980
|
-
|
|
981
|
-
for (const mid of milestoneIds) {
|
|
982
|
-
// Skip parked milestones — register them as 'parked' and move on
|
|
983
|
-
if (parkedMilestoneIds.has(mid)) {
|
|
984
|
-
const roadmap = roadmapCache.get(mid) ?? null;
|
|
985
|
-
const title = roadmap
|
|
986
|
-
? stripMilestonePrefix(roadmap.title)
|
|
987
|
-
: mid;
|
|
988
|
-
registry.push({ id: mid, title, status: 'parked' });
|
|
989
|
-
continue;
|
|
990
|
-
}
|
|
991
|
-
|
|
992
|
-
const roadmap = roadmapCache.get(mid) ?? null;
|
|
993
|
-
|
|
994
|
-
if (!roadmap) {
|
|
995
|
-
// No roadmap — check if a summary exists (completed milestone without roadmap)
|
|
996
|
-
const summaryFile = resolveMilestoneFile(basePath, mid, "SUMMARY");
|
|
997
|
-
if (summaryFile) {
|
|
998
|
-
const summaryContent = await cachedLoadFile(summaryFile);
|
|
999
|
-
const summaryTitle = summaryContent
|
|
1000
|
-
? (parseSummary(summaryContent).title || mid)
|
|
1001
|
-
: mid;
|
|
1002
|
-
registry.push({ id: mid, title: summaryTitle, status: 'complete' });
|
|
1003
|
-
completeMilestoneIds.add(mid);
|
|
1004
|
-
continue;
|
|
1005
|
-
}
|
|
1006
|
-
// Ghost milestone (only META.json, no CONTEXT/ROADMAP/SUMMARY) — skip entirely
|
|
1007
|
-
if (isGhostMilestone(basePath, mid)) continue;
|
|
1008
|
-
|
|
1009
|
-
// No roadmap and no summary — treat as incomplete/active
|
|
1010
|
-
if (!activeMilestoneFound) {
|
|
1011
|
-
// Check for CONTEXT-DRAFT.md to distinguish draft-seeded from blank milestones.
|
|
1012
|
-
// A draft seed means the milestone has discussion material but no full context yet.
|
|
1013
|
-
const contextFile = resolveMilestoneFile(basePath, mid, "CONTEXT");
|
|
1014
|
-
const draftFile = resolveMilestoneFile(basePath, mid, "CONTEXT-DRAFT");
|
|
1015
|
-
if (!contextFile && draftFile) activeMilestoneHasDraft = true;
|
|
1016
|
-
|
|
1017
|
-
// Extract title from CONTEXT.md or CONTEXT-DRAFT.md heading before falling back to mid.
|
|
1018
|
-
const contextContent = contextFile ? await cachedLoadFile(contextFile) : null;
|
|
1019
|
-
const draftContent = draftFile && !contextContent ? await cachedLoadFile(draftFile) : null;
|
|
1020
|
-
const title = extractContextTitle(contextContent || draftContent, mid);
|
|
1021
|
-
|
|
1022
|
-
// Check milestone-level dependencies before promoting to active.
|
|
1023
|
-
// Without this, a queued milestone with depends_on in its CONTEXT
|
|
1024
|
-
// or CONTEXT-DRAFT frontmatter would be promoted to active even when
|
|
1025
|
-
// its deps are unmet. Fall back to CONTEXT-DRAFT.md when absent (#1724).
|
|
1026
|
-
const deps = parseContextDependsOn(contextContent ?? draftContent);
|
|
1027
|
-
const depsUnmet = deps.some(dep => !completeMilestoneIds.has(dep));
|
|
1028
|
-
if (depsUnmet) {
|
|
1029
|
-
registry.push({ id: mid, title, status: 'pending', dependsOn: deps });
|
|
1030
|
-
} else {
|
|
1031
|
-
activeMilestone = { id: mid, title };
|
|
1032
|
-
activeMilestoneFound = true;
|
|
1033
|
-
registry.push({ id: mid, title, status: 'active', ...(deps.length > 0 ? { dependsOn: deps } : {}) });
|
|
1034
|
-
}
|
|
1035
|
-
} else {
|
|
1036
|
-
// For milestones after the active one, also try to extract title from context files.
|
|
1037
|
-
const contextFile = resolveMilestoneFile(basePath, mid, "CONTEXT");
|
|
1038
|
-
const draftFile = resolveMilestoneFile(basePath, mid, "CONTEXT-DRAFT");
|
|
1039
|
-
const contextContent = contextFile ? await cachedLoadFile(contextFile) : null;
|
|
1040
|
-
const draftContent = draftFile && !contextContent ? await cachedLoadFile(draftFile) : null;
|
|
1041
|
-
const title = extractContextTitle(contextContent || draftContent, mid);
|
|
1042
|
-
registry.push({ id: mid, title, status: 'pending' });
|
|
1043
|
-
}
|
|
1044
|
-
continue;
|
|
1045
|
-
}
|
|
1046
|
-
|
|
1047
|
-
const title = stripMilestonePrefix(roadmap.title);
|
|
1048
|
-
const complete = isMilestoneComplete(roadmap);
|
|
1049
|
-
|
|
1050
|
-
if (complete) {
|
|
1051
|
-
// All slices done — check validation and summary state
|
|
1052
|
-
const summaryFile = resolveMilestoneFile(basePath, mid, "SUMMARY");
|
|
1053
|
-
const validationFile = resolveMilestoneFile(basePath, mid, "VALIDATION");
|
|
1054
|
-
const validationContent = validationFile ? await cachedLoadFile(validationFile) : null;
|
|
1055
|
-
const validationTerminal = validationContent ? isValidationTerminal(validationContent) : false;
|
|
1056
|
-
|
|
1057
|
-
if (summaryFile) {
|
|
1058
|
-
// Summary exists → milestone is complete regardless of validation state.
|
|
1059
|
-
// The summary is the terminal artifact (#864).
|
|
1060
|
-
registry.push({ id: mid, title, status: 'complete' });
|
|
1061
|
-
} else if (!validationTerminal && !activeMilestoneFound) {
|
|
1062
|
-
// No summary and no terminal validation → validating-milestone
|
|
1063
|
-
activeMilestone = { id: mid, title };
|
|
1064
|
-
activeRoadmap = roadmap;
|
|
1065
|
-
activeMilestoneFound = true;
|
|
1066
|
-
registry.push({ id: mid, title, status: 'active' });
|
|
1067
|
-
} else if (!validationTerminal && activeMilestoneFound) {
|
|
1068
|
-
// No summary and no terminal validation, but another milestone is already active
|
|
1069
|
-
registry.push({ id: mid, title, status: 'pending' });
|
|
1070
|
-
} else if (!activeMilestoneFound) {
|
|
1071
|
-
// Terminal validation but no summary → completing-milestone
|
|
1072
|
-
activeMilestone = { id: mid, title };
|
|
1073
|
-
activeRoadmap = roadmap;
|
|
1074
|
-
activeMilestoneFound = true;
|
|
1075
|
-
registry.push({ id: mid, title, status: 'active' });
|
|
1076
|
-
} else {
|
|
1077
|
-
registry.push({ id: mid, title, status: 'complete' });
|
|
1078
|
-
}
|
|
1079
|
-
} else {
|
|
1080
|
-
// Roadmap slices not all checked — but if a summary exists, the milestone
|
|
1081
|
-
// is still complete. The summary is the terminal artifact (#864).
|
|
1082
|
-
const summaryFile = resolveMilestoneFile(basePath, mid, "SUMMARY");
|
|
1083
|
-
if (summaryFile) {
|
|
1084
|
-
registry.push({ id: mid, title, status: 'complete' });
|
|
1085
|
-
} else if (!activeMilestoneFound) {
|
|
1086
|
-
// Check milestone-level dependencies before promoting to active.
|
|
1087
|
-
// Fall back to CONTEXT-DRAFT.md when CONTEXT.md is absent (#1724).
|
|
1088
|
-
const contextFile = resolveMilestoneFile(basePath, mid, "CONTEXT");
|
|
1089
|
-
const draftFile = resolveMilestoneFile(basePath, mid, "CONTEXT-DRAFT");
|
|
1090
|
-
const contextContent = contextFile ? await cachedLoadFile(contextFile) : null;
|
|
1091
|
-
const draftContent = draftFile && !contextContent ? await cachedLoadFile(draftFile) : null;
|
|
1092
|
-
const deps = parseContextDependsOn(contextContent ?? draftContent);
|
|
1093
|
-
const depsUnmet = deps.some(dep => !completeMilestoneIds.has(dep));
|
|
1094
|
-
if (depsUnmet) {
|
|
1095
|
-
registry.push({ id: mid, title, status: 'pending', dependsOn: deps });
|
|
1096
|
-
// Do NOT set activeMilestoneFound — let the loop continue to the next milestone
|
|
1097
|
-
} else {
|
|
1098
|
-
activeMilestone = { id: mid, title };
|
|
1099
|
-
activeRoadmap = roadmap;
|
|
1100
|
-
activeMilestoneFound = true;
|
|
1101
|
-
registry.push({ id: mid, title, status: 'active', ...(deps.length > 0 ? { dependsOn: deps } : {}) });
|
|
1102
|
-
}
|
|
1103
|
-
} else {
|
|
1104
|
-
const contextFile2 = resolveMilestoneFile(basePath, mid, "CONTEXT");
|
|
1105
|
-
const draftFileForDeps3 = resolveMilestoneFile(basePath, mid, "CONTEXT-DRAFT");
|
|
1106
|
-
const contextOrDraftContent3 = contextFile2
|
|
1107
|
-
? await cachedLoadFile(contextFile2)
|
|
1108
|
-
: (draftFileForDeps3 ? await cachedLoadFile(draftFileForDeps3) : null);
|
|
1109
|
-
const deps2 = parseContextDependsOn(contextOrDraftContent3);
|
|
1110
|
-
registry.push({ id: mid, title, status: 'pending', ...(deps2.length > 0 ? { dependsOn: deps2 } : {}) });
|
|
1111
|
-
}
|
|
1112
|
-
}
|
|
1113
|
-
}
|
|
1114
|
-
|
|
1115
|
-
const milestoneProgress = {
|
|
1116
|
-
done: registry.filter(entry => entry.status === 'complete').length,
|
|
1117
|
-
total: registry.length,
|
|
1118
|
-
};
|
|
1119
|
-
|
|
1120
|
-
if (!activeMilestone) {
|
|
1121
|
-
// Check whether any milestones are pending (dep-blocked) or parked
|
|
1122
|
-
const pendingEntries = registry.filter(entry => entry.status === 'pending');
|
|
1123
|
-
const parkedEntries = registry.filter(entry => entry.status === 'parked');
|
|
1124
|
-
if (pendingEntries.length > 0) {
|
|
1125
|
-
// All incomplete milestones are dep-blocked — no progress possible
|
|
1126
|
-
const blockerDetails = pendingEntries
|
|
1127
|
-
.filter(entry => entry.dependsOn && entry.dependsOn.length > 0)
|
|
1128
|
-
.map(entry => `${entry.id} is waiting on unmet deps: ${entry.dependsOn!.join(', ')}`);
|
|
1129
|
-
return {
|
|
1130
|
-
activeMilestone: null,
|
|
1131
|
-
activeSlice: null,
|
|
1132
|
-
activeTask: null,
|
|
1133
|
-
phase: 'blocked',
|
|
1134
|
-
recentDecisions: [],
|
|
1135
|
-
blockers: blockerDetails.length > 0
|
|
1136
|
-
? blockerDetails
|
|
1137
|
-
: ['All remaining milestones are dep-blocked but no deps listed — check CONTEXT.md files'],
|
|
1138
|
-
nextAction: 'Resolve milestone dependencies before proceeding.',
|
|
1139
|
-
registry,
|
|
1140
|
-
requirements,
|
|
1141
|
-
progress: {
|
|
1142
|
-
milestones: milestoneProgress,
|
|
1143
|
-
},
|
|
1144
|
-
};
|
|
1145
|
-
}
|
|
1146
|
-
if (parkedEntries.length > 0) {
|
|
1147
|
-
// All non-complete milestones are parked — nothing active, but not "all complete"
|
|
1148
|
-
const parkedIds = parkedEntries.map(e => e.id).join(', ');
|
|
1149
|
-
return {
|
|
1150
|
-
activeMilestone: null,
|
|
1151
|
-
activeSlice: null,
|
|
1152
|
-
activeTask: null,
|
|
1153
|
-
phase: 'pre-planning',
|
|
1154
|
-
recentDecisions: [],
|
|
1155
|
-
blockers: [],
|
|
1156
|
-
nextAction: `All remaining milestones are parked (${parkedIds}). Run /gsd unpark <id> or create a new milestone.`,
|
|
1157
|
-
registry,
|
|
1158
|
-
requirements,
|
|
1159
|
-
progress: {
|
|
1160
|
-
milestones: milestoneProgress,
|
|
1161
|
-
},
|
|
1162
|
-
};
|
|
1163
|
-
}
|
|
1164
|
-
// All real milestones were ghosts (empty registry) → treat as pre-planning
|
|
1165
|
-
if (registry.length === 0) {
|
|
1166
|
-
return {
|
|
1167
|
-
activeMilestone: null,
|
|
1168
|
-
activeSlice: null,
|
|
1169
|
-
activeTask: null,
|
|
1170
|
-
phase: 'pre-planning',
|
|
1171
|
-
recentDecisions: [],
|
|
1172
|
-
blockers: [],
|
|
1173
|
-
nextAction: 'No milestones found. Run /gsd to create one.',
|
|
1174
|
-
registry: [],
|
|
1175
|
-
requirements,
|
|
1176
|
-
progress: {
|
|
1177
|
-
milestones: { done: 0, total: 0 },
|
|
1178
|
-
},
|
|
1179
|
-
};
|
|
1180
|
-
}
|
|
1181
|
-
// All milestones complete
|
|
1182
|
-
const lastEntry = registry[registry.length - 1];
|
|
1183
|
-
const activeReqs = requirements.active ?? 0;
|
|
1184
|
-
const completionNote = activeReqs > 0
|
|
1185
|
-
? `All milestones complete. ${activeReqs} active requirement${activeReqs === 1 ? '' : 's'} in REQUIREMENTS.md ${activeReqs === 1 ? 'has' : 'have'} not been mapped to a milestone.`
|
|
1186
|
-
: 'All milestones complete.';
|
|
1187
|
-
return {
|
|
1188
|
-
activeMilestone: lastEntry ? { id: lastEntry.id, title: lastEntry.title } : null,
|
|
1189
|
-
activeSlice: null,
|
|
1190
|
-
activeTask: null,
|
|
1191
|
-
phase: 'complete',
|
|
1192
|
-
recentDecisions: [],
|
|
1193
|
-
blockers: [],
|
|
1194
|
-
nextAction: completionNote,
|
|
1195
|
-
registry,
|
|
1196
|
-
requirements,
|
|
1197
|
-
progress: {
|
|
1198
|
-
milestones: milestoneProgress,
|
|
1199
|
-
},
|
|
1200
|
-
};
|
|
1201
|
-
}
|
|
1202
|
-
|
|
1203
|
-
if (!activeRoadmap) {
|
|
1204
|
-
// Active milestone exists but has no roadmap yet.
|
|
1205
|
-
// If a CONTEXT-DRAFT.md seed exists, it needs discussion before planning.
|
|
1206
|
-
// Otherwise, it's a blank milestone ready for initial planning.
|
|
1207
|
-
const phase = activeMilestoneHasDraft ? 'needs-discussion' as const : 'pre-planning' as const;
|
|
1208
|
-
const nextAction = activeMilestoneHasDraft
|
|
1209
|
-
? `Discuss draft context for milestone ${activeMilestone.id}.`
|
|
1210
|
-
: `Plan milestone ${activeMilestone.id}.`;
|
|
1211
|
-
return {
|
|
1212
|
-
activeMilestone,
|
|
1213
|
-
activeSlice: null,
|
|
1214
|
-
activeTask: null,
|
|
1215
|
-
phase,
|
|
1216
|
-
recentDecisions: [],
|
|
1217
|
-
blockers: [],
|
|
1218
|
-
nextAction,
|
|
1219
|
-
registry,
|
|
1220
|
-
requirements,
|
|
1221
|
-
progress: {
|
|
1222
|
-
milestones: milestoneProgress,
|
|
1223
|
-
},
|
|
1224
|
-
};
|
|
1225
|
-
}
|
|
1226
|
-
|
|
1227
|
-
// ── Zero-slice roadmap guard (#1785) ─────────────────────────────────
|
|
1228
|
-
// A stub roadmap (placeholder text, no slice definitions) has a truthy
|
|
1229
|
-
// roadmap object but an empty slices array. Without this check the
|
|
1230
|
-
// slice-finding loop below finds nothing and returns phase: "blocked".
|
|
1231
|
-
// An empty slices array means the roadmap still needs slice definitions,
|
|
1232
|
-
// so the correct phase is pre-planning.
|
|
1233
|
-
if (activeRoadmap.slices.length === 0) {
|
|
1234
|
-
return {
|
|
1235
|
-
activeMilestone,
|
|
1236
|
-
activeSlice: null,
|
|
1237
|
-
activeTask: null,
|
|
1238
|
-
phase: 'pre-planning',
|
|
1239
|
-
recentDecisions: [],
|
|
1240
|
-
blockers: [],
|
|
1241
|
-
nextAction: `Milestone ${activeMilestone.id} has a roadmap but no slices defined. Add slices to the roadmap.`,
|
|
1242
|
-
registry,
|
|
1243
|
-
requirements,
|
|
1244
|
-
progress: {
|
|
1245
|
-
milestones: milestoneProgress,
|
|
1246
|
-
slices: { done: 0, total: 0 },
|
|
1247
|
-
},
|
|
1248
|
-
};
|
|
1249
|
-
}
|
|
1250
|
-
|
|
1251
|
-
// Check if active milestone needs validation or completion (all slices done)
|
|
1252
|
-
if (isMilestoneComplete(activeRoadmap)) {
|
|
1253
|
-
const validationFile = resolveMilestoneFile(basePath, activeMilestone.id, "VALIDATION");
|
|
1254
|
-
const validationContent = validationFile ? await cachedLoadFile(validationFile) : null;
|
|
1255
|
-
const validationTerminal = validationContent ? isValidationTerminal(validationContent) : false;
|
|
1256
|
-
const sliceProgress = {
|
|
1257
|
-
done: activeRoadmap.slices.length,
|
|
1258
|
-
total: activeRoadmap.slices.length,
|
|
1259
|
-
};
|
|
1260
|
-
|
|
1261
|
-
if (!validationTerminal) {
|
|
1262
|
-
return {
|
|
1263
|
-
activeMilestone,
|
|
1264
|
-
activeSlice: null,
|
|
1265
|
-
activeTask: null,
|
|
1266
|
-
phase: 'validating-milestone',
|
|
1267
|
-
recentDecisions: [],
|
|
1268
|
-
blockers: [],
|
|
1269
|
-
nextAction: `Validate milestone ${activeMilestone.id} before completion.`,
|
|
1270
|
-
registry,
|
|
1271
|
-
requirements,
|
|
1272
|
-
progress: {
|
|
1273
|
-
milestones: milestoneProgress,
|
|
1274
|
-
slices: sliceProgress,
|
|
1275
|
-
},
|
|
1276
|
-
};
|
|
1277
|
-
}
|
|
1278
|
-
|
|
1279
|
-
return {
|
|
1280
|
-
activeMilestone,
|
|
1281
|
-
activeSlice: null,
|
|
1282
|
-
activeTask: null,
|
|
1283
|
-
phase: 'completing-milestone',
|
|
1284
|
-
recentDecisions: [],
|
|
1285
|
-
blockers: [],
|
|
1286
|
-
nextAction: `All slices complete in ${activeMilestone.id}. Write milestone summary.`,
|
|
1287
|
-
registry,
|
|
1288
|
-
requirements,
|
|
1289
|
-
progress: {
|
|
1290
|
-
milestones: milestoneProgress,
|
|
1291
|
-
slices: sliceProgress,
|
|
1292
|
-
},
|
|
1293
|
-
};
|
|
1294
|
-
}
|
|
1295
|
-
|
|
1296
|
-
const sliceProgress = {
|
|
1297
|
-
done: activeRoadmap.slices.filter(s => s.done).length,
|
|
1298
|
-
total: activeRoadmap.slices.length,
|
|
1299
|
-
};
|
|
1300
|
-
|
|
1301
|
-
// Find the active slice (first incomplete with deps satisfied)
|
|
1302
|
-
const doneSliceIds = new Set(activeRoadmap.slices.filter(s => s.done).map(s => s.id));
|
|
1303
|
-
let activeSlice: ActiveRef | null = null;
|
|
1304
|
-
|
|
1305
|
-
for (const s of activeRoadmap.slices) {
|
|
1306
|
-
if (s.done) continue;
|
|
1307
|
-
if (s.depends.every(dep => doneSliceIds.has(dep))) {
|
|
1308
|
-
activeSlice = { id: s.id, title: s.title };
|
|
1309
|
-
break;
|
|
1310
|
-
}
|
|
1311
|
-
}
|
|
1312
|
-
|
|
1313
|
-
if (!activeSlice) {
|
|
1314
|
-
return {
|
|
1315
|
-
activeMilestone,
|
|
1316
|
-
activeSlice: null,
|
|
1317
|
-
activeTask: null,
|
|
1318
|
-
phase: 'blocked',
|
|
1319
|
-
recentDecisions: [],
|
|
1320
|
-
blockers: ['No slice eligible — check dependency ordering'],
|
|
1321
|
-
nextAction: 'Resolve dependency blockers or plan next slice.',
|
|
1322
|
-
registry,
|
|
1323
|
-
requirements,
|
|
1324
|
-
progress: {
|
|
1325
|
-
milestones: milestoneProgress,
|
|
1326
|
-
slices: sliceProgress,
|
|
1327
|
-
},
|
|
1328
|
-
};
|
|
1329
|
-
}
|
|
1330
|
-
|
|
1331
|
-
// Check if the slice has a plan
|
|
1332
|
-
const planFile = resolveSliceFile(basePath, activeMilestone.id, activeSlice.id, "PLAN");
|
|
1333
|
-
const slicePlanContent = planFile ? await cachedLoadFile(planFile) : null;
|
|
1334
|
-
|
|
1335
|
-
if (!slicePlanContent) {
|
|
1336
|
-
return {
|
|
1337
|
-
activeMilestone,
|
|
1338
|
-
activeSlice,
|
|
1339
|
-
activeTask: null,
|
|
1340
|
-
phase: 'planning',
|
|
1341
|
-
recentDecisions: [],
|
|
1342
|
-
blockers: [],
|
|
1343
|
-
nextAction: `Plan slice ${activeSlice.id} (${activeSlice.title}).`,
|
|
1344
|
-
|
|
1345
|
-
registry,
|
|
1346
|
-
requirements,
|
|
1347
|
-
progress: {
|
|
1348
|
-
milestones: milestoneProgress,
|
|
1349
|
-
slices: sliceProgress,
|
|
1350
|
-
},
|
|
1351
|
-
};
|
|
1352
|
-
}
|
|
1353
|
-
|
|
1354
|
-
const slicePlan = parsePlan(slicePlanContent);
|
|
1355
|
-
|
|
1356
|
-
// ── Reconcile stale task status for filesystem-based projects (#2514) ──
|
|
1357
|
-
// Heading-style tasks (### T01:) are always parsed as done=false by
|
|
1358
|
-
// parsePlan because the heading syntax has no checkbox. When the agent
|
|
1359
|
-
// writes a SUMMARY file but the plan's heading isn't converted to a
|
|
1360
|
-
// checkbox, the task appears incomplete forever — causing infinite
|
|
1361
|
-
// re-dispatch. Reconcile by checking SUMMARY files on disk.
|
|
1362
|
-
for (const t of slicePlan.tasks) {
|
|
1363
|
-
if (t.done) continue;
|
|
1364
|
-
const summaryPath = resolveTaskFile(basePath, activeMilestone.id, activeSlice.id, t.id, "SUMMARY");
|
|
1365
|
-
if (summaryPath && existsSync(summaryPath)) {
|
|
1366
|
-
t.done = true;
|
|
1367
|
-
logWarning("reconcile", `task ${activeMilestone.id}/${activeSlice.id}/${t.id} reconciled via SUMMARY on disk (#2514)`, { mid: activeMilestone.id, sid: activeSlice.id, tid: t.id });
|
|
1368
|
-
}
|
|
1369
|
-
}
|
|
1370
|
-
|
|
1371
|
-
const taskProgress = {
|
|
1372
|
-
done: slicePlan.tasks.filter(t => t.done).length,
|
|
1373
|
-
total: slicePlan.tasks.length,
|
|
1374
|
-
};
|
|
1375
|
-
const activeTaskEntry = slicePlan.tasks.find(t => !t.done);
|
|
1376
|
-
|
|
1377
|
-
if (!activeTaskEntry && slicePlan.tasks.length > 0) {
|
|
1378
|
-
// All tasks done but slice not marked complete
|
|
1379
|
-
return {
|
|
1380
|
-
activeMilestone,
|
|
1381
|
-
activeSlice,
|
|
1382
|
-
activeTask: null,
|
|
1383
|
-
phase: 'summarizing',
|
|
1384
|
-
recentDecisions: [],
|
|
1385
|
-
blockers: [],
|
|
1386
|
-
nextAction: `All tasks done in ${activeSlice.id}. Write slice summary and complete slice.`,
|
|
1387
|
-
|
|
1388
|
-
registry,
|
|
1389
|
-
requirements,
|
|
1390
|
-
progress: {
|
|
1391
|
-
milestones: milestoneProgress,
|
|
1392
|
-
slices: sliceProgress,
|
|
1393
|
-
tasks: taskProgress,
|
|
1394
|
-
},
|
|
1395
|
-
};
|
|
1396
|
-
}
|
|
1397
|
-
|
|
1398
|
-
// Empty plan — no tasks defined yet, stay in planning phase
|
|
1399
|
-
if (!activeTaskEntry) {
|
|
1400
|
-
return {
|
|
1401
|
-
activeMilestone,
|
|
1402
|
-
activeSlice,
|
|
1403
|
-
activeTask: null,
|
|
1404
|
-
phase: 'planning',
|
|
1405
|
-
recentDecisions: [],
|
|
1406
|
-
blockers: [],
|
|
1407
|
-
nextAction: `Slice ${activeSlice.id} has a plan file but no tasks. Add tasks to the plan.`,
|
|
1408
|
-
|
|
1409
|
-
registry,
|
|
1410
|
-
requirements,
|
|
1411
|
-
progress: {
|
|
1412
|
-
milestones: milestoneProgress,
|
|
1413
|
-
slices: sliceProgress,
|
|
1414
|
-
tasks: taskProgress,
|
|
1415
|
-
},
|
|
1416
|
-
};
|
|
1417
|
-
}
|
|
1418
|
-
|
|
1419
|
-
const activeTask: ActiveRef = {
|
|
1420
|
-
id: activeTaskEntry.id,
|
|
1421
|
-
title: activeTaskEntry.title,
|
|
1422
|
-
};
|
|
1423
|
-
|
|
1424
|
-
// ── Task plan file check (#909) ──────────────────────────────────────
|
|
1425
|
-
// The slice plan may reference tasks but per-task plan files may be
|
|
1426
|
-
// missing — e.g. when the slice plan was pre-created during roadmapping.
|
|
1427
|
-
// If the tasks dir exists but has literally zero files (empty dir from
|
|
1428
|
-
// mkdir), fall back to planning so plan-slice generates task plans.
|
|
1429
|
-
const tasksDir = resolveTasksDir(basePath, activeMilestone.id, activeSlice.id);
|
|
1430
|
-
if (tasksDir && existsSync(tasksDir) && slicePlan.tasks.length > 0) {
|
|
1431
|
-
const allFiles = readdirSync(tasksDir).filter(f => f.endsWith(".md"));
|
|
1432
|
-
if (allFiles.length === 0) {
|
|
1433
|
-
return {
|
|
1434
|
-
activeMilestone,
|
|
1435
|
-
activeSlice,
|
|
1436
|
-
activeTask: null,
|
|
1437
|
-
phase: 'planning',
|
|
1438
|
-
recentDecisions: [],
|
|
1439
|
-
blockers: [],
|
|
1440
|
-
nextAction: `Task plan files missing for ${activeSlice.id}. Run plan-slice to generate task plans.`,
|
|
1441
|
-
registry,
|
|
1442
|
-
requirements,
|
|
1443
|
-
progress: {
|
|
1444
|
-
milestones: milestoneProgress,
|
|
1445
|
-
slices: sliceProgress,
|
|
1446
|
-
tasks: taskProgress,
|
|
1447
|
-
},
|
|
1448
|
-
};
|
|
1449
|
-
}
|
|
1450
|
-
}
|
|
1451
|
-
|
|
1452
|
-
// ── Blocker detection: scan completed task summaries ──────────────────
|
|
1453
|
-
// If any completed task has blocker_discovered: true and no REPLAN.md
|
|
1454
|
-
// exists yet, transition to replanning-slice instead of executing.
|
|
1455
|
-
const completedTasks = slicePlan.tasks.filter(t => t.done);
|
|
1456
|
-
let blockerTaskId: string | null = null;
|
|
1457
|
-
for (const ct of completedTasks) {
|
|
1458
|
-
const summaryFile = resolveTaskFile(basePath, activeMilestone.id, activeSlice.id, ct.id, "SUMMARY");
|
|
1459
|
-
if (!summaryFile) continue;
|
|
1460
|
-
const summaryContent = await cachedLoadFile(summaryFile);
|
|
1461
|
-
if (!summaryContent) continue;
|
|
1462
|
-
const summary = parseSummary(summaryContent);
|
|
1463
|
-
if (summary.frontmatter.blocker_discovered) {
|
|
1464
|
-
blockerTaskId = ct.id;
|
|
1465
|
-
break;
|
|
1466
|
-
}
|
|
1467
|
-
}
|
|
1468
|
-
|
|
1469
|
-
if (blockerTaskId) {
|
|
1470
|
-
// Loop protection: if REPLAN.md already exists, a replan was already
|
|
1471
|
-
// performed for this slice — skip further replanning and continue executing.
|
|
1472
|
-
const replanFile = resolveSliceFile(basePath, activeMilestone.id, activeSlice.id, "REPLAN");
|
|
1473
|
-
if (!replanFile) {
|
|
1474
|
-
return {
|
|
1475
|
-
activeMilestone,
|
|
1476
|
-
activeSlice,
|
|
1477
|
-
activeTask,
|
|
1478
|
-
phase: 'replanning-slice',
|
|
1479
|
-
recentDecisions: [],
|
|
1480
|
-
blockers: [`Task ${blockerTaskId} discovered a blocker requiring slice replan`],
|
|
1481
|
-
nextAction: `Task ${blockerTaskId} reported blocker_discovered. Replan slice ${activeSlice.id} before continuing.`,
|
|
1482
|
-
|
|
1483
|
-
activeWorkspace: undefined,
|
|
1484
|
-
registry,
|
|
1485
|
-
requirements,
|
|
1486
|
-
progress: {
|
|
1487
|
-
milestones: milestoneProgress,
|
|
1488
|
-
slices: sliceProgress,
|
|
1489
|
-
tasks: taskProgress,
|
|
1490
|
-
},
|
|
1491
|
-
};
|
|
1492
|
-
}
|
|
1493
|
-
// REPLAN.md exists — loop protection: fall through to normal executing
|
|
1494
|
-
}
|
|
1495
|
-
|
|
1496
|
-
// ── REPLAN-TRIGGER detection: triage-initiated replan ──────────────────
|
|
1497
|
-
// Manual `/gsd triage` writes REPLAN-TRIGGER.md when a capture is classified
|
|
1498
|
-
// as "replan". Detect it here and transition to replanning-slice so the
|
|
1499
|
-
// dispatch loop picks it up (instead of silently advancing past it).
|
|
1500
|
-
if (!blockerTaskId) {
|
|
1501
|
-
const replanTriggerFile = resolveSliceFile(basePath, activeMilestone.id, activeSlice.id, "REPLAN-TRIGGER");
|
|
1502
|
-
if (replanTriggerFile) {
|
|
1503
|
-
// Same loop protection: if REPLAN.md already exists, a replan was
|
|
1504
|
-
// already performed — skip further replanning and continue executing.
|
|
1505
|
-
const replanFile = resolveSliceFile(basePath, activeMilestone.id, activeSlice.id, "REPLAN");
|
|
1506
|
-
if (!replanFile) {
|
|
1507
|
-
return {
|
|
1508
|
-
activeMilestone,
|
|
1509
|
-
activeSlice,
|
|
1510
|
-
activeTask,
|
|
1511
|
-
phase: 'replanning-slice',
|
|
1512
|
-
recentDecisions: [],
|
|
1513
|
-
blockers: ['Triage replan trigger detected — slice replan required'],
|
|
1514
|
-
nextAction: `Triage replan triggered for slice ${activeSlice.id}. Replan before continuing.`,
|
|
1515
|
-
|
|
1516
|
-
activeWorkspace: undefined,
|
|
1517
|
-
registry,
|
|
1518
|
-
requirements,
|
|
1519
|
-
progress: {
|
|
1520
|
-
milestones: milestoneProgress,
|
|
1521
|
-
slices: sliceProgress,
|
|
1522
|
-
tasks: taskProgress,
|
|
1523
|
-
},
|
|
1524
|
-
};
|
|
1525
|
-
}
|
|
1526
|
-
}
|
|
1527
|
-
}
|
|
1528
|
-
|
|
1529
|
-
// Check for interrupted work
|
|
1530
|
-
const sDir = resolveSlicePath(basePath, activeMilestone.id, activeSlice.id);
|
|
1531
|
-
const continueFile = sDir ? resolveSliceFile(basePath, activeMilestone.id, activeSlice.id, "CONTINUE") : null;
|
|
1532
|
-
// Also check legacy continue.md
|
|
1533
|
-
const hasInterrupted = !!(continueFile && await cachedLoadFile(continueFile)) ||
|
|
1534
|
-
!!(sDir && await cachedLoadFile(join(sDir, "continue.md")));
|
|
1535
|
-
|
|
1536
|
-
return {
|
|
1537
|
-
activeMilestone,
|
|
1538
|
-
activeSlice,
|
|
1539
|
-
activeTask,
|
|
1540
|
-
phase: 'executing',
|
|
1541
|
-
recentDecisions: [],
|
|
1542
|
-
blockers: [],
|
|
1543
|
-
nextAction: hasInterrupted
|
|
1544
|
-
? `Resume interrupted work on ${activeTask.id}: ${activeTask.title} in slice ${activeSlice.id}. Read continue.md first.`
|
|
1545
|
-
: `Execute ${activeTask.id}: ${activeTask.title} in slice ${activeSlice.id}.`,
|
|
1546
|
-
registry,
|
|
1547
|
-
requirements,
|
|
1548
|
-
progress: {
|
|
1549
|
-
milestones: milestoneProgress,
|
|
1550
|
-
slices: sliceProgress,
|
|
1551
|
-
tasks: taskProgress,
|
|
1552
|
-
},
|
|
1553
|
-
};
|
|
1554
|
-
}
|