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
|
@@ -58,8 +58,9 @@ import { initRoutingHistory } from "./routing-history.js";
|
|
|
58
58
|
import { restoreHookState, resetHookState } from "./post-unit-hooks.js";
|
|
59
59
|
import { resetProactiveHealing, setLevelChangeCallback } from "./doctor-proactive.js";
|
|
60
60
|
import { snapshotSkills } from "./skill-discovery.js";
|
|
61
|
-
import { isDbAvailable, getMilestone } from "./gsd-db.js";
|
|
61
|
+
import { isDbAvailable, getMilestone, openDatabase } from "./gsd-db.js";
|
|
62
62
|
import { hideFooter } from "./auto-dashboard.js";
|
|
63
|
+
import { resolveProjectRootDbPath } from "./bootstrap/dynamic-tools.js";
|
|
63
64
|
import {
|
|
64
65
|
debugLog,
|
|
65
66
|
enableDebug,
|
|
@@ -67,6 +68,7 @@ import {
|
|
|
67
68
|
getDebugLogPath,
|
|
68
69
|
} from "./debug-logger.js";
|
|
69
70
|
import { parseUnitId } from "./unit-id.js";
|
|
71
|
+
import { setLogBasePath } from "./workflow-logger.js";
|
|
70
72
|
import type { AutoSession } from "./auto/session.js";
|
|
71
73
|
import {
|
|
72
74
|
existsSync,
|
|
@@ -78,7 +80,6 @@ import {
|
|
|
78
80
|
import { join } from "node:path";
|
|
79
81
|
import { sep as pathSep } from "node:path";
|
|
80
82
|
|
|
81
|
-
import { resolveProjectRootDbPath } from "./bootstrap/dynamic-tools.js";
|
|
82
83
|
import type { WorktreeResolver } from "./worktree-resolver.js";
|
|
83
84
|
|
|
84
85
|
export interface BootstrapDeps {
|
|
@@ -97,32 +98,26 @@ export interface BootstrapDeps {
|
|
|
97
98
|
* concurrent session detected). Returns true when ready to dispatch.
|
|
98
99
|
*/
|
|
99
100
|
|
|
100
|
-
/**
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
101
|
+
/** Guard: tracks consecutive bootstrap attempts that found phase === "complete".
|
|
102
|
+
* Prevents the recursive dialog loop described in #1348 where
|
|
103
|
+
* bootstrapAutoSession → showSmartEntry → checkAutoStartAfterDiscuss → startAuto
|
|
104
|
+
* cycles indefinitely when the discuss workflow doesn't produce a milestone. */
|
|
105
|
+
let _consecutiveCompleteBootstraps = 0;
|
|
106
|
+
const MAX_CONSECUTIVE_COMPLETE_BOOTSTRAPS = 2;
|
|
107
|
+
|
|
107
108
|
async function openProjectDbIfPresent(basePath: string): Promise<void> {
|
|
108
109
|
const gsdDbPath = resolveProjectRootDbPath(basePath);
|
|
109
|
-
if (!existsSync(gsdDbPath)) return;
|
|
110
|
-
if (isDbAvailable()) return;
|
|
110
|
+
if (!existsSync(gsdDbPath) || isDbAvailable()) return;
|
|
111
111
|
|
|
112
112
|
try {
|
|
113
|
-
const { openDatabase } = await import("./gsd-db.js");
|
|
114
113
|
openDatabase(gsdDbPath);
|
|
115
|
-
} catch {
|
|
116
|
-
|
|
114
|
+
} catch (err) {
|
|
115
|
+
process.stderr.write(
|
|
116
|
+
`gsd-db: failed to open existing database: ${(err as Error).message}\n`,
|
|
117
|
+
);
|
|
117
118
|
}
|
|
118
119
|
}
|
|
119
120
|
|
|
120
|
-
/** Guard: tracks consecutive bootstrap attempts that found phase === "complete".
|
|
121
|
-
* Prevents the recursive dialog loop described in #1348 where
|
|
122
|
-
* bootstrapAutoSession → showSmartEntry → checkAutoStartAfterDiscuss → startAuto
|
|
123
|
-
* cycles indefinitely when the discuss workflow doesn't produce a milestone. */
|
|
124
|
-
let _consecutiveCompleteBootstraps = 0;
|
|
125
|
-
const MAX_CONSECUTIVE_COMPLETE_BOOTSTRAPS = 2;
|
|
126
121
|
export async function bootstrapAutoSession(
|
|
127
122
|
s: AutoSession,
|
|
128
123
|
ctx: ExtensionCommandContext,
|
|
@@ -203,13 +198,10 @@ export async function bootstrapAutoSession(
|
|
|
203
198
|
ensureGitignore(base, { manageGitignore });
|
|
204
199
|
if (manageGitignore !== false) untrackRuntimeFiles(base);
|
|
205
200
|
|
|
206
|
-
// Bootstrap
|
|
207
|
-
// Check milestones/ directly — ensureGsdSymlink above already created .gsd/,
|
|
208
|
-
// so checking .gsd/ existence would be dead code (#2942).
|
|
201
|
+
// Bootstrap .gsd/ if it doesn't exist
|
|
209
202
|
const gsdDir = join(base, ".gsd");
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
mkdirSync(milestonesPath, { recursive: true });
|
|
203
|
+
if (!existsSync(gsdDir)) {
|
|
204
|
+
mkdirSync(join(gsdDir, "milestones"), { recursive: true });
|
|
213
205
|
try {
|
|
214
206
|
nativeAddAll(base);
|
|
215
207
|
nativeCommit(base, "chore: init gsd");
|
|
@@ -288,6 +280,10 @@ export async function bootstrapAutoSession(
|
|
|
288
280
|
ctx.ui.notify(`Debug logging enabled → ${getDebugLogPath()}`, "info");
|
|
289
281
|
}
|
|
290
282
|
|
|
283
|
+
// Open the project DB before the first derive so resume uses DB truth
|
|
284
|
+
// immediately on cold starts instead of falling back to markdown (#2841).
|
|
285
|
+
await openProjectDbIfPresent(base);
|
|
286
|
+
|
|
291
287
|
// Invalidate caches before initial state derivation
|
|
292
288
|
invalidateAllCaches();
|
|
293
289
|
|
|
@@ -297,10 +293,6 @@ export async function bootstrapAutoSession(
|
|
|
297
293
|
(mid) => !!resolveMilestoneFile(base, mid, "SUMMARY"),
|
|
298
294
|
);
|
|
299
295
|
|
|
300
|
-
// Open the project-root DB before deriveState so DB-backed state
|
|
301
|
-
// derivation (queue-order, task status) works on a cold start (#2841).
|
|
302
|
-
await openProjectDbIfPresent(base);
|
|
303
|
-
|
|
304
296
|
let state = await deriveState(base);
|
|
305
297
|
|
|
306
298
|
// Stale worktree state recovery (#654)
|
|
@@ -498,6 +490,7 @@ export async function bootstrapAutoSession(
|
|
|
498
490
|
s.verbose = verboseMode;
|
|
499
491
|
s.cmdCtx = ctx;
|
|
500
492
|
s.basePath = base;
|
|
493
|
+
setLogBasePath(base);
|
|
501
494
|
s.unitDispatchCount.clear();
|
|
502
495
|
s.unitRecoveryCount.clear();
|
|
503
496
|
s.lastBudgetAlertLevel = 0;
|
|
@@ -561,15 +554,14 @@ export async function bootstrapAutoSession(
|
|
|
561
554
|
}
|
|
562
555
|
|
|
563
556
|
// ── DB lifecycle ──
|
|
564
|
-
const gsdDbPath =
|
|
557
|
+
const gsdDbPath = resolveProjectRootDbPath(s.basePath);
|
|
565
558
|
const gsdDirPath = join(s.basePath, ".gsd");
|
|
566
559
|
if (existsSync(gsdDirPath) && !existsSync(gsdDbPath)) {
|
|
567
560
|
const hasDecisions = existsSync(join(gsdDirPath, "DECISIONS.md"));
|
|
568
561
|
const hasRequirements = existsSync(join(gsdDirPath, "REQUIREMENTS.md"));
|
|
569
562
|
const hasMilestones = existsSync(join(gsdDirPath, "milestones"));
|
|
570
563
|
try {
|
|
571
|
-
|
|
572
|
-
openDb(gsdDbPath);
|
|
564
|
+
openDatabase(gsdDbPath);
|
|
573
565
|
if (hasDecisions || hasRequirements || hasMilestones) {
|
|
574
566
|
const { migrateFromMarkdown } = await import("./md-importer.js");
|
|
575
567
|
migrateFromMarkdown(s.basePath);
|
|
@@ -582,8 +574,7 @@ export async function bootstrapAutoSession(
|
|
|
582
574
|
}
|
|
583
575
|
if (existsSync(gsdDbPath) && !isDbAvailable()) {
|
|
584
576
|
try {
|
|
585
|
-
|
|
586
|
-
openDb(gsdDbPath);
|
|
577
|
+
openDatabase(gsdDbPath);
|
|
587
578
|
} catch (err) {
|
|
588
579
|
process.stderr.write(
|
|
589
580
|
`gsd-db: failed to open existing database: ${(err as Error).message}\n`,
|
|
@@ -15,7 +15,6 @@ import {
|
|
|
15
15
|
realpathSync,
|
|
16
16
|
rmSync,
|
|
17
17
|
unlinkSync,
|
|
18
|
-
statSync,
|
|
19
18
|
lstatSync as lstatSyncFn,
|
|
20
19
|
} from "node:fs";
|
|
21
20
|
import { isAbsolute, join, sep as pathSep } from "node:path";
|
|
@@ -63,7 +62,6 @@ import {
|
|
|
63
62
|
nativeDiffNumstat,
|
|
64
63
|
nativeUpdateRef,
|
|
65
64
|
nativeIsAncestor,
|
|
66
|
-
nativeMergeAbort,
|
|
67
65
|
} from "./native-git-bridge.js";
|
|
68
66
|
|
|
69
67
|
const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
|
|
@@ -86,7 +84,6 @@ const ROOT_STATE_FILES = [
|
|
|
86
84
|
"QUEUE.md",
|
|
87
85
|
"completed-units.json",
|
|
88
86
|
"metrics.json",
|
|
89
|
-
"mcp.json",
|
|
90
87
|
// NOTE: project preferences are intentionally NOT in ROOT_STATE_FILES.
|
|
91
88
|
// Forward-sync (main → worktree) is handled explicitly in syncGsdStateToWorktree().
|
|
92
89
|
// Back-sync (worktree → main) must NEVER overwrite the project root's copy
|
|
@@ -105,67 +102,6 @@ function isSamePath(a: string, b: string): boolean {
|
|
|
105
102
|
}
|
|
106
103
|
}
|
|
107
104
|
|
|
108
|
-
// ─── ASSESSMENT Force-Sync Helper (#2821) ─────────────────────────────────
|
|
109
|
-
|
|
110
|
-
/** Regex matching YAML frontmatter `verdict:` field. */
|
|
111
|
-
const VERDICT_RE = /verdict:\s*[\w-]+/i;
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Walk a milestone directory and force-overwrite ASSESSMENT files in the
|
|
115
|
-
* destination when the source copy contains a `verdict:` field.
|
|
116
|
-
*
|
|
117
|
-
* This is the targeted fix for the UAT stuck-loop (#2821): the main
|
|
118
|
-
* safeCopyRecursive uses force:false to protect worktree-authoritative
|
|
119
|
-
* files (#1886), but ASSESSMENT files written by run-uat must be
|
|
120
|
-
* forward-synced when the project root has a verdict. Without this,
|
|
121
|
-
* the worktree retains a stale FAIL or missing ASSESSMENT and
|
|
122
|
-
* checkNeedsRunUat re-dispatches run-uat indefinitely.
|
|
123
|
-
*
|
|
124
|
-
* Only overwrites when the source has a verdict — never clobbers a
|
|
125
|
-
* worktree ASSESSMENT with a verdictless project-root copy.
|
|
126
|
-
*/
|
|
127
|
-
function forceOverwriteAssessmentsWithVerdict(
|
|
128
|
-
srcMilestoneDir: string,
|
|
129
|
-
dstMilestoneDir: string,
|
|
130
|
-
): void {
|
|
131
|
-
if (!existsSync(srcMilestoneDir)) return;
|
|
132
|
-
|
|
133
|
-
// Walk slices/<SID>/ looking for *-ASSESSMENT.md files
|
|
134
|
-
const slicesDir = join(srcMilestoneDir, "slices");
|
|
135
|
-
if (!existsSync(slicesDir)) return;
|
|
136
|
-
|
|
137
|
-
try {
|
|
138
|
-
for (const sliceEntry of readdirSync(slicesDir, { withFileTypes: true })) {
|
|
139
|
-
if (!sliceEntry.isDirectory()) continue;
|
|
140
|
-
const srcSliceDir = join(slicesDir, sliceEntry.name);
|
|
141
|
-
const dstSliceDir = join(dstMilestoneDir, "slices", sliceEntry.name);
|
|
142
|
-
|
|
143
|
-
try {
|
|
144
|
-
for (const fileEntry of readdirSync(srcSliceDir, { withFileTypes: true })) {
|
|
145
|
-
if (!fileEntry.isFile()) continue;
|
|
146
|
-
if (!fileEntry.name.endsWith("-ASSESSMENT.md")) continue;
|
|
147
|
-
|
|
148
|
-
const srcFile = join(srcSliceDir, fileEntry.name);
|
|
149
|
-
try {
|
|
150
|
-
const srcContent = readFileSync(srcFile, "utf-8");
|
|
151
|
-
if (!VERDICT_RE.test(srcContent)) continue; // no verdict in source — skip
|
|
152
|
-
|
|
153
|
-
// Source has a verdict — force-copy into worktree
|
|
154
|
-
mkdirSync(dstSliceDir, { recursive: true });
|
|
155
|
-
safeCopy(srcFile, join(dstSliceDir, fileEntry.name), { force: true });
|
|
156
|
-
} catch {
|
|
157
|
-
/* non-fatal per file */
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
} catch {
|
|
161
|
-
/* non-fatal per slice */
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
} catch {
|
|
165
|
-
/* non-fatal */
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
105
|
// ─── Module State ──────────────────────────────────────────────────────────
|
|
170
106
|
|
|
171
107
|
/** Original project root before chdir into auto-worktree. */
|
|
@@ -278,19 +214,6 @@ export function syncProjectRootToWorktree(
|
|
|
278
214
|
{ force: false },
|
|
279
215
|
);
|
|
280
216
|
|
|
281
|
-
// Force-sync ASSESSMENT files that have a verdict from project root (#2821).
|
|
282
|
-
// The additive-only copy above preserves worktree-authoritative files, but
|
|
283
|
-
// ASSESSMENT files are special: after run-uat writes a verdict and post-unit
|
|
284
|
-
// syncs it to the project root, the worktree may retain a stale copy (e.g.
|
|
285
|
-
// verdict:fail while the project root has verdict:pass from a retry). On
|
|
286
|
-
// session resume the DB is rebuilt from disk, and if the stale ASSESSMENT
|
|
287
|
-
// persists, checkNeedsRunUat finds no passing verdict → re-dispatches
|
|
288
|
-
// run-uat indefinitely (stuck-loop ×9).
|
|
289
|
-
forceOverwriteAssessmentsWithVerdict(
|
|
290
|
-
join(prGsd, "milestones", milestoneId),
|
|
291
|
-
join(wtGsd, "milestones", milestoneId),
|
|
292
|
-
);
|
|
293
|
-
|
|
294
217
|
// Forward-sync completed-units.json from project root to worktree.
|
|
295
218
|
// Project root is authoritative for completion state after crash recovery;
|
|
296
219
|
// without this, the worktree re-dispatches already-completed units (#1886).
|
|
@@ -300,18 +223,12 @@ export function syncProjectRootToWorktree(
|
|
|
300
223
|
{ force: true },
|
|
301
224
|
);
|
|
302
225
|
|
|
303
|
-
// Delete worktree gsd.db
|
|
304
|
-
//
|
|
305
|
-
// A non-empty DB was populated by gsd-migrate on respawn and must be
|
|
306
|
-
// preserved — deleting it truncates the file to 0 bytes when
|
|
307
|
-
// openDatabase re-creates it, causing "no such table" failures (#2815).
|
|
226
|
+
// Delete worktree gsd.db so it rebuilds from the freshly synced files.
|
|
227
|
+
// Stale DB rows are the root cause of the infinite skip loop (#853).
|
|
308
228
|
try {
|
|
309
229
|
const wtDb = join(wtGsd, "gsd.db");
|
|
310
230
|
if (existsSync(wtDb)) {
|
|
311
|
-
|
|
312
|
-
if (size === 0) {
|
|
313
|
-
unlinkSync(wtDb);
|
|
314
|
-
}
|
|
231
|
+
unlinkSync(wtDb);
|
|
315
232
|
}
|
|
316
233
|
} catch {
|
|
317
234
|
/* non-fatal */
|
|
@@ -1087,7 +1004,6 @@ function copyPlanningArtifacts(srcBase: string, wtPath: string): void {
|
|
|
1087
1004
|
"STATE.md",
|
|
1088
1005
|
"KNOWLEDGE.md",
|
|
1089
1006
|
"OVERRIDES.md",
|
|
1090
|
-
"mcp.json",
|
|
1091
1007
|
]) {
|
|
1092
1008
|
safeCopy(join(srcGsd, file), join(dstGsd, file), { force: true });
|
|
1093
1009
|
}
|
|
@@ -1498,19 +1414,9 @@ export function mergeMilestoneToMain(
|
|
|
1498
1414
|
encoding: "utf-8",
|
|
1499
1415
|
}).trim();
|
|
1500
1416
|
if (status) {
|
|
1501
|
-
// Use --include-untracked to stash untracked files that would block
|
|
1502
|
-
// the squash merge, but EXCLUDE .gsd/milestones/ (#2505).
|
|
1503
|
-
// --include-untracked without exclusion sweeps queued milestone
|
|
1504
|
-
// CONTEXT files into the stash. If stash pop later fails, those files
|
|
1505
|
-
// are permanently trapped in the stash entry and lost on the next
|
|
1506
|
-
// stash push or drop.
|
|
1507
1417
|
execFileSync(
|
|
1508
1418
|
"git",
|
|
1509
|
-
[
|
|
1510
|
-
"stash", "push", "--include-untracked",
|
|
1511
|
-
"-m", `gsd: pre-merge stash for ${milestoneId}`,
|
|
1512
|
-
"--", ":(exclude).gsd/milestones",
|
|
1513
|
-
],
|
|
1419
|
+
["stash", "push", "--include-untracked", "-m", `gsd: pre-merge stash for ${milestoneId}`],
|
|
1514
1420
|
{ cwd: originalBasePath_, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" },
|
|
1515
1421
|
);
|
|
1516
1422
|
stashed = true;
|
|
@@ -1520,62 +1426,6 @@ export function mergeMilestoneToMain(
|
|
|
1520
1426
|
// report the dirty tree if it fails.
|
|
1521
1427
|
}
|
|
1522
1428
|
|
|
1523
|
-
// 7a. Shelter queued milestone directories before the squash merge (#2505).
|
|
1524
|
-
// The milestone branch may contain copies of queued milestone dirs (via
|
|
1525
|
-
// copyPlanningArtifacts), so `git merge --squash` rejects when those same
|
|
1526
|
-
// files exist as untracked in the working tree. Temporarily move them to
|
|
1527
|
-
// a backup location, then restore after the merge+commit.
|
|
1528
|
-
const milestonesDir = join(gsdRoot(originalBasePath_), "milestones");
|
|
1529
|
-
const shelterDir = join(gsdRoot(originalBasePath_), ".milestone-shelter");
|
|
1530
|
-
const shelteredDirs: string[] = [];
|
|
1531
|
-
|
|
1532
|
-
// Helper: restore sheltered milestone directories (#2505).
|
|
1533
|
-
// Called on both success and error paths to ensure queued CONTEXT files
|
|
1534
|
-
// are never permanently lost.
|
|
1535
|
-
const restoreShelter = (): void => {
|
|
1536
|
-
if (shelteredDirs.length === 0) return;
|
|
1537
|
-
for (const dirName of shelteredDirs) {
|
|
1538
|
-
try {
|
|
1539
|
-
mkdirSync(milestonesDir, { recursive: true });
|
|
1540
|
-
cpSync(join(shelterDir, dirName), join(milestonesDir, dirName), { recursive: true, force: true });
|
|
1541
|
-
} catch { /* best-effort */ }
|
|
1542
|
-
}
|
|
1543
|
-
try { rmSync(shelterDir, { recursive: true, force: true }); } catch { /* best-effort */ }
|
|
1544
|
-
};
|
|
1545
|
-
|
|
1546
|
-
try {
|
|
1547
|
-
if (existsSync(milestonesDir)) {
|
|
1548
|
-
const entries = readdirSync(milestonesDir, { withFileTypes: true });
|
|
1549
|
-
for (const entry of entries) {
|
|
1550
|
-
if (!entry.isDirectory()) continue;
|
|
1551
|
-
// Only shelter directories that do NOT belong to the milestone being merged
|
|
1552
|
-
if (entry.name === milestoneId) continue;
|
|
1553
|
-
const srcDir = join(milestonesDir, entry.name);
|
|
1554
|
-
const dstDir = join(shelterDir, entry.name);
|
|
1555
|
-
try {
|
|
1556
|
-
mkdirSync(shelterDir, { recursive: true });
|
|
1557
|
-
cpSync(srcDir, dstDir, { recursive: true, force: true });
|
|
1558
|
-
rmSync(srcDir, { recursive: true, force: true });
|
|
1559
|
-
shelteredDirs.push(entry.name);
|
|
1560
|
-
} catch {
|
|
1561
|
-
// Non-fatal — if shelter fails, the merge may still succeed
|
|
1562
|
-
}
|
|
1563
|
-
}
|
|
1564
|
-
}
|
|
1565
|
-
} catch {
|
|
1566
|
-
// Non-fatal — proceed with merge; untracked files may block it
|
|
1567
|
-
}
|
|
1568
|
-
|
|
1569
|
-
// 7c. Clean stale MERGE_HEAD before the squash merge (#2912).
|
|
1570
|
-
// The native (libgit2) merge path or a prior interrupted merge may leave
|
|
1571
|
-
// MERGE_HEAD in the git dir. `git merge --squash` refuses to run when
|
|
1572
|
-
// MERGE_HEAD exists, so remove it preemptively.
|
|
1573
|
-
try {
|
|
1574
|
-
const gitDirPre = resolveGitDir(originalBasePath_);
|
|
1575
|
-
const mergeHeadPre = join(gitDirPre, "MERGE_HEAD");
|
|
1576
|
-
if (existsSync(mergeHeadPre)) unlinkSync(mergeHeadPre);
|
|
1577
|
-
} catch { /* best-effort */ }
|
|
1578
|
-
|
|
1579
1429
|
// 8. Squash merge — auto-resolve .gsd/ state file conflicts (#530)
|
|
1580
1430
|
const mergeResult = nativeMergeSquash(originalBasePath_, milestoneBranch);
|
|
1581
1431
|
|
|
@@ -1584,16 +1434,6 @@ export function mergeMilestoneToMain(
|
|
|
1584
1434
|
// untracked .gsd/ files left by syncStateToProjectRoot). Preserve the
|
|
1585
1435
|
// milestone branch so commits are not lost.
|
|
1586
1436
|
if (mergeResult.conflicts.includes("__dirty_working_tree__")) {
|
|
1587
|
-
// Defensively clean merge state — the native path may leave MERGE_HEAD
|
|
1588
|
-
// even when the merge is rejected (#2912).
|
|
1589
|
-
try {
|
|
1590
|
-
const gitDir_ = resolveGitDir(originalBasePath_);
|
|
1591
|
-
for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_HEAD"]) {
|
|
1592
|
-
const p = join(gitDir_, f);
|
|
1593
|
-
if (existsSync(p)) unlinkSync(p);
|
|
1594
|
-
}
|
|
1595
|
-
} catch { /* best-effort */ }
|
|
1596
|
-
|
|
1597
1437
|
// Pop stash before throwing so local work is not lost.
|
|
1598
1438
|
if (stashed) {
|
|
1599
1439
|
try {
|
|
@@ -1604,7 +1444,6 @@ export function mergeMilestoneToMain(
|
|
|
1604
1444
|
});
|
|
1605
1445
|
} catch { /* stash pop conflict is non-fatal */ }
|
|
1606
1446
|
}
|
|
1607
|
-
restoreShelter();
|
|
1608
1447
|
// Restore cwd so the caller is not stranded on the integration branch
|
|
1609
1448
|
process.chdir(previousCwd);
|
|
1610
1449
|
// Surface the actual dirty filenames from git stderr instead of
|
|
@@ -1651,18 +1490,6 @@ export function mergeMilestoneToMain(
|
|
|
1651
1490
|
|
|
1652
1491
|
// If there are still real code conflicts, escalate
|
|
1653
1492
|
if (codeConflicts.length > 0) {
|
|
1654
|
-
// Abort merge state so MERGE_HEAD is not left on disk (#2912).
|
|
1655
|
-
// libgit2's merge creates MERGE_HEAD even for squash merges; if left
|
|
1656
|
-
// dangling, subsequent merges fail and doctor reports corrupt state.
|
|
1657
|
-
try { nativeMergeAbort(originalBasePath_); } catch { /* best-effort */ }
|
|
1658
|
-
try {
|
|
1659
|
-
const gitDir_ = resolveGitDir(originalBasePath_);
|
|
1660
|
-
for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_HEAD"]) {
|
|
1661
|
-
const p = join(gitDir_, f);
|
|
1662
|
-
if (existsSync(p)) unlinkSync(p);
|
|
1663
|
-
}
|
|
1664
|
-
} catch { /* best-effort */ }
|
|
1665
|
-
|
|
1666
1493
|
// Pop stash before throwing so local work is not lost (#2151).
|
|
1667
1494
|
if (stashed) {
|
|
1668
1495
|
try {
|
|
@@ -1673,7 +1500,6 @@ export function mergeMilestoneToMain(
|
|
|
1673
1500
|
});
|
|
1674
1501
|
} catch { /* stash pop conflict is non-fatal */ }
|
|
1675
1502
|
}
|
|
1676
|
-
restoreShelter();
|
|
1677
1503
|
throw new MergeConflictError(
|
|
1678
1504
|
codeConflicts,
|
|
1679
1505
|
"squash",
|
|
@@ -1689,18 +1515,14 @@ export function mergeMilestoneToMain(
|
|
|
1689
1515
|
const commitResult = nativeCommit(originalBasePath_, commitMessage);
|
|
1690
1516
|
const nothingToCommit = commitResult === null;
|
|
1691
1517
|
|
|
1692
|
-
// 9a. Clean up
|
|
1518
|
+
// 9a. Clean up SQUASH_MSG left by git merge --squash (#1853).
|
|
1693
1519
|
// git only removes SQUASH_MSG when the commit reads it directly (plain
|
|
1694
1520
|
// `git commit`). nativeCommit uses `-F -` (stdin) or libgit2, neither
|
|
1695
|
-
// of which trigger git's SQUASH_MSG cleanup.
|
|
1696
|
-
//
|
|
1697
|
-
// If left on disk, doctor reports `corrupt_merge_state` on every subsequent run.
|
|
1521
|
+
// of which trigger git's SQUASH_MSG cleanup. If left on disk, doctor
|
|
1522
|
+
// reports `corrupt_merge_state` on every subsequent run.
|
|
1698
1523
|
try {
|
|
1699
|
-
const
|
|
1700
|
-
|
|
1701
|
-
const p = join(gitDir_, f);
|
|
1702
|
-
if (existsSync(p)) unlinkSync(p);
|
|
1703
|
-
}
|
|
1524
|
+
const squashMsgPath = join(resolveGitDir(originalBasePath_), "SQUASH_MSG");
|
|
1525
|
+
if (existsSync(squashMsgPath)) unlinkSync(squashMsgPath);
|
|
1704
1526
|
} catch { /* best-effort */ }
|
|
1705
1527
|
|
|
1706
1528
|
// 9a-ii. Restore stashed files now that the merge+commit is complete (#2151).
|
|
@@ -1759,9 +1581,6 @@ export function mergeMilestoneToMain(
|
|
|
1759
1581
|
}
|
|
1760
1582
|
}
|
|
1761
1583
|
|
|
1762
|
-
// 9a-iii. Restore sheltered queued milestone directories (#2505).
|
|
1763
|
-
restoreShelter();
|
|
1764
|
-
|
|
1765
1584
|
// 9b. Safety check (#1792): if nothing was committed, verify the milestone
|
|
1766
1585
|
// work is already on the integration branch before allowing teardown.
|
|
1767
1586
|
// Compare only non-.gsd/ paths — .gsd/ state files diverge normally and
|
|
@@ -68,28 +68,6 @@ export async function handleAgentEnd(
|
|
|
68
68
|
|
|
69
69
|
const lastMsg = event.messages[event.messages.length - 1];
|
|
70
70
|
if (lastMsg && "stopReason" in lastMsg && lastMsg.stopReason === "aborted") {
|
|
71
|
-
// Empty content with aborted stopReason is a non-fatal agent stop (the LLM
|
|
72
|
-
// chose to end without producing output). Only pause on genuine fatal aborts
|
|
73
|
-
// that carry error context — e.g. errorMessage field or non-empty content
|
|
74
|
-
// indicating a mid-stream failure. (#2695)
|
|
75
|
-
const content = "content" in lastMsg ? lastMsg.content : undefined;
|
|
76
|
-
const hasEmptyContent = Array.isArray(content) && content.length === 0;
|
|
77
|
-
const hasErrorMessage = "errorMessage" in lastMsg && !!lastMsg.errorMessage;
|
|
78
|
-
|
|
79
|
-
if (hasEmptyContent && !hasErrorMessage) {
|
|
80
|
-
// Non-fatal: treat as a normal agent end so the loop can continue
|
|
81
|
-
// instead of entering a stuck re-dispatch cycle.
|
|
82
|
-
try {
|
|
83
|
-
resetRetryState(retryState);
|
|
84
|
-
resolveAgentEnd(event);
|
|
85
|
-
} catch (err) {
|
|
86
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
87
|
-
ctx.ui.notify(`Auto-mode error after empty-content abort: ${message}. Stopping auto-mode.`, "error");
|
|
88
|
-
try { await pauseAuto(ctx, pi); } catch { /* best-effort */ }
|
|
89
|
-
}
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
71
|
await pauseAuto(ctx, pi);
|
|
94
72
|
return;
|
|
95
73
|
}
|
|
@@ -101,15 +79,6 @@ export async function handleAgentEnd(
|
|
|
101
79
|
// ── 1. Classify ──────────────────────────────────────────────────────
|
|
102
80
|
const cls = classifyError(errorMsg, explicitRetryAfterMs);
|
|
103
81
|
|
|
104
|
-
// Cap rate-limit backoff for CLI-style providers (openai-codex, google-gemini-cli)
|
|
105
|
-
// which use per-user quotas with shorter windows (#2922).
|
|
106
|
-
if (cls.kind === "rate-limit") {
|
|
107
|
-
const currentProvider = ctx.model?.provider;
|
|
108
|
-
if (currentProvider === "openai-codex" || currentProvider === "google-gemini-cli") {
|
|
109
|
-
cls.retryAfterMs = Math.min(cls.retryAfterMs, 30_000);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
82
|
// ── 2. Decide & Act ──────────────────────────────────────────────────
|
|
114
83
|
|
|
115
84
|
// --- Network errors: same-model retry with backoff ---
|
|
@@ -121,6 +121,14 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
121
121
|
};
|
|
122
122
|
}
|
|
123
123
|
try {
|
|
124
|
+
const db = await import("../gsd-db.js");
|
|
125
|
+
const existing = db.getRequirementById(params.id);
|
|
126
|
+
if (!existing) {
|
|
127
|
+
return {
|
|
128
|
+
content: [{ type: "text" as const, text: `Error: Requirement ${params.id} not found.` }],
|
|
129
|
+
details: { operation: "update_requirement", id: params.id, error: "not_found" } as any,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
124
132
|
const { updateRequirementInDb } = await import("../db-writer.js");
|
|
125
133
|
const updates: Record<string, string | undefined> = {};
|
|
126
134
|
if (params.status !== undefined) updates.status = params.status;
|
|
@@ -188,91 +196,6 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
188
196
|
pi.registerTool(requirementUpdateTool);
|
|
189
197
|
registerAlias(pi, requirementUpdateTool, "gsd_update_requirement", "gsd_requirement_update");
|
|
190
198
|
|
|
191
|
-
// ─── gsd_requirement_save ─────────────────────────────────────────────
|
|
192
|
-
|
|
193
|
-
const requirementSaveExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
194
|
-
const dbAvailable = await ensureDbOpen();
|
|
195
|
-
if (!dbAvailable) {
|
|
196
|
-
return {
|
|
197
|
-
content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot save requirement." }],
|
|
198
|
-
details: { operation: "save_requirement", error: "db_unavailable" } as any,
|
|
199
|
-
};
|
|
200
|
-
}
|
|
201
|
-
try {
|
|
202
|
-
const { saveRequirementToDb } = await import("../db-writer.js");
|
|
203
|
-
const result = await saveRequirementToDb(
|
|
204
|
-
{
|
|
205
|
-
class: params.class,
|
|
206
|
-
status: params.status,
|
|
207
|
-
description: params.description,
|
|
208
|
-
why: params.why,
|
|
209
|
-
source: params.source,
|
|
210
|
-
primary_owner: params.primary_owner,
|
|
211
|
-
supporting_slices: params.supporting_slices,
|
|
212
|
-
validation: params.validation,
|
|
213
|
-
notes: params.notes,
|
|
214
|
-
},
|
|
215
|
-
process.cwd(),
|
|
216
|
-
);
|
|
217
|
-
return {
|
|
218
|
-
content: [{ type: "text" as const, text: `Saved requirement ${result.id}` }],
|
|
219
|
-
details: { operation: "save_requirement", id: result.id } as any,
|
|
220
|
-
};
|
|
221
|
-
} catch (err) {
|
|
222
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
223
|
-
logError("tool", `gsd_requirement_save tool failed: ${msg}`, { tool: "gsd_requirement_save", error: String(err) });
|
|
224
|
-
return {
|
|
225
|
-
content: [{ type: "text" as const, text: `Error saving requirement: ${msg}` }],
|
|
226
|
-
details: { operation: "save_requirement", error: msg } as any,
|
|
227
|
-
};
|
|
228
|
-
}
|
|
229
|
-
};
|
|
230
|
-
|
|
231
|
-
const requirementSaveTool = {
|
|
232
|
-
name: "gsd_requirement_save",
|
|
233
|
-
label: "Save Requirement",
|
|
234
|
-
description:
|
|
235
|
-
"Record a new requirement to the GSD database and regenerate REQUIREMENTS.md. " +
|
|
236
|
-
"Requirement IDs are auto-assigned — never provide an ID manually.",
|
|
237
|
-
promptSnippet: "Record a new GSD requirement to the database (auto-assigns ID, regenerates REQUIREMENTS.md)",
|
|
238
|
-
promptGuidelines: [
|
|
239
|
-
"Use gsd_requirement_save when recording a new functional, non-functional, or operational requirement.",
|
|
240
|
-
"Requirement IDs are auto-assigned (R001, R002, ...) — never guess or provide an ID.",
|
|
241
|
-
"class, description, why, and source are required. All other fields are optional.",
|
|
242
|
-
"The tool writes to the DB and regenerates .gsd/REQUIREMENTS.md automatically.",
|
|
243
|
-
],
|
|
244
|
-
parameters: Type.Object({
|
|
245
|
-
class: Type.String({ description: "Requirement class (e.g. 'functional', 'non-functional', 'operational')" }),
|
|
246
|
-
description: Type.String({ description: "Short description of the requirement" }),
|
|
247
|
-
why: Type.String({ description: "Why this requirement matters" }),
|
|
248
|
-
source: Type.String({ description: "Origin of the requirement (e.g. 'user-research', 'design', 'M001')" }),
|
|
249
|
-
status: Type.Optional(Type.String({ description: "Status (default: 'active')" })),
|
|
250
|
-
primary_owner: Type.Optional(Type.String({ description: "Primary owning slice" })),
|
|
251
|
-
supporting_slices: Type.Optional(Type.String({ description: "Supporting slices" })),
|
|
252
|
-
validation: Type.Optional(Type.String({ description: "Validation criteria" })),
|
|
253
|
-
notes: Type.Optional(Type.String({ description: "Additional notes" })),
|
|
254
|
-
}),
|
|
255
|
-
execute: requirementSaveExecute,
|
|
256
|
-
renderCall(args: any, theme: any) {
|
|
257
|
-
let text = theme.fg("toolTitle", theme.bold("requirement_save "));
|
|
258
|
-
if (args.class) text += theme.fg("accent", `[${args.class}] `);
|
|
259
|
-
if (args.description) text += theme.fg("muted", args.description);
|
|
260
|
-
return new Text(text, 0, 0);
|
|
261
|
-
},
|
|
262
|
-
renderResult(result: any, _options: any, theme: any) {
|
|
263
|
-
const d = result.details;
|
|
264
|
-
if (result.isError || d?.error) {
|
|
265
|
-
return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
|
|
266
|
-
}
|
|
267
|
-
let text = theme.fg("success", `Requirement ${d?.id ?? ""} saved`);
|
|
268
|
-
text += theme.fg("dim", ` → REQUIREMENTS.md`);
|
|
269
|
-
return new Text(text, 0, 0);
|
|
270
|
-
},
|
|
271
|
-
};
|
|
272
|
-
|
|
273
|
-
pi.registerTool(requirementSaveTool);
|
|
274
|
-
registerAlias(pi, requirementSaveTool, "gsd_save_requirement", "gsd_requirement_save");
|
|
275
|
-
|
|
276
199
|
// ─── gsd_summary_save (formerly gsd_save_summary) ──────────────────────
|
|
277
200
|
|
|
278
201
|
const summarySaveExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
@@ -32,31 +32,6 @@ export function resolveProjectRootDbPath(basePath: string): string {
|
|
|
32
32
|
return join(projectRoot, ".gsd", "gsd.db");
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
// Symlink-resolved layout: /.gsd/projects/<hash>/worktrees/M001/...
|
|
36
|
-
// The project root is everything before /.gsd/projects/ (#2517)
|
|
37
|
-
const symlinkMarker = `${sep}.gsd${sep}projects${sep}`;
|
|
38
|
-
const symlinkIdx = basePath.indexOf(symlinkMarker);
|
|
39
|
-
if (symlinkIdx !== -1) {
|
|
40
|
-
const afterProjects = basePath.slice(symlinkIdx + symlinkMarker.length);
|
|
41
|
-
// Expect: <hash>/worktrees/...
|
|
42
|
-
const worktreeSeg = `${sep}worktrees${sep}`;
|
|
43
|
-
if (afterProjects.includes(worktreeSeg)) {
|
|
44
|
-
const projectRoot = basePath.slice(0, symlinkIdx);
|
|
45
|
-
return join(projectRoot, ".gsd", "gsd.db");
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Forward-slash variant for symlink-resolved layout
|
|
50
|
-
const fwdSymlinkMarker = "/.gsd/projects/";
|
|
51
|
-
const fwdSymlinkIdx = basePath.indexOf(fwdSymlinkMarker);
|
|
52
|
-
if (fwdSymlinkIdx !== -1) {
|
|
53
|
-
const afterProjects = basePath.slice(fwdSymlinkIdx + fwdSymlinkMarker.length);
|
|
54
|
-
if (afterProjects.includes("/worktrees/")) {
|
|
55
|
-
const projectRoot = basePath.slice(0, fwdSymlinkIdx);
|
|
56
|
-
return join(projectRoot, ".gsd", "gsd.db");
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
35
|
return join(basePath, ".gsd", "gsd.db");
|
|
61
36
|
}
|
|
62
37
|
|
|
@@ -106,20 +81,8 @@ export async function ensureDbOpen(): Promise<boolean> {
|
|
|
106
81
|
return opened;
|
|
107
82
|
}
|
|
108
83
|
|
|
109
|
-
process.stderr.write(
|
|
110
|
-
`gsd-db: ensureDbOpen failed — no .gsd directory found (resolvedPath=${resolveProjectRootDbPath(basePath)}, cwd=${basePath})\n`,
|
|
111
|
-
);
|
|
112
84
|
return false;
|
|
113
|
-
} catch
|
|
114
|
-
const basePath = process.cwd();
|
|
115
|
-
const diagnostic = {
|
|
116
|
-
resolvedPath: resolveProjectRootDbPath(basePath),
|
|
117
|
-
cwd: basePath,
|
|
118
|
-
error: (err as Error).message ?? String(err),
|
|
119
|
-
};
|
|
120
|
-
process.stderr.write(
|
|
121
|
-
`gsd-db: ensureDbOpen failed — ${JSON.stringify(diagnostic)}\n`,
|
|
122
|
-
);
|
|
85
|
+
} catch {
|
|
123
86
|
return false;
|
|
124
87
|
}
|
|
125
88
|
}
|