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
|
@@ -54,7 +54,6 @@ For each capture, classify it as one of:
|
|
|
54
54
|
- Add `**Resolution:** <brief description of what will happen>`
|
|
55
55
|
- Add `**Rationale:** <why this classification>`
|
|
56
56
|
- Add `**Resolved:** <current ISO timestamp>`
|
|
57
|
-
- Add `**Milestone:** <current milestone ID>` (e.g., `**Milestone:** M003`)
|
|
58
57
|
|
|
59
58
|
4. **Summarize** what was triaged: how many captures, what classifications were assigned, and what actions are pending (e.g., "2 quick-tasks ready for execution, 1 deferred to S03").
|
|
60
59
|
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { createHash } from "node:crypto";
|
|
9
9
|
import { execFileSync } from "node:child_process";
|
|
10
|
-
import {
|
|
10
|
+
import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, realpathSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
|
|
11
11
|
import { homedir } from "node:os";
|
|
12
12
|
import { basename, dirname, join, resolve } from "node:path";
|
|
13
13
|
const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
|
|
@@ -255,14 +255,9 @@ export function validateProjectId(id) {
|
|
|
255
255
|
* If `GSD_PROJECT_ID` is set, returns it directly (validation is expected
|
|
256
256
|
* to have already happened at startup via `validateProjectId`).
|
|
257
257
|
*
|
|
258
|
-
*
|
|
259
|
-
*
|
|
260
|
-
*
|
|
261
|
-
* For local-only repos (no remote), includes the git root in the hash.
|
|
262
|
-
* Local repos use a `.gsd-id` marker file for recovery after moves.
|
|
263
|
-
*
|
|
264
|
-
* Deterministic: same repo always produces the same hash regardless of
|
|
265
|
-
* which worktree the caller is inside.
|
|
258
|
+
* Otherwise returns SHA-256 of `${remoteUrl}\n${resolvedRoot}`, truncated
|
|
259
|
+
* to 12 hex chars. Deterministic: same repo always produces the same hash
|
|
260
|
+
* regardless of which worktree the caller is inside.
|
|
266
261
|
*/
|
|
267
262
|
export function repoIdentity(basePath) {
|
|
268
263
|
const projectId = process.env.GSD_PROJECT_ID;
|
|
@@ -270,14 +265,8 @@ export function repoIdentity(basePath) {
|
|
|
270
265
|
return projectId;
|
|
271
266
|
}
|
|
272
267
|
const remoteUrl = getRemoteUrl(basePath);
|
|
273
|
-
if (remoteUrl) {
|
|
274
|
-
// Remote URL alone uniquely identifies the repo — path is redundant.
|
|
275
|
-
// This makes moves transparent for repos with remotes (#2750).
|
|
276
|
-
return createHash("sha256").update(remoteUrl).digest("hex").slice(0, 12);
|
|
277
|
-
}
|
|
278
|
-
// Local-only repo: include git root since there's no remote to anchor identity.
|
|
279
268
|
const root = resolveGitRoot(basePath);
|
|
280
|
-
const input =
|
|
269
|
+
const input = `${remoteUrl}\n${root}`;
|
|
281
270
|
return createHash("sha256").update(input).digest("hex").slice(0, 12);
|
|
282
271
|
}
|
|
283
272
|
// ─── External State Directory ───────────────────────────────────────────────
|
|
@@ -336,149 +325,20 @@ export function cleanNumberedGsdVariants(projectPath) {
|
|
|
336
325
|
}
|
|
337
326
|
return removed;
|
|
338
327
|
}
|
|
339
|
-
// ─── .gsd-id Marker ─────────────────────────────────────────────────────────
|
|
340
|
-
/**
|
|
341
|
-
* Write a `.gsd-id` marker file in the project root.
|
|
342
|
-
*
|
|
343
|
-
* This file records the identity hash used for the external state directory.
|
|
344
|
-
* For local-only repos (no remote), this marker survives directory moves and
|
|
345
|
-
* enables automatic recovery of orphaned state (#2750).
|
|
346
|
-
*
|
|
347
|
-
* The marker is gitignored by ensureGitignore(). Non-fatal: failure to write
|
|
348
|
-
* the marker must never block project setup.
|
|
349
|
-
*/
|
|
350
|
-
function writeGsdIdMarker(projectPath, identity) {
|
|
351
|
-
try {
|
|
352
|
-
const markerPath = join(projectPath, ".gsd-id");
|
|
353
|
-
// Only write if content differs to avoid unnecessary disk writes.
|
|
354
|
-
if (existsSync(markerPath)) {
|
|
355
|
-
try {
|
|
356
|
-
if (readFileSync(markerPath, "utf-8").trim() === identity)
|
|
357
|
-
return;
|
|
358
|
-
}
|
|
359
|
-
catch { /* fall through and overwrite */ }
|
|
360
|
-
}
|
|
361
|
-
writeFileSync(markerPath, identity + "\n", "utf-8");
|
|
362
|
-
}
|
|
363
|
-
catch {
|
|
364
|
-
// Non-fatal — marker write failure should not block project setup
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
/**
|
|
368
|
-
* Read the `.gsd-id` marker from the project root.
|
|
369
|
-
* Returns the identity hash, or null if the marker doesn't exist or is unreadable.
|
|
370
|
-
*/
|
|
371
|
-
function readGsdIdMarker(projectPath) {
|
|
372
|
-
try {
|
|
373
|
-
const markerPath = join(projectPath, ".gsd-id");
|
|
374
|
-
if (!existsSync(markerPath))
|
|
375
|
-
return null;
|
|
376
|
-
const content = readFileSync(markerPath, "utf-8").trim();
|
|
377
|
-
return /^[a-zA-Z0-9_-]+$/.test(content) ? content : null;
|
|
378
|
-
}
|
|
379
|
-
catch {
|
|
380
|
-
return null;
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
/**
|
|
384
|
-
* Check whether an external state directory has meaningful content.
|
|
385
|
-
* Returns true if the directory contains any files or subdirectories
|
|
386
|
-
* beyond just repo-meta.json.
|
|
387
|
-
*/
|
|
388
|
-
function hasProjectState(externalPath) {
|
|
389
|
-
try {
|
|
390
|
-
if (!existsSync(externalPath))
|
|
391
|
-
return false;
|
|
392
|
-
const entries = readdirSync(externalPath);
|
|
393
|
-
return entries.some(e => e !== "repo-meta.json");
|
|
394
|
-
}
|
|
395
|
-
catch {
|
|
396
|
-
return false;
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
/**
|
|
400
|
-
* Resolve the external state directory, with recovery for relocated projects.
|
|
401
|
-
*
|
|
402
|
-
* For local-only repos where the computed identity produces an empty state dir,
|
|
403
|
-
* checks the `.gsd-id` marker for the original identity hash and recovers
|
|
404
|
-
* the old state directory if it still exists and contains data (#2750).
|
|
405
|
-
*
|
|
406
|
-
* Returns the resolved external path (may differ from the computed identity).
|
|
407
|
-
*/
|
|
408
|
-
function resolveExternalPathWithRecovery(projectPath) {
|
|
409
|
-
const computedPath = externalGsdRoot(projectPath);
|
|
410
|
-
const computedId = repoIdentity(projectPath);
|
|
411
|
-
// Check if computed path already has state — fast path, no recovery needed.
|
|
412
|
-
if (hasProjectState(computedPath)) {
|
|
413
|
-
return computedPath;
|
|
414
|
-
}
|
|
415
|
-
// Check for .gsd-id marker from a previous location.
|
|
416
|
-
const markerId = readGsdIdMarker(projectPath);
|
|
417
|
-
if (markerId && markerId !== computedId) {
|
|
418
|
-
// The marker points to a different identity — the repo was likely moved.
|
|
419
|
-
const base = process.env.GSD_STATE_DIR || gsdHome;
|
|
420
|
-
const markerPath = join(base, "projects", markerId);
|
|
421
|
-
if (hasProjectState(markerPath)) {
|
|
422
|
-
// Recover: use the old state directory and update the marker to the new identity.
|
|
423
|
-
// Move the state from the old hash dir to the new one so future lookups work
|
|
424
|
-
// without the marker.
|
|
425
|
-
try {
|
|
426
|
-
mkdirSync(computedPath, { recursive: true });
|
|
427
|
-
const entries = readdirSync(markerPath);
|
|
428
|
-
for (const entry of entries) {
|
|
429
|
-
try {
|
|
430
|
-
const src = join(markerPath, entry);
|
|
431
|
-
const dst = join(computedPath, entry);
|
|
432
|
-
// Use rename for same-filesystem (fast) or fall back to copy.
|
|
433
|
-
try {
|
|
434
|
-
renameSync(src, dst);
|
|
435
|
-
}
|
|
436
|
-
catch {
|
|
437
|
-
cpSync(src, dst, { recursive: true, force: true });
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
catch { /* continue with remaining entries */ }
|
|
441
|
-
}
|
|
442
|
-
// Clean up old directory after successful migration.
|
|
443
|
-
try {
|
|
444
|
-
rmSync(markerPath, { recursive: true, force: true });
|
|
445
|
-
}
|
|
446
|
-
catch { /* non-fatal */ }
|
|
447
|
-
}
|
|
448
|
-
catch {
|
|
449
|
-
// If migration fails, just point at the old directory.
|
|
450
|
-
return markerPath;
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
return computedPath;
|
|
455
|
-
}
|
|
456
328
|
// ─── Symlink Management ─────────────────────────────────────────────────────
|
|
457
329
|
/**
|
|
458
330
|
* Ensure the `<project>/.gsd` symlink points to the external state directory.
|
|
459
331
|
*
|
|
460
332
|
* 1. Clean up any macOS numbered collision variants (`.gsd 2`, `.gsd 3`, etc.)
|
|
461
|
-
* 2.
|
|
462
|
-
* 3.
|
|
463
|
-
* 4. If `<project>/.gsd`
|
|
464
|
-
* 5. If `<project>/.gsd` is
|
|
465
|
-
* 6. If `<project>/.gsd` is a real directory → return as-is (migration handles later)
|
|
466
|
-
* 7. Write `.gsd-id` marker for future relocation recovery
|
|
333
|
+
* 2. mkdir -p the external dir
|
|
334
|
+
* 3. If `<project>/.gsd` doesn't exist → create symlink
|
|
335
|
+
* 4. If `<project>/.gsd` is already the correct symlink → no-op
|
|
336
|
+
* 5. If `<project>/.gsd` is a real directory → return as-is (migration handles later)
|
|
467
337
|
*
|
|
468
338
|
* Returns the resolved external path.
|
|
469
339
|
*/
|
|
470
340
|
export function ensureGsdSymlink(projectPath) {
|
|
471
|
-
const
|
|
472
|
-
// Write .gsd-id marker so future relocations can recover this state (#2750).
|
|
473
|
-
// Only write for the project root (not subdirectories or worktrees that
|
|
474
|
-
// delegate to a parent .gsd).
|
|
475
|
-
if (!isInsideWorktree(projectPath)) {
|
|
476
|
-
writeGsdIdMarker(projectPath, repoIdentity(projectPath));
|
|
477
|
-
}
|
|
478
|
-
return result;
|
|
479
|
-
}
|
|
480
|
-
function ensureGsdSymlinkCore(projectPath) {
|
|
481
|
-
const externalPath = resolveExternalPathWithRecovery(projectPath);
|
|
341
|
+
const externalPath = externalGsdRoot(projectPath);
|
|
482
342
|
const localGsd = join(projectPath, ".gsd");
|
|
483
343
|
const inWorktree = isInsideWorktree(projectPath);
|
|
484
344
|
// Guard: Never create a symlink at ~/.gsd — that's the user-level GSD home,
|
|
@@ -527,34 +387,11 @@ function ensureGsdSymlinkCore(projectPath) {
|
|
|
527
387
|
writeRepoMeta(externalPath, getRemoteUrl(projectPath), resolveGitRoot(projectPath));
|
|
528
388
|
const replaceWithSymlink = () => {
|
|
529
389
|
rmSync(localGsd, { recursive: true, force: true });
|
|
530
|
-
// Defensive: remove any residual entry (e.g. dangling symlink) before creating.
|
|
531
|
-
try {
|
|
532
|
-
unlinkSync(localGsd);
|
|
533
|
-
}
|
|
534
|
-
catch { /* already gone */ }
|
|
535
390
|
symlinkSync(externalPath, localGsd, "junction");
|
|
536
391
|
return externalPath;
|
|
537
392
|
};
|
|
538
|
-
// Check for dangling symlinks (e.g. after relocation recovery removed the old
|
|
539
|
-
// state dir). existsSync follows symlinks, so it returns false for dangling ones.
|
|
540
|
-
// lstatSync does NOT follow, so we can detect the dangling symlink and replace it.
|
|
541
393
|
if (!existsSync(localGsd)) {
|
|
542
|
-
|
|
543
|
-
const stat = lstatSync(localGsd);
|
|
544
|
-
if (stat.isSymbolicLink()) {
|
|
545
|
-
// Dangling symlink — replace with correct one (#2750).
|
|
546
|
-
return replaceWithSymlink();
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
catch {
|
|
550
|
-
// lstat also failed — nothing exists at this path
|
|
551
|
-
}
|
|
552
|
-
// Nothing exists yet — create symlink.
|
|
553
|
-
// Defensive: remove any residual entry to avoid EEXIST race (#2750).
|
|
554
|
-
try {
|
|
555
|
-
unlinkSync(localGsd);
|
|
556
|
-
}
|
|
557
|
-
catch { /* nothing to remove */ }
|
|
394
|
+
// Nothing exists yet — create symlink
|
|
558
395
|
symlinkSync(externalPath, localGsd, "junction");
|
|
559
396
|
return externalPath;
|
|
560
397
|
}
|
|
@@ -571,37 +408,6 @@ function ensureGsdSymlinkCore(projectPath) {
|
|
|
571
408
|
if (inWorktree) {
|
|
572
409
|
return replaceWithSymlink();
|
|
573
410
|
}
|
|
574
|
-
// After identity hash change (e.g. upgrade from path-based to remote-only
|
|
575
|
-
// hash, or relocation recovery), migrate data from old target to new path
|
|
576
|
-
// and update the symlink (#2750).
|
|
577
|
-
if (!hasProjectState(externalPath) && hasProjectState(target)) {
|
|
578
|
-
try {
|
|
579
|
-
mkdirSync(externalPath, { recursive: true });
|
|
580
|
-
const oldEntries = readdirSync(target);
|
|
581
|
-
for (const entry of oldEntries) {
|
|
582
|
-
try {
|
|
583
|
-
const src = join(target, entry);
|
|
584
|
-
const dst = join(externalPath, entry);
|
|
585
|
-
try {
|
|
586
|
-
renameSync(src, dst);
|
|
587
|
-
}
|
|
588
|
-
catch {
|
|
589
|
-
cpSync(src, dst, { recursive: true, force: true });
|
|
590
|
-
}
|
|
591
|
-
}
|
|
592
|
-
catch { /* continue */ }
|
|
593
|
-
}
|
|
594
|
-
try {
|
|
595
|
-
rmSync(target, { recursive: true, force: true });
|
|
596
|
-
}
|
|
597
|
-
catch { /* non-fatal */ }
|
|
598
|
-
return replaceWithSymlink();
|
|
599
|
-
}
|
|
600
|
-
catch {
|
|
601
|
-
// Migration failed — preserve old symlink
|
|
602
|
-
return target;
|
|
603
|
-
}
|
|
604
|
-
}
|
|
605
411
|
// Outside worktrees, preserve custom overrides or legacy symlinks.
|
|
606
412
|
return target;
|
|
607
413
|
}
|
|
@@ -16,7 +16,6 @@ import { getParkedReason } from "./milestone-actions.js";
|
|
|
16
16
|
import { getMilestoneSlices, isDbAvailable } from "./gsd-db.js";
|
|
17
17
|
import { buildExistingMilestonesContext } from "./guided-flow-queue.js";
|
|
18
18
|
import { loadPrompt } from "./prompt-loader.js";
|
|
19
|
-
import { isGsdGitignored } from "./gitignore.js";
|
|
20
19
|
// ─── Entry Point ──────────────────────────────────────────────────────────────
|
|
21
20
|
export async function handleRethink(_args, ctx, pi) {
|
|
22
21
|
if (isAutoActive()) {
|
|
@@ -39,13 +38,9 @@ export async function handleRethink(_args, ctx, pi) {
|
|
|
39
38
|
const queueOrder = loadQueueOrder(basePath);
|
|
40
39
|
const rethinkData = buildRethinkData(basePath, milestoneIds, state, queueOrder);
|
|
41
40
|
const existingMilestonesContext = await buildExistingMilestonesContext(basePath, milestoneIds, state);
|
|
42
|
-
const commitInstruction = isGsdGitignored(basePath)
|
|
43
|
-
? "Do not commit planning artifacts — .gsd/ is gitignored in this project."
|
|
44
|
-
: '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)';
|
|
45
41
|
const content = loadPrompt("rethink", {
|
|
46
42
|
rethinkData,
|
|
47
43
|
existingMilestonesContext,
|
|
48
|
-
commitInstruction,
|
|
49
44
|
});
|
|
50
45
|
pi.sendMessage({ customType: "gsd-rethink", content, display: false }, { triggerTurn: true });
|
|
51
46
|
}
|
|
@@ -211,13 +211,12 @@ export function parseRoadmapSlices(content) {
|
|
|
211
211
|
function parseProseSliceHeaders(content) {
|
|
212
212
|
const slices = [];
|
|
213
213
|
// Match H1-H4 headers containing S<digits> with optional "Slice" prefix, bold markers,
|
|
214
|
-
//
|
|
215
|
-
// optional checkmark completion marker, and optional leading indentation.
|
|
214
|
+
// and optional checkmark completion marker before the slice ID.
|
|
216
215
|
// Separator after the ID is flexible: colon, dash, em/en dash, dot, or just whitespace.
|
|
217
|
-
const headerPattern =
|
|
216
|
+
const headerPattern = /^#{1,4}\s+\*{0,2}(?:\u2713\s+)?(?:Slice\s+)?(S\d+)\*{0,2}[:\s.\u2014\u2013-]*\s*(.+)/gm;
|
|
218
217
|
let match;
|
|
219
218
|
// Check for checkmark before the slice ID (e.g., "## checkmark S01: Title")
|
|
220
|
-
const prefixCheckPattern =
|
|
219
|
+
const prefixCheckPattern = /^#{1,4}\s+\*{0,2}\u2713\s+/;
|
|
221
220
|
while ((match = headerPattern.exec(content)) !== null) {
|
|
222
221
|
const id = match[1];
|
|
223
222
|
let title = match[2].trim().replace(/\*{1,2}$/g, "").trim(); // strip trailing bold markers
|
|
@@ -239,7 +238,7 @@ function parseProseSliceHeaders(content) {
|
|
|
239
238
|
}
|
|
240
239
|
// Try to extract depends from prose: "Depends on: S01" or "**Depends on:** S01, S02"
|
|
241
240
|
const afterHeader = content.slice(match.index + match[0].length);
|
|
242
|
-
const nextHeader = afterHeader.search(
|
|
241
|
+
const nextHeader = afterHeader.search(/^#{1,4}\s/m);
|
|
243
242
|
const section = nextHeader !== -1 ? afterHeader.slice(0, nextHeader) : afterHeader.slice(0, 500);
|
|
244
243
|
const depsMatch = section.match(/\*{0,2}Depends\s+on:?\*{0,2}\s*(.+)/i);
|
|
245
244
|
let depends = [];
|
|
@@ -6,41 +6,20 @@ import { parseSummary, loadFile, parseRequirementCounts, parseContextDependsOn,
|
|
|
6
6
|
import { resolveMilestoneFile, resolveSlicePath, resolveSliceFile, resolveTaskFile, resolveTasksDir, resolveGsdRootFile, gsdRoot, } from './paths.js';
|
|
7
7
|
import { findMilestoneIds } from './milestone-ids.js';
|
|
8
8
|
import { loadQueueOrder, sortByQueueOrder } from './queue-order.js';
|
|
9
|
+
import { isClosedStatus } from './status-guards.js';
|
|
9
10
|
import { nativeBatchParseGsdFiles } from './native-parser-bridge.js';
|
|
10
11
|
import { join, resolve } from 'path';
|
|
11
|
-
import { existsSync, readdirSync
|
|
12
|
+
import { existsSync, readdirSync } from 'node:fs';
|
|
12
13
|
import { debugCount, debugTime } from './debug-logger.js';
|
|
13
14
|
import { extractVerdict } from './verdict-parser.js';
|
|
14
|
-
import {
|
|
15
|
-
import { isDbAvailable, getAllMilestones, getMilestone, getMilestoneSlices, getSliceTasks, getReplanHistory, getSlice, insertMilestone, insertSlice, updateTaskStatus, getPendingSliceGateCount, } from './gsd-db.js';
|
|
15
|
+
import { isDbAvailable, getAllMilestones, getMilestoneSlices, getSliceTasks, getReplanHistory, getSlice, insertMilestone, updateTaskStatus, getPendingSliceGateCount, } from './gsd-db.js';
|
|
16
16
|
/**
|
|
17
17
|
* A "ghost" milestone directory contains only META.json (and no substantive
|
|
18
18
|
* files like CONTEXT, CONTEXT-DRAFT, ROADMAP, or SUMMARY). These appear when
|
|
19
19
|
* a milestone is created but never initialised. Treating them as active causes
|
|
20
20
|
* auto-mode to stall or falsely declare completion.
|
|
21
|
-
*
|
|
22
|
-
* However, a milestone is NOT a ghost if:
|
|
23
|
-
* - It has a DB row with a meaningful status (queued, active, etc.) — the DB
|
|
24
|
-
* knows about it even if content files haven't been created yet.
|
|
25
|
-
* - It has a worktree directory — a worktree proves the milestone was
|
|
26
|
-
* legitimately created and is expected to be populated.
|
|
27
|
-
*
|
|
28
|
-
* Fixes #2921: queued milestones with worktrees were incorrectly classified
|
|
29
|
-
* as ghosts, causing auto-mode to skip them entirely.
|
|
30
21
|
*/
|
|
31
22
|
export function isGhostMilestone(basePath, mid) {
|
|
32
|
-
// If the milestone has a DB row, it's a known milestone — not a ghost.
|
|
33
|
-
if (isDbAvailable()) {
|
|
34
|
-
const dbRow = getMilestone(mid);
|
|
35
|
-
if (dbRow)
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
// If a worktree exists for this milestone, it was legitimately created.
|
|
39
|
-
const root = gsdRoot(basePath);
|
|
40
|
-
const wtPath = join(root, 'worktrees', mid);
|
|
41
|
-
if (existsSync(wtPath))
|
|
42
|
-
return false;
|
|
43
|
-
// Fall back to content-file check: no substantive files means ghost.
|
|
44
23
|
const context = resolveMilestoneFile(basePath, mid, "CONTEXT");
|
|
45
24
|
const draft = resolveMilestoneFile(basePath, mid, "CONTEXT-DRAFT");
|
|
46
25
|
const roadmap = resolveMilestoneFile(basePath, mid, "ROADMAP");
|
|
@@ -161,10 +140,10 @@ export async function deriveState(basePath) {
|
|
|
161
140
|
// Dual-path: try DB-backed derivation first when hierarchy tables are populated
|
|
162
141
|
if (isDbAvailable()) {
|
|
163
142
|
let dbMilestones = getAllMilestones();
|
|
164
|
-
// Disk→DB reconciliation when
|
|
165
|
-
//
|
|
166
|
-
//
|
|
167
|
-
//
|
|
143
|
+
// Disk→DB reconciliation (#2631): when the milestones table is empty
|
|
144
|
+
// (e.g. failed initial migration per #2529), the reconciliation code
|
|
145
|
+
// inside deriveStateFromDb is unreachable. Populate from disk here so
|
|
146
|
+
// the DB path activates correctly.
|
|
168
147
|
if (dbMilestones.length === 0) {
|
|
169
148
|
const diskIds = findMilestoneIds(basePath);
|
|
170
149
|
let synced = false;
|
|
@@ -184,7 +163,7 @@ export async function deriveState(basePath) {
|
|
|
184
163
|
_telemetry.dbDeriveCount++;
|
|
185
164
|
}
|
|
186
165
|
else {
|
|
187
|
-
// DB open but
|
|
166
|
+
// DB open but empty hierarchy tables — pre-migration project, use filesystem
|
|
188
167
|
result = await _deriveStateImpl(basePath);
|
|
189
168
|
_telemetry.markdownDeriveCount++;
|
|
190
169
|
}
|
|
@@ -219,12 +198,6 @@ function extractContextTitle(content, fallback) {
|
|
|
219
198
|
return stripMilestonePrefix(h1.slice(2).trim()) || fallback;
|
|
220
199
|
}
|
|
221
200
|
// ─── DB-backed State Derivation ────────────────────────────────────────────
|
|
222
|
-
/**
|
|
223
|
-
* Helper: check if a DB status counts as "done" (handles K002 ambiguity).
|
|
224
|
-
*/
|
|
225
|
-
function isStatusDone(status) {
|
|
226
|
-
return status === 'complete' || status === 'done';
|
|
227
|
-
}
|
|
228
201
|
/**
|
|
229
202
|
* Derive GSD state from the milestones/slices/tasks DB tables.
|
|
230
203
|
* Flag files (PARKED, VALIDATION, CONTINUE, REPLAN, REPLAN-TRIGGER, CONTEXT-DRAFT)
|
|
@@ -253,39 +226,6 @@ export async function deriveStateFromDb(basePath) {
|
|
|
253
226
|
}
|
|
254
227
|
if (synced)
|
|
255
228
|
allMilestones = getAllMilestones();
|
|
256
|
-
// Disk→DB slice reconciliation (#2533): slices defined in ROADMAP.md but
|
|
257
|
-
// missing from the DB cause permanent "No slice eligible" blocks because
|
|
258
|
-
// the dependency resolver only sees DB rows. Parse each milestone's roadmap
|
|
259
|
-
// and insert any missing slices, checking SUMMARY files to set correct status.
|
|
260
|
-
// insertSlice uses INSERT OR IGNORE, so existing rows are never overwritten.
|
|
261
|
-
for (const mid of diskIds) {
|
|
262
|
-
if (isGhostMilestone(basePath, mid))
|
|
263
|
-
continue;
|
|
264
|
-
const roadmapPath = resolveMilestoneFile(basePath, mid, "ROADMAP");
|
|
265
|
-
if (!roadmapPath)
|
|
266
|
-
continue;
|
|
267
|
-
const dbSlices = getMilestoneSlices(mid);
|
|
268
|
-
const dbSliceIds = new Set(dbSlices.map(s => s.id));
|
|
269
|
-
let roadmapContent;
|
|
270
|
-
try {
|
|
271
|
-
roadmapContent = readFileSync(roadmapPath, "utf-8");
|
|
272
|
-
}
|
|
273
|
-
catch {
|
|
274
|
-
continue;
|
|
275
|
-
}
|
|
276
|
-
const parsed = parseRoadmap(roadmapContent);
|
|
277
|
-
for (const s of parsed.slices) {
|
|
278
|
-
if (dbSliceIds.has(s.id))
|
|
279
|
-
continue;
|
|
280
|
-
const summaryPath = resolveSliceFile(basePath, mid, s.id, "SUMMARY");
|
|
281
|
-
const sliceStatus = (s.done || summaryPath) ? "complete" : "pending";
|
|
282
|
-
insertSlice({
|
|
283
|
-
id: s.id, milestoneId: mid, title: s.title,
|
|
284
|
-
status: sliceStatus, risk: s.risk,
|
|
285
|
-
depends: s.depends, demo: s.demo,
|
|
286
|
-
});
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
229
|
// Reconcile: discover milestones that exist on disk but are missing from
|
|
290
230
|
// the DB. This happens when milestones were created before the DB migration
|
|
291
231
|
// or were manually added to the filesystem. Without this, disk-only
|
|
@@ -341,7 +281,7 @@ export async function deriveStateFromDb(basePath) {
|
|
|
341
281
|
parkedMilestoneIds.add(m.id);
|
|
342
282
|
continue;
|
|
343
283
|
}
|
|
344
|
-
if (
|
|
284
|
+
if (isClosedStatus(m.status)) {
|
|
345
285
|
completeMilestoneIds.add(m.id);
|
|
346
286
|
continue;
|
|
347
287
|
}
|
|
@@ -353,7 +293,7 @@ export async function deriveStateFromDb(basePath) {
|
|
|
353
293
|
}
|
|
354
294
|
// Check roadmap: all slices done means milestone is complete
|
|
355
295
|
const slices = getMilestoneSlices(m.id);
|
|
356
|
-
if (slices.length > 0 && slices.every(s =>
|
|
296
|
+
if (slices.length > 0 && slices.every(s => isClosedStatus(s.status))) {
|
|
357
297
|
// All slices done but no summary — still counts as complete for dep resolution
|
|
358
298
|
// if a summary file exists
|
|
359
299
|
// Note: without summary file, the milestone is in validating/completing state, not complete
|
|
@@ -372,7 +312,7 @@ export async function deriveStateFromDb(basePath) {
|
|
|
372
312
|
}
|
|
373
313
|
// Ghost milestone check: no slices in DB AND no substantive files on disk
|
|
374
314
|
const slices = getMilestoneSlices(m.id);
|
|
375
|
-
if (slices.length === 0 && !
|
|
315
|
+
if (slices.length === 0 && !isClosedStatus(m.status)) {
|
|
376
316
|
// Check disk for ghost detection
|
|
377
317
|
if (isGhostMilestone(basePath, m.id))
|
|
378
318
|
continue;
|
|
@@ -393,7 +333,7 @@ export async function deriveStateFromDb(basePath) {
|
|
|
393
333
|
continue;
|
|
394
334
|
}
|
|
395
335
|
// Not complete — determine if it should be active
|
|
396
|
-
const allSlicesDone = slices.length > 0 && slices.every(s =>
|
|
336
|
+
const allSlicesDone = slices.length > 0 && slices.every(s => isClosedStatus(s.status));
|
|
397
337
|
// Get title — prefer DB, fall back to context file extraction
|
|
398
338
|
let title = stripMilestonePrefix(m.title) || m.id;
|
|
399
339
|
if (title === m.id) {
|
|
@@ -492,8 +432,7 @@ export async function deriveStateFromDb(basePath) {
|
|
|
492
432
|
? `All milestones complete. ${activeReqs} active requirement${activeReqs === 1 ? '' : 's'} in REQUIREMENTS.md ${activeReqs === 1 ? 'has' : 'have'} not been mapped to a milestone.`
|
|
493
433
|
: 'All milestones complete.';
|
|
494
434
|
return {
|
|
495
|
-
activeMilestone: null,
|
|
496
|
-
lastCompletedMilestone: lastEntry ? { id: lastEntry.id, title: lastEntry.title } : null,
|
|
435
|
+
activeMilestone: lastEntry ? { id: lastEntry.id, title: lastEntry.title } : null,
|
|
497
436
|
activeSlice: null, activeTask: null,
|
|
498
437
|
phase: 'complete',
|
|
499
438
|
recentDecisions: [], blockers: [],
|
|
@@ -531,7 +470,10 @@ export async function deriveStateFromDb(basePath) {
|
|
|
531
470
|
};
|
|
532
471
|
}
|
|
533
472
|
// ── All slices done → validating/completing ─────────────────────────
|
|
534
|
-
|
|
473
|
+
// Guard: [].every() === true (vacuous truth). Without the length check,
|
|
474
|
+
// an empty slice array causes a premature phase transition to
|
|
475
|
+
// validating-milestone. See: https://github.com/gsd-build/gsd-2/issues/2667
|
|
476
|
+
const allSlicesDone = activeMilestoneSlices.length > 0 && activeMilestoneSlices.every(s => isClosedStatus(s.status));
|
|
535
477
|
if (allSlicesDone) {
|
|
536
478
|
const validationFile = resolveMilestoneFile(basePath, activeMilestone.id, "VALIDATION");
|
|
537
479
|
const validationContent = validationFile ? await loadFile(validationFile) : null;
|
|
@@ -561,14 +503,14 @@ export async function deriveStateFromDb(basePath) {
|
|
|
561
503
|
}
|
|
562
504
|
// ── Find active slice (first incomplete with deps satisfied) ─────────
|
|
563
505
|
const sliceProgress = {
|
|
564
|
-
done: activeMilestoneSlices.filter(s =>
|
|
506
|
+
done: activeMilestoneSlices.filter(s => isClosedStatus(s.status)).length,
|
|
565
507
|
total: activeMilestoneSlices.length,
|
|
566
508
|
};
|
|
567
|
-
const doneSliceIds = new Set(activeMilestoneSlices.filter(s =>
|
|
509
|
+
const doneSliceIds = new Set(activeMilestoneSlices.filter(s => isClosedStatus(s.status)).map(s => s.id));
|
|
568
510
|
let activeSlice = null;
|
|
569
511
|
let activeSliceRow = null;
|
|
570
512
|
for (const s of activeMilestoneSlices) {
|
|
571
|
-
if (
|
|
513
|
+
if (isClosedStatus(s.status))
|
|
572
514
|
continue;
|
|
573
515
|
if (s.depends.every(dep => doneSliceIds.has(dep))) {
|
|
574
516
|
activeSlice = { id: s.id, title: s.title };
|
|
@@ -608,18 +550,18 @@ export async function deriveStateFromDb(basePath) {
|
|
|
608
550
|
// causing the dispatcher to re-dispatch the same completed task forever.
|
|
609
551
|
let reconciled = false;
|
|
610
552
|
for (const t of tasks) {
|
|
611
|
-
if (
|
|
553
|
+
if (isClosedStatus(t.status))
|
|
612
554
|
continue;
|
|
613
555
|
const summaryPath = resolveTaskFile(basePath, activeMilestone.id, activeSlice.id, t.id, "SUMMARY");
|
|
614
556
|
if (summaryPath && existsSync(summaryPath)) {
|
|
615
557
|
try {
|
|
616
558
|
updateTaskStatus(activeMilestone.id, activeSlice.id, t.id, "complete");
|
|
617
|
-
|
|
559
|
+
process.stderr.write(`gsd-reconcile: task ${activeMilestone.id}/${activeSlice.id}/${t.id} had SUMMARY on disk but DB status was "${t.status}" — updated to "complete" (#2514)\n`);
|
|
618
560
|
reconciled = true;
|
|
619
561
|
}
|
|
620
562
|
catch (e) {
|
|
621
563
|
// DB write failed — continue with stale status rather than crash
|
|
622
|
-
|
|
564
|
+
process.stderr.write(`gsd-reconcile: failed to update task ${t.id}: ${e.message}\n`);
|
|
623
565
|
}
|
|
624
566
|
}
|
|
625
567
|
}
|
|
@@ -628,10 +570,10 @@ export async function deriveStateFromDb(basePath) {
|
|
|
628
570
|
tasks = getSliceTasks(activeMilestone.id, activeSlice.id);
|
|
629
571
|
}
|
|
630
572
|
const taskProgress = {
|
|
631
|
-
done: tasks.filter(t =>
|
|
573
|
+
done: tasks.filter(t => isClosedStatus(t.status)).length,
|
|
632
574
|
total: tasks.length,
|
|
633
575
|
};
|
|
634
|
-
const activeTaskRow = tasks.find(t => !
|
|
576
|
+
const activeTaskRow = tasks.find(t => !isClosedStatus(t.status));
|
|
635
577
|
if (!activeTaskRow && tasks.length > 0) {
|
|
636
578
|
// All tasks done but slice not marked complete → summarizing
|
|
637
579
|
return {
|
|
@@ -686,7 +628,7 @@ export async function deriveStateFromDb(basePath) {
|
|
|
686
628
|
};
|
|
687
629
|
}
|
|
688
630
|
// ── Blocker detection: check completed tasks for blocker_discovered ──
|
|
689
|
-
const completedTasks = tasks.filter(t =>
|
|
631
|
+
const completedTasks = tasks.filter(t => isClosedStatus(t.status));
|
|
690
632
|
let blockerTaskId = null;
|
|
691
633
|
for (const ct of completedTasks) {
|
|
692
634
|
if (ct.blocker_discovered) {
|
|
@@ -1245,7 +1187,7 @@ export async function _deriveStateImpl(basePath) {
|
|
|
1245
1187
|
const summaryPath = resolveTaskFile(basePath, activeMilestone.id, activeSlice.id, t.id, "SUMMARY");
|
|
1246
1188
|
if (summaryPath && existsSync(summaryPath)) {
|
|
1247
1189
|
t.done = true;
|
|
1248
|
-
|
|
1190
|
+
process.stderr.write(`gsd-reconcile: task ${activeMilestone.id}/${activeSlice.id}/${t.id} has SUMMARY on disk but plan shows incomplete — marking done (#2514)\n`);
|
|
1249
1191
|
}
|
|
1250
1192
|
}
|
|
1251
1193
|
const taskProgress = {
|
|
@@ -87,26 +87,7 @@ export function load(url, context, nextLoad) {
|
|
|
87
87
|
emitDecoratorMetadata: true,
|
|
88
88
|
},
|
|
89
89
|
});
|
|
90
|
-
|
|
91
|
-
// workspace packages compiled as ESM can still use them. This avoids the
|
|
92
|
-
// need for import.meta.url behind indirect invocation patterns that fail in
|
|
93
|
-
// CJS and in dynamically-created scopes.
|
|
94
|
-
// Only inject globals that the source file doesn't already declare itself.
|
|
95
|
-
const preambleLines = [
|
|
96
|
-
'import { fileURLToPath as __preamble_fUTP } from "node:url";',
|
|
97
|
-
'import { dirname as __preamble_dn } from "node:path";',
|
|
98
|
-
'import { createRequire as __preamble_cR } from "node:module";',
|
|
99
|
-
];
|
|
100
|
-
if (!outputText.includes('const __filename') && !outputText.includes('let __filename')) {
|
|
101
|
-
preambleLines.push('const __filename = __preamble_fUTP(import.meta.url);');
|
|
102
|
-
}
|
|
103
|
-
if (!outputText.includes('const __dirname') && !outputText.includes('let __dirname')) {
|
|
104
|
-
preambleLines.push('const __dirname = __preamble_dn(__preamble_fUTP(import.meta.url));');
|
|
105
|
-
}
|
|
106
|
-
if (!outputText.includes('const require') && !outputText.includes('let require')) {
|
|
107
|
-
preambleLines.push('const require = __preamble_cR(import.meta.url);');
|
|
108
|
-
}
|
|
109
|
-
return { format: 'module', source: preambleLines.join('\n') + '\n' + outputText, shortCircuit: true };
|
|
90
|
+
return { format: 'module', source: outputText, shortCircuit: true };
|
|
110
91
|
}
|
|
111
92
|
return nextLoad(url, context);
|
|
112
93
|
}
|