gsd-pi 2.58.0-dev.778d6ac → 2.58.0-dev.d63175c
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 +1 -1
- package/dist/cli.js +35 -49
- package/dist/headless-ui.d.ts +0 -17
- package/dist/headless-ui.js +3 -97
- package/dist/headless.js +6 -67
- package/dist/help-text.js +0 -1
- package/dist/onboarding.js +0 -44
- package/dist/resource-loader.js +1 -16
- package/dist/resources/agents/researcher.md +1 -1
- package/dist/resources/extensions/ask-user-questions.js +3 -16
- package/dist/resources/extensions/async-jobs/extension-manifest.json +1 -1
- package/dist/resources/extensions/bg-shell/extension-manifest.json +1 -1
- package/dist/resources/extensions/browser-tools/extension-manifest.json +1 -1
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +6 -14
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +36 -59
- package/dist/resources/extensions/context7/extension-manifest.json +1 -1
- package/dist/resources/extensions/get-secrets-from-user.js +5 -8
- package/dist/resources/extensions/google-search/extension-manifest.json +1 -1
- package/dist/resources/extensions/google-search/index.js +1 -2
- package/dist/resources/extensions/gsd/auto/phases.js +21 -25
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +2 -2
- package/dist/resources/extensions/gsd/auto-dashboard.js +20 -37
- package/dist/resources/extensions/gsd/auto-dispatch.js +2 -17
- package/dist/resources/extensions/gsd/auto-model-selection.js +3 -26
- package/dist/resources/extensions/gsd/auto-post-unit.js +4 -16
- package/dist/resources/extensions/gsd/auto-prompts.js +1 -1
- package/dist/resources/extensions/gsd/auto-recovery.js +5 -13
- package/dist/resources/extensions/gsd/auto-start.js +22 -35
- package/dist/resources/extensions/gsd/auto-worktree.js +12 -196
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +0 -32
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +8 -80
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -32
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +18 -33
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -44
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +0 -67
- package/dist/resources/extensions/gsd/captures.js +4 -56
- package/dist/resources/extensions/gsd/db-writer.js +8 -116
- package/dist/resources/extensions/gsd/doctor-git-checks.js +0 -28
- package/dist/resources/extensions/gsd/doctor-providers.js +1 -2
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +4 -5
- package/dist/resources/extensions/gsd/doctor.js +1 -3
- package/dist/resources/extensions/gsd/error-classifier.js +10 -13
- package/dist/resources/extensions/gsd/extension-manifest.json +1 -16
- package/dist/resources/extensions/gsd/forensics.js +20 -123
- package/dist/resources/extensions/gsd/git-service.js +1 -23
- package/dist/resources/extensions/gsd/gitignore.js +0 -33
- package/dist/resources/extensions/gsd/gsd-db.js +9 -36
- package/dist/resources/extensions/gsd/guided-flow.js +44 -106
- package/dist/resources/extensions/gsd/health-widget-core.js +0 -31
- package/dist/resources/extensions/gsd/health-widget.js +0 -17
- package/dist/resources/extensions/gsd/index.js +1 -1
- package/dist/resources/extensions/gsd/memory-extractor.js +0 -7
- package/dist/resources/extensions/gsd/migrate-external.js +1 -8
- package/dist/resources/extensions/gsd/model-cost-table.js +0 -18
- package/dist/resources/extensions/gsd/model-router.js +1 -35
- package/dist/resources/extensions/gsd/native-git-bridge.js +0 -17
- package/dist/resources/extensions/gsd/notifications.js +1 -16
- package/dist/resources/extensions/gsd/parallel-eligibility.js +2 -13
- package/dist/resources/extensions/gsd/parallel-merge.js +5 -78
- package/dist/resources/extensions/gsd/parsers-legacy.js +3 -20
- package/dist/resources/extensions/gsd/paths.js +0 -43
- package/dist/resources/extensions/gsd/preferences-models.js +1 -14
- package/dist/resources/extensions/gsd/preferences-types.js +1 -2
- package/dist/resources/extensions/gsd/preferences.js +16 -13
- package/dist/resources/extensions/gsd/prompt-loader.js +1 -4
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -4
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
- package/dist/resources/extensions/gsd/prompts/discuss.md +1 -1
- package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -3
- package/dist/resources/extensions/gsd/prompts/forensics.md +2 -2
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +0 -2
- package/dist/resources/extensions/gsd/prompts/rethink.md +1 -1
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +0 -1
- package/dist/resources/extensions/gsd/repo-identity.js +11 -205
- package/dist/resources/extensions/gsd/rethink.js +0 -5
- package/dist/resources/extensions/gsd/roadmap-slices.js +4 -5
- package/dist/resources/extensions/gsd/state.js +27 -85
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +1 -20
- package/dist/resources/extensions/gsd/tools/complete-task.js +71 -34
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +2 -12
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +1 -29
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +3 -14
- package/dist/resources/extensions/gsd/triage-resolution.js +7 -22
- package/dist/resources/extensions/gsd/undo.js +2 -2
- package/dist/resources/extensions/gsd/unit-ownership.js +33 -164
- package/dist/resources/extensions/gsd/verdict-parser.js +8 -20
- package/dist/resources/extensions/gsd/workflow-manifest.js +5 -24
- package/dist/resources/extensions/gsd/workflow-projections.js +63 -95
- package/dist/resources/extensions/gsd/workflow-reconcile.js +5 -35
- package/dist/resources/extensions/gsd/workspace-index.js +0 -24
- package/dist/resources/extensions/gsd/worktree-manager.js +1 -105
- package/dist/resources/extensions/gsd/worktree-resolver.js +3 -20
- package/dist/resources/extensions/mcp-client/index.js +7 -11
- package/dist/resources/extensions/search-the-web/extension-manifest.json +1 -1
- package/dist/resources/extensions/shared/interview-ui.js +1 -11
- package/dist/resources/skills/create-gsd-extension/SKILL.md +3 -5
- package/dist/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +4 -5
- package/dist/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
- package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
- package/dist/resources/skills/create-gsd-extension/workflows/debug-extension.md +3 -5
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -17
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- package/dist/web/standalone/.next/required-server-files.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -17
- package/dist/web/standalone/.next/server/chunks/2229.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/6502.8b732f67a11b11b4.js +9 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-a1c1e452c6b32d04.js → webpack-61d3afac6d0f0ce7.js} +1 -1
- package/dist/web/standalone/.next/static/css/a58ef8a151aa0493.css +1 -0
- package/dist/web/standalone/server.js +1 -1
- package/dist/web-mode.js +1 -2
- package/package.json +2 -2
- package/packages/native/dist/ast/index.js +5 -9
- package/packages/native/dist/ast/types.js +1 -2
- package/packages/native/dist/clipboard/index.js +7 -12
- package/packages/native/dist/clipboard/types.js +1 -2
- package/packages/native/dist/diff/index.js +7 -12
- package/packages/native/dist/diff/types.js +1 -2
- package/packages/native/dist/fd/index.js +3 -6
- package/packages/native/dist/fd/types.js +1 -2
- package/packages/native/dist/glob/index.js +5 -9
- package/packages/native/dist/glob/types.js +1 -2
- package/packages/native/dist/grep/index.js +5 -9
- package/packages/native/dist/grep/types.js +1 -2
- package/packages/native/dist/gsd-parser/index.js +11 -18
- package/packages/native/dist/gsd-parser/types.js +1 -2
- package/packages/native/dist/highlight/index.js +7 -12
- package/packages/native/dist/highlight/types.js +1 -2
- package/packages/native/dist/html/index.js +3 -6
- package/packages/native/dist/html/types.js +1 -2
- package/packages/native/dist/image/index.js +5 -10
- package/packages/native/dist/image/types.js +4 -7
- package/packages/native/dist/index.js +17 -70
- package/packages/native/dist/json-parse/index.js +8 -13
- package/packages/native/dist/native.js +10 -47
- package/packages/native/dist/ps/index.js +9 -15
- package/packages/native/dist/ps/types.js +1 -2
- package/packages/native/dist/stream-process/index.js +7 -12
- package/packages/native/dist/text/index.js +14 -24
- package/packages/native/dist/text/types.js +2 -5
- package/packages/native/dist/truncate/index.js +7 -12
- package/packages/native/dist/ttsr/index.js +7 -12
- package/packages/native/dist/ttsr/types.js +1 -2
- package/packages/native/dist/xxhash/index.js +5 -9
- package/packages/native/package.json +19 -19
- package/packages/native/src/native.ts +8 -9
- package/packages/pi-agent-core/dist/agent-loop.js +2 -3
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/proxy.d.ts +1 -1
- package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/proxy.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.ts +2 -3
- package/packages/pi-agent-core/src/proxy.ts +1 -1
- package/packages/pi-ai/dist/env-api-keys.js +0 -1
- package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
- package/packages/pi-ai/dist/index.d.ts +0 -1
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +0 -1
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +2 -19
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +3 -3
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/dist/utils/json-parse.d.ts +0 -3
- package/packages/pi-ai/dist/utils/json-parse.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/json-parse.js +1 -24
- package/packages/pi-ai/dist/utils/json-parse.js.map +1 -1
- package/packages/pi-ai/src/env-api-keys.ts +0 -1
- package/packages/pi-ai/src/index.ts +0 -1
- package/packages/pi-ai/src/providers/anthropic-shared.ts +2 -17
- package/packages/pi-ai/src/types.ts +2 -3
- package/packages/pi-ai/src/utils/json-parse.ts +1 -28
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +0 -4
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +0 -31
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +1 -17
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +2 -62
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/exec.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/exec.js +1 -3
- package/packages/pi-coding-agent/dist/core/exec.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +0 -4
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js +0 -2
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +0 -5
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +0 -5
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/index.js +1 -1
- package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/index.js +0 -3
- package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +0 -3
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/messages.js +2 -31
- package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +0 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +0 -10
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +1 -12
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +0 -6
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +1 -48
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -10
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js +4 -13
- package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +2 -2
- 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/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +0 -4
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts +0 -1
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js +0 -5
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +1 -38
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +1 -94
- package/packages/pi-coding-agent/src/core/exec.ts +1 -3
- package/packages/pi-coding-agent/src/core/extensions/index.ts +0 -4
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +0 -5
- package/packages/pi-coding-agent/src/core/index.ts +0 -6
- package/packages/pi-coding-agent/src/core/lsp/index.ts +0 -3
- package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +0 -3
- package/packages/pi-coding-agent/src/core/messages.ts +2 -29
- package/packages/pi-coding-agent/src/core/model-resolver.ts +0 -1
- package/packages/pi-coding-agent/src/core/resource-loader.ts +1 -20
- package/packages/pi-coding-agent/src/core/retry-handler.ts +1 -52
- package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +3 -11
- package/packages/pi-coding-agent/src/core/tools/read.ts +4 -14
- package/packages/pi-coding-agent/src/index.ts +0 -6
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +0 -7
- package/packages/pi-coding-agent/src/modes/rpc/remote-terminal.ts +0 -6
- package/packages/pi-tui/dist/terminal.d.ts +0 -2
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +0 -9
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +0 -9
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/src/terminal.ts +0 -14
- package/packages/pi-tui/src/tui.ts +0 -8
- package/scripts/ensure-workspace-builds.cjs +14 -45
- package/src/resources/agents/researcher.md +1 -1
- package/src/resources/extensions/ask-user-questions.ts +3 -21
- package/src/resources/extensions/async-jobs/extension-manifest.json +1 -1
- package/src/resources/extensions/bg-shell/extension-manifest.json +1 -1
- package/src/resources/extensions/browser-tools/extension-manifest.json +1 -1
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +6 -13
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +35 -63
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +0 -28
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +1 -108
- package/src/resources/extensions/context7/extension-manifest.json +1 -1
- package/src/resources/extensions/get-secrets-from-user.ts +5 -8
- package/src/resources/extensions/google-search/extension-manifest.json +1 -1
- package/src/resources/extensions/google-search/index.ts +1 -2
- package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -1
- package/src/resources/extensions/gsd/auto/phases.ts +34 -43
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
- package/src/resources/extensions/gsd/auto-dashboard.ts +19 -37
- package/src/resources/extensions/gsd/auto-dispatch.ts +2 -18
- package/src/resources/extensions/gsd/auto-model-selection.ts +5 -26
- package/src/resources/extensions/gsd/auto-post-unit.ts +4 -18
- package/src/resources/extensions/gsd/auto-prompts.ts +1 -1
- package/src/resources/extensions/gsd/auto-recovery.ts +5 -12
- package/src/resources/extensions/gsd/auto-start.ts +26 -35
- package/src/resources/extensions/gsd/auto-worktree.ts +9 -190
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +0 -31
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +8 -85
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -38
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +19 -31
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -50
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +0 -75
- package/src/resources/extensions/gsd/captures.ts +3 -63
- package/src/resources/extensions/gsd/db-writer.ts +7 -140
- package/src/resources/extensions/gsd/doctor-git-checks.ts +0 -26
- package/src/resources/extensions/gsd/doctor-providers.ts +1 -2
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +4 -5
- package/src/resources/extensions/gsd/doctor.ts +1 -3
- package/src/resources/extensions/gsd/error-classifier.ts +11 -14
- package/src/resources/extensions/gsd/extension-manifest.json +1 -16
- package/src/resources/extensions/gsd/forensics.ts +20 -144
- package/src/resources/extensions/gsd/git-service.ts +3 -26
- package/src/resources/extensions/gsd/gitignore.ts +0 -33
- package/src/resources/extensions/gsd/gsd-db.ts +7 -43
- package/src/resources/extensions/gsd/guided-flow.ts +45 -114
- package/src/resources/extensions/gsd/health-widget-core.ts +0 -34
- package/src/resources/extensions/gsd/health-widget.ts +0 -17
- package/src/resources/extensions/gsd/index.ts +0 -1
- package/src/resources/extensions/gsd/memory-extractor.ts +0 -8
- package/src/resources/extensions/gsd/migrate-external.ts +1 -9
- package/src/resources/extensions/gsd/model-cost-table.ts +0 -19
- package/src/resources/extensions/gsd/model-router.ts +1 -35
- package/src/resources/extensions/gsd/native-git-bridge.ts +0 -17
- package/src/resources/extensions/gsd/notifications.ts +0 -16
- package/src/resources/extensions/gsd/parallel-eligibility.ts +2 -15
- package/src/resources/extensions/gsd/parallel-merge.ts +4 -87
- package/src/resources/extensions/gsd/parsers-legacy.ts +3 -22
- package/src/resources/extensions/gsd/paths.ts +0 -42
- package/src/resources/extensions/gsd/preferences-models.ts +1 -14
- package/src/resources/extensions/gsd/preferences-types.ts +1 -2
- package/src/resources/extensions/gsd/preferences.ts +15 -13
- package/src/resources/extensions/gsd/prompt-loader.ts +1 -4
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -4
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
- package/src/resources/extensions/gsd/prompts/discuss.md +1 -1
- package/src/resources/extensions/gsd/prompts/execute-task.md +1 -3
- package/src/resources/extensions/gsd/prompts/forensics.md +2 -2
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +0 -2
- package/src/resources/extensions/gsd/prompts/rethink.md +1 -1
- package/src/resources/extensions/gsd/prompts/triage-captures.md +0 -1
- package/src/resources/extensions/gsd/repo-identity.ts +11 -186
- package/src/resources/extensions/gsd/rethink.ts +0 -6
- package/src/resources/extensions/gsd/roadmap-slices.ts +4 -5
- package/src/resources/extensions/gsd/state.ts +32 -84
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +0 -29
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +1 -71
- package/src/resources/extensions/gsd/tests/captures.test.ts +0 -103
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +0 -27
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +0 -21
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +12 -7
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +5 -78
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +0 -29
- package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +0 -40
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +1 -20
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +0 -117
- package/src/resources/extensions/gsd/tests/empty-db-reconciliation.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -31
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +12 -125
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +0 -67
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +1 -111
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +0 -101
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +0 -59
- package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +0 -110
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +2 -85
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +0 -34
- package/src/resources/extensions/gsd/tests/model-router.test.ts +3 -68
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +0 -28
- package/src/resources/extensions/gsd/tests/notifications.test.ts +0 -45
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +1 -33
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +0 -29
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +0 -38
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +0 -117
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +0 -97
- package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +0 -134
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +1 -2
- package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +0 -8
- package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +17 -100
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +1 -4
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +0 -48
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +0 -92
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +1 -48
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +5 -29
- package/src/resources/extensions/gsd/tools/complete-task.ts +74 -36
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +1 -13
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +0 -36
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +2 -20
- package/src/resources/extensions/gsd/triage-resolution.ts +6 -23
- package/src/resources/extensions/gsd/types.ts +2 -4
- package/src/resources/extensions/gsd/undo.ts +2 -2
- package/src/resources/extensions/gsd/unit-ownership.ts +35 -206
- package/src/resources/extensions/gsd/verdict-parser.ts +6 -21
- package/src/resources/extensions/gsd/workflow-logger.ts +1 -3
- package/src/resources/extensions/gsd/workflow-manifest.ts +5 -22
- package/src/resources/extensions/gsd/workflow-projections.ts +64 -97
- package/src/resources/extensions/gsd/workflow-reconcile.ts +10 -39
- package/src/resources/extensions/gsd/workspace-index.ts +0 -30
- package/src/resources/extensions/gsd/worktree-manager.ts +1 -120
- package/src/resources/extensions/gsd/worktree-resolver.ts +3 -22
- package/src/resources/extensions/mcp-client/index.ts +7 -13
- package/src/resources/extensions/search-the-web/extension-manifest.json +1 -1
- package/src/resources/extensions/shared/interview-ui.ts +1 -12
- package/src/resources/skills/create-gsd-extension/SKILL.md +3 -5
- package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +4 -5
- package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
- package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
- package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +3 -5
- package/dist/resources/extensions/gsd/milestone-validation-gates.js +0 -45
- package/dist/resources/extensions/ollama/index.js +0 -112
- package/dist/resources/extensions/ollama/model-capabilities.js +0 -115
- package/dist/resources/extensions/ollama/ollama-client.js +0 -168
- package/dist/resources/extensions/ollama/ollama-commands.js +0 -194
- package/dist/resources/extensions/ollama/ollama-discovery.js +0 -69
- package/dist/resources/extensions/ollama/ollama-tool.js +0 -184
- package/dist/resources/extensions/ollama/types.js +0 -2
- package/dist/startup-model-validation.d.ts +0 -39
- package/dist/startup-model-validation.js +0 -50
- package/dist/web/standalone/.next/static/chunks/6502.7593d7797a4b3999.js +0 -9
- package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +0 -1
- package/packages/native/src/__tests__/module-compat.test.mjs +0 -91
- package/packages/pi-agent-core/src/agent-loop.test.ts +0 -45
- package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts +0 -2
- package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts.map +0 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js +0 -25
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +0 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.d.ts +0 -37
- package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +0 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.js +0 -75
- package/packages/pi-ai/dist/utils/repair-tool-json.js.map +0 -1
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts +0 -2
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts.map +0 -1
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +0 -73
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +0 -1
- package/packages/pi-ai/src/providers/anthropic-shared.test.ts +0 -29
- package/packages/pi-ai/src/utils/repair-tool-json.ts +0 -88
- package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +0 -102
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts +0 -6
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +0 -176
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts +0 -28
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js +0 -37
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js +0 -63
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts +0 -19
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js +0 -115
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js +0 -109
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts +0 -44
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js +0 -97
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js +0 -181
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/messages.test.d.ts +0 -9
- package/packages/pi-coding-agent/dist/core/messages.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/messages.test.js +0 -86
- package/packages/pi-coding-agent/dist/core/messages.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts +0 -9
- package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js +0 -193
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts +0 -16
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +0 -80
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +0 -1
- package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +0 -236
- package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +0 -77
- package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +0 -62
- package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +0 -134
- package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +0 -137
- package/packages/pi-coding-agent/src/core/image-overflow-recovery.test.ts +0 -228
- package/packages/pi-coding-agent/src/core/image-overflow-recovery.ts +0 -118
- package/packages/pi-coding-agent/src/core/messages.test.ts +0 -114
- package/packages/pi-coding-agent/src/core/retry-handler.test.ts +0 -255
- package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +0 -92
- package/src/resources/extensions/gsd/milestone-validation-gates.ts +0 -56
- package/src/resources/extensions/gsd/tests/auto-mode-interactive-guard.test.ts +0 -71
- package/src/resources/extensions/gsd/tests/cli-provider-rate-limit.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/completion-hierarchy-guards.test.ts +0 -192
- package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +0 -131
- 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/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/event-replay-idempotency.test.ts +0 -140
- 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/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/hook-key-parsing.test.ts +0 -107
- package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +0 -243
- package/src/resources/extensions/gsd/tests/integration/gitignore-staging-2570.test.ts +0 -150
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +0 -959
- package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +0 -105
- package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +0 -116
- package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +0 -159
- package/src/resources/extensions/gsd/tests/parallel-eligibility-ghost.test.ts +0 -150
- package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +0 -70
- package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +0 -297
- package/src/resources/extensions/gsd/tests/prompt-loader-replacement.test.ts +0 -178
- package/src/resources/extensions/gsd/tests/prompt-tool-names.test.ts +0 -69
- package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +0 -157
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +0 -90
- package/src/resources/extensions/gsd/tests/reconciliation-edge-cases.test.ts +0 -162
- package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +0 -233
- 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/stop-auto-race-null-unit.test.ts +0 -106
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +0 -174
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +0 -221
- package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +0 -289
- package/src/resources/extensions/gsd/tests/vacuum-recovery.test.ts +0 -154
- package/src/resources/extensions/gsd/tests/verdict-parser.test.ts +0 -156
- package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +0 -82
- package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +0 -140
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +0 -101
- package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +0 -95
- package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +0 -55
- package/src/resources/extensions/ollama/index.ts +0 -130
- package/src/resources/extensions/ollama/model-capabilities.ts +0 -145
- package/src/resources/extensions/ollama/ollama-client.ts +0 -196
- package/src/resources/extensions/ollama/ollama-commands.ts +0 -248
- package/src/resources/extensions/ollama/ollama-discovery.ts +0 -106
- package/src/resources/extensions/ollama/ollama-tool.ts +0 -218
- package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +0 -162
- package/src/resources/extensions/ollama/tests/ollama-client.test.ts +0 -38
- package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +0 -28
- package/src/resources/extensions/ollama/types.ts +0 -130
- package/src/resources/extensions/shared/tests/ask-user-freetext.test.ts +0 -156
- /package/dist/web/standalone/.next/static/{R0D4xaIPl5kg93edN7Oo0 → 5DLsjFHdSB6_a1EDQVjr7}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{R0D4xaIPl5kg93edN7Oo0 → 5DLsjFHdSB6_a1EDQVjr7}/_ssgManifest.js +0 -0
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
import { createHash } from "node:crypto";
|
|
10
10
|
import { execFileSync } from "node:child_process";
|
|
11
|
-
import {
|
|
11
|
+
import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, realpathSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
|
|
12
12
|
import { homedir } from "node:os";
|
|
13
13
|
import { basename, dirname, join, resolve } from "node:path";
|
|
14
14
|
|
|
@@ -276,14 +276,9 @@ export function validateProjectId(id: string): boolean {
|
|
|
276
276
|
* If `GSD_PROJECT_ID` is set, returns it directly (validation is expected
|
|
277
277
|
* to have already happened at startup via `validateProjectId`).
|
|
278
278
|
*
|
|
279
|
-
*
|
|
280
|
-
*
|
|
281
|
-
*
|
|
282
|
-
* For local-only repos (no remote), includes the git root in the hash.
|
|
283
|
-
* Local repos use a `.gsd-id` marker file for recovery after moves.
|
|
284
|
-
*
|
|
285
|
-
* Deterministic: same repo always produces the same hash regardless of
|
|
286
|
-
* which worktree the caller is inside.
|
|
279
|
+
* Otherwise returns SHA-256 of `${remoteUrl}\n${resolvedRoot}`, truncated
|
|
280
|
+
* to 12 hex chars. Deterministic: same repo always produces the same hash
|
|
281
|
+
* regardless of which worktree the caller is inside.
|
|
287
282
|
*/
|
|
288
283
|
export function repoIdentity(basePath: string): string {
|
|
289
284
|
const projectId = process.env.GSD_PROJECT_ID;
|
|
@@ -291,14 +286,8 @@ export function repoIdentity(basePath: string): string {
|
|
|
291
286
|
return projectId;
|
|
292
287
|
}
|
|
293
288
|
const remoteUrl = getRemoteUrl(basePath);
|
|
294
|
-
if (remoteUrl) {
|
|
295
|
-
// Remote URL alone uniquely identifies the repo — path is redundant.
|
|
296
|
-
// This makes moves transparent for repos with remotes (#2750).
|
|
297
|
-
return createHash("sha256").update(remoteUrl).digest("hex").slice(0, 12);
|
|
298
|
-
}
|
|
299
|
-
// Local-only repo: include git root since there's no remote to anchor identity.
|
|
300
289
|
const root = resolveGitRoot(basePath);
|
|
301
|
-
const input =
|
|
290
|
+
const input = `${remoteUrl}\n${root}`;
|
|
302
291
|
return createHash("sha256").update(input).digest("hex").slice(0, 12);
|
|
303
292
|
}
|
|
304
293
|
|
|
@@ -362,148 +351,21 @@ export function cleanNumberedGsdVariants(projectPath: string): string[] {
|
|
|
362
351
|
return removed;
|
|
363
352
|
}
|
|
364
353
|
|
|
365
|
-
// ─── .gsd-id Marker ─────────────────────────────────────────────────────────
|
|
366
|
-
|
|
367
|
-
/**
|
|
368
|
-
* Write a `.gsd-id` marker file in the project root.
|
|
369
|
-
*
|
|
370
|
-
* This file records the identity hash used for the external state directory.
|
|
371
|
-
* For local-only repos (no remote), this marker survives directory moves and
|
|
372
|
-
* enables automatic recovery of orphaned state (#2750).
|
|
373
|
-
*
|
|
374
|
-
* The marker is gitignored by ensureGitignore(). Non-fatal: failure to write
|
|
375
|
-
* the marker must never block project setup.
|
|
376
|
-
*/
|
|
377
|
-
function writeGsdIdMarker(projectPath: string, identity: string): void {
|
|
378
|
-
try {
|
|
379
|
-
const markerPath = join(projectPath, ".gsd-id");
|
|
380
|
-
// Only write if content differs to avoid unnecessary disk writes.
|
|
381
|
-
if (existsSync(markerPath)) {
|
|
382
|
-
try {
|
|
383
|
-
if (readFileSync(markerPath, "utf-8").trim() === identity) return;
|
|
384
|
-
} catch { /* fall through and overwrite */ }
|
|
385
|
-
}
|
|
386
|
-
writeFileSync(markerPath, identity + "\n", "utf-8");
|
|
387
|
-
} catch {
|
|
388
|
-
// Non-fatal — marker write failure should not block project setup
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
/**
|
|
393
|
-
* Read the `.gsd-id` marker from the project root.
|
|
394
|
-
* Returns the identity hash, or null if the marker doesn't exist or is unreadable.
|
|
395
|
-
*/
|
|
396
|
-
function readGsdIdMarker(projectPath: string): string | null {
|
|
397
|
-
try {
|
|
398
|
-
const markerPath = join(projectPath, ".gsd-id");
|
|
399
|
-
if (!existsSync(markerPath)) return null;
|
|
400
|
-
const content = readFileSync(markerPath, "utf-8").trim();
|
|
401
|
-
return /^[a-zA-Z0-9_-]+$/.test(content) ? content : null;
|
|
402
|
-
} catch {
|
|
403
|
-
return null;
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
/**
|
|
408
|
-
* Check whether an external state directory has meaningful content.
|
|
409
|
-
* Returns true if the directory contains any files or subdirectories
|
|
410
|
-
* beyond just repo-meta.json.
|
|
411
|
-
*/
|
|
412
|
-
function hasProjectState(externalPath: string): boolean {
|
|
413
|
-
try {
|
|
414
|
-
if (!existsSync(externalPath)) return false;
|
|
415
|
-
const entries = readdirSync(externalPath);
|
|
416
|
-
return entries.some(e => e !== "repo-meta.json");
|
|
417
|
-
} catch {
|
|
418
|
-
return false;
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
/**
|
|
423
|
-
* Resolve the external state directory, with recovery for relocated projects.
|
|
424
|
-
*
|
|
425
|
-
* For local-only repos where the computed identity produces an empty state dir,
|
|
426
|
-
* checks the `.gsd-id` marker for the original identity hash and recovers
|
|
427
|
-
* the old state directory if it still exists and contains data (#2750).
|
|
428
|
-
*
|
|
429
|
-
* Returns the resolved external path (may differ from the computed identity).
|
|
430
|
-
*/
|
|
431
|
-
function resolveExternalPathWithRecovery(projectPath: string): string {
|
|
432
|
-
const computedPath = externalGsdRoot(projectPath);
|
|
433
|
-
const computedId = repoIdentity(projectPath);
|
|
434
|
-
|
|
435
|
-
// Check if computed path already has state — fast path, no recovery needed.
|
|
436
|
-
if (hasProjectState(computedPath)) {
|
|
437
|
-
return computedPath;
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
// Check for .gsd-id marker from a previous location.
|
|
441
|
-
const markerId = readGsdIdMarker(projectPath);
|
|
442
|
-
if (markerId && markerId !== computedId) {
|
|
443
|
-
// The marker points to a different identity — the repo was likely moved.
|
|
444
|
-
const base = process.env.GSD_STATE_DIR || gsdHome;
|
|
445
|
-
const markerPath = join(base, "projects", markerId);
|
|
446
|
-
if (hasProjectState(markerPath)) {
|
|
447
|
-
// Recover: use the old state directory and update the marker to the new identity.
|
|
448
|
-
// Move the state from the old hash dir to the new one so future lookups work
|
|
449
|
-
// without the marker.
|
|
450
|
-
try {
|
|
451
|
-
mkdirSync(computedPath, { recursive: true });
|
|
452
|
-
const entries = readdirSync(markerPath);
|
|
453
|
-
for (const entry of entries) {
|
|
454
|
-
try {
|
|
455
|
-
const src = join(markerPath, entry);
|
|
456
|
-
const dst = join(computedPath, entry);
|
|
457
|
-
// Use rename for same-filesystem (fast) or fall back to copy.
|
|
458
|
-
try {
|
|
459
|
-
renameSync(src, dst);
|
|
460
|
-
} catch {
|
|
461
|
-
cpSync(src, dst, { recursive: true, force: true });
|
|
462
|
-
}
|
|
463
|
-
} catch { /* continue with remaining entries */ }
|
|
464
|
-
}
|
|
465
|
-
// Clean up old directory after successful migration.
|
|
466
|
-
try { rmSync(markerPath, { recursive: true, force: true }); } catch { /* non-fatal */ }
|
|
467
|
-
} catch {
|
|
468
|
-
// If migration fails, just point at the old directory.
|
|
469
|
-
return markerPath;
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
return computedPath;
|
|
475
|
-
}
|
|
476
|
-
|
|
477
354
|
// ─── Symlink Management ─────────────────────────────────────────────────────
|
|
478
355
|
|
|
479
356
|
/**
|
|
480
357
|
* Ensure the `<project>/.gsd` symlink points to the external state directory.
|
|
481
358
|
*
|
|
482
359
|
* 1. Clean up any macOS numbered collision variants (`.gsd 2`, `.gsd 3`, etc.)
|
|
483
|
-
* 2.
|
|
484
|
-
* 3.
|
|
485
|
-
* 4. If `<project>/.gsd`
|
|
486
|
-
* 5. If `<project>/.gsd` is
|
|
487
|
-
* 6. If `<project>/.gsd` is a real directory → return as-is (migration handles later)
|
|
488
|
-
* 7. Write `.gsd-id` marker for future relocation recovery
|
|
360
|
+
* 2. mkdir -p the external dir
|
|
361
|
+
* 3. If `<project>/.gsd` doesn't exist → create symlink
|
|
362
|
+
* 4. If `<project>/.gsd` is already the correct symlink → no-op
|
|
363
|
+
* 5. If `<project>/.gsd` is a real directory → return as-is (migration handles later)
|
|
489
364
|
*
|
|
490
365
|
* Returns the resolved external path.
|
|
491
366
|
*/
|
|
492
367
|
export function ensureGsdSymlink(projectPath: string): string {
|
|
493
|
-
const
|
|
494
|
-
|
|
495
|
-
// Write .gsd-id marker so future relocations can recover this state (#2750).
|
|
496
|
-
// Only write for the project root (not subdirectories or worktrees that
|
|
497
|
-
// delegate to a parent .gsd).
|
|
498
|
-
if (!isInsideWorktree(projectPath)) {
|
|
499
|
-
writeGsdIdMarker(projectPath, repoIdentity(projectPath));
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
return result;
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
function ensureGsdSymlinkCore(projectPath: string): string {
|
|
506
|
-
const externalPath = resolveExternalPathWithRecovery(projectPath);
|
|
368
|
+
const externalPath = externalGsdRoot(projectPath);
|
|
507
369
|
const localGsd = join(projectPath, ".gsd");
|
|
508
370
|
const inWorktree = isInsideWorktree(projectPath);
|
|
509
371
|
|
|
@@ -556,28 +418,12 @@ function ensureGsdSymlinkCore(projectPath: string): string {
|
|
|
556
418
|
|
|
557
419
|
const replaceWithSymlink = (): string => {
|
|
558
420
|
rmSync(localGsd, { recursive: true, force: true });
|
|
559
|
-
// Defensive: remove any residual entry (e.g. dangling symlink) before creating.
|
|
560
|
-
try { unlinkSync(localGsd); } catch { /* already gone */ }
|
|
561
421
|
symlinkSync(externalPath, localGsd, "junction");
|
|
562
422
|
return externalPath;
|
|
563
423
|
};
|
|
564
424
|
|
|
565
|
-
// Check for dangling symlinks (e.g. after relocation recovery removed the old
|
|
566
|
-
// state dir). existsSync follows symlinks, so it returns false for dangling ones.
|
|
567
|
-
// lstatSync does NOT follow, so we can detect the dangling symlink and replace it.
|
|
568
425
|
if (!existsSync(localGsd)) {
|
|
569
|
-
|
|
570
|
-
const stat = lstatSync(localGsd);
|
|
571
|
-
if (stat.isSymbolicLink()) {
|
|
572
|
-
// Dangling symlink — replace with correct one (#2750).
|
|
573
|
-
return replaceWithSymlink();
|
|
574
|
-
}
|
|
575
|
-
} catch {
|
|
576
|
-
// lstat also failed — nothing exists at this path
|
|
577
|
-
}
|
|
578
|
-
// Nothing exists yet — create symlink.
|
|
579
|
-
// Defensive: remove any residual entry to avoid EEXIST race (#2750).
|
|
580
|
-
try { unlinkSync(localGsd); } catch { /* nothing to remove */ }
|
|
426
|
+
// Nothing exists yet — create symlink
|
|
581
427
|
symlinkSync(externalPath, localGsd, "junction");
|
|
582
428
|
return externalPath;
|
|
583
429
|
}
|
|
@@ -596,27 +442,6 @@ function ensureGsdSymlinkCore(projectPath: string): string {
|
|
|
596
442
|
if (inWorktree) {
|
|
597
443
|
return replaceWithSymlink();
|
|
598
444
|
}
|
|
599
|
-
// After identity hash change (e.g. upgrade from path-based to remote-only
|
|
600
|
-
// hash, or relocation recovery), migrate data from old target to new path
|
|
601
|
-
// and update the symlink (#2750).
|
|
602
|
-
if (!hasProjectState(externalPath) && hasProjectState(target)) {
|
|
603
|
-
try {
|
|
604
|
-
mkdirSync(externalPath, { recursive: true });
|
|
605
|
-
const oldEntries = readdirSync(target);
|
|
606
|
-
for (const entry of oldEntries) {
|
|
607
|
-
try {
|
|
608
|
-
const src = join(target, entry);
|
|
609
|
-
const dst = join(externalPath, entry);
|
|
610
|
-
try { renameSync(src, dst); } catch { cpSync(src, dst, { recursive: true, force: true }); }
|
|
611
|
-
} catch { /* continue */ }
|
|
612
|
-
}
|
|
613
|
-
try { rmSync(target, { recursive: true, force: true }); } catch { /* non-fatal */ }
|
|
614
|
-
return replaceWithSymlink();
|
|
615
|
-
} catch {
|
|
616
|
-
// Migration failed — preserve old symlink
|
|
617
|
-
return target;
|
|
618
|
-
}
|
|
619
|
-
}
|
|
620
445
|
// Outside worktrees, preserve custom overrides or legacy symlinks.
|
|
621
446
|
return target;
|
|
622
447
|
}
|
|
@@ -19,7 +19,6 @@ import { isParked, getParkedReason } from "./milestone-actions.js";
|
|
|
19
19
|
import { getMilestoneSlices, isDbAvailable } from "./gsd-db.js";
|
|
20
20
|
import { buildExistingMilestonesContext } from "./guided-flow-queue.js";
|
|
21
21
|
import { loadPrompt } from "./prompt-loader.js";
|
|
22
|
-
import { isGsdGitignored } from "./gitignore.js";
|
|
23
22
|
|
|
24
23
|
// ─── Entry Point ──────────────────────────────────────────────────────────────
|
|
25
24
|
|
|
@@ -54,14 +53,9 @@ export async function handleRethink(
|
|
|
54
53
|
const rethinkData = buildRethinkData(basePath, milestoneIds, state, queueOrder);
|
|
55
54
|
const existingMilestonesContext = await buildExistingMilestonesContext(basePath, milestoneIds, state);
|
|
56
55
|
|
|
57
|
-
const commitInstruction = isGsdGitignored(basePath)
|
|
58
|
-
? "Do not commit planning artifacts — .gsd/ is gitignored in this project."
|
|
59
|
-
: 'After changes, run `git add .gsd/ && git commit -m "docs(gsd): rethink milestone plan"` to persist (rethink runs interactively outside auto-mode, so no system auto-commit)';
|
|
60
|
-
|
|
61
56
|
const content = loadPrompt("rethink", {
|
|
62
57
|
rethinkData,
|
|
63
58
|
existingMilestonesContext,
|
|
64
|
-
commitInstruction,
|
|
65
59
|
});
|
|
66
60
|
|
|
67
61
|
pi.sendMessage(
|
|
@@ -219,14 +219,13 @@ export function parseRoadmapSlices(content: string): RoadmapSliceEntry[] {
|
|
|
219
219
|
function parseProseSliceHeaders(content: string): RoadmapSliceEntry[] {
|
|
220
220
|
const slices: RoadmapSliceEntry[] = [];
|
|
221
221
|
// Match H1-H4 headers containing S<digits> with optional "Slice" prefix, bold markers,
|
|
222
|
-
//
|
|
223
|
-
// optional checkmark completion marker, and optional leading indentation.
|
|
222
|
+
// and optional checkmark completion marker before the slice ID.
|
|
224
223
|
// Separator after the ID is flexible: colon, dash, em/en dash, dot, or just whitespace.
|
|
225
|
-
const headerPattern =
|
|
224
|
+
const headerPattern = /^#{1,4}\s+\*{0,2}(?:\u2713\s+)?(?:Slice\s+)?(S\d+)\*{0,2}[:\s.\u2014\u2013-]*\s*(.+)/gm;
|
|
226
225
|
let match: RegExpExecArray | null;
|
|
227
226
|
|
|
228
227
|
// Check for checkmark before the slice ID (e.g., "## checkmark S01: Title")
|
|
229
|
-
const prefixCheckPattern =
|
|
228
|
+
const prefixCheckPattern = /^#{1,4}\s+\*{0,2}\u2713\s+/;
|
|
230
229
|
|
|
231
230
|
while ((match = headerPattern.exec(content)) !== null) {
|
|
232
231
|
const id = match[1]!;
|
|
@@ -252,7 +251,7 @@ function parseProseSliceHeaders(content: string): RoadmapSliceEntry[] {
|
|
|
252
251
|
|
|
253
252
|
// Try to extract depends from prose: "Depends on: S01" or "**Depends on:** S01, S02"
|
|
254
253
|
const afterHeader = content.slice(match.index + match[0].length);
|
|
255
|
-
const nextHeader = afterHeader.search(
|
|
254
|
+
const nextHeader = afterHeader.search(/^#{1,4}\s/m);
|
|
256
255
|
const section = nextHeader !== -1 ? afterHeader.slice(0, nextHeader) : afterHeader.slice(0, 500);
|
|
257
256
|
|
|
258
257
|
const depsMatch = section.match(/\*{0,2}Depends\s+on:?\*{0,2}\s*(.+)/i);
|
|
@@ -36,24 +36,22 @@ import {
|
|
|
36
36
|
|
|
37
37
|
import { findMilestoneIds } from './milestone-ids.js';
|
|
38
38
|
import { loadQueueOrder, sortByQueueOrder } from './queue-order.js';
|
|
39
|
+
import { isClosedStatus } from './status-guards.js';
|
|
39
40
|
import { nativeBatchParseGsdFiles, type BatchParsedFile } from './native-parser-bridge.js';
|
|
40
41
|
|
|
41
42
|
import { join, resolve } from 'path';
|
|
42
|
-
import { existsSync, readdirSync
|
|
43
|
+
import { existsSync, readdirSync } from 'node:fs';
|
|
43
44
|
import { debugCount, debugTime } from './debug-logger.js';
|
|
44
45
|
import { extractVerdict } from './verdict-parser.js';
|
|
45
|
-
import { logWarning, logError } from './workflow-logger.js';
|
|
46
46
|
|
|
47
47
|
import {
|
|
48
48
|
isDbAvailable,
|
|
49
49
|
getAllMilestones,
|
|
50
|
-
getMilestone,
|
|
51
50
|
getMilestoneSlices,
|
|
52
51
|
getSliceTasks,
|
|
53
52
|
getReplanHistory,
|
|
54
53
|
getSlice,
|
|
55
54
|
insertMilestone,
|
|
56
|
-
insertSlice,
|
|
57
55
|
updateTaskStatus,
|
|
58
56
|
getPendingSliceGateCount,
|
|
59
57
|
type MilestoneRow,
|
|
@@ -66,29 +64,8 @@ import {
|
|
|
66
64
|
* files like CONTEXT, CONTEXT-DRAFT, ROADMAP, or SUMMARY). These appear when
|
|
67
65
|
* a milestone is created but never initialised. Treating them as active causes
|
|
68
66
|
* 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
67
|
*/
|
|
79
68
|
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
69
|
const context = resolveMilestoneFile(basePath, mid, "CONTEXT");
|
|
93
70
|
const draft = resolveMilestoneFile(basePath, mid, "CONTEXT-DRAFT");
|
|
94
71
|
const roadmap = resolveMilestoneFile(basePath, mid, "ROADMAP");
|
|
@@ -232,10 +209,10 @@ export async function deriveState(basePath: string): Promise<GSDState> {
|
|
|
232
209
|
if (isDbAvailable()) {
|
|
233
210
|
let dbMilestones = getAllMilestones();
|
|
234
211
|
|
|
235
|
-
// Disk→DB reconciliation when
|
|
236
|
-
//
|
|
237
|
-
//
|
|
238
|
-
//
|
|
212
|
+
// Disk→DB reconciliation (#2631): when the milestones table is empty
|
|
213
|
+
// (e.g. failed initial migration per #2529), the reconciliation code
|
|
214
|
+
// inside deriveStateFromDb is unreachable. Populate from disk here so
|
|
215
|
+
// the DB path activates correctly.
|
|
239
216
|
if (dbMilestones.length === 0) {
|
|
240
217
|
const diskIds = findMilestoneIds(basePath);
|
|
241
218
|
let synced = false;
|
|
@@ -254,7 +231,7 @@ export async function deriveState(basePath: string): Promise<GSDState> {
|
|
|
254
231
|
stopDbTimer({ phase: result.phase, milestone: result.activeMilestone?.id });
|
|
255
232
|
_telemetry.dbDeriveCount++;
|
|
256
233
|
} else {
|
|
257
|
-
// DB open but
|
|
234
|
+
// DB open but empty hierarchy tables — pre-migration project, use filesystem
|
|
258
235
|
result = await _deriveStateImpl(basePath);
|
|
259
236
|
_telemetry.markdownDeriveCount++;
|
|
260
237
|
}
|
|
@@ -291,13 +268,6 @@ function extractContextTitle(content: string | null, fallback: string): string {
|
|
|
291
268
|
|
|
292
269
|
// ─── DB-backed State Derivation ────────────────────────────────────────────
|
|
293
270
|
|
|
294
|
-
/**
|
|
295
|
-
* Helper: check if a DB status counts as "done" (handles K002 ambiguity).
|
|
296
|
-
*/
|
|
297
|
-
function isStatusDone(status: string): boolean {
|
|
298
|
-
return status === 'complete' || status === 'done';
|
|
299
|
-
}
|
|
300
|
-
|
|
301
271
|
/**
|
|
302
272
|
* Derive GSD state from the milestones/slices/tasks DB tables.
|
|
303
273
|
* Flag files (PARKED, VALIDATION, CONTINUE, REPLAN, REPLAN-TRIGGER, CONTEXT-DRAFT)
|
|
@@ -328,36 +298,6 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
|
|
|
328
298
|
}
|
|
329
299
|
if (synced) allMilestones = getAllMilestones();
|
|
330
300
|
|
|
331
|
-
// Disk→DB slice reconciliation (#2533): slices defined in ROADMAP.md but
|
|
332
|
-
// missing from the DB cause permanent "No slice eligible" blocks because
|
|
333
|
-
// the dependency resolver only sees DB rows. Parse each milestone's roadmap
|
|
334
|
-
// and insert any missing slices, checking SUMMARY files to set correct status.
|
|
335
|
-
// insertSlice uses INSERT OR IGNORE, so existing rows are never overwritten.
|
|
336
|
-
for (const mid of diskIds) {
|
|
337
|
-
if (isGhostMilestone(basePath, mid)) continue;
|
|
338
|
-
const roadmapPath = resolveMilestoneFile(basePath, mid, "ROADMAP");
|
|
339
|
-
if (!roadmapPath) continue;
|
|
340
|
-
|
|
341
|
-
const dbSlices = getMilestoneSlices(mid);
|
|
342
|
-
const dbSliceIds = new Set(dbSlices.map(s => s.id));
|
|
343
|
-
|
|
344
|
-
let roadmapContent: string;
|
|
345
|
-
try { roadmapContent = readFileSync(roadmapPath, "utf-8"); }
|
|
346
|
-
catch { continue; }
|
|
347
|
-
|
|
348
|
-
const parsed = parseRoadmap(roadmapContent);
|
|
349
|
-
for (const s of parsed.slices) {
|
|
350
|
-
if (dbSliceIds.has(s.id)) continue;
|
|
351
|
-
const summaryPath = resolveSliceFile(basePath, mid, s.id, "SUMMARY");
|
|
352
|
-
const sliceStatus = (s.done || summaryPath) ? "complete" : "pending";
|
|
353
|
-
insertSlice({
|
|
354
|
-
id: s.id, milestoneId: mid, title: s.title,
|
|
355
|
-
status: sliceStatus, risk: s.risk,
|
|
356
|
-
depends: s.depends, demo: s.demo,
|
|
357
|
-
});
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
|
|
361
301
|
// Reconcile: discover milestones that exist on disk but are missing from
|
|
362
302
|
// the DB. This happens when milestones were created before the DB migration
|
|
363
303
|
// or were manually added to the filesystem. Without this, disk-only
|
|
@@ -417,7 +357,7 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
|
|
|
417
357
|
continue;
|
|
418
358
|
}
|
|
419
359
|
|
|
420
|
-
if (
|
|
360
|
+
if (isClosedStatus(m.status)) {
|
|
421
361
|
completeMilestoneIds.add(m.id);
|
|
422
362
|
continue;
|
|
423
363
|
}
|
|
@@ -431,7 +371,7 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
|
|
|
431
371
|
|
|
432
372
|
// Check roadmap: all slices done means milestone is complete
|
|
433
373
|
const slices = getMilestoneSlices(m.id);
|
|
434
|
-
if (slices.length > 0 && slices.every(s =>
|
|
374
|
+
if (slices.length > 0 && slices.every(s => isClosedStatus(s.status))) {
|
|
435
375
|
// All slices done but no summary — still counts as complete for dep resolution
|
|
436
376
|
// if a summary file exists
|
|
437
377
|
// Note: without summary file, the milestone is in validating/completing state, not complete
|
|
@@ -453,7 +393,7 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
|
|
|
453
393
|
|
|
454
394
|
// Ghost milestone check: no slices in DB AND no substantive files on disk
|
|
455
395
|
const slices = getMilestoneSlices(m.id);
|
|
456
|
-
if (slices.length === 0 && !
|
|
396
|
+
if (slices.length === 0 && !isClosedStatus(m.status)) {
|
|
457
397
|
// Check disk for ghost detection
|
|
458
398
|
if (isGhostMilestone(basePath, m.id)) continue;
|
|
459
399
|
}
|
|
@@ -476,7 +416,7 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
|
|
|
476
416
|
}
|
|
477
417
|
|
|
478
418
|
// Not complete — determine if it should be active
|
|
479
|
-
const allSlicesDone = slices.length > 0 && slices.every(s =>
|
|
419
|
+
const allSlicesDone = slices.length > 0 && slices.every(s => isClosedStatus(s.status));
|
|
480
420
|
|
|
481
421
|
// Get title — prefer DB, fall back to context file extraction
|
|
482
422
|
let title = stripMilestonePrefix(m.title) || m.id;
|
|
@@ -586,8 +526,7 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
|
|
|
586
526
|
? `All milestones complete. ${activeReqs} active requirement${activeReqs === 1 ? '' : 's'} in REQUIREMENTS.md ${activeReqs === 1 ? 'has' : 'have'} not been mapped to a milestone.`
|
|
587
527
|
: 'All milestones complete.';
|
|
588
528
|
return {
|
|
589
|
-
activeMilestone: null,
|
|
590
|
-
lastCompletedMilestone: lastEntry ? { id: lastEntry.id, title: lastEntry.title } : null,
|
|
529
|
+
activeMilestone: lastEntry ? { id: lastEntry.id, title: lastEntry.title } : null,
|
|
591
530
|
activeSlice: null, activeTask: null,
|
|
592
531
|
phase: 'complete',
|
|
593
532
|
recentDecisions: [], blockers: [],
|
|
@@ -629,7 +568,10 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
|
|
|
629
568
|
}
|
|
630
569
|
|
|
631
570
|
// ── All slices done → validating/completing ─────────────────────────
|
|
632
|
-
|
|
571
|
+
// Guard: [].every() === true (vacuous truth). Without the length check,
|
|
572
|
+
// an empty slice array causes a premature phase transition to
|
|
573
|
+
// validating-milestone. See: https://github.com/gsd-build/gsd-2/issues/2667
|
|
574
|
+
const allSlicesDone = activeMilestoneSlices.length > 0 && activeMilestoneSlices.every(s => isClosedStatus(s.status));
|
|
633
575
|
if (allSlicesDone) {
|
|
634
576
|
const validationFile = resolveMilestoneFile(basePath, activeMilestone.id, "VALIDATION");
|
|
635
577
|
const validationContent = validationFile ? await loadFile(validationFile) : null;
|
|
@@ -662,19 +604,19 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
|
|
|
662
604
|
|
|
663
605
|
// ── Find active slice (first incomplete with deps satisfied) ─────────
|
|
664
606
|
const sliceProgress = {
|
|
665
|
-
done: activeMilestoneSlices.filter(s =>
|
|
607
|
+
done: activeMilestoneSlices.filter(s => isClosedStatus(s.status)).length,
|
|
666
608
|
total: activeMilestoneSlices.length,
|
|
667
609
|
};
|
|
668
610
|
|
|
669
611
|
const doneSliceIds = new Set(
|
|
670
|
-
activeMilestoneSlices.filter(s =>
|
|
612
|
+
activeMilestoneSlices.filter(s => isClosedStatus(s.status)).map(s => s.id)
|
|
671
613
|
);
|
|
672
614
|
|
|
673
615
|
let activeSlice: ActiveRef | null = null;
|
|
674
616
|
let activeSliceRow: SliceRow | null = null;
|
|
675
617
|
|
|
676
618
|
for (const s of activeMilestoneSlices) {
|
|
677
|
-
if (
|
|
619
|
+
if (isClosedStatus(s.status)) continue;
|
|
678
620
|
if (s.depends.every(dep => doneSliceIds.has(dep))) {
|
|
679
621
|
activeSlice = { id: s.id, title: s.title };
|
|
680
622
|
activeSliceRow = s;
|
|
@@ -717,16 +659,20 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
|
|
|
717
659
|
// causing the dispatcher to re-dispatch the same completed task forever.
|
|
718
660
|
let reconciled = false;
|
|
719
661
|
for (const t of tasks) {
|
|
720
|
-
if (
|
|
662
|
+
if (isClosedStatus(t.status)) continue;
|
|
721
663
|
const summaryPath = resolveTaskFile(basePath, activeMilestone.id, activeSlice.id, t.id, "SUMMARY");
|
|
722
664
|
if (summaryPath && existsSync(summaryPath)) {
|
|
723
665
|
try {
|
|
724
666
|
updateTaskStatus(activeMilestone.id, activeSlice.id, t.id, "complete");
|
|
725
|
-
|
|
667
|
+
process.stderr.write(
|
|
668
|
+
`gsd-reconcile: task ${activeMilestone.id}/${activeSlice.id}/${t.id} had SUMMARY on disk but DB status was "${t.status}" — updated to "complete" (#2514)\n`,
|
|
669
|
+
);
|
|
726
670
|
reconciled = true;
|
|
727
671
|
} catch (e) {
|
|
728
672
|
// DB write failed — continue with stale status rather than crash
|
|
729
|
-
|
|
673
|
+
process.stderr.write(
|
|
674
|
+
`gsd-reconcile: failed to update task ${t.id}: ${(e as Error).message}\n`,
|
|
675
|
+
);
|
|
730
676
|
}
|
|
731
677
|
}
|
|
732
678
|
}
|
|
@@ -736,11 +682,11 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
|
|
|
736
682
|
}
|
|
737
683
|
|
|
738
684
|
const taskProgress = {
|
|
739
|
-
done: tasks.filter(t =>
|
|
685
|
+
done: tasks.filter(t => isClosedStatus(t.status)).length,
|
|
740
686
|
total: tasks.length,
|
|
741
687
|
};
|
|
742
688
|
|
|
743
|
-
const activeTaskRow = tasks.find(t => !
|
|
689
|
+
const activeTaskRow = tasks.find(t => !isClosedStatus(t.status));
|
|
744
690
|
|
|
745
691
|
if (!activeTaskRow && tasks.length > 0) {
|
|
746
692
|
// All tasks done but slice not marked complete → summarizing
|
|
@@ -801,7 +747,7 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
|
|
|
801
747
|
}
|
|
802
748
|
|
|
803
749
|
// ── Blocker detection: check completed tasks for blocker_discovered ──
|
|
804
|
-
const completedTasks = tasks.filter(t =>
|
|
750
|
+
const completedTasks = tasks.filter(t => isClosedStatus(t.status));
|
|
805
751
|
let blockerTaskId: string | null = null;
|
|
806
752
|
for (const ct of completedTasks) {
|
|
807
753
|
if (ct.blocker_discovered) {
|
|
@@ -1381,7 +1327,9 @@ export async function _deriveStateImpl(basePath: string): Promise<GSDState> {
|
|
|
1381
1327
|
const summaryPath = resolveTaskFile(basePath, activeMilestone.id, activeSlice.id, t.id, "SUMMARY");
|
|
1382
1328
|
if (summaryPath && existsSync(summaryPath)) {
|
|
1383
1329
|
t.done = true;
|
|
1384
|
-
|
|
1330
|
+
process.stderr.write(
|
|
1331
|
+
`gsd-reconcile: task ${activeMilestone.id}/${activeSlice.id}/${t.id} has SUMMARY on disk but plan shows incomplete — marking done (#2514)\n`,
|
|
1332
|
+
);
|
|
1385
1333
|
}
|
|
1386
1334
|
}
|
|
1387
1335
|
|
|
@@ -317,35 +317,6 @@ test("auto/resolve.ts one-shot pattern: _currentResolve is nulled before calling
|
|
|
317
317
|
);
|
|
318
318
|
});
|
|
319
319
|
|
|
320
|
-
test("auto/phases.ts: selectAndApplyModel called exactly once and before updateProgressWidget (#2907)", () => {
|
|
321
|
-
const src = readFileSync(
|
|
322
|
-
resolve(import.meta.dirname, "..", "auto", "phases.ts"),
|
|
323
|
-
"utf-8",
|
|
324
|
-
);
|
|
325
|
-
// Extract the runUnitPhase function body
|
|
326
|
-
const fnStart = src.indexOf("export async function runUnitPhase");
|
|
327
|
-
assert.ok(fnStart > 0, "runUnitPhase should exist in phases.ts");
|
|
328
|
-
const fnBody = src.slice(fnStart, fnStart + 8000);
|
|
329
|
-
|
|
330
|
-
// selectAndApplyModel must appear exactly once
|
|
331
|
-
const allOccurrences = [...fnBody.matchAll(/selectAndApplyModel\(/g)];
|
|
332
|
-
assert.equal(
|
|
333
|
-
allOccurrences.length,
|
|
334
|
-
1,
|
|
335
|
-
`selectAndApplyModel should be called exactly once in runUnitPhase, found ${allOccurrences.length} calls`,
|
|
336
|
-
);
|
|
337
|
-
|
|
338
|
-
// selectAndApplyModel must appear BEFORE updateProgressWidget
|
|
339
|
-
const modelIdx = fnBody.indexOf("selectAndApplyModel(");
|
|
340
|
-
const widgetIdx = fnBody.indexOf("updateProgressWidget(");
|
|
341
|
-
assert.ok(modelIdx > 0, "selectAndApplyModel should exist in runUnitPhase");
|
|
342
|
-
assert.ok(widgetIdx > 0, "updateProgressWidget should exist in runUnitPhase");
|
|
343
|
-
assert.ok(
|
|
344
|
-
modelIdx < widgetIdx,
|
|
345
|
-
"selectAndApplyModel must be called BEFORE updateProgressWidget (#2899/#2907)",
|
|
346
|
-
);
|
|
347
|
-
});
|
|
348
|
-
|
|
349
320
|
// ─── autoLoop tests (T02) ─────────────────────────────────────────────────
|
|
350
321
|
|
|
351
322
|
/**
|