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
|
@@ -9,25 +9,6 @@ function requireDb() {
|
|
|
9
9
|
throw new Error("workflow-manifest: No database open");
|
|
10
10
|
return db;
|
|
11
11
|
}
|
|
12
|
-
/**
|
|
13
|
-
* Coerce a raw DB value to a number, returning `fallback` for
|
|
14
|
-
* null/undefined/non-numeric strings (e.g. "-", "N/A", "").
|
|
15
|
-
* SQLite can store TEXT in INTEGER columns after migrations or manual inserts.
|
|
16
|
-
*/
|
|
17
|
-
export function toNumeric(value, fallback = null) {
|
|
18
|
-
if (value === null || value === undefined)
|
|
19
|
-
return fallback;
|
|
20
|
-
if (typeof value === "number")
|
|
21
|
-
return Number.isFinite(value) ? value : fallback;
|
|
22
|
-
if (typeof value === "string") {
|
|
23
|
-
const trimmed = value.trim();
|
|
24
|
-
if (trimmed === "" || trimmed === "-" || trimmed === "N/A")
|
|
25
|
-
return fallback;
|
|
26
|
-
const n = Number(trimmed);
|
|
27
|
-
return Number.isFinite(n) ? n : fallback;
|
|
28
|
-
}
|
|
29
|
-
return fallback;
|
|
30
|
-
}
|
|
31
12
|
// ─── snapshotState ───────────────────────────────────────────────────────
|
|
32
13
|
/**
|
|
33
14
|
* Capture complete DB state as a StateManifest.
|
|
@@ -81,7 +62,7 @@ export function snapshotState() {
|
|
|
81
62
|
proof_level: r["proof_level"] ?? "",
|
|
82
63
|
integration_closure: r["integration_closure"] ?? "",
|
|
83
64
|
observability_impact: r["observability_impact"] ?? "",
|
|
84
|
-
sequence:
|
|
65
|
+
sequence: r["sequence"] ?? 0,
|
|
85
66
|
replan_triggered_at: r["replan_triggered_at"] ?? null,
|
|
86
67
|
}));
|
|
87
68
|
const rawTasks = db.prepare("SELECT * FROM tasks ORDER BY milestone_id, slice_id, sequence, id").all();
|
|
@@ -110,11 +91,11 @@ export function snapshotState() {
|
|
|
110
91
|
expected_output: JSON.parse(r["expected_output"] || "[]"),
|
|
111
92
|
observability_impact: r["observability_impact"] ?? "",
|
|
112
93
|
full_plan_md: r["full_plan_md"] ?? "",
|
|
113
|
-
sequence:
|
|
94
|
+
sequence: r["sequence"] ?? 0,
|
|
114
95
|
}));
|
|
115
96
|
const rawDecisions = db.prepare("SELECT * FROM decisions ORDER BY seq").all();
|
|
116
97
|
const decisions = rawDecisions.map((r) => ({
|
|
117
|
-
seq:
|
|
98
|
+
seq: r["seq"],
|
|
118
99
|
id: r["id"],
|
|
119
100
|
when_context: r["when_context"] ?? "",
|
|
120
101
|
scope: r["scope"] ?? "",
|
|
@@ -132,9 +113,9 @@ export function snapshotState() {
|
|
|
132
113
|
slice_id: r["slice_id"],
|
|
133
114
|
milestone_id: r["milestone_id"],
|
|
134
115
|
command: r["command"],
|
|
135
|
-
exit_code:
|
|
116
|
+
exit_code: r["exit_code"] ?? null,
|
|
136
117
|
verdict: r["verdict"] ?? "",
|
|
137
|
-
duration_ms:
|
|
118
|
+
duration_ms: r["duration_ms"] ?? null,
|
|
138
119
|
created_at: r["created_at"],
|
|
139
120
|
}));
|
|
140
121
|
const result = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// GSD Extension — Projection Renderers (DB -> Markdown)
|
|
2
2
|
// Renders PLAN.md, ROADMAP.md, SUMMARY.md, and STATE.md from database rows.
|
|
3
3
|
// Projections are read-only views of engine state (Layer 3 of the architecture).
|
|
4
|
-
import { _getAdapter, isDbAvailable, getMilestone, getMilestoneSlices, getSliceTasks,
|
|
4
|
+
import { _getAdapter, isDbAvailable, getMilestone, getMilestoneSlices, getSliceTasks, } from "./gsd-db.js";
|
|
5
5
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
6
6
|
import { join } from "node:path";
|
|
7
7
|
import { mkdirSync, existsSync } from "node:fs";
|
|
@@ -16,10 +16,8 @@ export function renderPlanContent(sliceRow, taskRows) {
|
|
|
16
16
|
const lines = [];
|
|
17
17
|
lines.push(`# ${sliceRow.id}: ${sliceRow.title}`);
|
|
18
18
|
lines.push("");
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
lines.push(`**Goal:** ${sliceRow.goal || "TBD"}`);
|
|
22
|
-
lines.push(`**Demo:** After this: ${sliceRow.demo || "TBD"}`);
|
|
19
|
+
lines.push(`**Goal:** ${sliceRow.goal || sliceRow.full_summary_md || "TBD"}`);
|
|
20
|
+
lines.push(`**Demo:** After this: ${sliceRow.demo || sliceRow.full_uat_md || "TBD"}`);
|
|
23
21
|
lines.push("");
|
|
24
22
|
lines.push("## Tasks");
|
|
25
23
|
for (const task of taskRows) {
|
|
@@ -87,10 +85,7 @@ export function renderRoadmapContent(milestoneRow, sliceRows) {
|
|
|
87
85
|
depends = slice.depends.join(", ");
|
|
88
86
|
}
|
|
89
87
|
const risk = (slice.risk || "low").toLowerCase();
|
|
90
|
-
|
|
91
|
-
// multi-line UAT content (preconditions, steps, expected results) that
|
|
92
|
-
// corrupts the markdown table and makes subsequent slices invisible.
|
|
93
|
-
const demo = slice.demo || "TBD";
|
|
88
|
+
const demo = slice.demo || slice.full_uat_md || "TBD";
|
|
94
89
|
lines.push(`| ${slice.id} | ${slice.title} | ${risk} | ${depends} | ${done} | ${demo} |`);
|
|
95
90
|
}
|
|
96
91
|
lines.push("");
|
|
@@ -113,85 +108,64 @@ export function renderRoadmapProjection(basePath, milestoneId) {
|
|
|
113
108
|
// ─── SUMMARY.md Projection ──────────────────────────────────────────────
|
|
114
109
|
/**
|
|
115
110
|
* Render SUMMARY.md content from a task row.
|
|
116
|
-
*
|
|
117
|
-
* time and at projection regeneration time (#2720).
|
|
118
|
-
*
|
|
119
|
-
* @param evidence - Optional verification evidence rows. When called from
|
|
120
|
-
* complete-task, these are passed directly. When called from projection
|
|
121
|
-
* regeneration, they are queried from the DB by renderSummaryProjection.
|
|
111
|
+
* Pure function — no side effects.
|
|
122
112
|
*/
|
|
123
|
-
export function renderSummaryContent(taskRow, sliceId, milestoneId
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
if (evidenceList.length > 0) {
|
|
144
|
-
evidenceList.forEach((e, i) => {
|
|
145
|
-
const code = e.exitCode ?? e.exit_code ?? 0;
|
|
146
|
-
const dur = e.durationMs ?? e.duration_ms ?? 0;
|
|
147
|
-
evidenceTable += `| ${i + 1} | \`${e.command}\` | ${code} | ${e.verdict} | ${dur}ms |\n`;
|
|
148
|
-
});
|
|
113
|
+
export function renderSummaryContent(taskRow, sliceId, milestoneId) {
|
|
114
|
+
const lines = [];
|
|
115
|
+
// Frontmatter
|
|
116
|
+
lines.push("---");
|
|
117
|
+
lines.push(`id: ${taskRow.id}`);
|
|
118
|
+
lines.push(`parent: ${sliceId}`);
|
|
119
|
+
lines.push(`milestone: ${milestoneId}`);
|
|
120
|
+
lines.push("provides: []");
|
|
121
|
+
lines.push("requires: []");
|
|
122
|
+
lines.push("affects: []");
|
|
123
|
+
// key_files is already parsed to string[]
|
|
124
|
+
if (taskRow.key_files && taskRow.key_files.length > 0) {
|
|
125
|
+
lines.push(`key_files: [${taskRow.key_files.map(f => `"${f}"`).join(", ")}]`);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
lines.push("key_files: []");
|
|
129
|
+
}
|
|
130
|
+
// key_decisions is already parsed to string[]
|
|
131
|
+
if (taskRow.key_decisions && taskRow.key_decisions.length > 0) {
|
|
132
|
+
lines.push(`key_decisions: [${taskRow.key_decisions.map(d => `"${d}"`).join(", ")}]`);
|
|
149
133
|
}
|
|
150
134
|
else {
|
|
151
|
-
|
|
135
|
+
lines.push("key_decisions: []");
|
|
136
|
+
}
|
|
137
|
+
lines.push("patterns_established: []");
|
|
138
|
+
lines.push("drill_down_paths: []");
|
|
139
|
+
lines.push("observability_surfaces: []");
|
|
140
|
+
lines.push(`duration: "${taskRow.duration || ""}"`);
|
|
141
|
+
lines.push(`verification_result: "${taskRow.verification_result || ""}"`);
|
|
142
|
+
lines.push(`completed_at: ${taskRow.completed_at || ""}`);
|
|
143
|
+
lines.push(`blocker_discovered: ${taskRow.blocker_discovered ? "true" : "false"}`);
|
|
144
|
+
lines.push("---");
|
|
145
|
+
lines.push("");
|
|
146
|
+
lines.push(`# ${taskRow.id}: ${taskRow.title}`);
|
|
147
|
+
lines.push("");
|
|
148
|
+
// One-liner (if present)
|
|
149
|
+
if (taskRow.one_liner) {
|
|
150
|
+
lines.push(`> ${taskRow.one_liner}`);
|
|
151
|
+
lines.push("");
|
|
152
152
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
**${taskRow.one_liner || ""}**
|
|
171
|
-
|
|
172
|
-
## What Happened
|
|
173
|
-
|
|
174
|
-
${taskRow.narrative || "No summary recorded."}
|
|
175
|
-
|
|
176
|
-
## Verification
|
|
177
|
-
|
|
178
|
-
${taskRow.verification_result || "No verification recorded."}
|
|
179
|
-
|
|
180
|
-
## Verification Evidence
|
|
181
|
-
|
|
182
|
-
${evidenceTable}
|
|
183
|
-
## Deviations
|
|
184
|
-
|
|
185
|
-
${taskRow.deviations || "None."}
|
|
186
|
-
|
|
187
|
-
## Known Issues
|
|
188
|
-
|
|
189
|
-
${taskRow.known_issues || "None."}
|
|
190
|
-
|
|
191
|
-
## Files Created/Modified
|
|
192
|
-
|
|
193
|
-
${taskRow.key_files && taskRow.key_files.length > 0 ? taskRow.key_files.map(f => `- \`${f}\``).join("\n") : "None."}
|
|
194
|
-
`;
|
|
153
|
+
lines.push("## What Happened");
|
|
154
|
+
lines.push(taskRow.full_summary_md || taskRow.narrative || "No summary recorded.");
|
|
155
|
+
lines.push("");
|
|
156
|
+
// Deviations (if present)
|
|
157
|
+
if (taskRow.deviations) {
|
|
158
|
+
lines.push("## Deviations");
|
|
159
|
+
lines.push(taskRow.deviations);
|
|
160
|
+
lines.push("");
|
|
161
|
+
}
|
|
162
|
+
// Known issues (if present)
|
|
163
|
+
if (taskRow.known_issues) {
|
|
164
|
+
lines.push("## Known Issues");
|
|
165
|
+
lines.push(taskRow.known_issues);
|
|
166
|
+
lines.push("");
|
|
167
|
+
}
|
|
168
|
+
return lines.join("\n");
|
|
195
169
|
}
|
|
196
170
|
/**
|
|
197
171
|
* Render SUMMARY.md projection to disk for a specific task.
|
|
@@ -202,8 +176,7 @@ export function renderSummaryProjection(basePath, milestoneId, sliceId, taskId)
|
|
|
202
176
|
const taskRow = taskRows.find(t => t.id === taskId);
|
|
203
177
|
if (!taskRow)
|
|
204
178
|
return;
|
|
205
|
-
const
|
|
206
|
-
const content = renderSummaryContent(taskRow, sliceId, milestoneId, evidenceRows);
|
|
179
|
+
const content = renderSummaryContent(taskRow, sliceId, milestoneId);
|
|
207
180
|
const dir = join(basePath, ".gsd", "milestones", milestoneId, "slices", sliceId, "tasks");
|
|
208
181
|
mkdirSync(dir, { recursive: true });
|
|
209
182
|
atomicWriteSync(join(dir, `${taskId}-SUMMARY.md`), content);
|
|
@@ -217,18 +190,13 @@ export function renderSummaryProjection(basePath, milestoneId, sliceId, taskId)
|
|
|
217
190
|
export function renderStateContent(state) {
|
|
218
191
|
const lines = [];
|
|
219
192
|
lines.push("# GSD State", "");
|
|
193
|
+
const activeMilestone = state.activeMilestone
|
|
194
|
+
? `${state.activeMilestone.id}: ${state.activeMilestone.title}`
|
|
195
|
+
: "None";
|
|
220
196
|
const activeSlice = state.activeSlice
|
|
221
197
|
? `${state.activeSlice.id}: ${state.activeSlice.title}`
|
|
222
198
|
: "None";
|
|
223
|
-
|
|
224
|
-
lines.push(`**Last Completed Milestone:** ${state.lastCompletedMilestone.id}: ${state.lastCompletedMilestone.title}`);
|
|
225
|
-
}
|
|
226
|
-
else {
|
|
227
|
-
const activeMilestone = state.activeMilestone
|
|
228
|
-
? `${state.activeMilestone.id}: ${state.activeMilestone.title}`
|
|
229
|
-
: "None";
|
|
230
|
-
lines.push(`**Active Milestone:** ${activeMilestone}`);
|
|
231
|
-
}
|
|
199
|
+
lines.push(`**Active Milestone:** ${activeMilestone}`);
|
|
232
200
|
lines.push(`**Active Slice:** ${activeSlice}`);
|
|
233
201
|
lines.push(`**Phase:** ${state.phase}`);
|
|
234
202
|
if (state.requirements) {
|
|
@@ -1,39 +1,10 @@
|
|
|
1
1
|
import { join } from "node:path";
|
|
2
2
|
import { mkdirSync, existsSync, readFileSync, unlinkSync } from "node:fs";
|
|
3
|
-
import { logWarning, logError } from "./workflow-logger.js";
|
|
4
3
|
import { readEvents, findForkPoint, appendEvent, getSessionId } from "./workflow-events.js";
|
|
5
|
-
import { transaction, updateTaskStatus, updateSliceStatus,
|
|
6
|
-
import { isClosedStatus } from "./status-guards.js";
|
|
4
|
+
import { transaction, updateTaskStatus, updateSliceStatus, insertVerificationEvidence, upsertDecision, openDatabase, } from "./gsd-db.js";
|
|
7
5
|
import { writeManifest } from "./workflow-manifest.js";
|
|
8
6
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
9
7
|
import { acquireSyncLock, releaseSyncLock } from "./sync-lock.js";
|
|
10
|
-
// ─── Replay Helpers ──────────────────────────────────────────────────────────
|
|
11
|
-
/**
|
|
12
|
-
* Replay a complete_slice event with task validation.
|
|
13
|
-
*
|
|
14
|
-
* #2945 Bug 2: The original replay blindly called updateSliceStatus("done")
|
|
15
|
-
* without checking whether all tasks in the slice are actually complete.
|
|
16
|
-
* During API overload or partial execution, a complete_slice event could
|
|
17
|
-
* be logged even when tasks were skipped, causing the milestone completion
|
|
18
|
-
* guard to see the slice as "done" and allow premature milestone completion.
|
|
19
|
-
*
|
|
20
|
-
* This function validates that every task in the slice has a closed status
|
|
21
|
-
* before marking the slice as done. If any task is still pending, the slice
|
|
22
|
-
* status is left unchanged.
|
|
23
|
-
*/
|
|
24
|
-
export function replaySliceComplete(milestoneId, sliceId, ts) {
|
|
25
|
-
const tasks = getSliceTasks(milestoneId, sliceId);
|
|
26
|
-
// If there are tasks and any are not closed, skip the status update
|
|
27
|
-
if (tasks.length > 0) {
|
|
28
|
-
const incompleteTasks = tasks.filter(t => !isClosedStatus(t.status));
|
|
29
|
-
if (incompleteTasks.length > 0) {
|
|
30
|
-
process.stderr.write(`[gsd] reconcile: skipping complete_slice replay for ${sliceId} — ` +
|
|
31
|
-
`${incompleteTasks.length} task(s) still pending\n`);
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
updateSliceStatus(milestoneId, sliceId, "done", ts);
|
|
36
|
-
}
|
|
37
8
|
// ─── replayEvents ─────────────────────────────────────────────────────────────
|
|
38
9
|
/**
|
|
39
10
|
* Replay a list of WorkflowEvents by dispatching each to the appropriate
|
|
@@ -87,8 +58,7 @@ function replayEvents(events) {
|
|
|
87
58
|
case "complete_slice": {
|
|
88
59
|
const milestoneId = p["milestoneId"];
|
|
89
60
|
const sliceId = p["sliceId"];
|
|
90
|
-
|
|
91
|
-
replaySliceComplete(milestoneId, sliceId, event.ts);
|
|
61
|
+
updateSliceStatus(milestoneId, sliceId, "done", event.ts);
|
|
92
62
|
break;
|
|
93
63
|
}
|
|
94
64
|
case "plan_slice": {
|
|
@@ -251,7 +221,7 @@ export function reconcileWorktreeLogs(mainBasePath, worktreeBasePath) {
|
|
|
251
221
|
// Acquire advisory lock to prevent concurrent reconcile + append races
|
|
252
222
|
const lock = acquireSyncLock(mainBasePath);
|
|
253
223
|
if (!lock.acquired) {
|
|
254
|
-
|
|
224
|
+
process.stderr.write(`[gsd] reconcile: could not acquire sync lock — another reconciliation may be in progress\n`);
|
|
255
225
|
return { autoMerged: 0, conflicts: [] };
|
|
256
226
|
}
|
|
257
227
|
try {
|
|
@@ -281,7 +251,7 @@ function _reconcileWorktreeLogsInner(mainBasePath, worktreeBasePath) {
|
|
|
281
251
|
if (conflicts.length > 0) {
|
|
282
252
|
// D-04: atomic all-or-nothing — block entire merge
|
|
283
253
|
writeConflictsFile(mainBasePath, conflicts, worktreeBasePath);
|
|
284
|
-
|
|
254
|
+
process.stderr.write(`[gsd] reconcile: ${conflicts.length} conflict(s) detected — see ${join(mainBasePath, ".gsd", "CONFLICTS.md")}\n`);
|
|
285
255
|
return { autoMerged: 0, conflicts };
|
|
286
256
|
}
|
|
287
257
|
// Step 6: Clean merge — stable sort by timestamp (index-based tiebreaker)
|
|
@@ -302,7 +272,7 @@ function _reconcileWorktreeLogsInner(mainBasePath, worktreeBasePath) {
|
|
|
302
272
|
writeManifest(mainBasePath);
|
|
303
273
|
}
|
|
304
274
|
catch (err) {
|
|
305
|
-
|
|
275
|
+
process.stderr.write(`[gsd] reconcile: manifest write failed (non-fatal): ${err.message}\n`);
|
|
306
276
|
}
|
|
307
277
|
return { autoMerged: merged.length, conflicts: [] };
|
|
308
278
|
}
|
|
@@ -3,7 +3,6 @@ import { isDbAvailable, getMilestoneSlices, getSliceTasks } from "./gsd-db.js";
|
|
|
3
3
|
import { parseRoadmap, parsePlan } from "./parsers-legacy.js";
|
|
4
4
|
import { resolveMilestoneFile, resolveSliceFile, resolveTaskFile, resolveTasksDir, } from "./paths.js";
|
|
5
5
|
import { deriveState } from "./state.js";
|
|
6
|
-
import { extractVerdict } from "./verdict-parser.js";
|
|
7
6
|
import { findMilestoneIds } from "./guided-flow.js";
|
|
8
7
|
import { getSliceBranchName, detectWorktreeName } from "./worktree.js";
|
|
9
8
|
// Extract milestone title from roadmap header without using parsers.
|
|
@@ -117,29 +116,6 @@ export async function indexWorkspace(basePath, opts = {}) {
|
|
|
117
116
|
taskId: state.activeTask?.id,
|
|
118
117
|
phase: state.phase,
|
|
119
118
|
};
|
|
120
|
-
// Enrich milestones with authoritative status from state registry (#2807)
|
|
121
|
-
if (state.registry) {
|
|
122
|
-
const registryMap = new Map(state.registry.map(e => [e.id, e]));
|
|
123
|
-
for (const milestone of milestones) {
|
|
124
|
-
const entry = registryMap.get(milestone.id);
|
|
125
|
-
if (entry) {
|
|
126
|
-
milestone.status = entry.status;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
// Populate validationVerdict from VALIDATION files (#2807)
|
|
131
|
-
for (const milestone of milestones) {
|
|
132
|
-
const validationPath = resolveMilestoneFile(basePath, milestone.id, "VALIDATION");
|
|
133
|
-
if (validationPath) {
|
|
134
|
-
const validationContent = await loadFile(validationPath);
|
|
135
|
-
if (validationContent) {
|
|
136
|
-
const verdict = extractVerdict(validationContent);
|
|
137
|
-
if (verdict === "pass" || verdict === "needs-attention" || verdict === "needs-remediation") {
|
|
138
|
-
milestone.validationVerdict = verdict;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
119
|
const scopes = [{ scope: "project", label: "project", kind: "project" }];
|
|
144
120
|
for (const milestone of milestones) {
|
|
145
121
|
scopes.push({ scope: milestone.id, label: `${milestone.id}: ${milestone.title}`, kind: "milestone" });
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* 3. merge() — LLM-guided reconciliation of .gsd/ artifacts back to main
|
|
15
15
|
* 4. remove() — git worktree remove + branch cleanup
|
|
16
16
|
*/
|
|
17
|
-
import { existsSync,
|
|
17
|
+
import { existsSync, mkdirSync, readFileSync, realpathSync, rmSync } from "node:fs";
|
|
18
18
|
import { execFileSync } from "node:child_process";
|
|
19
19
|
import { join, resolve, sep } from "node:path";
|
|
20
20
|
import { GSDError, GSD_PARSE_ERROR, GSD_STALE_STATE, GSD_LOCK_HELD, GSD_GIT_ERROR, GSD_MERGE_CONFLICT } from "./errors.js";
|
|
@@ -203,73 +203,6 @@ export function listWorktrees(basePath) {
|
|
|
203
203
|
}
|
|
204
204
|
return worktrees;
|
|
205
205
|
}
|
|
206
|
-
// ─── Nested .git Detection (#2616) ──────────────────────────────────────
|
|
207
|
-
//
|
|
208
|
-
// Scaffolding tools (create-next-app, cargo init, etc.) create nested .git
|
|
209
|
-
// directories inside worktrees. Git records these as gitlinks (mode 160000)
|
|
210
|
-
// without a .gitmodules entry — so worktree cleanup destroys the only copy
|
|
211
|
-
// of their object database, causing permanent silent data loss.
|
|
212
|
-
/** Directories to skip when scanning for nested .git dirs. */
|
|
213
|
-
const NESTED_GIT_SKIP_DIRS = new Set([
|
|
214
|
-
".git", ".gsd", "node_modules", ".next", ".nuxt", "dist", "build",
|
|
215
|
-
"__pycache__", ".tox", ".venv", "venv", "target", "vendor",
|
|
216
|
-
]);
|
|
217
|
-
/**
|
|
218
|
-
* Recursively find nested .git directories inside a worktree root.
|
|
219
|
-
* Returns paths to directories that contain their own .git (directory, not file).
|
|
220
|
-
* Skips node_modules, .gsd, and other non-project directories for performance.
|
|
221
|
-
*
|
|
222
|
-
* A nested .git *directory* (not a .git file — which is a legitimate worktree
|
|
223
|
-
* pointer) indicates a scaffolded repo that will become an orphaned gitlink.
|
|
224
|
-
*/
|
|
225
|
-
export function findNestedGitDirs(rootPath) {
|
|
226
|
-
const results = [];
|
|
227
|
-
function walk(dir, depth) {
|
|
228
|
-
// Cap recursion depth to avoid runaway scanning
|
|
229
|
-
if (depth > 10)
|
|
230
|
-
return;
|
|
231
|
-
let entries;
|
|
232
|
-
try {
|
|
233
|
-
entries = readdirSync(dir);
|
|
234
|
-
}
|
|
235
|
-
catch {
|
|
236
|
-
return; // Permission denied, broken symlink, etc.
|
|
237
|
-
}
|
|
238
|
-
for (const entry of entries) {
|
|
239
|
-
if (NESTED_GIT_SKIP_DIRS.has(entry))
|
|
240
|
-
continue;
|
|
241
|
-
const fullPath = join(dir, entry);
|
|
242
|
-
// Only follow real directories, not symlinks
|
|
243
|
-
let stat;
|
|
244
|
-
try {
|
|
245
|
-
stat = lstatSync(fullPath);
|
|
246
|
-
}
|
|
247
|
-
catch {
|
|
248
|
-
continue;
|
|
249
|
-
}
|
|
250
|
-
if (!stat.isDirectory())
|
|
251
|
-
continue;
|
|
252
|
-
// Check if this directory contains a .git *directory* (not a .git file).
|
|
253
|
-
// A .git file is a worktree pointer and is legitimate.
|
|
254
|
-
// A .git directory is a standalone repo created by scaffolding.
|
|
255
|
-
const innerGit = join(fullPath, ".git");
|
|
256
|
-
try {
|
|
257
|
-
const innerStat = lstatSync(innerGit);
|
|
258
|
-
if (innerStat.isDirectory()) {
|
|
259
|
-
results.push(fullPath);
|
|
260
|
-
// Don't recurse into the nested repo — we found what we need
|
|
261
|
-
continue;
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
catch {
|
|
265
|
-
// No .git here — continue scanning
|
|
266
|
-
}
|
|
267
|
-
walk(fullPath, depth + 1);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
walk(rootPath, 0);
|
|
271
|
-
return results;
|
|
272
|
-
}
|
|
273
206
|
/**
|
|
274
207
|
* Remove a worktree and optionally delete its branch.
|
|
275
208
|
* If the process is currently inside the worktree, chdir out first.
|
|
@@ -336,24 +269,6 @@ export function removeWorktree(basePath, name, opts = {}) {
|
|
|
336
269
|
// submodule status failed — proceed with normal removal
|
|
337
270
|
}
|
|
338
271
|
}
|
|
339
|
-
// Nested .git safety (#2616): detect nested .git directories created by
|
|
340
|
-
// scaffolding tools (create-next-app, cargo init, etc.). These produce
|
|
341
|
-
// gitlink entries (mode 160000) without .gitmodules — cleanup would destroy
|
|
342
|
-
// the only copy of the nested object database, causing permanent data loss.
|
|
343
|
-
// Fix: remove the nested .git dirs so git tracks the files as regular content.
|
|
344
|
-
const nestedGitDirs = findNestedGitDirs(resolvedWtPath);
|
|
345
|
-
if (nestedGitDirs.length > 0) {
|
|
346
|
-
for (const nestedDir of nestedGitDirs) {
|
|
347
|
-
const nestedGitPath = join(nestedDir, ".git");
|
|
348
|
-
try {
|
|
349
|
-
rmSync(nestedGitPath, { recursive: true, force: true });
|
|
350
|
-
logWarning("reconcile", `Removed nested .git directory from scaffolded project to prevent data loss (#2616)`, { worktree: name, nestedRepo: nestedDir });
|
|
351
|
-
}
|
|
352
|
-
catch {
|
|
353
|
-
logWarning("reconcile", `Failed to remove nested .git directory — files may be lost as orphaned gitlink`, { worktree: name, nestedRepo: nestedDir });
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
272
|
// Remove worktree: try non-force first when submodules have changes,
|
|
358
273
|
// falling back to force only after submodule state has been preserved.
|
|
359
274
|
const useForce = hasSubmoduleChanges ? false : force;
|
|
@@ -368,25 +283,6 @@ export function removeWorktree(basePath, name, opts = {}) {
|
|
|
368
283
|
}
|
|
369
284
|
catch { /* may fail */ }
|
|
370
285
|
}
|
|
371
|
-
// (#2821) If the worktree directory STILL exists after both native removal
|
|
372
|
-
// attempts (e.g. untracked files like ASSESSMENT/UAT-RESULT prevent git
|
|
373
|
-
// worktree remove), force-remove the git internal worktree metadata first,
|
|
374
|
-
// then remove the filesystem directory. Without this, the .git/worktrees/<name>
|
|
375
|
-
// lock prevents rmSync from cleaning up, and the orphaned worktree directory
|
|
376
|
-
// causes every subsequent `/gsd auto` to re-enter the stale worktree.
|
|
377
|
-
if (existsSync(resolvedWtPath)) {
|
|
378
|
-
try {
|
|
379
|
-
const wtInternalDir = join(basePath, ".git", "worktrees", name);
|
|
380
|
-
if (existsSync(wtInternalDir)) {
|
|
381
|
-
rmSync(wtInternalDir, { recursive: true, force: true });
|
|
382
|
-
}
|
|
383
|
-
rmSync(resolvedWtPath, { recursive: true, force: true });
|
|
384
|
-
}
|
|
385
|
-
catch {
|
|
386
|
-
logWarning("reconcile", `Worktree directory could not be removed after git internal cleanup: ${resolvedWtPath}. ` +
|
|
387
|
-
`Manual cleanup: rm -rf "${resolvedWtPath.replaceAll("\\", "/")}"`, { worktree: name });
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
286
|
// Prune stale entries so git knows the worktree is gone
|
|
391
287
|
nativeWorktreePrune(basePath);
|
|
392
288
|
if (deleteBranch) {
|
|
@@ -248,12 +248,7 @@ export class WorktreeResolver {
|
|
|
248
248
|
eventType: "worktree-merge-start",
|
|
249
249
|
data: { milestoneId, mode },
|
|
250
250
|
});
|
|
251
|
-
|
|
252
|
-
// regardless of the current isolation config. This prevents data loss when
|
|
253
|
-
// the default isolation mode changes between versions (e.g., "worktree" ->
|
|
254
|
-
// "none"): the worktree branch still holds real commits that need merging.
|
|
255
|
-
const inWorktree = this.deps.isInAutoWorktree(this.s.basePath) && this.s.originalBasePath;
|
|
256
|
-
if (mode === "none" && !inWorktree) {
|
|
251
|
+
if (mode === "none") {
|
|
257
252
|
debugLog("WorktreeResolver", {
|
|
258
253
|
action: "mergeAndExit",
|
|
259
254
|
milestoneId,
|
|
@@ -262,7 +257,8 @@ export class WorktreeResolver {
|
|
|
262
257
|
});
|
|
263
258
|
return;
|
|
264
259
|
}
|
|
265
|
-
if (mode === "worktree" ||
|
|
260
|
+
if (mode === "worktree" ||
|
|
261
|
+
(this.deps.isInAutoWorktree(this.s.basePath) && this.s.originalBasePath)) {
|
|
266
262
|
this._mergeWorktreeMode(milestoneId, ctx);
|
|
267
263
|
}
|
|
268
264
|
else if (mode === "branch") {
|
|
@@ -312,19 +308,6 @@ export class WorktreeResolver {
|
|
|
312
308
|
if (roadmapPath) {
|
|
313
309
|
const roadmapContent = this.deps.readFileSync(roadmapPath, "utf-8");
|
|
314
310
|
const mergeResult = this.deps.mergeMilestoneToMain(originalBase, milestoneId, roadmapContent);
|
|
315
|
-
// #2945 Bug 3: mergeMilestoneToMain performs best-effort worktree
|
|
316
|
-
// cleanup internally (step 12), but it can silently fail on Windows
|
|
317
|
-
// or when the worktree directory is locked. Perform a secondary
|
|
318
|
-
// teardown here to ensure the worktree is properly cleaned up.
|
|
319
|
-
// This is idempotent — if the worktree was already removed,
|
|
320
|
-
// teardownAutoWorktree handles the no-op case gracefully.
|
|
321
|
-
try {
|
|
322
|
-
this.deps.teardownAutoWorktree(originalBase, milestoneId);
|
|
323
|
-
}
|
|
324
|
-
catch {
|
|
325
|
-
// Best-effort — the primary cleanup in mergeMilestoneToMain may
|
|
326
|
-
// have already removed the worktree.
|
|
327
|
-
}
|
|
328
311
|
if (mergeResult.codeFilesChanged) {
|
|
329
312
|
ctx.notify(`Milestone ${milestoneId} merged to main.${mergeResult.pushed ? " Pushed to remote." : ""}`, "info");
|
|
330
313
|
}
|
|
@@ -74,9 +74,7 @@ function readConfigs() {
|
|
|
74
74
|
return servers;
|
|
75
75
|
}
|
|
76
76
|
function getServerConfig(name) {
|
|
77
|
-
|
|
78
|
-
return readConfigs().find((s) => s.name === trimmed ||
|
|
79
|
-
s.name.toLowerCase() === trimmed.toLowerCase());
|
|
77
|
+
return readConfigs().find((s) => s.name === name);
|
|
80
78
|
}
|
|
81
79
|
/** Resolve ${VAR} references in env values against process.env. */
|
|
82
80
|
function resolveEnv(env) {
|
|
@@ -92,14 +90,12 @@ function resolveEnv(env) {
|
|
|
92
90
|
return resolved;
|
|
93
91
|
}
|
|
94
92
|
async function getOrConnect(name, signal) {
|
|
93
|
+
const existing = connections.get(name);
|
|
94
|
+
if (existing)
|
|
95
|
+
return existing.client;
|
|
95
96
|
const config = getServerConfig(name);
|
|
96
97
|
if (!config)
|
|
97
98
|
throw new Error(`Unknown MCP server: "${name}". Use mcp_servers to list available servers.`);
|
|
98
|
-
// Always use config.name as the canonical cache key so that variant
|
|
99
|
-
// casing / whitespace still hits the same connection.
|
|
100
|
-
const existing = connections.get(config.name);
|
|
101
|
-
if (existing)
|
|
102
|
-
return existing.client;
|
|
103
99
|
const client = new Client({ name: "gsd", version: "1.0.0" });
|
|
104
100
|
let transport;
|
|
105
101
|
if (config.transport === "stdio" && config.command) {
|
|
@@ -112,14 +108,14 @@ async function getOrConnect(name, signal) {
|
|
|
112
108
|
});
|
|
113
109
|
}
|
|
114
110
|
else if (config.transport === "http" && config.url) {
|
|
115
|
-
const resolvedUrl = config.url.replace(/\$\{([^}]+)\}/g, (_,
|
|
111
|
+
const resolvedUrl = config.url.replace(/\$\{([^}]+)\}/g, (_, name) => process.env[name] ?? "");
|
|
116
112
|
transport = new StreamableHTTPClientTransport(new URL(resolvedUrl));
|
|
117
113
|
}
|
|
118
114
|
else {
|
|
119
|
-
throw new Error(`Server "${
|
|
115
|
+
throw new Error(`Server "${name}" has unsupported transport: ${config.transport}`);
|
|
120
116
|
}
|
|
121
117
|
await client.connect(transport, { signal, timeout: 30000 });
|
|
122
|
-
connections.set(
|
|
118
|
+
connections.set(name, { client, transport });
|
|
123
119
|
return client;
|
|
124
120
|
}
|
|
125
121
|
async function closeAll() {
|
|
@@ -8,6 +8,6 @@
|
|
|
8
8
|
"provides": {
|
|
9
9
|
"tools": ["search-the-web", "fetch_page", "search_and_read", "web_search"],
|
|
10
10
|
"commands": ["search-provider"],
|
|
11
|
-
"hooks": ["
|
|
11
|
+
"hooks": ["model_select", "before_provider_request"]
|
|
12
12
|
}
|
|
13
13
|
}
|
|
@@ -28,7 +28,7 @@ import { Editor, Key, matchesKey, truncateToWidth, } from "@gsd/pi-tui";
|
|
|
28
28
|
import { makeUI, INDENT } from "./ui.js";
|
|
29
29
|
// ─── Constants ────────────────────────────────────────────────────────────────
|
|
30
30
|
const OTHER_OPTION_LABEL = "None of the above";
|
|
31
|
-
const OTHER_OPTION_DESCRIPTION = "
|
|
31
|
+
const OTHER_OPTION_DESCRIPTION = "Press TAB to add optional notes.";
|
|
32
32
|
// ─── Wrap-up screen ───────────────────────────────────────────────────────────
|
|
33
33
|
export async function showWrapUpScreen(opts, ctx) {
|
|
34
34
|
return ctx.ui.custom((tui, theme, _kb, done) => {
|
|
@@ -199,16 +199,6 @@ export async function showInterviewRound(questions, opts, ctx) {
|
|
|
199
199
|
if (!isMultiSelect(currentIdx)) {
|
|
200
200
|
states[currentIdx].committedIndex = states[currentIdx].cursorIndex;
|
|
201
201
|
}
|
|
202
|
-
// Auto-open the notes field when "None of the above" is selected
|
|
203
|
-
// so the user can immediately provide a free-text explanation
|
|
204
|
-
// instead of being trapped in a re-asking loop (bug #2715).
|
|
205
|
-
if (!isMultiSelect(currentIdx) && states[currentIdx].cursorIndex === noneOrDoneIdx(currentIdx)) {
|
|
206
|
-
states[currentIdx].notesVisible = true;
|
|
207
|
-
focusNotes = true;
|
|
208
|
-
loadStateToEditor();
|
|
209
|
-
refresh();
|
|
210
|
-
return;
|
|
211
|
-
}
|
|
212
202
|
if (isMultiQuestion && currentIdx < questions.length - 1) {
|
|
213
203
|
let next = currentIdx + 1;
|
|
214
204
|
for (let i = 0; i < questions.length; i++) {
|