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
|
@@ -4,7 +4,7 @@ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { tmpdir } from "node:os";
|
|
6
6
|
|
|
7
|
-
import { resolvePreferredModelConfig
|
|
7
|
+
import { resolvePreferredModelConfig } from "../auto-model-selection.js";
|
|
8
8
|
|
|
9
9
|
function makeTempDir(prefix: string): string {
|
|
10
10
|
return mkdtempSync(join(tmpdir(), prefix));
|
|
@@ -137,73 +137,3 @@ test("resolvePreferredModelConfig keeps explicit phase models as the ceiling", (
|
|
|
137
137
|
rmSync(tempGsdHome, { recursive: true, force: true });
|
|
138
138
|
}
|
|
139
139
|
});
|
|
140
|
-
|
|
141
|
-
// ─── resolveModelId tests ─────────────────────────────────────────────────
|
|
142
|
-
|
|
143
|
-
test("resolveModelId: bare ID resolves to anthropic over claude-code when session is claude-code (#2905)", () => {
|
|
144
|
-
const availableModels = [
|
|
145
|
-
{ id: "claude-sonnet-4-6", provider: "anthropic" },
|
|
146
|
-
{ id: "claude-sonnet-4-6", provider: "claude-code" },
|
|
147
|
-
];
|
|
148
|
-
|
|
149
|
-
// Bug: when currentProvider is "claude-code", bare ID "claude-sonnet-4-6"
|
|
150
|
-
// resolves to claude-code/claude-sonnet-4-6 instead of anthropic/claude-sonnet-4-6
|
|
151
|
-
const result = resolveModelId("claude-sonnet-4-6", availableModels, "claude-code");
|
|
152
|
-
assert.ok(result, "should resolve a model");
|
|
153
|
-
assert.equal(result.provider, "anthropic", "bare ID must resolve to anthropic, not claude-code");
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
test("resolveModelId: bare ID still prefers current provider when it is a first-class API provider", () => {
|
|
157
|
-
const availableModels = [
|
|
158
|
-
{ id: "claude-sonnet-4-6", provider: "anthropic" },
|
|
159
|
-
{ id: "claude-sonnet-4-6", provider: "bedrock" },
|
|
160
|
-
];
|
|
161
|
-
|
|
162
|
-
const result = resolveModelId("claude-sonnet-4-6", availableModels, "bedrock");
|
|
163
|
-
assert.ok(result, "should resolve a model");
|
|
164
|
-
assert.equal(result.provider, "bedrock", "bare ID should prefer current provider when it is a real API provider");
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
test("resolveModelId: explicit provider/model format still resolves to claude-code when specified", () => {
|
|
168
|
-
const availableModels = [
|
|
169
|
-
{ id: "claude-sonnet-4-6", provider: "anthropic" },
|
|
170
|
-
{ id: "claude-sonnet-4-6", provider: "claude-code" },
|
|
171
|
-
];
|
|
172
|
-
|
|
173
|
-
const result = resolveModelId("claude-code/claude-sonnet-4-6", availableModels, "anthropic");
|
|
174
|
-
assert.ok(result, "should resolve a model");
|
|
175
|
-
assert.equal(result.provider, "claude-code", "explicit provider prefix must be respected");
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
test("resolveModelId: bare ID with only one provider works normally", () => {
|
|
179
|
-
const availableModels = [
|
|
180
|
-
{ id: "claude-sonnet-4-6", provider: "anthropic" },
|
|
181
|
-
];
|
|
182
|
-
|
|
183
|
-
const result = resolveModelId("claude-sonnet-4-6", availableModels, "anthropic");
|
|
184
|
-
assert.ok(result, "should resolve a model");
|
|
185
|
-
assert.equal(result.provider, "anthropic");
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
test("resolveModelId: bare ID with claude-code as only provider still resolves", () => {
|
|
189
|
-
const availableModels = [
|
|
190
|
-
{ id: "claude-sonnet-4-6", provider: "claude-code" },
|
|
191
|
-
];
|
|
192
|
-
|
|
193
|
-
// If claude-code is the ONLY provider for this model, it should still resolve
|
|
194
|
-
const result = resolveModelId("claude-sonnet-4-6", availableModels, "claude-code");
|
|
195
|
-
assert.ok(result, "should resolve even when only available via claude-code");
|
|
196
|
-
assert.equal(result.provider, "claude-code");
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
test("resolveModelId: anthropic wins over claude-code regardless of list order", () => {
|
|
200
|
-
const availableModels = [
|
|
201
|
-
{ id: "claude-sonnet-4-6", provider: "claude-code" },
|
|
202
|
-
{ id: "claude-sonnet-4-6", provider: "anthropic" },
|
|
203
|
-
];
|
|
204
|
-
|
|
205
|
-
// Even when claude-code appears first in the list, anthropic should win
|
|
206
|
-
const result = resolveModelId("claude-sonnet-4-6", availableModels, "claude-code");
|
|
207
|
-
assert.ok(result, "should resolve a model");
|
|
208
|
-
assert.equal(result.provider, "anthropic", "anthropic must win over claude-code regardless of list order");
|
|
209
|
-
});
|
|
@@ -19,11 +19,8 @@ import {
|
|
|
19
19
|
appendCapture,
|
|
20
20
|
loadAllCaptures,
|
|
21
21
|
loadPendingCaptures,
|
|
22
|
-
loadActionableCaptures,
|
|
23
22
|
hasPendingCaptures,
|
|
24
23
|
markCaptureResolved,
|
|
25
|
-
markCaptureExecuted,
|
|
26
|
-
stampCaptureMilestone,
|
|
27
24
|
resolveCapturesPath,
|
|
28
25
|
parseTriageOutput,
|
|
29
26
|
} from "../captures.ts";
|
|
@@ -422,103 +419,3 @@ test("triage: parseTriageOutput preserves affectedFiles and targetSlice", () =>
|
|
|
422
419
|
assert.strictEqual(results[1].targetSlice, "S04");
|
|
423
420
|
assert.strictEqual(results[1].affectedFiles, undefined);
|
|
424
421
|
});
|
|
425
|
-
|
|
426
|
-
// ─── Stale Quick-Task Captures (#2872) ────────────────────────────────────────
|
|
427
|
-
|
|
428
|
-
test("captures: markCaptureResolved stores milestone ID when provided", (t) => {
|
|
429
|
-
const tmp = makeTempDir("cap-milestone");
|
|
430
|
-
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
431
|
-
|
|
432
|
-
const id = appendCapture(tmp, "fix dialog width");
|
|
433
|
-
markCaptureResolved(tmp, id, "quick-task", "widen the dialog", "small fix", "M003");
|
|
434
|
-
|
|
435
|
-
const all = loadAllCaptures(tmp);
|
|
436
|
-
assert.strictEqual(all.length, 1);
|
|
437
|
-
assert.strictEqual(all[0].resolvedInMilestone, "M003", "should store milestone ID");
|
|
438
|
-
});
|
|
439
|
-
|
|
440
|
-
test("captures: loadActionableCaptures excludes captures resolved in prior milestones", (t) => {
|
|
441
|
-
const tmp = makeTempDir("cap-stale-filter");
|
|
442
|
-
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
443
|
-
|
|
444
|
-
// Capture resolved in M003 (prior milestone)
|
|
445
|
-
const id1 = appendCapture(tmp, "dialog too narrow");
|
|
446
|
-
markCaptureResolved(tmp, id1, "quick-task", "widen it", "small fix", "M003");
|
|
447
|
-
|
|
448
|
-
// Capture resolved in M004 (current milestone)
|
|
449
|
-
const id2 = appendCapture(tmp, "button misaligned");
|
|
450
|
-
markCaptureResolved(tmp, id2, "quick-task", "fix alignment", "css fix", "M004");
|
|
451
|
-
|
|
452
|
-
// Capture resolved without milestone context (legacy)
|
|
453
|
-
const id3 = appendCapture(tmp, "typo in label");
|
|
454
|
-
markCaptureResolved(tmp, id3, "quick-task", "fix typo", "trivial");
|
|
455
|
-
|
|
456
|
-
// When loading for M004, only M004 and no-milestone captures should be returned
|
|
457
|
-
const actionable = loadActionableCaptures(tmp, "M004");
|
|
458
|
-
const ids = actionable.map(c => c.id);
|
|
459
|
-
|
|
460
|
-
assert.ok(!ids.includes(id1), "should exclude capture resolved in M003");
|
|
461
|
-
assert.ok(ids.includes(id2), "should include capture resolved in M004");
|
|
462
|
-
assert.ok(ids.includes(id3), "should include capture with no milestone (legacy)");
|
|
463
|
-
});
|
|
464
|
-
|
|
465
|
-
test("captures: loadActionableCaptures without milestone returns all actionable", (t) => {
|
|
466
|
-
const tmp = makeTempDir("cap-no-milestone-filter");
|
|
467
|
-
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
468
|
-
|
|
469
|
-
const id1 = appendCapture(tmp, "issue one");
|
|
470
|
-
markCaptureResolved(tmp, id1, "quick-task", "fix it", "small", "M003");
|
|
471
|
-
|
|
472
|
-
const id2 = appendCapture(tmp, "issue two");
|
|
473
|
-
markCaptureResolved(tmp, id2, "inject", "inject it", "needed", "M004");
|
|
474
|
-
|
|
475
|
-
// Without milestone filter, all actionable captures are returned (backward compat)
|
|
476
|
-
const actionable = loadActionableCaptures(tmp);
|
|
477
|
-
assert.strictEqual(actionable.length, 2, "should return all actionable without filter");
|
|
478
|
-
});
|
|
479
|
-
|
|
480
|
-
test("captures: loadActionableCaptures excludes already-executed captures", (t) => {
|
|
481
|
-
const tmp = makeTempDir("cap-executed-filter");
|
|
482
|
-
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
483
|
-
|
|
484
|
-
const id1 = appendCapture(tmp, "already done");
|
|
485
|
-
markCaptureResolved(tmp, id1, "quick-task", "fix it", "small", "M004");
|
|
486
|
-
markCaptureExecuted(tmp, id1);
|
|
487
|
-
|
|
488
|
-
const id2 = appendCapture(tmp, "still pending");
|
|
489
|
-
markCaptureResolved(tmp, id2, "quick-task", "fix it too", "small", "M004");
|
|
490
|
-
|
|
491
|
-
const actionable = loadActionableCaptures(tmp, "M004");
|
|
492
|
-
assert.strictEqual(actionable.length, 1, "should exclude executed capture");
|
|
493
|
-
assert.strictEqual(actionable[0].id, id2);
|
|
494
|
-
});
|
|
495
|
-
|
|
496
|
-
test("captures: stampCaptureMilestone adds milestone to capture missing it", (t) => {
|
|
497
|
-
const tmp = makeTempDir("cap-stamp-milestone");
|
|
498
|
-
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
499
|
-
|
|
500
|
-
const id = appendCapture(tmp, "fix alignment");
|
|
501
|
-
markCaptureResolved(tmp, id, "quick-task", "fix it", "small");
|
|
502
|
-
|
|
503
|
-
// Before stamping, no milestone
|
|
504
|
-
let all = loadAllCaptures(tmp);
|
|
505
|
-
assert.strictEqual(all[0].resolvedInMilestone, undefined, "should have no milestone initially");
|
|
506
|
-
|
|
507
|
-
stampCaptureMilestone(tmp, id, "M004");
|
|
508
|
-
|
|
509
|
-
all = loadAllCaptures(tmp);
|
|
510
|
-
assert.strictEqual(all[0].resolvedInMilestone, "M004", "should have milestone after stamping");
|
|
511
|
-
});
|
|
512
|
-
|
|
513
|
-
test("captures: stampCaptureMilestone is no-op if milestone already present", (t) => {
|
|
514
|
-
const tmp = makeTempDir("cap-stamp-noop");
|
|
515
|
-
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
516
|
-
|
|
517
|
-
const id = appendCapture(tmp, "fix alignment");
|
|
518
|
-
markCaptureResolved(tmp, id, "quick-task", "fix it", "small", "M003");
|
|
519
|
-
|
|
520
|
-
stampCaptureMilestone(tmp, id, "M004");
|
|
521
|
-
|
|
522
|
-
const all = loadAllCaptures(tmp);
|
|
523
|
-
assert.strictEqual(all[0].resolvedInMilestone, "M003", "should keep original milestone");
|
|
524
|
-
});
|
|
@@ -237,33 +237,6 @@ describe("complete-milestone", () => {
|
|
|
237
237
|
}
|
|
238
238
|
});
|
|
239
239
|
|
|
240
|
-
test("step 11 specifies write tool for PROJECT.md update (#2946)", () => {
|
|
241
|
-
const prompt = loadPromptFromWorktree("complete-milestone", {
|
|
242
|
-
workingDirectory: "/tmp/test-project",
|
|
243
|
-
milestoneId: "M001",
|
|
244
|
-
milestoneTitle: "Tool Guidance Test",
|
|
245
|
-
roadmapPath: ".gsd/milestones/M001/M001-ROADMAP.md",
|
|
246
|
-
inlinedContext: "context",
|
|
247
|
-
milestoneSummaryPath: ".gsd/milestones/M001/M001-SUMMARY.md",
|
|
248
|
-
skillActivation: "",
|
|
249
|
-
});
|
|
250
|
-
|
|
251
|
-
// Step 11 must explicitly name the `write` tool so the LLM doesn't
|
|
252
|
-
// confuse it with `edit` (which requires path + oldText + newText).
|
|
253
|
-
// See: https://github.com/gsd-build/gsd-2/issues/2946
|
|
254
|
-
assert.ok(
|
|
255
|
-
/PROJECT\.md.*\bwrite\b/i.test(prompt) || /\bwrite\b.*PROJECT\.md/i.test(prompt),
|
|
256
|
-
"step 11 must name the `write` tool when updating PROJECT.md",
|
|
257
|
-
);
|
|
258
|
-
|
|
259
|
-
// The prompt must NOT leave tool choice ambiguous for PROJECT.md
|
|
260
|
-
// Verify it mentions the required parameter (`content` or `path`)
|
|
261
|
-
assert.ok(
|
|
262
|
-
prompt.includes("`.gsd/PROJECT.md`") || prompt.includes('".gsd/PROJECT.md"'),
|
|
263
|
-
"step 11 must reference the PROJECT.md path explicitly",
|
|
264
|
-
);
|
|
265
|
-
});
|
|
266
|
-
|
|
267
240
|
test("deriveState completing-milestone integration", async () => {
|
|
268
241
|
const { deriveState, isMilestoneComplete } = await import("../state.ts");
|
|
269
242
|
const { invalidateAllCaches: invalidateAllCachesDynamic } = await import("../cache.ts");
|
|
@@ -406,27 +406,6 @@ console.log('\n=== complete-slice: handler with missing roadmap ===');
|
|
|
406
406
|
cleanup(dbPath);
|
|
407
407
|
}
|
|
408
408
|
|
|
409
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
410
|
-
// complete-slice: step 13 specifies write tool for PROJECT.md (#2946)
|
|
411
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
412
|
-
|
|
413
|
-
console.log('\n=== complete-slice: step 13 specifies write tool for PROJECT.md (#2946) ===');
|
|
414
|
-
{
|
|
415
|
-
const promptPath = path.join(
|
|
416
|
-
path.dirname(new URL(import.meta.url).pathname),
|
|
417
|
-
'..', 'prompts', 'complete-slice.md',
|
|
418
|
-
);
|
|
419
|
-
const prompt = fs.readFileSync(promptPath, 'utf-8');
|
|
420
|
-
|
|
421
|
-
// Step 13 must explicitly name the `write` tool so the LLM doesn't
|
|
422
|
-
// confuse it with `edit` (which requires path + oldText + newText).
|
|
423
|
-
// See: https://github.com/gsd-build/gsd-2/issues/2946
|
|
424
|
-
const mentionsWriteTool =
|
|
425
|
-
/PROJECT\.md.*\bwrite\b/i.test(prompt) ||
|
|
426
|
-
/\bwrite\b.*PROJECT\.md/i.test(prompt);
|
|
427
|
-
assertTrue(mentionsWriteTool, 'step 13 must name the `write` tool when updating PROJECT.md');
|
|
428
|
-
}
|
|
429
|
-
|
|
430
409
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
431
410
|
|
|
432
411
|
report();
|
|
@@ -416,18 +416,23 @@ describe('db-writer', () => {
|
|
|
416
416
|
}
|
|
417
417
|
});
|
|
418
418
|
|
|
419
|
-
test('updateRequirementInDb —
|
|
419
|
+
test('updateRequirementInDb — not found', async () => {
|
|
420
420
|
const tmpDir = makeTmpDir();
|
|
421
421
|
const dbPath = path.join(tmpDir, '.gsd', 'gsd.db');
|
|
422
422
|
openDatabase(dbPath);
|
|
423
423
|
|
|
424
424
|
try {
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
425
|
+
let threw = false;
|
|
426
|
+
try {
|
|
427
|
+
await updateRequirementInDb('R999', { status: 'validated' }, tmpDir);
|
|
428
|
+
} catch (err) {
|
|
429
|
+
threw = true;
|
|
430
|
+
assert.ok(
|
|
431
|
+
(err as Error).message.includes('R999'),
|
|
432
|
+
'error message mentions the missing ID',
|
|
433
|
+
);
|
|
434
|
+
}
|
|
435
|
+
assert.ok(threw, 'throws when requirement not found');
|
|
431
436
|
} finally {
|
|
432
437
|
closeDatabase();
|
|
433
438
|
cleanupDir(tmpDir);
|
|
@@ -4,7 +4,7 @@ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
|
4
4
|
import { join } from 'node:path';
|
|
5
5
|
import { tmpdir } from 'node:os';
|
|
6
6
|
|
|
7
|
-
import { deriveState, invalidateStateCache, _deriveStateImpl, deriveStateFromDb
|
|
7
|
+
import { deriveState, invalidateStateCache, _deriveStateImpl, deriveStateFromDb } from '../state.ts';
|
|
8
8
|
import {
|
|
9
9
|
openDatabase,
|
|
10
10
|
closeDatabase,
|
|
@@ -934,8 +934,8 @@ describe('derive-state-db', async () => {
|
|
|
934
934
|
}
|
|
935
935
|
});
|
|
936
936
|
|
|
937
|
-
// ─── Test 21: Ghost milestone skipped
|
|
938
|
-
test('derive-state-db: ghost milestone skipped
|
|
937
|
+
// ─── Test 21: Ghost milestone skipped ─────────────────────────────────
|
|
938
|
+
test('derive-state-db: ghost milestone skipped', async () => {
|
|
939
939
|
const base = createFixtureBase();
|
|
940
940
|
try {
|
|
941
941
|
// Ghost: milestone dir exists with only META.json, no context/roadmap/summary
|
|
@@ -948,7 +948,8 @@ describe('derive-state-db', async () => {
|
|
|
948
948
|
const fileState = await _deriveStateImpl(base);
|
|
949
949
|
|
|
950
950
|
openDatabase(':memory:');
|
|
951
|
-
//
|
|
951
|
+
// Ghost milestone in DB — no slices, status active
|
|
952
|
+
insertMilestone({ id: 'M001', title: '', status: 'active' });
|
|
952
953
|
insertMilestone({ id: 'M002', title: 'Real', status: 'active' });
|
|
953
954
|
|
|
954
955
|
invalidateStateCache();
|
|
@@ -1050,78 +1051,4 @@ describe('derive-state-db', async () => {
|
|
|
1050
1051
|
closeDatabase();
|
|
1051
1052
|
}
|
|
1052
1053
|
});
|
|
1053
|
-
|
|
1054
|
-
// ─── Queued milestone with worktree not flagged as ghost (#2921) ──────
|
|
1055
|
-
test('derive-state-db: queued milestone with worktree not flagged as ghost (#2921)', async () => {
|
|
1056
|
-
const base = createFixtureBase();
|
|
1057
|
-
try {
|
|
1058
|
-
// M001: complete milestone with summary
|
|
1059
|
-
writeFile(base, 'milestones/M001/M001-SUMMARY.md', '# M001 Summary\n\nDone.');
|
|
1060
|
-
|
|
1061
|
-
// M002: queued milestone — directory + slices dir exists, but no content files.
|
|
1062
|
-
// This is what happens when ensureMilestoneDbRow creates M002 but the DB row
|
|
1063
|
-
// is lost during worktree teardown.
|
|
1064
|
-
mkdirSync(join(base, '.gsd', 'milestones', 'M002', 'slices'), { recursive: true });
|
|
1065
|
-
|
|
1066
|
-
// A worktree exists for M002, proving it's a legitimate milestone
|
|
1067
|
-
mkdirSync(join(base, '.gsd', 'worktrees', 'M002'), { recursive: true });
|
|
1068
|
-
|
|
1069
|
-
// isGhostMilestone should NOT treat M002 as ghost when worktree exists
|
|
1070
|
-
assert.ok(!isGhostMilestone(base, 'M002'), 'ghost-wt: M002 with worktree is NOT a ghost');
|
|
1071
|
-
|
|
1072
|
-
// DB has M001 complete but M002 row was lost
|
|
1073
|
-
openDatabase(':memory:');
|
|
1074
|
-
insertMilestone({ id: 'M001', title: 'First', status: 'complete' });
|
|
1075
|
-
// No M002 row — simulates DB row loss during worktree teardown
|
|
1076
|
-
|
|
1077
|
-
invalidateStateCache();
|
|
1078
|
-
const dbState = await deriveStateFromDb(base);
|
|
1079
|
-
|
|
1080
|
-
// M002 should be reconciled from disk (not skipped as ghost) and become active
|
|
1081
|
-
const m002Entry = dbState.registry.find(e => e.id === 'M002');
|
|
1082
|
-
assert.ok(m002Entry !== undefined, 'ghost-wt: M002 should be in registry');
|
|
1083
|
-
assert.deepStrictEqual(dbState.activeMilestone?.id, 'M002', 'ghost-wt: M002 should be active');
|
|
1084
|
-
// Should NOT be phase: complete
|
|
1085
|
-
assert.notEqual(dbState.phase, 'complete', 'ghost-wt: phase should not be complete');
|
|
1086
|
-
|
|
1087
|
-
closeDatabase();
|
|
1088
|
-
} finally {
|
|
1089
|
-
closeDatabase();
|
|
1090
|
-
cleanup(base);
|
|
1091
|
-
}
|
|
1092
|
-
});
|
|
1093
|
-
|
|
1094
|
-
// ─── Queued milestone with DB row not flagged as ghost (#2921) ────────
|
|
1095
|
-
test('derive-state-db: queued milestone with DB row not flagged as ghost (#2921)', async () => {
|
|
1096
|
-
const base = createFixtureBase();
|
|
1097
|
-
try {
|
|
1098
|
-
// M001: complete milestone with summary
|
|
1099
|
-
writeFile(base, 'milestones/M001/M001-SUMMARY.md', '# M001 Summary\n\nDone.');
|
|
1100
|
-
|
|
1101
|
-
// M002: queued milestone — directory exists, no content files, but has DB row
|
|
1102
|
-
mkdirSync(join(base, '.gsd', 'milestones', 'M002', 'slices'), { recursive: true });
|
|
1103
|
-
|
|
1104
|
-
// DB has both M001 complete and M002 queued
|
|
1105
|
-
openDatabase(':memory:');
|
|
1106
|
-
insertMilestone({ id: 'M001', title: 'First', status: 'complete' });
|
|
1107
|
-
insertMilestone({ id: 'M002', title: 'Second', status: 'queued' });
|
|
1108
|
-
|
|
1109
|
-
// isGhostMilestone should NOT treat M002 as ghost when DB row exists
|
|
1110
|
-
assert.ok(!isGhostMilestone(base, 'M002'), 'ghost-dbrow: M002 with DB row is NOT a ghost');
|
|
1111
|
-
|
|
1112
|
-
invalidateStateCache();
|
|
1113
|
-
const dbState = await deriveStateFromDb(base);
|
|
1114
|
-
|
|
1115
|
-
// M002 should not be skipped
|
|
1116
|
-
const m002Entry = dbState.registry.find(e => e.id === 'M002');
|
|
1117
|
-
assert.ok(m002Entry !== undefined, 'ghost-dbrow: M002 should be in registry');
|
|
1118
|
-
assert.deepStrictEqual(dbState.activeMilestone?.id, 'M002', 'ghost-dbrow: M002 should be active');
|
|
1119
|
-
assert.notEqual(dbState.phase, 'complete', 'ghost-dbrow: phase should not be complete');
|
|
1120
|
-
|
|
1121
|
-
closeDatabase();
|
|
1122
|
-
} finally {
|
|
1123
|
-
closeDatabase();
|
|
1124
|
-
cleanup(base);
|
|
1125
|
-
}
|
|
1126
|
-
});
|
|
1127
1054
|
});
|
|
@@ -930,35 +930,6 @@ slice: S01
|
|
|
930
930
|
}
|
|
931
931
|
});
|
|
932
932
|
|
|
933
|
-
// ─── Test: queued milestone with worktree not flagged as ghost (#2921) ──
|
|
934
|
-
test('queued milestone with worktree not flagged as ghost (#2921)', async () => {
|
|
935
|
-
const base = createFixtureBase();
|
|
936
|
-
try {
|
|
937
|
-
// Create a milestone directory with only an empty slices subdir — no content files.
|
|
938
|
-
// This would normally be a ghost, but it has a worktree directory.
|
|
939
|
-
const milestoneDir = join(base, '.gsd', 'milestones', 'M002');
|
|
940
|
-
mkdirSync(join(milestoneDir, 'slices'), { recursive: true });
|
|
941
|
-
|
|
942
|
-
// Create a worktree directory for M002, simulating an active worktree
|
|
943
|
-
const worktreeDir = join(base, '.gsd', 'worktrees', 'M002');
|
|
944
|
-
mkdirSync(worktreeDir, { recursive: true });
|
|
945
|
-
|
|
946
|
-
// isGhostMilestone should return false because the worktree exists
|
|
947
|
-
assert.ok(!isGhostMilestone(base, 'M002'), 'M002 with worktree should NOT be a ghost');
|
|
948
|
-
|
|
949
|
-
// Also create a completed M001 so deriveState has something before M002
|
|
950
|
-
writeMilestoneSummary(base, 'M001', '# M001 Summary\n\nDone.');
|
|
951
|
-
|
|
952
|
-
const state = await deriveState(base);
|
|
953
|
-
// M002 should appear in the registry (not filtered as ghost)
|
|
954
|
-
const m002Entry = state.registry.find(e => e.id === 'M002');
|
|
955
|
-
assert.ok(m002Entry !== undefined, 'M002 should be in registry when worktree exists');
|
|
956
|
-
assert.deepStrictEqual(state.activeMilestone?.id, 'M002', 'M002 should be active milestone');
|
|
957
|
-
} finally {
|
|
958
|
-
cleanup(base);
|
|
959
|
-
}
|
|
960
|
-
});
|
|
961
|
-
|
|
962
933
|
// ─── Test: zero-slice roadmap → pre-planning, not blocked (#1785) ────
|
|
963
934
|
test('zero-slice roadmap → pre-planning, not blocked (#1785)', async () => {
|
|
964
935
|
const base = createFixtureBase();
|
|
@@ -238,44 +238,4 @@ describe("discuss-queued-milestones (#2307)", () => {
|
|
|
238
238
|
"queued milestone picker must label entries with [queued] to distinguish from active",
|
|
239
239
|
);
|
|
240
240
|
});
|
|
241
|
-
|
|
242
|
-
// ─── #3150: allDiscussed early-return must not block queued milestone discussion ──
|
|
243
|
-
|
|
244
|
-
test("12. allDiscussed path checks for pending milestones before returning (#3150)", () => {
|
|
245
|
-
const source = readGuidedFlowSource();
|
|
246
|
-
|
|
247
|
-
// Extract the allDiscussed block — the if (allDiscussed) { ... } body
|
|
248
|
-
const allDiscussedMatch = source.match(
|
|
249
|
-
/const allDiscussed = pendingSlices\.every\([\s\S]*?\n if \(allDiscussed\) \{([\s\S]*?)\n \}/,
|
|
250
|
-
);
|
|
251
|
-
assert.ok(!!allDiscussedMatch, "allDiscussed guard block must exist in showDiscuss()");
|
|
252
|
-
|
|
253
|
-
if (allDiscussedMatch) {
|
|
254
|
-
const body = allDiscussedMatch[1];
|
|
255
|
-
// The fix must check for pending milestones and route to showDiscussQueuedMilestone
|
|
256
|
-
assert.ok(
|
|
257
|
-
body.includes("pending") && body.includes("showDiscussQueuedMilestone"),
|
|
258
|
-
"allDiscussed block must check for pending milestones and call showDiscussQueuedMilestone before returning (#3150)",
|
|
259
|
-
);
|
|
260
|
-
}
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
test("13. pendingSlices.length===0 path checks for pending milestones before returning (#3150)", () => {
|
|
264
|
-
const source = readGuidedFlowSource();
|
|
265
|
-
|
|
266
|
-
// Find the pendingSlices.length === 0 guard block
|
|
267
|
-
const zeroSlicesMatch = source.match(
|
|
268
|
-
/if \(pendingSlices\.length === 0\) \{([\s\S]*?)\n \}/,
|
|
269
|
-
);
|
|
270
|
-
assert.ok(!!zeroSlicesMatch, "pendingSlices.length === 0 guard block must exist in showDiscuss()");
|
|
271
|
-
|
|
272
|
-
if (zeroSlicesMatch) {
|
|
273
|
-
const body = zeroSlicesMatch[1];
|
|
274
|
-
// The fix must check for pending milestones and route to showDiscussQueuedMilestone
|
|
275
|
-
assert.ok(
|
|
276
|
-
body.includes("pending") && body.includes("showDiscussQueuedMilestone"),
|
|
277
|
-
"pendingSlices.length===0 block must check for pending milestones and call showDiscussQueuedMilestone before returning (#3150)",
|
|
278
|
-
);
|
|
279
|
-
}
|
|
280
|
-
});
|
|
281
241
|
});
|
|
@@ -87,26 +87,7 @@ export function load(url, context, nextLoad) {
|
|
|
87
87
|
emitDecoratorMetadata: true,
|
|
88
88
|
},
|
|
89
89
|
});
|
|
90
|
-
|
|
91
|
-
// workspace packages compiled as ESM can still use them. This avoids the
|
|
92
|
-
// need for import.meta.url behind indirect invocation patterns that fail in
|
|
93
|
-
// CJS and in dynamically-created scopes.
|
|
94
|
-
// Only inject globals that the source file doesn't already declare itself.
|
|
95
|
-
const preambleLines = [
|
|
96
|
-
'import { fileURLToPath as __preamble_fUTP } from "node:url";',
|
|
97
|
-
'import { dirname as __preamble_dn } from "node:path";',
|
|
98
|
-
'import { createRequire as __preamble_cR } from "node:module";',
|
|
99
|
-
];
|
|
100
|
-
if (!outputText.includes('const __filename') && !outputText.includes('let __filename')) {
|
|
101
|
-
preambleLines.push('const __filename = __preamble_fUTP(import.meta.url);');
|
|
102
|
-
}
|
|
103
|
-
if (!outputText.includes('const __dirname') && !outputText.includes('let __dirname')) {
|
|
104
|
-
preambleLines.push('const __dirname = __preamble_dn(__preamble_fUTP(import.meta.url));');
|
|
105
|
-
}
|
|
106
|
-
if (!outputText.includes('const require') && !outputText.includes('let require')) {
|
|
107
|
-
preambleLines.push('const require = __preamble_cR(import.meta.url);');
|
|
108
|
-
}
|
|
109
|
-
return { format: 'module', source: preambleLines.join('\n') + '\n' + outputText, shortCircuit: true };
|
|
90
|
+
return { format: 'module', source: outputText, shortCircuit: true };
|
|
110
91
|
}
|
|
111
92
|
return nextLoad(url, context);
|
|
112
93
|
}
|
|
@@ -484,120 +484,3 @@ test("runProviderChecks uses object provider field for anthropic-vertex models",
|
|
|
484
484
|
rmSync(repo, { recursive: true, force: true });
|
|
485
485
|
rmSync(tmpHome, { recursive: true, force: true });
|
|
486
486
|
});
|
|
487
|
-
|
|
488
|
-
// ─── Cross-provider routing: Codex & Gemini CLI (#2922) ────────────────────
|
|
489
|
-
|
|
490
|
-
test("runProviderChecks reports ok for Google via google-gemini-cli auth.json (#2922)", () => {
|
|
491
|
-
const repo = realpathSync(mkdtempSync(join(tmpdir(), "gsd-providers-gemini-cli-repo-")));
|
|
492
|
-
mkdirSync(join(repo, ".gsd"), { recursive: true });
|
|
493
|
-
writeFileSync(
|
|
494
|
-
join(repo, ".gsd", "PREFERENCES.md"),
|
|
495
|
-
[
|
|
496
|
-
"---",
|
|
497
|
-
"models:",
|
|
498
|
-
" execution: gemini-2.5-pro",
|
|
499
|
-
"---",
|
|
500
|
-
"",
|
|
501
|
-
].join("\n"),
|
|
502
|
-
);
|
|
503
|
-
|
|
504
|
-
const tmpHome = realpathSync(mkdtempSync(join(tmpdir(), "gsd-providers-gemini-cli-home-")));
|
|
505
|
-
const agentDir = join(tmpHome, ".gsd", "agent");
|
|
506
|
-
mkdirSync(agentDir, { recursive: true });
|
|
507
|
-
|
|
508
|
-
// google-gemini-cli OAuth in auth.json (no google API key)
|
|
509
|
-
const authData = {
|
|
510
|
-
"google-gemini-cli": { type: "oauth", apiKey: "ya29.gemini-cli-token", expires: Date.now() + 3_600_000 },
|
|
511
|
-
};
|
|
512
|
-
writeFileSync(join(agentDir, "auth.json"), JSON.stringify(authData));
|
|
513
|
-
|
|
514
|
-
withEnv({
|
|
515
|
-
HOME: tmpHome,
|
|
516
|
-
GEMINI_API_KEY: undefined,
|
|
517
|
-
GOOGLE_API_KEY: undefined,
|
|
518
|
-
}, () => {
|
|
519
|
-
withCwd(repo, () => {
|
|
520
|
-
const results = runProviderChecks();
|
|
521
|
-
const google = results.find(r => r.name === "google");
|
|
522
|
-
assert.ok(google, "google result should exist");
|
|
523
|
-
assert.equal(google!.status, "ok", "should be ok when google-gemini-cli auth is available (#2922)");
|
|
524
|
-
assert.ok(google!.message.includes("Google Gemini CLI"), "should mention Gemini CLI as the source (#2922)");
|
|
525
|
-
});
|
|
526
|
-
});
|
|
527
|
-
|
|
528
|
-
rmSync(repo, { recursive: true, force: true });
|
|
529
|
-
rmSync(tmpHome, { recursive: true, force: true });
|
|
530
|
-
});
|
|
531
|
-
|
|
532
|
-
test("runProviderChecks reports ok for OpenAI via openai-codex auth.json (#2922)", () => {
|
|
533
|
-
const repo = realpathSync(mkdtempSync(join(tmpdir(), "gsd-providers-codex-repo-")));
|
|
534
|
-
mkdirSync(join(repo, ".gsd"), { recursive: true });
|
|
535
|
-
writeFileSync(
|
|
536
|
-
join(repo, ".gsd", "PREFERENCES.md"),
|
|
537
|
-
[
|
|
538
|
-
"---",
|
|
539
|
-
"models:",
|
|
540
|
-
" execution: gpt-4o",
|
|
541
|
-
"---",
|
|
542
|
-
"",
|
|
543
|
-
].join("\n"),
|
|
544
|
-
);
|
|
545
|
-
|
|
546
|
-
const tmpHome = realpathSync(mkdtempSync(join(tmpdir(), "gsd-providers-codex-home-")));
|
|
547
|
-
const agentDir = join(tmpHome, ".gsd", "agent");
|
|
548
|
-
mkdirSync(agentDir, { recursive: true });
|
|
549
|
-
|
|
550
|
-
// openai-codex OAuth in auth.json (no openai API key)
|
|
551
|
-
const authData = {
|
|
552
|
-
"openai-codex": { type: "oauth", apiKey: "codex-token", expires: Date.now() + 3_600_000 },
|
|
553
|
-
};
|
|
554
|
-
writeFileSync(join(agentDir, "auth.json"), JSON.stringify(authData));
|
|
555
|
-
|
|
556
|
-
withEnv({
|
|
557
|
-
HOME: tmpHome,
|
|
558
|
-
OPENAI_API_KEY: undefined,
|
|
559
|
-
// Clear Copilot env vars so it doesn't route through Copilot
|
|
560
|
-
COPILOT_GITHUB_TOKEN: undefined,
|
|
561
|
-
GH_TOKEN: undefined,
|
|
562
|
-
GITHUB_TOKEN: undefined,
|
|
563
|
-
}, () => {
|
|
564
|
-
withCwd(repo, () => {
|
|
565
|
-
const results = runProviderChecks();
|
|
566
|
-
const openai = results.find(r => r.name === "openai");
|
|
567
|
-
assert.ok(openai, "openai result should exist");
|
|
568
|
-
assert.equal(openai!.status, "ok", "should be ok when openai-codex auth is available (#2922)");
|
|
569
|
-
assert.ok(openai!.message.includes("Codex"), "should mention Codex as the source (#2922)");
|
|
570
|
-
});
|
|
571
|
-
});
|
|
572
|
-
|
|
573
|
-
rmSync(repo, { recursive: true, force: true });
|
|
574
|
-
rmSync(tmpHome, { recursive: true, force: true });
|
|
575
|
-
});
|
|
576
|
-
|
|
577
|
-
test("PROVIDER_ROUTES includes google-gemini-cli as route for google (#2922)", async () => {
|
|
578
|
-
const { readFileSync: readFS } = await import("node:fs");
|
|
579
|
-
const { dirname: dirn, join: joinPath } = await import("node:path");
|
|
580
|
-
const { fileURLToPath: fileUrl } = await import("node:url");
|
|
581
|
-
const __dir = dirn(fileUrl(import.meta.url));
|
|
582
|
-
const src = readFS(joinPath(__dir, "..", "doctor-providers.ts"), "utf-8");
|
|
583
|
-
|
|
584
|
-
// PROVIDER_ROUTES must map google -> [..., "google-gemini-cli"]
|
|
585
|
-
assert.ok(
|
|
586
|
-
src.includes('"google-gemini-cli"'),
|
|
587
|
-
'PROVIDER_ROUTES must include "google-gemini-cli" as a route (#2922)',
|
|
588
|
-
);
|
|
589
|
-
});
|
|
590
|
-
|
|
591
|
-
test("PROVIDER_ROUTES includes openai-codex as route for openai (#2922)", async () => {
|
|
592
|
-
const { readFileSync: readFS } = await import("node:fs");
|
|
593
|
-
const { dirname: dirn, join: joinPath } = await import("node:path");
|
|
594
|
-
const { fileURLToPath: fileUrl } = await import("node:url");
|
|
595
|
-
const __dir = dirn(fileUrl(import.meta.url));
|
|
596
|
-
const src = readFS(joinPath(__dir, "..", "doctor-providers.ts"), "utf-8");
|
|
597
|
-
|
|
598
|
-
// PROVIDER_ROUTES must map openai -> [..., "openai-codex"]
|
|
599
|
-
assert.ok(
|
|
600
|
-
src.includes('"openai-codex"'),
|
|
601
|
-
'PROVIDER_ROUTES must include "openai-codex" as a route (#2922)',
|
|
602
|
-
);
|
|
603
|
-
});
|