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
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
// GSD State Machine Regression Tests — Event Replay & Reconciliation (#3161)
|
|
2
|
-
|
|
3
|
-
import { describe, test, beforeEach, afterEach } from "node:test";
|
|
4
|
-
import assert from "node:assert/strict";
|
|
5
|
-
import {
|
|
6
|
-
openDatabase,
|
|
7
|
-
closeDatabase,
|
|
8
|
-
insertMilestone,
|
|
9
|
-
insertSlice,
|
|
10
|
-
insertTask,
|
|
11
|
-
getTask,
|
|
12
|
-
updateTaskStatus,
|
|
13
|
-
insertVerificationEvidence,
|
|
14
|
-
upsertDecision,
|
|
15
|
-
} from "../gsd-db.ts";
|
|
16
|
-
import { extractEntityKey } from "../workflow-reconcile.ts";
|
|
17
|
-
|
|
18
|
-
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
19
|
-
|
|
20
|
-
const MID = "M001";
|
|
21
|
-
const SID = "S01";
|
|
22
|
-
const TID = "T01";
|
|
23
|
-
const TS = new Date().toISOString();
|
|
24
|
-
|
|
25
|
-
function setupDb(): void {
|
|
26
|
-
openDatabase(":memory:");
|
|
27
|
-
insertMilestone({ id: MID, title: "Test Milestone" });
|
|
28
|
-
insertSlice({ id: SID, milestoneId: MID, title: "Test Slice" });
|
|
29
|
-
insertTask({ id: TID, sliceId: SID, milestoneId: MID, title: "Test Task" });
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// ─── Tests ────────────────────────────────────────────────────────────────────
|
|
33
|
-
|
|
34
|
-
describe("event-replay-idempotency", () => {
|
|
35
|
-
beforeEach(() => {
|
|
36
|
-
setupDb();
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
afterEach(() => {
|
|
40
|
-
closeDatabase();
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
test("updateTaskStatus is idempotent for complete_task replay", () => {
|
|
44
|
-
// Simulates replaying a complete_task event twice (e.g. crash recovery)
|
|
45
|
-
updateTaskStatus(MID, SID, TID, "done", TS);
|
|
46
|
-
updateTaskStatus(MID, SID, TID, "done", TS);
|
|
47
|
-
|
|
48
|
-
const task = getTask(MID, SID, TID);
|
|
49
|
-
assert.ok(task !== null, "task should exist after status update");
|
|
50
|
-
assert.equal(task!.status, "done", "status should be 'done' after double replay");
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
test("updateTaskStatus is idempotent for start_task replay", () => {
|
|
54
|
-
// Simulates replaying a start_task event twice
|
|
55
|
-
updateTaskStatus(MID, SID, TID, "in-progress");
|
|
56
|
-
updateTaskStatus(MID, SID, TID, "in-progress");
|
|
57
|
-
|
|
58
|
-
const task = getTask(MID, SID, TID);
|
|
59
|
-
assert.ok(task !== null, "task should exist after status update");
|
|
60
|
-
assert.equal(task!.status, "in-progress", "status should be 'in-progress' after double replay");
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
test("updateTaskStatus for report_blocker does not set blocker_discovered flag (M4)", () => {
|
|
64
|
-
// M4 finding: report_blocker replay only calls updateTaskStatus("blocked").
|
|
65
|
-
// The blocker_discovered column is NOT set during replay — this is a known
|
|
66
|
-
// lossy replay: status is recovered but the blocker flag is not.
|
|
67
|
-
updateTaskStatus(MID, SID, TID, "blocked");
|
|
68
|
-
|
|
69
|
-
const task = getTask(MID, SID, TID);
|
|
70
|
-
assert.ok(task !== null, "task should exist after blocked status update");
|
|
71
|
-
assert.equal(task!.status, "blocked", "status should be 'blocked'");
|
|
72
|
-
assert.equal(
|
|
73
|
-
task!.blocker_discovered,
|
|
74
|
-
false,
|
|
75
|
-
"blocker_discovered should remain false — report_blocker replay is lossy (M4 finding)",
|
|
76
|
-
);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
test("insertVerificationEvidence is NOT idempotent — duplicates accumulate (M5)", () => {
|
|
80
|
-
// M5 finding: insertVerificationEvidence uses a plain INSERT (no ON CONFLICT),
|
|
81
|
-
// so replaying the same record_verification event twice produces two rows.
|
|
82
|
-
// Both calls must succeed without throwing — the duplication is the risk.
|
|
83
|
-
const evidence = {
|
|
84
|
-
taskId: TID,
|
|
85
|
-
sliceId: SID,
|
|
86
|
-
milestoneId: MID,
|
|
87
|
-
command: "npm test",
|
|
88
|
-
exitCode: 0,
|
|
89
|
-
verdict: "pass",
|
|
90
|
-
durationMs: 1200,
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
assert.doesNotThrow(
|
|
94
|
-
() => insertVerificationEvidence(evidence),
|
|
95
|
-
"first insertVerificationEvidence call should not throw",
|
|
96
|
-
);
|
|
97
|
-
assert.doesNotThrow(
|
|
98
|
-
() => insertVerificationEvidence(evidence),
|
|
99
|
-
"second insertVerificationEvidence call should not throw — duplicates accumulate silently (M5 finding)",
|
|
100
|
-
);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
test("upsertDecision is idempotent via INSERT OR REPLACE", () => {
|
|
104
|
-
// save_decision replay uses upsertDecision which is INSERT OR REPLACE,
|
|
105
|
-
// so replaying the same decision id twice overwrites without error.
|
|
106
|
-
const base = {
|
|
107
|
-
id: "arch:logging",
|
|
108
|
-
when_context: "during planning",
|
|
109
|
-
scope: "arch",
|
|
110
|
-
decision: "logging",
|
|
111
|
-
rationale: "structured logs",
|
|
112
|
-
revisable: "yes" as const,
|
|
113
|
-
made_by: "agent" as const,
|
|
114
|
-
superseded_by: null,
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
upsertDecision({ ...base, choice: "structured" });
|
|
118
|
-
upsertDecision({ ...base, choice: "unstructured" });
|
|
119
|
-
|
|
120
|
-
// No error means the second call replaced the first — idempotent at the id level.
|
|
121
|
-
// The final choice is "unstructured" per INSERT OR REPLACE semantics.
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
test("unknown event commands in replayEvents are silently skipped — extractEntityKey returns null for unknown commands", () => {
|
|
125
|
-
// replayEvents uses a switch/default that silently skips unrecognised commands.
|
|
126
|
-
// We verify this via extractEntityKey which follows the same command set.
|
|
127
|
-
// A future_command not in the switch must return null (not throw).
|
|
128
|
-
const event = {
|
|
129
|
-
cmd: "future_command",
|
|
130
|
-
params: { foo: "bar" },
|
|
131
|
-
ts: new Date().toISOString(),
|
|
132
|
-
hash: "0000000000000000",
|
|
133
|
-
actor: "agent" as const,
|
|
134
|
-
session_id: "test-session",
|
|
135
|
-
};
|
|
136
|
-
|
|
137
|
-
const key = extractEntityKey(event);
|
|
138
|
-
assert.equal(key, null, "extractEntityKey should return null for unknown commands");
|
|
139
|
-
});
|
|
140
|
-
});
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
import { describe, it, beforeEach, afterEach } from "node:test";
|
|
2
|
-
import assert from "node:assert/strict";
|
|
3
|
-
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
4
|
-
import { join, dirname } from "node:path";
|
|
5
|
-
import { fileURLToPath } from "node:url";
|
|
6
|
-
|
|
7
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
|
-
const gsdDir = join(__dirname, "..");
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Test suite for #2941: Forensics report context lost on follow-up turns.
|
|
12
|
-
*
|
|
13
|
-
* The forensics flow sends a one-shot message via sendMessage() with
|
|
14
|
-
* triggerTurn: true. On follow-up turns, the context is gone because
|
|
15
|
-
* there's no re-injection mechanism like buildGuidedExecuteContextInjection
|
|
16
|
-
* provides for task execution.
|
|
17
|
-
*
|
|
18
|
-
* Fix: write an active-forensics.json marker when forensics starts, and
|
|
19
|
-
* have buildBeforeAgentStartResult() re-inject the forensics prompt on
|
|
20
|
-
* subsequent turns.
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
describe("forensics context persistence (#2941)", () => {
|
|
24
|
-
// ─── Source-level invariant tests ──────────────────────────────────────────
|
|
25
|
-
|
|
26
|
-
it("forensics.ts writes active-forensics marker after saving report", () => {
|
|
27
|
-
const src = readFileSync(join(gsdDir, "forensics.ts"), "utf-8");
|
|
28
|
-
assert.ok(
|
|
29
|
-
src.includes("active-forensics.json"),
|
|
30
|
-
"forensics.ts must reference active-forensics.json marker file",
|
|
31
|
-
);
|
|
32
|
-
assert.ok(
|
|
33
|
-
src.includes("writeForensicsMarker"),
|
|
34
|
-
"forensics.ts must call writeForensicsMarker to persist session state",
|
|
35
|
-
);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it("system-context.ts checks for active forensics marker in buildBeforeAgentStartResult", () => {
|
|
39
|
-
const src = readFileSync(join(gsdDir, "bootstrap", "system-context.ts"), "utf-8");
|
|
40
|
-
assert.ok(
|
|
41
|
-
src.includes("active-forensics.json"),
|
|
42
|
-
"system-context.ts must check for active-forensics.json marker",
|
|
43
|
-
);
|
|
44
|
-
assert.ok(
|
|
45
|
-
src.includes("gsd-forensics"),
|
|
46
|
-
"system-context.ts must inject gsd-forensics customType message",
|
|
47
|
-
);
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it("system-context.ts exports clearForensicsMarker for cleanup", () => {
|
|
51
|
-
const src = readFileSync(join(gsdDir, "bootstrap", "system-context.ts"), "utf-8");
|
|
52
|
-
assert.ok(
|
|
53
|
-
src.includes("clearForensicsMarker"),
|
|
54
|
-
"system-context.ts must export clearForensicsMarker function",
|
|
55
|
-
);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
// ─── Functional tests using temp directories ──────────────────────────────
|
|
59
|
-
|
|
60
|
-
const tmpBase = join(__dirname, "__tmp_forensics_persist__");
|
|
61
|
-
|
|
62
|
-
beforeEach(() => {
|
|
63
|
-
rmSync(tmpBase, { recursive: true, force: true });
|
|
64
|
-
mkdirSync(join(tmpBase, ".gsd", "runtime"), { recursive: true });
|
|
65
|
-
mkdirSync(join(tmpBase, ".gsd", "forensics"), { recursive: true });
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
afterEach(() => {
|
|
69
|
-
rmSync(tmpBase, { recursive: true, force: true });
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
it("writeForensicsMarker creates marker with reportPath and promptContent", async () => {
|
|
73
|
-
const { writeForensicsMarker } = await import("../forensics.ts");
|
|
74
|
-
|
|
75
|
-
const reportPath = join(tmpBase, ".gsd", "forensics", "report-2026-01-01.md");
|
|
76
|
-
writeFileSync(reportPath, "# Test Report", "utf-8");
|
|
77
|
-
|
|
78
|
-
writeForensicsMarker(tmpBase, reportPath, "Test forensics prompt content");
|
|
79
|
-
|
|
80
|
-
const markerPath = join(tmpBase, ".gsd", "runtime", "active-forensics.json");
|
|
81
|
-
assert.ok(existsSync(markerPath), "marker file must be created");
|
|
82
|
-
|
|
83
|
-
const marker = JSON.parse(readFileSync(markerPath, "utf-8"));
|
|
84
|
-
assert.equal(marker.reportPath, reportPath);
|
|
85
|
-
assert.equal(marker.promptContent, "Test forensics prompt content");
|
|
86
|
-
assert.ok(marker.createdAt, "marker must have createdAt timestamp");
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
it("readForensicsMarker returns null when no marker exists", async () => {
|
|
90
|
-
const { readForensicsMarker } = await import("../forensics.ts");
|
|
91
|
-
|
|
92
|
-
const result = readForensicsMarker(join(tmpBase, "nonexistent"));
|
|
93
|
-
assert.equal(result, null);
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
it("readForensicsMarker returns marker data when file exists", async () => {
|
|
97
|
-
const { readForensicsMarker } = await import("../forensics.ts");
|
|
98
|
-
|
|
99
|
-
const markerPath = join(tmpBase, ".gsd", "runtime", "active-forensics.json");
|
|
100
|
-
const markerData = {
|
|
101
|
-
reportPath: "/some/report.md",
|
|
102
|
-
promptContent: "forensics prompt",
|
|
103
|
-
createdAt: new Date().toISOString(),
|
|
104
|
-
};
|
|
105
|
-
writeFileSync(markerPath, JSON.stringify(markerData), "utf-8");
|
|
106
|
-
|
|
107
|
-
const result = readForensicsMarker(tmpBase);
|
|
108
|
-
assert.ok(result);
|
|
109
|
-
assert.equal(result.reportPath, "/some/report.md");
|
|
110
|
-
assert.equal(result.promptContent, "forensics prompt");
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
it("clearForensicsMarker removes the marker file", async () => {
|
|
114
|
-
const { clearForensicsMarker } = await import("../bootstrap/system-context.ts");
|
|
115
|
-
|
|
116
|
-
const markerPath = join(tmpBase, ".gsd", "runtime", "active-forensics.json");
|
|
117
|
-
writeFileSync(markerPath, JSON.stringify({ reportPath: "/x", promptContent: "y", createdAt: new Date().toISOString() }), "utf-8");
|
|
118
|
-
assert.ok(existsSync(markerPath), "precondition: marker must exist");
|
|
119
|
-
|
|
120
|
-
clearForensicsMarker(tmpBase);
|
|
121
|
-
assert.ok(!existsSync(markerPath), "marker must be removed after clear");
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
it("clearForensicsMarker is a no-op when no marker exists", async () => {
|
|
125
|
-
const { clearForensicsMarker } = await import("../bootstrap/system-context.ts");
|
|
126
|
-
// Should not throw
|
|
127
|
-
clearForensicsMarker(join(tmpBase, "nonexistent"));
|
|
128
|
-
});
|
|
129
|
-
});
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import { describe, it } from "node:test";
|
|
2
|
-
import assert from "node:assert/strict";
|
|
3
|
-
import { readFileSync } from "node:fs";
|
|
4
|
-
import { join, dirname } from "node:path";
|
|
5
|
-
import { fileURLToPath } from "node:url";
|
|
6
|
-
|
|
7
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
|
-
const gsdDir = join(__dirname, "..");
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Tests for #3129: forensics reads DB for completion status instead of legacy file.
|
|
12
|
-
*
|
|
13
|
-
* The old loadCompletedKeys() reads completed-units.json which is never populated
|
|
14
|
-
* during normal auto-mode completion. The DB (milestones/slices/tasks tables) is
|
|
15
|
-
* the authoritative source for completion status.
|
|
16
|
-
*/
|
|
17
|
-
describe("forensics DB completion status (#3129)", () => {
|
|
18
|
-
const forensicsSrc = readFileSync(join(gsdDir, "forensics.ts"), "utf-8");
|
|
19
|
-
const stateSrc = readFileSync(join(gsdDir, "state.ts"), "utf-8");
|
|
20
|
-
|
|
21
|
-
// ── Primary fix: forensics queries DB for completion counts ──────────
|
|
22
|
-
|
|
23
|
-
it("ForensicReport has dbCompletionCounts field for DB-sourced completion data", () => {
|
|
24
|
-
assert.ok(
|
|
25
|
-
forensicsSrc.includes("dbCompletionCounts"),
|
|
26
|
-
"ForensicReport must include dbCompletionCounts field for DB-sourced completion data",
|
|
27
|
-
);
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
it("buildForensicReport queries DB for completed milestones, slices, and tasks", () => {
|
|
31
|
-
assert.ok(
|
|
32
|
-
forensicsSrc.includes("getDbCompletionCounts"),
|
|
33
|
-
"buildForensicReport must call getDbCompletionCounts to query DB completion status",
|
|
34
|
-
);
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it("getDbCompletionCounts checks isDbAvailable before querying", () => {
|
|
38
|
-
assert.ok(
|
|
39
|
-
forensicsSrc.includes("isDbAvailable"),
|
|
40
|
-
"getDbCompletionCounts must check isDbAvailable() before querying the DB",
|
|
41
|
-
);
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
it("getDbCompletionCounts queries getAllMilestones for milestone completion", () => {
|
|
45
|
-
assert.ok(
|
|
46
|
-
forensicsSrc.includes("getAllMilestones"),
|
|
47
|
-
"getDbCompletionCounts must use getAllMilestones() to count completed milestones",
|
|
48
|
-
);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it("completion counting uses isClosedStatus for consistent status checks", () => {
|
|
52
|
-
assert.ok(
|
|
53
|
-
forensicsSrc.includes("isClosedStatus"),
|
|
54
|
-
"forensics must use isClosedStatus() for consistent status checks",
|
|
55
|
-
);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
it("report rendering shows DB completion counts instead of just legacy key count", () => {
|
|
59
|
-
assert.ok(
|
|
60
|
-
forensicsSrc.includes("milestones complete"),
|
|
61
|
-
"report must show '__ milestones complete' from DB data",
|
|
62
|
-
);
|
|
63
|
-
assert.ok(
|
|
64
|
-
forensicsSrc.includes("slices complete"),
|
|
65
|
-
"report must show '__ slices complete' from DB data",
|
|
66
|
-
);
|
|
67
|
-
assert.ok(
|
|
68
|
-
forensicsSrc.includes("tasks complete"),
|
|
69
|
-
"report must show '__ tasks complete' from DB data",
|
|
70
|
-
);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it("falls back to completed-units.json only when DB is unavailable", () => {
|
|
74
|
-
// loadCompletedKeys should still exist as fallback
|
|
75
|
-
assert.ok(
|
|
76
|
-
forensicsSrc.includes("loadCompletedKeys"),
|
|
77
|
-
"loadCompletedKeys must still exist as fallback for non-DB projects",
|
|
78
|
-
);
|
|
79
|
-
// But the report should prefer DB counts
|
|
80
|
-
assert.ok(
|
|
81
|
-
forensicsSrc.includes("dbCompletionCounts"),
|
|
82
|
-
"report must prefer dbCompletionCounts over legacy completedKeys",
|
|
83
|
-
);
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
// ── Secondary fix: STATE.md label when all milestones complete ───────
|
|
87
|
-
|
|
88
|
-
it("state.ts returns null activeMilestone when all milestones are complete", () => {
|
|
89
|
-
// When phase is "complete", activeMilestone should be null, not the last milestone
|
|
90
|
-
// The last completed milestone should be in a separate field
|
|
91
|
-
assert.ok(
|
|
92
|
-
stateSrc.includes("lastCompletedMilestone"),
|
|
93
|
-
"GSDState must have lastCompletedMilestone field for the final milestone when phase=complete",
|
|
94
|
-
);
|
|
95
|
-
});
|
|
96
|
-
});
|
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* gsdroot-worktree-detection.test.ts — Regression test for #2594.
|
|
3
|
-
*
|
|
4
|
-
* gsdRoot() must return the worktree's own .gsd directory when the basePath
|
|
5
|
-
* is inside a .gsd/worktrees/<name>/ structure, not walk up to the project
|
|
6
|
-
* root's .gsd via the git-root probe.
|
|
7
|
-
*
|
|
8
|
-
* The bug: when a git worktree lives at /project/.gsd/worktrees/M008/,
|
|
9
|
-
* probeGsdRoot() runs `git rev-parse --show-toplevel` which can return the
|
|
10
|
-
* main project root (not the worktree root) depending on git version and
|
|
11
|
-
* worktree setup. The walk-up then finds /project/.gsd and returns that
|
|
12
|
-
* instead of the worktree's own .gsd path.
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import { describe, test, beforeEach, afterEach } from "node:test";
|
|
16
|
-
import assert from "node:assert/strict";
|
|
17
|
-
import { mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
18
|
-
import { join } from "node:path";
|
|
19
|
-
import { mkdtempSync, realpathSync } from "node:fs";
|
|
20
|
-
import { tmpdir } from "node:os";
|
|
21
|
-
import { spawnSync } from "node:child_process";
|
|
22
|
-
|
|
23
|
-
import { gsdRoot, _clearGsdRootCache } from "../paths.ts";
|
|
24
|
-
|
|
25
|
-
describe("gsdRoot() worktree detection (#2594)", () => {
|
|
26
|
-
let projectRoot: string;
|
|
27
|
-
let projectGsd: string;
|
|
28
|
-
|
|
29
|
-
beforeEach(() => {
|
|
30
|
-
_clearGsdRootCache();
|
|
31
|
-
// Create a temporary project with a git repo to simulate real conditions.
|
|
32
|
-
// realpathSync handles macOS /tmp -> /private/tmp.
|
|
33
|
-
projectRoot = realpathSync(mkdtempSync(join(tmpdir(), "gsdroot-wt-")));
|
|
34
|
-
projectGsd = join(projectRoot, ".gsd");
|
|
35
|
-
mkdirSync(projectGsd, { recursive: true });
|
|
36
|
-
|
|
37
|
-
// Initialize a git repo in the project root so git rev-parse works
|
|
38
|
-
spawnSync("git", ["init", "--initial-branch=main"], {
|
|
39
|
-
cwd: projectRoot,
|
|
40
|
-
stdio: "ignore",
|
|
41
|
-
});
|
|
42
|
-
spawnSync("git", ["config", "user.email", "test@test.com"], {
|
|
43
|
-
cwd: projectRoot,
|
|
44
|
-
stdio: "ignore",
|
|
45
|
-
});
|
|
46
|
-
spawnSync("git", ["config", "user.name", "Test"], {
|
|
47
|
-
cwd: projectRoot,
|
|
48
|
-
stdio: "ignore",
|
|
49
|
-
});
|
|
50
|
-
// Create an initial commit so we have a HEAD
|
|
51
|
-
writeFileSync(join(projectRoot, "README.md"), "# Test");
|
|
52
|
-
spawnSync("git", ["add", "."], { cwd: projectRoot, stdio: "ignore" });
|
|
53
|
-
spawnSync("git", ["commit", "-m", "init"], {
|
|
54
|
-
cwd: projectRoot,
|
|
55
|
-
stdio: "ignore",
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
afterEach(() => {
|
|
60
|
-
_clearGsdRootCache();
|
|
61
|
-
rmSync(projectRoot, { recursive: true, force: true });
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
test("returns worktree .gsd when basePath is a worktree with its own .gsd (fast path)", () => {
|
|
65
|
-
// Simulates a worktree that already had copyPlanningArtifacts() run,
|
|
66
|
-
// so it has its own .gsd/ directory.
|
|
67
|
-
const worktreeBase = join(projectGsd, "worktrees", "M008");
|
|
68
|
-
const worktreeGsd = join(worktreeBase, ".gsd");
|
|
69
|
-
mkdirSync(worktreeGsd, { recursive: true });
|
|
70
|
-
|
|
71
|
-
const result = gsdRoot(worktreeBase);
|
|
72
|
-
assert.equal(
|
|
73
|
-
result,
|
|
74
|
-
worktreeGsd,
|
|
75
|
-
`Expected worktree .gsd (${worktreeGsd}), got ${result}. ` +
|
|
76
|
-
"gsdRoot() should use the fast path for an existing worktree .gsd.",
|
|
77
|
-
);
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
test("returns worktree .gsd path (not project root .gsd) when worktree .gsd does not exist yet", () => {
|
|
81
|
-
// This is the core #2594 bug: the worktree directory exists but its .gsd
|
|
82
|
-
// subdirectory hasn't been created yet. Without the fix, probeGsdRoot()
|
|
83
|
-
// walks up from the worktree path, finds /project/.gsd, and returns it.
|
|
84
|
-
// With the fix, it detects the .gsd/worktrees/<name>/ pattern and returns
|
|
85
|
-
// the worktree-local .gsd path as the creation fallback.
|
|
86
|
-
const worktreeBase = join(projectGsd, "worktrees", "M008");
|
|
87
|
-
mkdirSync(worktreeBase, { recursive: true });
|
|
88
|
-
// NOTE: no .gsd/ inside worktreeBase
|
|
89
|
-
|
|
90
|
-
const result = gsdRoot(worktreeBase);
|
|
91
|
-
const expected = join(worktreeBase, ".gsd");
|
|
92
|
-
|
|
93
|
-
// Without the fix, this returns projectGsd (/project/.gsd) because the
|
|
94
|
-
// walk-up from worktreeBase finds it. With the fix, it returns the
|
|
95
|
-
// worktree-local path.
|
|
96
|
-
assert.notEqual(
|
|
97
|
-
result,
|
|
98
|
-
projectGsd,
|
|
99
|
-
"gsdRoot() must NOT return the project root .gsd when basePath is inside .gsd/worktrees/",
|
|
100
|
-
);
|
|
101
|
-
assert.equal(
|
|
102
|
-
result,
|
|
103
|
-
expected,
|
|
104
|
-
`Expected worktree-local .gsd (${expected}), got ${result}.`,
|
|
105
|
-
);
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
test("returns worktree .gsd when basePath is a real git worktree inside .gsd/worktrees/", () => {
|
|
109
|
-
// Create a real git worktree at .gsd/worktrees/M010
|
|
110
|
-
const worktreeName = "M010";
|
|
111
|
-
const worktreeBase = join(projectGsd, "worktrees", worktreeName);
|
|
112
|
-
|
|
113
|
-
// Use git worktree add to create a real worktree
|
|
114
|
-
const result = spawnSync(
|
|
115
|
-
"git",
|
|
116
|
-
["worktree", "add", "-b", `milestone/${worktreeName}`, worktreeBase],
|
|
117
|
-
{ cwd: projectRoot, encoding: "utf-8" },
|
|
118
|
-
);
|
|
119
|
-
|
|
120
|
-
if (result.status !== 0) {
|
|
121
|
-
// If git worktree add fails, skip the test gracefully
|
|
122
|
-
assert.ok(true, "Skipped: git worktree add not available");
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// The real git worktree exists at worktreeBase but has NO .gsd/ subdir yet
|
|
127
|
-
const gsdResult = gsdRoot(worktreeBase);
|
|
128
|
-
const expected = join(worktreeBase, ".gsd");
|
|
129
|
-
|
|
130
|
-
assert.notEqual(
|
|
131
|
-
gsdResult,
|
|
132
|
-
projectGsd,
|
|
133
|
-
"gsdRoot() must NOT escape to project root .gsd from inside a git worktree",
|
|
134
|
-
);
|
|
135
|
-
assert.equal(
|
|
136
|
-
gsdResult,
|
|
137
|
-
expected,
|
|
138
|
-
`Expected worktree-local .gsd (${expected}), got ${gsdResult}`,
|
|
139
|
-
);
|
|
140
|
-
|
|
141
|
-
// Cleanup worktree
|
|
142
|
-
spawnSync("git", ["worktree", "remove", "--force", worktreeBase], {
|
|
143
|
-
cwd: projectRoot,
|
|
144
|
-
stdio: "ignore",
|
|
145
|
-
});
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
test("still returns project .gsd for normal (non-worktree) basePath", () => {
|
|
149
|
-
const result = gsdRoot(projectRoot);
|
|
150
|
-
assert.equal(result, projectGsd);
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
test("still returns project .gsd for a subdirectory of the project", () => {
|
|
154
|
-
const subdir = join(projectRoot, "src", "lib");
|
|
155
|
-
mkdirSync(subdir, { recursive: true });
|
|
156
|
-
|
|
157
|
-
const result = gsdRoot(subdir);
|
|
158
|
-
assert.equal(
|
|
159
|
-
result,
|
|
160
|
-
projectGsd,
|
|
161
|
-
"Non-worktree subdirectories should still resolve to project .gsd",
|
|
162
|
-
);
|
|
163
|
-
});
|
|
164
|
-
});
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Guided-flow dynamic routing — regression test for #2958.
|
|
3
|
-
*
|
|
4
|
-
* Verifies that dispatchWorkflow() routes through the dynamic routing pipeline
|
|
5
|
-
* (selectAndApplyModel from auto-model-selection.ts) instead of bypassing it
|
|
6
|
-
* with a direct call to resolveModelWithFallbacksForUnit.
|
|
7
|
-
*
|
|
8
|
-
* Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import test from "node:test";
|
|
12
|
-
import assert from "node:assert/strict";
|
|
13
|
-
import { readFileSync } from "node:fs";
|
|
14
|
-
import { join, dirname } from "node:path";
|
|
15
|
-
import { fileURLToPath } from "node:url";
|
|
16
|
-
|
|
17
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
18
|
-
const gsdDir = join(__dirname, "..");
|
|
19
|
-
|
|
20
|
-
function readSrc(file: string): string {
|
|
21
|
-
return readFileSync(join(gsdDir, file), "utf-8");
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const guidedFlowSrc = readSrc("guided-flow.ts");
|
|
25
|
-
|
|
26
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
27
|
-
// #2958: dispatchWorkflow must route through dynamic routing pipeline
|
|
28
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
29
|
-
|
|
30
|
-
test("#2958: guided-flow imports selectAndApplyModel from auto-model-selection", () => {
|
|
31
|
-
assert.ok(
|
|
32
|
-
guidedFlowSrc.includes("selectAndApplyModel"),
|
|
33
|
-
"guided-flow.ts must import and use selectAndApplyModel from auto-model-selection.ts",
|
|
34
|
-
);
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
test("#2958: dispatchWorkflow does not call resolveModelWithFallbacksForUnit directly", () => {
|
|
38
|
-
// Extract the dispatchWorkflow function body
|
|
39
|
-
const fnStart = guidedFlowSrc.indexOf("async function dispatchWorkflow(");
|
|
40
|
-
assert.ok(fnStart !== -1, "dispatchWorkflow function not found");
|
|
41
|
-
|
|
42
|
-
// Find the function body by tracking brace depth
|
|
43
|
-
const openBrace = guidedFlowSrc.indexOf("{", fnStart);
|
|
44
|
-
let depth = 1;
|
|
45
|
-
let pos = openBrace + 1;
|
|
46
|
-
while (depth > 0 && pos < guidedFlowSrc.length) {
|
|
47
|
-
if (guidedFlowSrc[pos] === "{") depth++;
|
|
48
|
-
else if (guidedFlowSrc[pos] === "}") depth--;
|
|
49
|
-
pos++;
|
|
50
|
-
}
|
|
51
|
-
const fnBody = guidedFlowSrc.slice(openBrace, pos);
|
|
52
|
-
|
|
53
|
-
assert.ok(
|
|
54
|
-
!fnBody.includes("resolveModelWithFallbacksForUnit"),
|
|
55
|
-
"dispatchWorkflow must NOT call resolveModelWithFallbacksForUnit directly — " +
|
|
56
|
-
"it must route through selectAndApplyModel for dynamic routing support (#2958)",
|
|
57
|
-
);
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
test("#2958: dispatchWorkflow calls selectAndApplyModel for model selection", () => {
|
|
61
|
-
// Extract the dispatchWorkflow function body
|
|
62
|
-
const fnStart = guidedFlowSrc.indexOf("async function dispatchWorkflow(");
|
|
63
|
-
assert.ok(fnStart !== -1, "dispatchWorkflow function not found");
|
|
64
|
-
|
|
65
|
-
const openBrace = guidedFlowSrc.indexOf("{", fnStart);
|
|
66
|
-
let depth = 1;
|
|
67
|
-
let pos = openBrace + 1;
|
|
68
|
-
while (depth > 0 && pos < guidedFlowSrc.length) {
|
|
69
|
-
if (guidedFlowSrc[pos] === "{") depth++;
|
|
70
|
-
else if (guidedFlowSrc[pos] === "}") depth--;
|
|
71
|
-
pos++;
|
|
72
|
-
}
|
|
73
|
-
const fnBody = guidedFlowSrc.slice(openBrace, pos);
|
|
74
|
-
|
|
75
|
-
assert.ok(
|
|
76
|
-
fnBody.includes("selectAndApplyModel"),
|
|
77
|
-
"dispatchWorkflow must call selectAndApplyModel to route through the dynamic routing pipeline (#2958)",
|
|
78
|
-
);
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
test("#2958: dispatchWorkflow does not use resolveAvailableModel inline", () => {
|
|
82
|
-
const fnStart = guidedFlowSrc.indexOf("async function dispatchWorkflow(");
|
|
83
|
-
assert.ok(fnStart !== -1, "dispatchWorkflow function not found");
|
|
84
|
-
|
|
85
|
-
const openBrace = guidedFlowSrc.indexOf("{", fnStart);
|
|
86
|
-
let depth = 1;
|
|
87
|
-
let pos = openBrace + 1;
|
|
88
|
-
while (depth > 0 && pos < guidedFlowSrc.length) {
|
|
89
|
-
if (guidedFlowSrc[pos] === "{") depth++;
|
|
90
|
-
else if (guidedFlowSrc[pos] === "}") depth--;
|
|
91
|
-
pos++;
|
|
92
|
-
}
|
|
93
|
-
const fnBody = guidedFlowSrc.slice(openBrace, pos);
|
|
94
|
-
|
|
95
|
-
assert.ok(
|
|
96
|
-
!fnBody.includes("resolveAvailableModel"),
|
|
97
|
-
"dispatchWorkflow must NOT use resolveAvailableModel inline — " +
|
|
98
|
-
"model resolution is handled by selectAndApplyModel (#2958)",
|
|
99
|
-
);
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
test("#2958: guided-flow does not import resolveModelWithFallbacksForUnit", () => {
|
|
103
|
-
// The import should be removed since dispatchWorkflow was the only consumer
|
|
104
|
-
// Check if resolveModelWithFallbacksForUnit is still used elsewhere in the file
|
|
105
|
-
const fnStart = guidedFlowSrc.indexOf("async function dispatchWorkflow(");
|
|
106
|
-
const beforeDispatch = guidedFlowSrc.slice(0, fnStart);
|
|
107
|
-
const afterFnEnd = (() => {
|
|
108
|
-
const openBrace = guidedFlowSrc.indexOf("{", fnStart);
|
|
109
|
-
let depth = 1;
|
|
110
|
-
let p = openBrace + 1;
|
|
111
|
-
while (depth > 0 && p < guidedFlowSrc.length) {
|
|
112
|
-
if (guidedFlowSrc[p] === "{") depth++;
|
|
113
|
-
else if (guidedFlowSrc[p] === "}") depth--;
|
|
114
|
-
p++;
|
|
115
|
-
}
|
|
116
|
-
return guidedFlowSrc.slice(p);
|
|
117
|
-
})();
|
|
118
|
-
|
|
119
|
-
// If resolveModelWithFallbacksForUnit is not used outside dispatchWorkflow,
|
|
120
|
-
// the import should be removed
|
|
121
|
-
const usedOutside = beforeDispatch.includes("resolveModelWithFallbacksForUnit(")
|
|
122
|
-
|| afterFnEnd.includes("resolveModelWithFallbacksForUnit(");
|
|
123
|
-
|
|
124
|
-
if (!usedOutside) {
|
|
125
|
-
// Verify the import line was cleaned up
|
|
126
|
-
const importLines = guidedFlowSrc.split("\n").filter(l =>
|
|
127
|
-
l.includes("import") && l.includes("resolveModelWithFallbacksForUnit"),
|
|
128
|
-
);
|
|
129
|
-
assert.equal(
|
|
130
|
-
importLines.length,
|
|
131
|
-
0,
|
|
132
|
-
"resolveModelWithFallbacksForUnit import should be removed when no longer used outside dispatchWorkflow",
|
|
133
|
-
);
|
|
134
|
-
}
|
|
135
|
-
});
|