gsd-pi 2.58.0-dev.778d6ac → 2.58.0-dev.d63175c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/cli.js +35 -49
- package/dist/headless-ui.d.ts +0 -17
- package/dist/headless-ui.js +3 -97
- package/dist/headless.js +6 -67
- package/dist/help-text.js +0 -1
- package/dist/onboarding.js +0 -44
- package/dist/resource-loader.js +1 -16
- package/dist/resources/agents/researcher.md +1 -1
- package/dist/resources/extensions/ask-user-questions.js +3 -16
- package/dist/resources/extensions/async-jobs/extension-manifest.json +1 -1
- package/dist/resources/extensions/bg-shell/extension-manifest.json +1 -1
- package/dist/resources/extensions/browser-tools/extension-manifest.json +1 -1
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +6 -14
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +36 -59
- package/dist/resources/extensions/context7/extension-manifest.json +1 -1
- package/dist/resources/extensions/get-secrets-from-user.js +5 -8
- package/dist/resources/extensions/google-search/extension-manifest.json +1 -1
- package/dist/resources/extensions/google-search/index.js +1 -2
- package/dist/resources/extensions/gsd/auto/phases.js +21 -25
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +2 -2
- package/dist/resources/extensions/gsd/auto-dashboard.js +20 -37
- package/dist/resources/extensions/gsd/auto-dispatch.js +2 -17
- package/dist/resources/extensions/gsd/auto-model-selection.js +3 -26
- package/dist/resources/extensions/gsd/auto-post-unit.js +4 -16
- package/dist/resources/extensions/gsd/auto-prompts.js +1 -1
- package/dist/resources/extensions/gsd/auto-recovery.js +5 -13
- package/dist/resources/extensions/gsd/auto-start.js +22 -35
- package/dist/resources/extensions/gsd/auto-worktree.js +12 -196
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +0 -32
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +8 -80
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -32
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +18 -33
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -44
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +0 -67
- package/dist/resources/extensions/gsd/captures.js +4 -56
- package/dist/resources/extensions/gsd/db-writer.js +8 -116
- package/dist/resources/extensions/gsd/doctor-git-checks.js +0 -28
- package/dist/resources/extensions/gsd/doctor-providers.js +1 -2
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +4 -5
- package/dist/resources/extensions/gsd/doctor.js +1 -3
- package/dist/resources/extensions/gsd/error-classifier.js +10 -13
- package/dist/resources/extensions/gsd/extension-manifest.json +1 -16
- package/dist/resources/extensions/gsd/forensics.js +20 -123
- package/dist/resources/extensions/gsd/git-service.js +1 -23
- package/dist/resources/extensions/gsd/gitignore.js +0 -33
- package/dist/resources/extensions/gsd/gsd-db.js +9 -36
- package/dist/resources/extensions/gsd/guided-flow.js +44 -106
- package/dist/resources/extensions/gsd/health-widget-core.js +0 -31
- package/dist/resources/extensions/gsd/health-widget.js +0 -17
- package/dist/resources/extensions/gsd/index.js +1 -1
- package/dist/resources/extensions/gsd/memory-extractor.js +0 -7
- package/dist/resources/extensions/gsd/migrate-external.js +1 -8
- package/dist/resources/extensions/gsd/model-cost-table.js +0 -18
- package/dist/resources/extensions/gsd/model-router.js +1 -35
- package/dist/resources/extensions/gsd/native-git-bridge.js +0 -17
- package/dist/resources/extensions/gsd/notifications.js +1 -16
- package/dist/resources/extensions/gsd/parallel-eligibility.js +2 -13
- package/dist/resources/extensions/gsd/parallel-merge.js +5 -78
- package/dist/resources/extensions/gsd/parsers-legacy.js +3 -20
- package/dist/resources/extensions/gsd/paths.js +0 -43
- package/dist/resources/extensions/gsd/preferences-models.js +1 -14
- package/dist/resources/extensions/gsd/preferences-types.js +1 -2
- package/dist/resources/extensions/gsd/preferences.js +16 -13
- package/dist/resources/extensions/gsd/prompt-loader.js +1 -4
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -4
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
- package/dist/resources/extensions/gsd/prompts/discuss.md +1 -1
- package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -3
- package/dist/resources/extensions/gsd/prompts/forensics.md +2 -2
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +0 -2
- package/dist/resources/extensions/gsd/prompts/rethink.md +1 -1
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +0 -1
- package/dist/resources/extensions/gsd/repo-identity.js +11 -205
- package/dist/resources/extensions/gsd/rethink.js +0 -5
- package/dist/resources/extensions/gsd/roadmap-slices.js +4 -5
- package/dist/resources/extensions/gsd/state.js +27 -85
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +1 -20
- package/dist/resources/extensions/gsd/tools/complete-task.js +71 -34
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +2 -12
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +1 -29
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +3 -14
- package/dist/resources/extensions/gsd/triage-resolution.js +7 -22
- package/dist/resources/extensions/gsd/undo.js +2 -2
- package/dist/resources/extensions/gsd/unit-ownership.js +33 -164
- package/dist/resources/extensions/gsd/verdict-parser.js +8 -20
- package/dist/resources/extensions/gsd/workflow-manifest.js +5 -24
- package/dist/resources/extensions/gsd/workflow-projections.js +63 -95
- package/dist/resources/extensions/gsd/workflow-reconcile.js +5 -35
- package/dist/resources/extensions/gsd/workspace-index.js +0 -24
- package/dist/resources/extensions/gsd/worktree-manager.js +1 -105
- package/dist/resources/extensions/gsd/worktree-resolver.js +3 -20
- package/dist/resources/extensions/mcp-client/index.js +7 -11
- package/dist/resources/extensions/search-the-web/extension-manifest.json +1 -1
- package/dist/resources/extensions/shared/interview-ui.js +1 -11
- package/dist/resources/skills/create-gsd-extension/SKILL.md +3 -5
- package/dist/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +4 -5
- package/dist/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
- package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
- package/dist/resources/skills/create-gsd-extension/workflows/debug-extension.md +3 -5
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -17
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- package/dist/web/standalone/.next/required-server-files.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -17
- package/dist/web/standalone/.next/server/chunks/2229.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/6502.8b732f67a11b11b4.js +9 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-a1c1e452c6b32d04.js → webpack-61d3afac6d0f0ce7.js} +1 -1
- package/dist/web/standalone/.next/static/css/a58ef8a151aa0493.css +1 -0
- package/dist/web/standalone/server.js +1 -1
- package/dist/web-mode.js +1 -2
- package/package.json +2 -2
- package/packages/native/dist/ast/index.js +5 -9
- package/packages/native/dist/ast/types.js +1 -2
- package/packages/native/dist/clipboard/index.js +7 -12
- package/packages/native/dist/clipboard/types.js +1 -2
- package/packages/native/dist/diff/index.js +7 -12
- package/packages/native/dist/diff/types.js +1 -2
- package/packages/native/dist/fd/index.js +3 -6
- package/packages/native/dist/fd/types.js +1 -2
- package/packages/native/dist/glob/index.js +5 -9
- package/packages/native/dist/glob/types.js +1 -2
- package/packages/native/dist/grep/index.js +5 -9
- package/packages/native/dist/grep/types.js +1 -2
- package/packages/native/dist/gsd-parser/index.js +11 -18
- package/packages/native/dist/gsd-parser/types.js +1 -2
- package/packages/native/dist/highlight/index.js +7 -12
- package/packages/native/dist/highlight/types.js +1 -2
- package/packages/native/dist/html/index.js +3 -6
- package/packages/native/dist/html/types.js +1 -2
- package/packages/native/dist/image/index.js +5 -10
- package/packages/native/dist/image/types.js +4 -7
- package/packages/native/dist/index.js +17 -70
- package/packages/native/dist/json-parse/index.js +8 -13
- package/packages/native/dist/native.js +10 -47
- package/packages/native/dist/ps/index.js +9 -15
- package/packages/native/dist/ps/types.js +1 -2
- package/packages/native/dist/stream-process/index.js +7 -12
- package/packages/native/dist/text/index.js +14 -24
- package/packages/native/dist/text/types.js +2 -5
- package/packages/native/dist/truncate/index.js +7 -12
- package/packages/native/dist/ttsr/index.js +7 -12
- package/packages/native/dist/ttsr/types.js +1 -2
- package/packages/native/dist/xxhash/index.js +5 -9
- package/packages/native/package.json +19 -19
- package/packages/native/src/native.ts +8 -9
- package/packages/pi-agent-core/dist/agent-loop.js +2 -3
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/proxy.d.ts +1 -1
- package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/proxy.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.ts +2 -3
- package/packages/pi-agent-core/src/proxy.ts +1 -1
- package/packages/pi-ai/dist/env-api-keys.js +0 -1
- package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
- package/packages/pi-ai/dist/index.d.ts +0 -1
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +0 -1
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +2 -19
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +3 -3
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/dist/utils/json-parse.d.ts +0 -3
- package/packages/pi-ai/dist/utils/json-parse.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/json-parse.js +1 -24
- package/packages/pi-ai/dist/utils/json-parse.js.map +1 -1
- package/packages/pi-ai/src/env-api-keys.ts +0 -1
- package/packages/pi-ai/src/index.ts +0 -1
- package/packages/pi-ai/src/providers/anthropic-shared.ts +2 -17
- package/packages/pi-ai/src/types.ts +2 -3
- package/packages/pi-ai/src/utils/json-parse.ts +1 -28
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +0 -4
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +0 -31
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +1 -17
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +2 -62
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/exec.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/exec.js +1 -3
- package/packages/pi-coding-agent/dist/core/exec.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +0 -4
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js +0 -2
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +0 -5
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +0 -5
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/index.js +1 -1
- package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/index.js +0 -3
- package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +0 -3
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/messages.js +2 -31
- package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +0 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +0 -10
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +1 -12
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +0 -6
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +1 -48
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -10
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js +4 -13
- package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +2 -2
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +0 -4
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts +0 -1
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js +0 -5
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +1 -38
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +1 -94
- package/packages/pi-coding-agent/src/core/exec.ts +1 -3
- package/packages/pi-coding-agent/src/core/extensions/index.ts +0 -4
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +0 -5
- package/packages/pi-coding-agent/src/core/index.ts +0 -6
- package/packages/pi-coding-agent/src/core/lsp/index.ts +0 -3
- package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +0 -3
- package/packages/pi-coding-agent/src/core/messages.ts +2 -29
- package/packages/pi-coding-agent/src/core/model-resolver.ts +0 -1
- package/packages/pi-coding-agent/src/core/resource-loader.ts +1 -20
- package/packages/pi-coding-agent/src/core/retry-handler.ts +1 -52
- package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +3 -11
- package/packages/pi-coding-agent/src/core/tools/read.ts +4 -14
- package/packages/pi-coding-agent/src/index.ts +0 -6
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +0 -7
- package/packages/pi-coding-agent/src/modes/rpc/remote-terminal.ts +0 -6
- package/packages/pi-tui/dist/terminal.d.ts +0 -2
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +0 -9
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +0 -9
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/src/terminal.ts +0 -14
- package/packages/pi-tui/src/tui.ts +0 -8
- package/scripts/ensure-workspace-builds.cjs +14 -45
- package/src/resources/agents/researcher.md +1 -1
- package/src/resources/extensions/ask-user-questions.ts +3 -21
- package/src/resources/extensions/async-jobs/extension-manifest.json +1 -1
- package/src/resources/extensions/bg-shell/extension-manifest.json +1 -1
- package/src/resources/extensions/browser-tools/extension-manifest.json +1 -1
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +6 -13
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +35 -63
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +0 -28
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +1 -108
- package/src/resources/extensions/context7/extension-manifest.json +1 -1
- package/src/resources/extensions/get-secrets-from-user.ts +5 -8
- package/src/resources/extensions/google-search/extension-manifest.json +1 -1
- package/src/resources/extensions/google-search/index.ts +1 -2
- package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -1
- package/src/resources/extensions/gsd/auto/phases.ts +34 -43
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
- package/src/resources/extensions/gsd/auto-dashboard.ts +19 -37
- package/src/resources/extensions/gsd/auto-dispatch.ts +2 -18
- package/src/resources/extensions/gsd/auto-model-selection.ts +5 -26
- package/src/resources/extensions/gsd/auto-post-unit.ts +4 -18
- package/src/resources/extensions/gsd/auto-prompts.ts +1 -1
- package/src/resources/extensions/gsd/auto-recovery.ts +5 -12
- package/src/resources/extensions/gsd/auto-start.ts +26 -35
- package/src/resources/extensions/gsd/auto-worktree.ts +9 -190
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +0 -31
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +8 -85
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -38
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +19 -31
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -50
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +0 -75
- package/src/resources/extensions/gsd/captures.ts +3 -63
- package/src/resources/extensions/gsd/db-writer.ts +7 -140
- package/src/resources/extensions/gsd/doctor-git-checks.ts +0 -26
- package/src/resources/extensions/gsd/doctor-providers.ts +1 -2
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +4 -5
- package/src/resources/extensions/gsd/doctor.ts +1 -3
- package/src/resources/extensions/gsd/error-classifier.ts +11 -14
- package/src/resources/extensions/gsd/extension-manifest.json +1 -16
- package/src/resources/extensions/gsd/forensics.ts +20 -144
- package/src/resources/extensions/gsd/git-service.ts +3 -26
- package/src/resources/extensions/gsd/gitignore.ts +0 -33
- package/src/resources/extensions/gsd/gsd-db.ts +7 -43
- package/src/resources/extensions/gsd/guided-flow.ts +45 -114
- package/src/resources/extensions/gsd/health-widget-core.ts +0 -34
- package/src/resources/extensions/gsd/health-widget.ts +0 -17
- package/src/resources/extensions/gsd/index.ts +0 -1
- package/src/resources/extensions/gsd/memory-extractor.ts +0 -8
- package/src/resources/extensions/gsd/migrate-external.ts +1 -9
- package/src/resources/extensions/gsd/model-cost-table.ts +0 -19
- package/src/resources/extensions/gsd/model-router.ts +1 -35
- package/src/resources/extensions/gsd/native-git-bridge.ts +0 -17
- package/src/resources/extensions/gsd/notifications.ts +0 -16
- package/src/resources/extensions/gsd/parallel-eligibility.ts +2 -15
- package/src/resources/extensions/gsd/parallel-merge.ts +4 -87
- package/src/resources/extensions/gsd/parsers-legacy.ts +3 -22
- package/src/resources/extensions/gsd/paths.ts +0 -42
- package/src/resources/extensions/gsd/preferences-models.ts +1 -14
- package/src/resources/extensions/gsd/preferences-types.ts +1 -2
- package/src/resources/extensions/gsd/preferences.ts +15 -13
- package/src/resources/extensions/gsd/prompt-loader.ts +1 -4
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -4
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
- package/src/resources/extensions/gsd/prompts/discuss.md +1 -1
- package/src/resources/extensions/gsd/prompts/execute-task.md +1 -3
- package/src/resources/extensions/gsd/prompts/forensics.md +2 -2
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +0 -2
- package/src/resources/extensions/gsd/prompts/rethink.md +1 -1
- package/src/resources/extensions/gsd/prompts/triage-captures.md +0 -1
- package/src/resources/extensions/gsd/repo-identity.ts +11 -186
- package/src/resources/extensions/gsd/rethink.ts +0 -6
- package/src/resources/extensions/gsd/roadmap-slices.ts +4 -5
- package/src/resources/extensions/gsd/state.ts +32 -84
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +0 -29
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +1 -71
- package/src/resources/extensions/gsd/tests/captures.test.ts +0 -103
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +0 -27
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +0 -21
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +12 -7
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +5 -78
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +0 -29
- package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +0 -40
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +1 -20
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +0 -117
- package/src/resources/extensions/gsd/tests/empty-db-reconciliation.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -31
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +12 -125
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +0 -67
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +1 -111
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +0 -101
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +0 -59
- package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +0 -110
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +2 -85
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +0 -34
- package/src/resources/extensions/gsd/tests/model-router.test.ts +3 -68
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +0 -28
- package/src/resources/extensions/gsd/tests/notifications.test.ts +0 -45
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +1 -33
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +0 -29
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +0 -38
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +0 -117
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +0 -97
- package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +0 -134
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +1 -2
- package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +0 -8
- package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +17 -100
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +1 -4
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +0 -48
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +0 -92
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +1 -48
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +5 -29
- package/src/resources/extensions/gsd/tools/complete-task.ts +74 -36
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +1 -13
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +0 -36
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +2 -20
- package/src/resources/extensions/gsd/triage-resolution.ts +6 -23
- package/src/resources/extensions/gsd/types.ts +2 -4
- package/src/resources/extensions/gsd/undo.ts +2 -2
- package/src/resources/extensions/gsd/unit-ownership.ts +35 -206
- package/src/resources/extensions/gsd/verdict-parser.ts +6 -21
- package/src/resources/extensions/gsd/workflow-logger.ts +1 -3
- package/src/resources/extensions/gsd/workflow-manifest.ts +5 -22
- package/src/resources/extensions/gsd/workflow-projections.ts +64 -97
- package/src/resources/extensions/gsd/workflow-reconcile.ts +10 -39
- package/src/resources/extensions/gsd/workspace-index.ts +0 -30
- package/src/resources/extensions/gsd/worktree-manager.ts +1 -120
- package/src/resources/extensions/gsd/worktree-resolver.ts +3 -22
- package/src/resources/extensions/mcp-client/index.ts +7 -13
- package/src/resources/extensions/search-the-web/extension-manifest.json +1 -1
- package/src/resources/extensions/shared/interview-ui.ts +1 -12
- package/src/resources/skills/create-gsd-extension/SKILL.md +3 -5
- package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +4 -5
- package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
- package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
- package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +3 -5
- package/dist/resources/extensions/gsd/milestone-validation-gates.js +0 -45
- package/dist/resources/extensions/ollama/index.js +0 -112
- package/dist/resources/extensions/ollama/model-capabilities.js +0 -115
- package/dist/resources/extensions/ollama/ollama-client.js +0 -168
- package/dist/resources/extensions/ollama/ollama-commands.js +0 -194
- package/dist/resources/extensions/ollama/ollama-discovery.js +0 -69
- package/dist/resources/extensions/ollama/ollama-tool.js +0 -184
- package/dist/resources/extensions/ollama/types.js +0 -2
- package/dist/startup-model-validation.d.ts +0 -39
- package/dist/startup-model-validation.js +0 -50
- package/dist/web/standalone/.next/static/chunks/6502.7593d7797a4b3999.js +0 -9
- package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +0 -1
- package/packages/native/src/__tests__/module-compat.test.mjs +0 -91
- package/packages/pi-agent-core/src/agent-loop.test.ts +0 -45
- package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts +0 -2
- package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts.map +0 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js +0 -25
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +0 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.d.ts +0 -37
- package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +0 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.js +0 -75
- package/packages/pi-ai/dist/utils/repair-tool-json.js.map +0 -1
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts +0 -2
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts.map +0 -1
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +0 -73
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +0 -1
- package/packages/pi-ai/src/providers/anthropic-shared.test.ts +0 -29
- package/packages/pi-ai/src/utils/repair-tool-json.ts +0 -88
- package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +0 -102
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts +0 -6
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +0 -176
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts +0 -28
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js +0 -37
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js +0 -63
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts +0 -19
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js +0 -115
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js +0 -109
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts +0 -44
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js +0 -97
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js +0 -181
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/messages.test.d.ts +0 -9
- package/packages/pi-coding-agent/dist/core/messages.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/messages.test.js +0 -86
- package/packages/pi-coding-agent/dist/core/messages.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts +0 -9
- package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js +0 -193
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts +0 -16
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +0 -80
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +0 -1
- package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +0 -236
- package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +0 -77
- package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +0 -62
- package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +0 -134
- package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +0 -137
- package/packages/pi-coding-agent/src/core/image-overflow-recovery.test.ts +0 -228
- package/packages/pi-coding-agent/src/core/image-overflow-recovery.ts +0 -118
- package/packages/pi-coding-agent/src/core/messages.test.ts +0 -114
- package/packages/pi-coding-agent/src/core/retry-handler.test.ts +0 -255
- package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +0 -92
- package/src/resources/extensions/gsd/milestone-validation-gates.ts +0 -56
- package/src/resources/extensions/gsd/tests/auto-mode-interactive-guard.test.ts +0 -71
- package/src/resources/extensions/gsd/tests/cli-provider-rate-limit.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/completion-hierarchy-guards.test.ts +0 -192
- package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +0 -131
- package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +0 -127
- package/src/resources/extensions/gsd/tests/dynamic-routing-default.test.ts +0 -20
- package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +0 -74
- package/src/resources/extensions/gsd/tests/event-replay-idempotency.test.ts +0 -140
- package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -129
- package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
- package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +0 -164
- package/src/resources/extensions/gsd/tests/guided-flow-dynamic-routing.test.ts +0 -135
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +0 -97
- package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +0 -107
- package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +0 -243
- package/src/resources/extensions/gsd/tests/integration/gitignore-staging-2570.test.ts +0 -150
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +0 -959
- package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +0 -105
- package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +0 -116
- package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +0 -159
- package/src/resources/extensions/gsd/tests/parallel-eligibility-ghost.test.ts +0 -150
- package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +0 -70
- package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +0 -297
- package/src/resources/extensions/gsd/tests/prompt-loader-replacement.test.ts +0 -178
- package/src/resources/extensions/gsd/tests/prompt-tool-names.test.ts +0 -69
- package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +0 -157
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +0 -90
- package/src/resources/extensions/gsd/tests/reconciliation-edge-cases.test.ts +0 -162
- package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +0 -233
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +0 -305
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +0 -405
- package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +0 -257
- package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +0 -1628
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +0 -106
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +0 -174
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +0 -221
- package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +0 -289
- package/src/resources/extensions/gsd/tests/vacuum-recovery.test.ts +0 -154
- package/src/resources/extensions/gsd/tests/verdict-parser.test.ts +0 -156
- package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +0 -82
- package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +0 -140
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +0 -101
- package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +0 -95
- package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +0 -55
- package/src/resources/extensions/ollama/index.ts +0 -130
- package/src/resources/extensions/ollama/model-capabilities.ts +0 -145
- package/src/resources/extensions/ollama/ollama-client.ts +0 -196
- package/src/resources/extensions/ollama/ollama-commands.ts +0 -248
- package/src/resources/extensions/ollama/ollama-discovery.ts +0 -106
- package/src/resources/extensions/ollama/ollama-tool.ts +0 -218
- package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +0 -162
- package/src/resources/extensions/ollama/tests/ollama-client.test.ts +0 -38
- package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +0 -28
- package/src/resources/extensions/ollama/types.ts +0 -130
- package/src/resources/extensions/shared/tests/ask-user-freetext.test.ts +0 -156
- /package/dist/web/standalone/.next/static/{R0D4xaIPl5kg93edN7Oo0 → 5DLsjFHdSB6_a1EDQVjr7}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{R0D4xaIPl5kg93edN7Oo0 → 5DLsjFHdSB6_a1EDQVjr7}/_ssgManifest.js +0 -0
|
@@ -8,7 +8,6 @@ import { createRequire } from "node:module";
|
|
|
8
8
|
import { existsSync, copyFileSync, mkdirSync, realpathSync } from "node:fs";
|
|
9
9
|
import { dirname } from "node:path";
|
|
10
10
|
import { GSDError, GSD_STALE_STATE } from "./errors.js";
|
|
11
|
-
import { logError } from "./workflow-logger.js";
|
|
12
11
|
const _require = createRequire(import.meta.url);
|
|
13
12
|
let providerName = null;
|
|
14
13
|
let providerModule = null;
|
|
@@ -698,29 +697,11 @@ export function openDatabase(path) {
|
|
|
698
697
|
initSchema(adapter, fileBacked);
|
|
699
698
|
}
|
|
700
699
|
catch (err) {
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
if (fileBacked && err instanceof Error && err.message?.includes("malformed")) {
|
|
704
|
-
try {
|
|
705
|
-
adapter.exec("VACUUM");
|
|
706
|
-
initSchema(adapter, fileBacked);
|
|
707
|
-
process.stderr.write("gsd-db: recovered corrupt database via VACUUM\n");
|
|
708
|
-
}
|
|
709
|
-
catch (retryErr) {
|
|
710
|
-
try {
|
|
711
|
-
adapter.close();
|
|
712
|
-
}
|
|
713
|
-
catch { /* swallow */ }
|
|
714
|
-
throw retryErr;
|
|
715
|
-
}
|
|
716
|
-
}
|
|
717
|
-
else {
|
|
718
|
-
try {
|
|
719
|
-
adapter.close();
|
|
720
|
-
}
|
|
721
|
-
catch { /* swallow */ }
|
|
722
|
-
throw err;
|
|
700
|
+
try {
|
|
701
|
+
adapter.close();
|
|
723
702
|
}
|
|
703
|
+
catch { /* swallow */ }
|
|
704
|
+
throw err;
|
|
724
705
|
}
|
|
725
706
|
currentDb = adapter;
|
|
726
707
|
currentPath = path;
|
|
@@ -1009,11 +990,10 @@ export function insertMilestone(m) {
|
|
|
1009
990
|
":boundary_map_markdown": m.planning?.boundaryMapMarkdown ?? "",
|
|
1010
991
|
});
|
|
1011
992
|
}
|
|
1012
|
-
export function upsertMilestonePlanning(milestoneId, planning
|
|
993
|
+
export function upsertMilestonePlanning(milestoneId, planning) {
|
|
1013
994
|
if (!currentDb)
|
|
1014
995
|
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
1015
996
|
currentDb.prepare(`UPDATE milestones SET
|
|
1016
|
-
title = COALESCE(:title, title),
|
|
1017
997
|
vision = COALESCE(:vision, vision),
|
|
1018
998
|
success_criteria = COALESCE(:success_criteria, success_criteria),
|
|
1019
999
|
key_risks = COALESCE(:key_risks, key_risks),
|
|
@@ -1027,7 +1007,6 @@ export function upsertMilestonePlanning(milestoneId, planning, title) {
|
|
|
1027
1007
|
boundary_map_markdown = COALESCE(:boundary_map_markdown, boundary_map_markdown)
|
|
1028
1008
|
WHERE id = :id`).run({
|
|
1029
1009
|
":id": milestoneId,
|
|
1030
|
-
":title": title ?? null,
|
|
1031
1010
|
":vision": planning.vision ?? null,
|
|
1032
1011
|
":success_criteria": planning.successCriteria ? JSON.stringify(planning.successCriteria) : null,
|
|
1033
1012
|
":key_risks": planning.keyRisks ? JSON.stringify(planning.keyRisks) : null,
|
|
@@ -1297,12 +1276,6 @@ export function insertVerificationEvidence(e) {
|
|
|
1297
1276
|
":created_at": new Date().toISOString(),
|
|
1298
1277
|
});
|
|
1299
1278
|
}
|
|
1300
|
-
export function getVerificationEvidence(milestoneId, sliceId, taskId) {
|
|
1301
|
-
if (!currentDb)
|
|
1302
|
-
return [];
|
|
1303
|
-
const rows = currentDb.prepare("SELECT * FROM verification_evidence WHERE milestone_id = :mid AND slice_id = :sid AND task_id = :tid ORDER BY id").all({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
|
|
1304
|
-
return rows;
|
|
1305
|
-
}
|
|
1306
1279
|
function rowToMilestone(row) {
|
|
1307
1280
|
return {
|
|
1308
1281
|
id: row["id"],
|
|
@@ -1474,7 +1447,7 @@ export function copyWorktreeDb(srcDbPath, destDbPath) {
|
|
|
1474
1447
|
return true;
|
|
1475
1448
|
}
|
|
1476
1449
|
catch (err) {
|
|
1477
|
-
|
|
1450
|
+
process.stderr.write(`gsd-db: failed to copy DB to worktree: ${err.message}\n`);
|
|
1478
1451
|
return false;
|
|
1479
1452
|
}
|
|
1480
1453
|
}
|
|
@@ -1493,13 +1466,13 @@ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
|
|
|
1493
1466
|
// ATTACH DATABASE doesn't support parameterized paths in all providers,
|
|
1494
1467
|
// so we use strict allowlist validation instead.
|
|
1495
1468
|
if (/['";\x00]/.test(worktreeDbPath)) {
|
|
1496
|
-
|
|
1469
|
+
process.stderr.write("gsd-db: worktree DB reconciliation failed: path contains unsafe characters\n");
|
|
1497
1470
|
return zero;
|
|
1498
1471
|
}
|
|
1499
1472
|
if (!currentDb) {
|
|
1500
1473
|
const opened = openDatabase(mainDbPath);
|
|
1501
1474
|
if (!opened) {
|
|
1502
|
-
|
|
1475
|
+
process.stderr.write("gsd-db: worktree DB reconciliation failed: cannot open main DB\n");
|
|
1503
1476
|
return zero;
|
|
1504
1477
|
}
|
|
1505
1478
|
}
|
|
@@ -1623,7 +1596,7 @@ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
|
|
|
1623
1596
|
}
|
|
1624
1597
|
}
|
|
1625
1598
|
catch (err) {
|
|
1626
|
-
|
|
1599
|
+
process.stderr.write(`gsd-db: worktree DB reconciliation failed: ${err.message}\n`);
|
|
1627
1600
|
return { ...zero, conflicts };
|
|
1628
1601
|
}
|
|
1629
1602
|
}
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
import { showNextAction } from "../shared/tui.js";
|
|
9
9
|
import { loadFile } from "./files.js";
|
|
10
10
|
import { isDbAvailable, getMilestoneSlices } from "./gsd-db.js";
|
|
11
|
-
import { parseRoadmapSlices } from "./roadmap-slices.js";
|
|
12
11
|
import { loadPrompt, inlineTemplate } from "./prompt-loader.js";
|
|
13
12
|
import { buildSkillActivationBlock } from "./auto-prompts.js";
|
|
14
13
|
import { deriveState } from "./state.js";
|
|
@@ -32,7 +31,7 @@ import { showConfirm } from "../shared/tui.js";
|
|
|
32
31
|
import { debugLog } from "./debug-logger.js";
|
|
33
32
|
import { findMilestoneIds, nextMilestoneId, reserveMilestoneId, getReservedMilestoneIds, clearReservedMilestoneIds } from "./milestone-ids.js";
|
|
34
33
|
import { parkMilestone, discardMilestone } from "./milestone-actions.js";
|
|
35
|
-
import {
|
|
34
|
+
import { resolveModelWithFallbacksForUnit } from "./preferences-models.js";
|
|
36
35
|
// ─── Re-exports (preserve public API for existing importers) ────────────────
|
|
37
36
|
export { MILESTONE_ID_RE, generateMilestoneSuffix, nextMilestoneId, extractMilestoneSeq, parseMilestoneId, milestoneIdSort, maxMilestoneNum, findMilestoneIds, reserveMilestoneId, claimReservedId, getReservedMilestoneIds, clearReservedMilestoneIds, } from "./milestone-ids.js";
|
|
38
37
|
export { showQueue, handleQueueReorder, showQueueAdd, buildExistingMilestonesContext, } from "./guided-flow-queue.js";
|
|
@@ -54,61 +53,18 @@ function nextMilestoneIdReserved(existingIds, uniqueEnabled) {
|
|
|
54
53
|
function buildDocsCommitInstruction(_message) {
|
|
55
54
|
return "Do not commit planning artifacts — .gsd/ is managed externally.";
|
|
56
55
|
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
function _getPendingAutoStart(basePath) {
|
|
64
|
-
if (basePath)
|
|
65
|
-
return pendingAutoStartMap.get(basePath) ?? null;
|
|
66
|
-
if (pendingAutoStartMap.size === 1)
|
|
67
|
-
return pendingAutoStartMap.values().next().value;
|
|
68
|
-
return null;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Store pending auto-start state for a project.
|
|
72
|
-
* Exported for testing (#2985).
|
|
73
|
-
*/
|
|
74
|
-
export function setPendingAutoStart(basePath, entry) {
|
|
75
|
-
pendingAutoStartMap.set(basePath, entry);
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Clear pending auto-start state.
|
|
79
|
-
* If basePath is given, clears only that project. Otherwise clears all.
|
|
80
|
-
* Exported for testing (#2985).
|
|
81
|
-
*/
|
|
82
|
-
export function clearPendingAutoStart(basePath) {
|
|
83
|
-
if (basePath) {
|
|
84
|
-
pendingAutoStartMap.delete(basePath);
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
pendingAutoStartMap.clear();
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Returns the milestoneId being discussed for the given project.
|
|
92
|
-
* When basePath is omitted and only one session is active, returns that
|
|
93
|
-
* session's milestoneId for backward compatibility. Returns null when
|
|
94
|
-
* multiple sessions exist and basePath is not specified (#2985 Bug 4).
|
|
95
|
-
*/
|
|
96
|
-
export function getDiscussionMilestoneId(basePath) {
|
|
97
|
-
if (basePath) {
|
|
98
|
-
return pendingAutoStartMap.get(basePath)?.milestoneId ?? null;
|
|
99
|
-
}
|
|
100
|
-
// Backward compat: return the sole entry's milestoneId, or null if ambiguous
|
|
101
|
-
if (pendingAutoStartMap.size === 1) {
|
|
102
|
-
return pendingAutoStartMap.values().next().value.milestoneId;
|
|
103
|
-
}
|
|
104
|
-
return null;
|
|
56
|
+
// ─── Auto-start after discuss ─────────────────────────────────────────────────
|
|
57
|
+
/** Stashed context + flag for auto-starting after discuss phase completes */
|
|
58
|
+
let pendingAutoStart = null;
|
|
59
|
+
/** Returns the milestoneId being discussed, or null if no discussion is active */
|
|
60
|
+
export function getDiscussionMilestoneId() {
|
|
61
|
+
return pendingAutoStart?.milestoneId ?? null;
|
|
105
62
|
}
|
|
106
63
|
/** Called from agent_end to check if auto-mode should start after discuss */
|
|
107
64
|
export function checkAutoStartAfterDiscuss() {
|
|
108
|
-
|
|
109
|
-
if (!entry)
|
|
65
|
+
if (!pendingAutoStart)
|
|
110
66
|
return false;
|
|
111
|
-
const { ctx, pi, basePath, milestoneId, step } =
|
|
67
|
+
const { ctx, pi, basePath, milestoneId, step } = pendingAutoStart;
|
|
112
68
|
// Gate 1: Primary milestone must have CONTEXT.md or ROADMAP.md
|
|
113
69
|
// The "discuss" path creates CONTEXT.md; the "plan" path creates ROADMAP.md.
|
|
114
70
|
const contextFile = resolveMilestoneFile(basePath, milestoneId, "CONTEXT");
|
|
@@ -186,7 +142,7 @@ export function checkAutoStartAfterDiscuss() {
|
|
|
186
142
|
unlinkSync(manifestPath);
|
|
187
143
|
}
|
|
188
144
|
catch { /* may not exist for single-milestone */ }
|
|
189
|
-
|
|
145
|
+
pendingAutoStart = null;
|
|
190
146
|
ctx.ui.notify(`Milestone ${milestoneId} ready.`, "info");
|
|
191
147
|
startAuto(ctx, pi, basePath, false, { step }).catch((err) => {
|
|
192
148
|
ctx.ui.notify(`Auto-start failed: ${getErrorMessage(err)}`, "error");
|
|
@@ -221,17 +177,23 @@ function parseMilestoneSequenceFromProject(content) {
|
|
|
221
177
|
* per-phase model preferences that auto-mode uses.
|
|
222
178
|
*/
|
|
223
179
|
async function dispatchWorkflow(pi, note, customType = "gsd-run", ctx, unitType) {
|
|
224
|
-
//
|
|
225
|
-
// tier downgrade, fallback chains) — same path as auto-mode dispatches (#2958).
|
|
180
|
+
// Apply model preference for this unit type (if configured)
|
|
226
181
|
if (ctx && unitType) {
|
|
227
|
-
const
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
model
|
|
233
|
-
|
|
234
|
-
|
|
182
|
+
const modelConfig = resolveModelWithFallbacksForUnit(unitType);
|
|
183
|
+
if (modelConfig) {
|
|
184
|
+
const availableModels = ctx.modelRegistry.getAvailable();
|
|
185
|
+
const modelsToTry = [modelConfig.primary, ...modelConfig.fallbacks];
|
|
186
|
+
for (const modelId of modelsToTry) {
|
|
187
|
+
// Resolve model from available models (same logic as auto-model-selection)
|
|
188
|
+
const model = resolveAvailableModel(modelId, availableModels, ctx.model?.provider);
|
|
189
|
+
if (!model)
|
|
190
|
+
continue;
|
|
191
|
+
const ok = await pi.setModel(model, { persist: false });
|
|
192
|
+
if (ok) {
|
|
193
|
+
debugLog("guided-flow-model-applied", { unitType, model: `${model.provider}/${model.id}` });
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
235
197
|
}
|
|
236
198
|
}
|
|
237
199
|
const workflowPath = process.env.GSD_WORKFLOW_PATH ?? join(process.env.HOME ?? "~", ".gsd", "agent", "GSD-WORKFLOW.md");
|
|
@@ -349,7 +311,7 @@ export async function showHeadlessMilestoneCreation(ctx, pi, basePath, seedConte
|
|
|
349
311
|
// Build and dispatch the headless discuss prompt
|
|
350
312
|
const prompt = buildHeadlessDiscussPrompt(nextId, seedContext, basePath);
|
|
351
313
|
// Set pending auto start (auto-mode triggers on "Milestone X ready." via checkAutoStartAfterDiscuss)
|
|
352
|
-
|
|
314
|
+
pendingAutoStart = { ctx, pi, basePath, milestoneId: nextId };
|
|
353
315
|
// Dispatch — headless milestone creation is a planning activity
|
|
354
316
|
await dispatchWorkflow(pi, prompt, "gsd-run", ctx, "plan-milestone");
|
|
355
317
|
}
|
|
@@ -498,13 +460,13 @@ export async function showDiscuss(ctx, pi, basePath) {
|
|
|
498
460
|
const seed = draftContent
|
|
499
461
|
? `${basePrompt}\n\n## Prior Discussion (Draft Seed)\n\n${draftContent}`
|
|
500
462
|
: basePrompt;
|
|
501
|
-
|
|
463
|
+
pendingAutoStart = { ctx, pi, basePath, milestoneId: mid, step: false };
|
|
502
464
|
await dispatchWorkflow(pi, seed, "gsd-discuss", ctx, "discuss-milestone");
|
|
503
465
|
}
|
|
504
466
|
else if (choice === "discuss_fresh") {
|
|
505
467
|
const discussMilestoneTemplates = inlineTemplate("context", "Context");
|
|
506
468
|
const structuredQuestionsAvailable = pi.getActiveTools().includes("ask_user_questions") ? "true" : "false";
|
|
507
|
-
|
|
469
|
+
pendingAutoStart = { ctx, pi, basePath, milestoneId: mid, step: false };
|
|
508
470
|
await dispatchWorkflow(pi, loadPrompt("guided-discuss-milestone", {
|
|
509
471
|
milestoneId: mid, milestoneTitle, inlinedTemplates: discussMilestoneTemplates, structuredQuestionsAvailable,
|
|
510
472
|
commitInstruction: buildDocsCommitInstruction(`docs(${mid}): milestone context from discuss`),
|
|
@@ -514,7 +476,7 @@ export async function showDiscuss(ctx, pi, basePath) {
|
|
|
514
476
|
const milestoneIds = findMilestoneIds(basePath);
|
|
515
477
|
const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
|
|
516
478
|
const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds);
|
|
517
|
-
|
|
479
|
+
pendingAutoStart = { ctx, pi, basePath, milestoneId: nextId, step: false };
|
|
518
480
|
await dispatchWorkflow(pi, buildDiscussPrompt(nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone");
|
|
519
481
|
}
|
|
520
482
|
return;
|
|
@@ -540,20 +502,8 @@ export async function showDiscuss(ctx, pi, basePath) {
|
|
|
540
502
|
else {
|
|
541
503
|
normSlices = [];
|
|
542
504
|
}
|
|
543
|
-
// DB is open but returned zero slices despite a roadmap existing —
|
|
544
|
-
// the DB may be empty due to WAL loss or truncation (see #2815, #2892).
|
|
545
|
-
// Fall back to roadmap parsing to prevent false "all complete" exit.
|
|
546
|
-
if (normSlices.length === 0 && roadmapContent) {
|
|
547
|
-
normSlices = parseRoadmapSlices(roadmapContent).map(s => ({ id: s.id, done: s.done, title: s.title }));
|
|
548
|
-
}
|
|
549
505
|
const pendingSlices = normSlices.filter(s => !s.done);
|
|
550
506
|
if (pendingSlices.length === 0) {
|
|
551
|
-
// All slices complete — but queued milestones may still need discussion (#3150)
|
|
552
|
-
const pendingMilestones = state.registry.filter(m => m.status === "pending");
|
|
553
|
-
if (pendingMilestones.length > 0) {
|
|
554
|
-
await showDiscussQueuedMilestone(ctx, pi, basePath, pendingMilestones);
|
|
555
|
-
return;
|
|
556
|
-
}
|
|
557
507
|
ctx.ui.notify("All slices are complete — nothing to discuss.", "info");
|
|
558
508
|
return;
|
|
559
509
|
}
|
|
@@ -567,14 +517,9 @@ export async function showDiscuss(ctx, pi, basePath) {
|
|
|
567
517
|
const contextFile = resolveSliceFile(basePath, mid, s.id, "CONTEXT");
|
|
568
518
|
discussedMap.set(s.id, !!contextFile);
|
|
569
519
|
}
|
|
570
|
-
// If all pending slices are discussed,
|
|
520
|
+
// If all pending slices are discussed, notify and exit instead of looping
|
|
571
521
|
const allDiscussed = pendingSlices.every(s => discussedMap.get(s.id));
|
|
572
522
|
if (allDiscussed) {
|
|
573
|
-
const pendingMilestones = state.registry.filter(m => m.status === "pending");
|
|
574
|
-
if (pendingMilestones.length > 0) {
|
|
575
|
-
await showDiscussQueuedMilestone(ctx, pi, basePath, pendingMilestones);
|
|
576
|
-
return;
|
|
577
|
-
}
|
|
578
523
|
const lockData = readSessionLockData(basePath);
|
|
579
524
|
const remoteAutoRunning = lockData && lockData.pid !== process.pid && isSessionLockProcessAlive(lockData);
|
|
580
525
|
const nextStep = remoteAutoRunning
|
|
@@ -829,7 +774,7 @@ async function handleMilestoneActions(ctx, pi, basePath, milestoneId, milestoneT
|
|
|
829
774
|
const milestoneIds = findMilestoneIds(basePath);
|
|
830
775
|
const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
|
|
831
776
|
const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds);
|
|
832
|
-
|
|
777
|
+
pendingAutoStart = { ctx, pi, basePath, milestoneId: nextId, step: stepMode };
|
|
833
778
|
await dispatchWorkflow(pi, buildDiscussPrompt(nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone");
|
|
834
779
|
return true;
|
|
835
780
|
}
|
|
@@ -859,14 +804,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
|
|
|
859
804
|
return;
|
|
860
805
|
}
|
|
861
806
|
// ── Detection preamble — run before any bootstrap ────────────────────
|
|
862
|
-
|
|
863
|
-
// A zombie .gsd/ state (symlink exists but missing PREFERENCES.md and
|
|
864
|
-
// milestones/) must trigger the init wizard, not skip it (#2942).
|
|
865
|
-
const gsdPath = gsdRoot(basePath);
|
|
866
|
-
const hasBootstrapArtifacts = existsSync(gsdPath)
|
|
867
|
-
&& (existsSync(join(gsdPath, "PREFERENCES.md"))
|
|
868
|
-
|| existsSync(join(gsdPath, "milestones")));
|
|
869
|
-
if (!hasBootstrapArtifacts) {
|
|
807
|
+
if (!existsSync(gsdRoot(basePath))) {
|
|
870
808
|
const detection = detectProjectState(basePath);
|
|
871
809
|
// v1 .planning/ detected — offer migration before anything else
|
|
872
810
|
if (detection.state === "v1-planning" && detection.v1) {
|
|
@@ -880,7 +818,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
|
|
|
880
818
|
}
|
|
881
819
|
// "fresh" — fall through to init wizard
|
|
882
820
|
}
|
|
883
|
-
// No .gsd/
|
|
821
|
+
// No .gsd/ — run the project init wizard
|
|
884
822
|
const result = await showProjectInit(ctx, pi, basePath, detection);
|
|
885
823
|
if (!result.completed)
|
|
886
824
|
return; // User cancelled
|
|
@@ -931,9 +869,9 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
|
|
|
931
869
|
if (!state.activeMilestone?.id) {
|
|
932
870
|
// Guard: if a discuss session is already in flight, don't re-inject the prompt.
|
|
933
871
|
// Both /gsd and /gsd auto reach this branch when no milestone exists yet.
|
|
934
|
-
// Without this guard, every subsequent /gsd call overwrites
|
|
872
|
+
// Without this guard, every subsequent /gsd call overwrites pendingAutoStart
|
|
935
873
|
// and fires another dispatchWorkflow, resetting the conversation mid-interview.
|
|
936
|
-
if (
|
|
874
|
+
if (pendingAutoStart) {
|
|
937
875
|
ctx.ui.notify("Discussion already in progress — answer the question above to continue.", "info");
|
|
938
876
|
return;
|
|
939
877
|
}
|
|
@@ -960,7 +898,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
|
|
|
960
898
|
const isFirst = milestoneIds.length === 0;
|
|
961
899
|
if (isFirst) {
|
|
962
900
|
// First ever — skip wizard, just ask directly
|
|
963
|
-
|
|
901
|
+
pendingAutoStart = { ctx, pi, basePath, milestoneId: nextId, step: stepMode };
|
|
964
902
|
await dispatchWorkflow(pi, buildDiscussPrompt(nextId, `New project, milestone ${nextId}. Do NOT read or explore .gsd/ — it's empty scaffolding.`, basePath), "gsd-run", ctx, "discuss-milestone");
|
|
965
903
|
}
|
|
966
904
|
else {
|
|
@@ -978,7 +916,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
|
|
|
978
916
|
notYetMessage: "Run /gsd when ready.",
|
|
979
917
|
});
|
|
980
918
|
if (choice === "new_milestone") {
|
|
981
|
-
|
|
919
|
+
pendingAutoStart = { ctx, pi, basePath, milestoneId: nextId, step: stepMode };
|
|
982
920
|
await dispatchWorkflow(pi, buildDiscussPrompt(nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone");
|
|
983
921
|
}
|
|
984
922
|
}
|
|
@@ -1010,7 +948,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
|
|
|
1010
948
|
const milestoneIds = findMilestoneIds(basePath);
|
|
1011
949
|
const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
|
|
1012
950
|
const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds);
|
|
1013
|
-
|
|
951
|
+
pendingAutoStart = { ctx, pi, basePath, milestoneId: nextId, step: stepMode };
|
|
1014
952
|
await dispatchWorkflow(pi, buildDiscussPrompt(nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone");
|
|
1015
953
|
}
|
|
1016
954
|
else if (choice === "status") {
|
|
@@ -1056,13 +994,13 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
|
|
|
1056
994
|
const seed = draftContent
|
|
1057
995
|
? `${basePrompt}\n\n## Prior Discussion (Draft Seed)\n\n${draftContent}`
|
|
1058
996
|
: basePrompt;
|
|
1059
|
-
|
|
997
|
+
pendingAutoStart = { ctx, pi, basePath, milestoneId, step: stepMode };
|
|
1060
998
|
await dispatchWorkflow(pi, seed, "gsd-discuss", ctx, "discuss-milestone");
|
|
1061
999
|
}
|
|
1062
1000
|
else if (choice === "discuss_fresh") {
|
|
1063
1001
|
const discussMilestoneTemplates = inlineTemplate("context", "Context");
|
|
1064
1002
|
const structuredQuestionsAvailable = pi.getActiveTools().includes("ask_user_questions") ? "true" : "false";
|
|
1065
|
-
|
|
1003
|
+
pendingAutoStart = { ctx, pi, basePath, milestoneId, step: stepMode };
|
|
1066
1004
|
await dispatchWorkflow(pi, loadPrompt("guided-discuss-milestone", {
|
|
1067
1005
|
milestoneId, milestoneTitle, inlinedTemplates: discussMilestoneTemplates, structuredQuestionsAvailable,
|
|
1068
1006
|
commitInstruction: buildDocsCommitInstruction(`docs(${milestoneId}): milestone context from discuss`),
|
|
@@ -1072,7 +1010,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
|
|
|
1072
1010
|
const milestoneIds = findMilestoneIds(basePath);
|
|
1073
1011
|
const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
|
|
1074
1012
|
const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds);
|
|
1075
|
-
|
|
1013
|
+
pendingAutoStart = { ctx, pi, basePath, milestoneId: nextId, step: stepMode };
|
|
1076
1014
|
await dispatchWorkflow(pi, buildDiscussPrompt(nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone");
|
|
1077
1015
|
}
|
|
1078
1016
|
return;
|
|
@@ -1117,7 +1055,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
|
|
|
1117
1055
|
notYetMessage: "Run /gsd when ready.",
|
|
1118
1056
|
});
|
|
1119
1057
|
if (choice === "plan") {
|
|
1120
|
-
|
|
1058
|
+
pendingAutoStart = { ctx, pi, basePath, milestoneId, step: stepMode };
|
|
1121
1059
|
const planMilestoneTemplates = [
|
|
1122
1060
|
inlineTemplate("roadmap", "Roadmap"),
|
|
1123
1061
|
inlineTemplate("plan", "Slice Plan"),
|
|
@@ -1150,7 +1088,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
|
|
|
1150
1088
|
const milestoneIds = findMilestoneIds(basePath);
|
|
1151
1089
|
const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
|
|
1152
1090
|
const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds);
|
|
1153
|
-
|
|
1091
|
+
pendingAutoStart = { ctx, pi, basePath, milestoneId: nextId, step: stepMode };
|
|
1154
1092
|
await dispatchWorkflow(pi, buildDiscussPrompt(nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone");
|
|
1155
1093
|
}
|
|
1156
1094
|
else if (choice === "discard_milestone") {
|
|
@@ -16,31 +16,6 @@ export function detectHealthWidgetProjectState(basePath) {
|
|
|
16
16
|
function formatCost(n) {
|
|
17
17
|
return n >= 1 ? `$${n.toFixed(2)}` : `${(n * 100).toFixed(1)}¢`;
|
|
18
18
|
}
|
|
19
|
-
/**
|
|
20
|
-
* Format a Unix epoch (seconds) as a human-readable relative time string.
|
|
21
|
-
* Returns "just now" for <1m, "Xm ago" for <1h, "Xh ago" for <24h, "Xd ago" otherwise.
|
|
22
|
-
*/
|
|
23
|
-
export function formatRelativeTime(epochSeconds) {
|
|
24
|
-
const diffSeconds = Math.floor(Date.now() / 1000) - epochSeconds;
|
|
25
|
-
if (diffSeconds < 60)
|
|
26
|
-
return "just now";
|
|
27
|
-
const minutes = Math.floor(diffSeconds / 60);
|
|
28
|
-
if (minutes < 60)
|
|
29
|
-
return `${minutes}m ago`;
|
|
30
|
-
const hours = Math.floor(minutes / 60);
|
|
31
|
-
if (hours < 24)
|
|
32
|
-
return `${hours}h ago`;
|
|
33
|
-
const days = Math.floor(hours / 24);
|
|
34
|
-
return `${days}d ago`;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Truncate a commit message to fit the widget, appending "…" if needed.
|
|
38
|
-
*/
|
|
39
|
-
function truncateMessage(msg, maxLen) {
|
|
40
|
-
if (msg.length <= maxLen)
|
|
41
|
-
return msg;
|
|
42
|
-
return msg.slice(0, maxLen - 1) + "…";
|
|
43
|
-
}
|
|
44
19
|
/**
|
|
45
20
|
* Build compact health lines for the widget.
|
|
46
21
|
* Returns a string array suitable for setWidget().
|
|
@@ -79,11 +54,5 @@ export function buildHealthLines(data) {
|
|
|
79
54
|
else if (data.environmentWarningCount > 0) {
|
|
80
55
|
parts.push(`Env: ${data.environmentWarningCount} warning${data.environmentWarningCount > 1 ? "s" : ""}`);
|
|
81
56
|
}
|
|
82
|
-
// Always-on last commit display — shows relative time + truncated message
|
|
83
|
-
if (data.lastCommitEpoch !== null && data.lastCommitEpoch > 0) {
|
|
84
|
-
const relTime = formatRelativeTime(data.lastCommitEpoch);
|
|
85
|
-
const msg = data.lastCommitMessage ? ` — ${truncateMessage(data.lastCommitMessage, 50)}` : "";
|
|
86
|
-
parts.push(`Last commit: ${relTime}${msg}`);
|
|
87
|
-
}
|
|
88
57
|
return [` ${parts.join(" │ ")}`];
|
|
89
58
|
}
|
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
import { runProviderChecks, summariseProviderIssues } from "./doctor-providers.js";
|
|
11
11
|
import { runEnvironmentChecks } from "./doctor-environment.js";
|
|
12
12
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
13
|
-
import { nativeIsRepo, nativeLastCommitEpoch, nativeGetCurrentBranch, nativeCommitSubject } from "./native-git-bridge.js";
|
|
14
13
|
import { loadLedgerFromDisk, getProjectTotals } from "./metrics.js";
|
|
15
14
|
import { projectRoot } from "./commands/context.js";
|
|
16
15
|
import { buildHealthLines, detectHealthWidgetProjectState, } from "./health-widget-core.js";
|
|
@@ -21,8 +20,6 @@ function loadHealthWidgetData(basePath) {
|
|
|
21
20
|
let providerIssue = null;
|
|
22
21
|
let environmentErrorCount = 0;
|
|
23
22
|
let environmentWarningCount = 0;
|
|
24
|
-
let lastCommitEpoch = null;
|
|
25
|
-
let lastCommitMessage = null;
|
|
26
23
|
const projectState = detectHealthWidgetProjectState(basePath);
|
|
27
24
|
try {
|
|
28
25
|
const prefs = loadEffectiveGSDPreferences();
|
|
@@ -49,18 +46,6 @@ function loadHealthWidgetData(basePath) {
|
|
|
49
46
|
}
|
|
50
47
|
}
|
|
51
48
|
catch { /* non-fatal */ }
|
|
52
|
-
// ── Last commit info ──
|
|
53
|
-
try {
|
|
54
|
-
if (nativeIsRepo(basePath)) {
|
|
55
|
-
const branch = nativeGetCurrentBranch(basePath);
|
|
56
|
-
const epoch = nativeLastCommitEpoch(basePath, branch || "HEAD");
|
|
57
|
-
if (epoch > 0) {
|
|
58
|
-
lastCommitEpoch = epoch;
|
|
59
|
-
lastCommitMessage = nativeCommitSubject(basePath, branch || "HEAD") || null;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
catch { /* non-fatal */ }
|
|
64
49
|
return {
|
|
65
50
|
projectState,
|
|
66
51
|
budgetCeiling,
|
|
@@ -68,8 +53,6 @@ function loadHealthWidgetData(basePath) {
|
|
|
68
53
|
providerIssue,
|
|
69
54
|
environmentErrorCount,
|
|
70
55
|
environmentWarningCount,
|
|
71
|
-
lastCommitEpoch,
|
|
72
|
-
lastCommitMessage,
|
|
73
56
|
lastRefreshed: Date.now(),
|
|
74
57
|
};
|
|
75
58
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { isDepthVerified, isQueuePhaseActive, setQueuePhaseActive, shouldBlockContextWrite,
|
|
1
|
+
export { isDepthVerified, isQueuePhaseActive, setQueuePhaseActive, shouldBlockContextWrite, } from "./bootstrap/write-gate.js";
|
|
2
2
|
export default async function registerExtension(pi) {
|
|
3
3
|
const { registerGsdExtension } = await import("./bootstrap/register-extension.js");
|
|
4
4
|
registerGsdExtension(pi);
|
|
@@ -57,21 +57,14 @@ export function buildMemoryLLMCall(ctx) {
|
|
|
57
57
|
if (!model)
|
|
58
58
|
return null;
|
|
59
59
|
const selectedModel = model;
|
|
60
|
-
// Resolve API key via modelRegistry so OAuth tokens (auth.json) are used.
|
|
61
|
-
// Without this, streamSimpleAnthropic only checks env vars via getEnvApiKey,
|
|
62
|
-
// which returns undefined for OAuth users (Claude Max / Claude Pro).
|
|
63
|
-
// See: https://github.com/gsd-build/gsd-2/issues/2959
|
|
64
|
-
const resolvedKeyPromise = ctx.modelRegistry.getApiKey(selectedModel).catch(() => undefined);
|
|
65
60
|
return async (system, user) => {
|
|
66
61
|
const { completeSimple } = await import('@gsd/pi-ai');
|
|
67
|
-
const resolvedApiKey = await resolvedKeyPromise;
|
|
68
62
|
const result = await completeSimple(selectedModel, {
|
|
69
63
|
systemPrompt: system,
|
|
70
64
|
messages: [{ role: 'user', content: [{ type: 'text', text: user }], timestamp: Date.now() }],
|
|
71
65
|
}, {
|
|
72
66
|
maxTokens: 2048,
|
|
73
67
|
temperature: 0,
|
|
74
|
-
...(resolvedApiKey ? { apiKey: resolvedApiKey } : {}),
|
|
75
68
|
});
|
|
76
69
|
// Extract text from response
|
|
77
70
|
const textParts = result.content
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import { execFileSync } from "node:child_process";
|
|
9
9
|
import { existsSync, lstatSync, mkdirSync, readdirSync, realpathSync, renameSync, cpSync, rmSync, symlinkSync } from "node:fs";
|
|
10
10
|
import { join } from "node:path";
|
|
11
|
-
import { externalGsdRoot
|
|
11
|
+
import { externalGsdRoot } from "./repo-identity.js";
|
|
12
12
|
import { getErrorMessage } from "./error-utils.js";
|
|
13
13
|
import { hasGitTrackedGsdFiles } from "./gitignore.js";
|
|
14
14
|
import { GIT_NO_PROMPT_ENV } from "./git-constants.js";
|
|
@@ -27,13 +27,6 @@ import { GIT_NO_PROMPT_ENV } from "./git-constants.js";
|
|
|
27
27
|
* 3. On failure: rename `.gsd.migrating` back to `.gsd` (rollback)
|
|
28
28
|
*/
|
|
29
29
|
export function migrateToExternalState(basePath) {
|
|
30
|
-
// Worktrees get their .gsd via syncGsdStateToWorktree(), not migration.
|
|
31
|
-
// Migration inside a worktree would compute the same external hash as the
|
|
32
|
-
// main repo (externalGsdRoot hashes remoteUrl + gitRoot), creating a broken
|
|
33
|
-
// junction and orphaning .gsd.migrating (#2970).
|
|
34
|
-
if (isInsideWorktree(basePath)) {
|
|
35
|
-
return { migrated: false };
|
|
36
|
-
}
|
|
37
30
|
const localGsd = join(basePath, ".gsd");
|
|
38
31
|
// Skip if doesn't exist
|
|
39
32
|
if (!existsSync(localGsd)) {
|
|
@@ -20,27 +20,9 @@ export const BUNDLED_COST_TABLE = [
|
|
|
20
20
|
// OpenAI
|
|
21
21
|
{ id: "gpt-4o", inputPer1k: 0.0025, outputPer1k: 0.01, updatedAt: "2025-03-15" },
|
|
22
22
|
{ id: "gpt-4o-mini", inputPer1k: 0.00015, outputPer1k: 0.0006, updatedAt: "2025-03-15" },
|
|
23
|
-
{ id: "gpt-4.1", inputPer1k: 0.002, outputPer1k: 0.008, updatedAt: "2026-03-29" },
|
|
24
|
-
{ id: "gpt-4.1-mini", inputPer1k: 0.0004, outputPer1k: 0.0016, updatedAt: "2026-03-29" },
|
|
25
|
-
{ id: "gpt-4.1-nano", inputPer1k: 0.0001, outputPer1k: 0.0004, updatedAt: "2026-03-29" },
|
|
26
|
-
{ id: "gpt-5", inputPer1k: 0.01, outputPer1k: 0.04, updatedAt: "2026-03-29" },
|
|
27
|
-
{ id: "gpt-5-mini", inputPer1k: 0.0003, outputPer1k: 0.0012, updatedAt: "2026-03-29" },
|
|
28
|
-
{ id: "gpt-5-nano", inputPer1k: 0.0001, outputPer1k: 0.0004, updatedAt: "2026-03-29" },
|
|
29
|
-
{ id: "gpt-5-pro", inputPer1k: 0.015, outputPer1k: 0.06, updatedAt: "2026-03-29" },
|
|
30
23
|
{ id: "o1", inputPer1k: 0.015, outputPer1k: 0.06, updatedAt: "2025-03-15" },
|
|
31
24
|
{ id: "o3", inputPer1k: 0.015, outputPer1k: 0.06, updatedAt: "2025-03-15" },
|
|
32
|
-
{ id: "o4-mini", inputPer1k: 0.005, outputPer1k: 0.02, updatedAt: "2026-03-29" },
|
|
33
|
-
{ id: "o4-mini-deep-research", inputPer1k: 0.005, outputPer1k: 0.02, updatedAt: "2026-03-29" },
|
|
34
25
|
{ id: "gpt-4-turbo", inputPer1k: 0.01, outputPer1k: 0.03, updatedAt: "2025-03-15" },
|
|
35
|
-
// OpenAI Codex
|
|
36
|
-
{ id: "gpt-5.1", inputPer1k: 0.005, outputPer1k: 0.02, updatedAt: "2026-03-29" },
|
|
37
|
-
{ id: "gpt-5.1-codex-max", inputPer1k: 0.003, outputPer1k: 0.012, updatedAt: "2026-03-29" },
|
|
38
|
-
{ id: "gpt-5.1-codex-mini", inputPer1k: 0.0003, outputPer1k: 0.0012, updatedAt: "2026-03-29" },
|
|
39
|
-
{ id: "gpt-5.2", inputPer1k: 0.005, outputPer1k: 0.02, updatedAt: "2026-03-29" },
|
|
40
|
-
{ id: "gpt-5.2-codex", inputPer1k: 0.005, outputPer1k: 0.02, updatedAt: "2026-03-29" },
|
|
41
|
-
{ id: "gpt-5.3-codex", inputPer1k: 0.005, outputPer1k: 0.02, updatedAt: "2026-03-29" },
|
|
42
|
-
{ id: "gpt-5.3-codex-spark", inputPer1k: 0.0003, outputPer1k: 0.0012, updatedAt: "2026-03-29" },
|
|
43
|
-
{ id: "gpt-5.4", inputPer1k: 0.005, outputPer1k: 0.02, updatedAt: "2026-03-29" },
|
|
44
26
|
// Google
|
|
45
27
|
{ id: "gemini-2.0-flash", inputPer1k: 0.0001, outputPer1k: 0.0004, updatedAt: "2025-03-15" },
|
|
46
28
|
{ id: "gemini-flash-2.0", inputPer1k: 0.0001, outputPer1k: 0.0004, updatedAt: "2025-03-15" },
|