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
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression test for #2631: deriveState disk→DB reconciliation must
|
|
3
|
+
* run even when the milestones table starts empty.
|
|
4
|
+
*
|
|
5
|
+
* When getAllMilestones() returns [] (e.g. after a failed initial migration),
|
|
6
|
+
* the reconciliation code inside deriveStateFromDb was unreachable because
|
|
7
|
+
* deriveState only called it when dbMilestones.length > 0. The fix moves
|
|
8
|
+
* disk→DB sync into deriveState itself, before the length check.
|
|
9
|
+
*/
|
|
10
|
+
import { test } from "node:test";
|
|
11
|
+
import assert from "node:assert/strict";
|
|
12
|
+
import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from "node:fs";
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
import { tmpdir } from "node:os";
|
|
15
|
+
|
|
16
|
+
import { deriveState, invalidateStateCache } from "../state.ts";
|
|
17
|
+
import {
|
|
18
|
+
openDatabase,
|
|
19
|
+
closeDatabase,
|
|
20
|
+
getAllMilestones,
|
|
21
|
+
} from "../gsd-db.ts";
|
|
22
|
+
|
|
23
|
+
test("deriveState populates empty DB from disk milestones (#2631)", async () => {
|
|
24
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-empty-db-"));
|
|
25
|
+
mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
|
|
26
|
+
|
|
27
|
+
try {
|
|
28
|
+
// Create a milestone on disk with a CONTEXT file (not a ghost)
|
|
29
|
+
writeFileSync(
|
|
30
|
+
join(base, ".gsd", "milestones", "M001", "M001-CONTEXT.md"),
|
|
31
|
+
"# M001: Test Milestone\n\nSome context about this milestone.",
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
// Open DB — milestones table is empty (simulating failed migration)
|
|
35
|
+
openDatabase(":memory:");
|
|
36
|
+
const before = getAllMilestones();
|
|
37
|
+
assert.equal(before.length, 0, "DB should start with 0 milestones");
|
|
38
|
+
|
|
39
|
+
// deriveState should reconcile disk → DB
|
|
40
|
+
invalidateStateCache();
|
|
41
|
+
const state = await deriveState(base);
|
|
42
|
+
|
|
43
|
+
// After deriveState, the DB should now have the disk milestone
|
|
44
|
+
const after = getAllMilestones();
|
|
45
|
+
assert.ok(after.length > 0, "DB should have milestones after reconciliation");
|
|
46
|
+
assert.equal(after[0]!.id, "M001", "reconciled milestone should be M001");
|
|
47
|
+
|
|
48
|
+
// State should reflect the milestone (not "No milestones found")
|
|
49
|
+
assert.ok(
|
|
50
|
+
state.activeMilestone !== null,
|
|
51
|
+
"activeMilestone should not be null after reconciliation",
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
closeDatabase();
|
|
55
|
+
} finally {
|
|
56
|
+
closeDatabase();
|
|
57
|
+
rmSync(base, { recursive: true, force: true });
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test("deriveState does NOT insert ghost milestones into DB (#2631 guard)", async () => {
|
|
62
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-empty-db-"));
|
|
63
|
+
// Create a ghost milestone directory (empty — no CONTEXT, no ROADMAP)
|
|
64
|
+
mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
|
|
65
|
+
|
|
66
|
+
try {
|
|
67
|
+
openDatabase(":memory:");
|
|
68
|
+
invalidateStateCache();
|
|
69
|
+
await deriveState(base);
|
|
70
|
+
|
|
71
|
+
const milestones = getAllMilestones();
|
|
72
|
+
assert.equal(milestones.length, 0, "ghost milestone should NOT be inserted");
|
|
73
|
+
|
|
74
|
+
closeDatabase();
|
|
75
|
+
} finally {
|
|
76
|
+
closeDatabase();
|
|
77
|
+
rmSync(base, { recursive: true, force: true });
|
|
78
|
+
}
|
|
79
|
+
});
|
|
@@ -46,34 +46,3 @@ describe("forensics dedup (#2096)", () => {
|
|
|
46
46
|
"opt-in notice must mention duplicate detection");
|
|
47
47
|
});
|
|
48
48
|
});
|
|
49
|
-
|
|
50
|
-
describe("forensics dedup ordering (#2704)", () => {
|
|
51
|
-
it("{{dedupSection}} appears before Investigation Protocol in the prompt template", () => {
|
|
52
|
-
const prompt = readFileSync(join(gsdDir, "prompts", "forensics.md"), "utf-8");
|
|
53
|
-
const dedupIndex = prompt.indexOf("{{dedupSection}}");
|
|
54
|
-
const investigationIndex = prompt.indexOf("## Investigation Protocol");
|
|
55
|
-
assert.ok(dedupIndex !== -1, "prompt must contain {{dedupSection}}");
|
|
56
|
-
assert.ok(investigationIndex !== -1, "prompt must contain ## Investigation Protocol");
|
|
57
|
-
assert.ok(
|
|
58
|
-
dedupIndex < investigationIndex,
|
|
59
|
-
`{{dedupSection}} (index ${dedupIndex}) must appear before Investigation Protocol (index ${investigationIndex}) — dedup should run before expensive investigation to avoid wasting tokens on already-fixed bugs`,
|
|
60
|
-
);
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
it("DEDUP_PROMPT_SECTION contains a decision gate to skip investigation", () => {
|
|
64
|
-
const source = readFileSync(join(gsdDir, "forensics.ts"), "utf-8");
|
|
65
|
-
// The dedup section must instruct the agent to skip investigation when a match is found
|
|
66
|
-
assert.ok(
|
|
67
|
-
source.includes("Skip full investigation") || source.includes("skip full investigation") || source.includes("Skip investigation"),
|
|
68
|
-
"DEDUP_PROMPT_SECTION must contain a decision gate telling the agent to skip full investigation when a duplicate is found",
|
|
69
|
-
);
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
it("DEDUP_PROMPT_SECTION heading reflects pre-investigation role", () => {
|
|
73
|
-
const source = readFileSync(join(gsdDir, "forensics.ts"), "utf-8");
|
|
74
|
-
assert.ok(
|
|
75
|
-
source.includes("Pre-Investigation") || source.includes("pre-investigation"),
|
|
76
|
-
"DEDUP_PROMPT_SECTION heading must indicate it runs before investigation, not just before issue creation",
|
|
77
|
-
);
|
|
78
|
-
});
|
|
79
|
-
});
|
|
@@ -21,10 +21,8 @@ import {
|
|
|
21
21
|
import {
|
|
22
22
|
saveDecisionToDb,
|
|
23
23
|
updateRequirementInDb,
|
|
24
|
-
saveRequirementToDb,
|
|
25
24
|
saveArtifactToDb,
|
|
26
25
|
nextDecisionId,
|
|
27
|
-
nextRequirementId,
|
|
28
26
|
} from '../db-writer.ts';
|
|
29
27
|
import type { Requirement } from '../types.ts';
|
|
30
28
|
|
|
@@ -162,11 +160,18 @@ describe('gsd-tools', () => {
|
|
|
162
160
|
assert.ok(mdContent.includes('R001'), 'REQUIREMENTS.md should contain R001');
|
|
163
161
|
assert.ok(mdContent.includes('validated'), 'REQUIREMENTS.md should reflect updated status');
|
|
164
162
|
|
|
165
|
-
// Updating non-existent requirement
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
163
|
+
// Updating non-existent requirement throws
|
|
164
|
+
let threwForMissing = false;
|
|
165
|
+
try {
|
|
166
|
+
await updateRequirementInDb('R999', { status: 'deferred' }, tmpDir);
|
|
167
|
+
} catch (err) {
|
|
168
|
+
threwForMissing = true;
|
|
169
|
+
assert.ok(
|
|
170
|
+
(err as Error).message.includes('R999'),
|
|
171
|
+
'Error should mention the missing requirement ID',
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
assert.ok(threwForMissing, 'Should throw for non-existent requirement');
|
|
170
175
|
|
|
171
176
|
closeDatabase();
|
|
172
177
|
} finally {
|
|
@@ -258,124 +263,6 @@ describe('gsd-tools', () => {
|
|
|
258
263
|
assert.deepStrictEqual(fallbackId, 'D001', 'nextDecisionId should return D001 when DB unavailable');
|
|
259
264
|
});
|
|
260
265
|
|
|
261
|
-
test('gsd_requirement_save creates new requirement', async () => {
|
|
262
|
-
const tmpDir = makeTmpDir();
|
|
263
|
-
try {
|
|
264
|
-
const dbPath = path.join(tmpDir, '.gsd', 'gsd.db');
|
|
265
|
-
openDatabase(dbPath);
|
|
266
|
-
|
|
267
|
-
// (a) saveRequirementToDb creates a new requirement with auto-assigned ID
|
|
268
|
-
const result = await saveRequirementToDb(
|
|
269
|
-
{
|
|
270
|
-
class: 'functional',
|
|
271
|
-
status: 'active',
|
|
272
|
-
description: 'Must support dark mode',
|
|
273
|
-
why: 'Accessibility requirement',
|
|
274
|
-
source: 'user-research',
|
|
275
|
-
},
|
|
276
|
-
tmpDir,
|
|
277
|
-
);
|
|
278
|
-
|
|
279
|
-
assert.deepStrictEqual(result.id, 'R001', 'First requirement should be R001');
|
|
280
|
-
|
|
281
|
-
// Verify DB row exists
|
|
282
|
-
const row = getRequirementById('R001');
|
|
283
|
-
assert.ok(row !== null, 'Requirement R001 should exist in DB');
|
|
284
|
-
assert.deepStrictEqual(row!.class, 'functional', 'Class should match');
|
|
285
|
-
assert.deepStrictEqual(row!.description, 'Must support dark mode', 'Description should match');
|
|
286
|
-
assert.deepStrictEqual(row!.status, 'active', 'Status should match');
|
|
287
|
-
|
|
288
|
-
// Verify REQUIREMENTS.md was generated
|
|
289
|
-
const mdPath = path.join(tmpDir, '.gsd', 'REQUIREMENTS.md');
|
|
290
|
-
assert.ok(fs.existsSync(mdPath), 'REQUIREMENTS.md should be created');
|
|
291
|
-
const mdContent = fs.readFileSync(mdPath, 'utf-8');
|
|
292
|
-
assert.ok(mdContent.includes('R001'), 'REQUIREMENTS.md should contain R001');
|
|
293
|
-
assert.ok(mdContent.includes('dark mode'), 'REQUIREMENTS.md should contain description');
|
|
294
|
-
|
|
295
|
-
// (b) Auto-assigns correct next ID
|
|
296
|
-
const result2 = await saveRequirementToDb(
|
|
297
|
-
{
|
|
298
|
-
class: 'non-functional',
|
|
299
|
-
status: 'active',
|
|
300
|
-
description: 'Must load in under 2 seconds',
|
|
301
|
-
why: 'Performance SLA',
|
|
302
|
-
source: 'design',
|
|
303
|
-
},
|
|
304
|
-
tmpDir,
|
|
305
|
-
);
|
|
306
|
-
assert.deepStrictEqual(result2.id, 'R002', 'Second requirement should be R002');
|
|
307
|
-
|
|
308
|
-
closeDatabase();
|
|
309
|
-
} finally {
|
|
310
|
-
cleanupDir(tmpDir);
|
|
311
|
-
}
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
test('nextRequirementId computes correct next ID', async () => {
|
|
315
|
-
const tmpDir = makeTmpDir();
|
|
316
|
-
try {
|
|
317
|
-
const dbPath = path.join(tmpDir, '.gsd', 'gsd.db');
|
|
318
|
-
openDatabase(dbPath);
|
|
319
|
-
|
|
320
|
-
// No requirements yet
|
|
321
|
-
const id1 = await nextRequirementId();
|
|
322
|
-
assert.deepStrictEqual(id1, 'R001', 'Should return R001 when no requirements exist');
|
|
323
|
-
|
|
324
|
-
// Add one requirement
|
|
325
|
-
upsertRequirement({
|
|
326
|
-
id: 'R001',
|
|
327
|
-
class: 'functional',
|
|
328
|
-
status: 'active',
|
|
329
|
-
description: 'Test',
|
|
330
|
-
why: '',
|
|
331
|
-
source: '',
|
|
332
|
-
primary_owner: '',
|
|
333
|
-
supporting_slices: '',
|
|
334
|
-
validation: '',
|
|
335
|
-
notes: '',
|
|
336
|
-
full_content: '',
|
|
337
|
-
superseded_by: null,
|
|
338
|
-
});
|
|
339
|
-
|
|
340
|
-
const id2 = await nextRequirementId();
|
|
341
|
-
assert.deepStrictEqual(id2, 'R002', 'Should return R002 after R001 exists');
|
|
342
|
-
|
|
343
|
-
closeDatabase();
|
|
344
|
-
} finally {
|
|
345
|
-
cleanupDir(tmpDir);
|
|
346
|
-
}
|
|
347
|
-
});
|
|
348
|
-
|
|
349
|
-
test('gsd_requirement_update upserts when requirement not in DB', async () => {
|
|
350
|
-
const tmpDir = makeTmpDir();
|
|
351
|
-
try {
|
|
352
|
-
const dbPath = path.join(tmpDir, '.gsd', 'gsd.db');
|
|
353
|
-
openDatabase(dbPath);
|
|
354
|
-
|
|
355
|
-
// Requirement R025 does NOT exist in DB — simulates the bug scenario
|
|
356
|
-
// where requirements exist in REQUIREMENTS.md but were never imported.
|
|
357
|
-
// updateRequirementInDb should create the row instead of throwing.
|
|
358
|
-
await updateRequirementInDb(
|
|
359
|
-
'R025',
|
|
360
|
-
{ status: 'validated', validation: 'Integration tests pass' },
|
|
361
|
-
tmpDir,
|
|
362
|
-
);
|
|
363
|
-
|
|
364
|
-
const created = getRequirementById('R025');
|
|
365
|
-
assert.ok(created !== null, 'R025 should be created by upsert');
|
|
366
|
-
assert.deepStrictEqual(created!.status, 'validated', 'Status should be set');
|
|
367
|
-
assert.deepStrictEqual(created!.validation, 'Integration tests pass', 'Validation should be set');
|
|
368
|
-
|
|
369
|
-
// Verify REQUIREMENTS.md was generated
|
|
370
|
-
const mdPath = path.join(tmpDir, '.gsd', 'REQUIREMENTS.md');
|
|
371
|
-
assert.ok(fs.existsSync(mdPath), 'REQUIREMENTS.md should be created');
|
|
372
|
-
|
|
373
|
-
closeDatabase();
|
|
374
|
-
} finally {
|
|
375
|
-
cleanupDir(tmpDir);
|
|
376
|
-
}
|
|
377
|
-
});
|
|
378
|
-
|
|
379
266
|
test('Tool result format', async () => {
|
|
380
267
|
const tmpDir = makeTmpDir();
|
|
381
268
|
try {
|
|
@@ -6,7 +6,6 @@ import { tmpdir } from "node:os";
|
|
|
6
6
|
import {
|
|
7
7
|
buildHealthLines,
|
|
8
8
|
detectHealthWidgetProjectState,
|
|
9
|
-
formatRelativeTime,
|
|
10
9
|
type HealthWidgetData,
|
|
11
10
|
} from "../health-widget-core.ts";
|
|
12
11
|
|
|
@@ -35,8 +34,6 @@ function activeData(overrides: Partial<HealthWidgetData> = {}): HealthWidgetData
|
|
|
35
34
|
providerIssue: null,
|
|
36
35
|
environmentErrorCount: 0,
|
|
37
36
|
environmentWarningCount: 0,
|
|
38
|
-
lastCommitEpoch: null,
|
|
39
|
-
lastCommitMessage: null,
|
|
40
37
|
lastRefreshed: Date.now(),
|
|
41
38
|
...overrides,
|
|
42
39
|
};
|
|
@@ -101,70 +98,6 @@ test("buildHealthLines: active state with issues reports issue summary", (t) =>
|
|
|
101
98
|
assert.match(lines[0]!, /Env: 1 error/);
|
|
102
99
|
});
|
|
103
100
|
|
|
104
|
-
// ── Last commit display ──────────────────────────────────────────────────
|
|
105
|
-
|
|
106
|
-
test("buildHealthLines: shows last commit with relative time and message", (t) => {
|
|
107
|
-
const epoch = Math.floor(Date.now() / 1000) - 300; // 5 minutes ago
|
|
108
|
-
const lines = buildHealthLines(activeData({
|
|
109
|
-
lastCommitEpoch: epoch,
|
|
110
|
-
lastCommitMessage: "feat(widget): add health display",
|
|
111
|
-
}));
|
|
112
|
-
assert.equal(lines.length, 1);
|
|
113
|
-
assert.match(lines[0]!, /Last commit: 5m ago/);
|
|
114
|
-
assert.match(lines[0]!, /feat\(widget\): add health display/);
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
test("buildHealthLines: truncates long commit messages", (t) => {
|
|
118
|
-
const epoch = Math.floor(Date.now() / 1000) - 60;
|
|
119
|
-
const longMsg = "a".repeat(80);
|
|
120
|
-
const lines = buildHealthLines(activeData({
|
|
121
|
-
lastCommitEpoch: epoch,
|
|
122
|
-
lastCommitMessage: longMsg,
|
|
123
|
-
}));
|
|
124
|
-
assert.equal(lines.length, 1);
|
|
125
|
-
assert.match(lines[0]!, /a{49}…/);
|
|
126
|
-
assert.ok(!lines[0]!.includes("a".repeat(51)), "message is truncated");
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
test("buildHealthLines: no last commit section when epoch is null", (t) => {
|
|
130
|
-
const lines = buildHealthLines(activeData({ lastCommitEpoch: null }));
|
|
131
|
-
assert.equal(lines.length, 1);
|
|
132
|
-
assert.ok(!lines[0]!.includes("Last commit"), "no last commit when null");
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
test("buildHealthLines: last commit without message shows only time", (t) => {
|
|
136
|
-
const epoch = Math.floor(Date.now() / 1000) - 3600; // 1 hour ago
|
|
137
|
-
const lines = buildHealthLines(activeData({
|
|
138
|
-
lastCommitEpoch: epoch,
|
|
139
|
-
lastCommitMessage: null,
|
|
140
|
-
}));
|
|
141
|
-
assert.equal(lines.length, 1);
|
|
142
|
-
assert.match(lines[0]!, /Last commit: 1h ago/);
|
|
143
|
-
assert.ok(!lines[0]!.includes(" — "), "no dash separator when no message");
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
// ── formatRelativeTime ───────────────────────────────────────────────────
|
|
147
|
-
|
|
148
|
-
test("formatRelativeTime: just now for <60s", () => {
|
|
149
|
-
const epoch = Math.floor(Date.now() / 1000) - 30;
|
|
150
|
-
assert.equal(formatRelativeTime(epoch), "just now");
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
test("formatRelativeTime: minutes", () => {
|
|
154
|
-
const epoch = Math.floor(Date.now() / 1000) - 300;
|
|
155
|
-
assert.equal(formatRelativeTime(epoch), "5m ago");
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
test("formatRelativeTime: hours", () => {
|
|
159
|
-
const epoch = Math.floor(Date.now() / 1000) - 7200;
|
|
160
|
-
assert.equal(formatRelativeTime(epoch), "2h ago");
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
test("formatRelativeTime: days", () => {
|
|
164
|
-
const epoch = Math.floor(Date.now() / 1000) - 172800;
|
|
165
|
-
assert.equal(formatRelativeTime(epoch), "2d ago");
|
|
166
|
-
});
|
|
167
|
-
|
|
168
101
|
test("detectHealthWidgetProjectState: metrics file alone does not imply project", (t) => {
|
|
169
102
|
const dir = makeTempDir("metrics-only");
|
|
170
103
|
t.after(() => { cleanup(dir); });
|
|
@@ -111,51 +111,7 @@ test("resolveExpectedArtifactPath returns correct path for all slice-level types
|
|
|
111
111
|
|
|
112
112
|
const uatResult = resolveExpectedArtifactPath("run-uat", "M001/S01", base);
|
|
113
113
|
assert.ok(uatResult);
|
|
114
|
-
assert.ok(uatResult!.includes("
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
// ─── run-uat artifact path contract (#2873) ──────────────────────────────
|
|
118
|
-
|
|
119
|
-
test("resolveExpectedArtifactPath for run-uat returns ASSESSMENT path, not UAT (#2873)", (t) => {
|
|
120
|
-
// The run-uat prompt instructs the agent to call gsd_summary_save with
|
|
121
|
-
// artifact_type: "ASSESSMENT", which writes S##-ASSESSMENT.md. The artifact
|
|
122
|
-
// verification path must match — otherwise verification fails and auto-mode
|
|
123
|
-
// retries the unit in an infinite loop.
|
|
124
|
-
const base = makeTmpBase();
|
|
125
|
-
t.after(() => cleanup(base));
|
|
126
|
-
|
|
127
|
-
const result = resolveExpectedArtifactPath("run-uat", "M001/S01", base);
|
|
128
|
-
assert.ok(result, "run-uat should resolve to a non-null artifact path");
|
|
129
|
-
assert.ok(
|
|
130
|
-
result!.endsWith("S01-ASSESSMENT.md"),
|
|
131
|
-
`run-uat artifact path should end with S01-ASSESSMENT.md, got: ${result}`,
|
|
132
|
-
);
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
test("diagnoseExpectedArtifact for run-uat references ASSESSMENT (#2873)", (t) => {
|
|
136
|
-
const base = makeTmpBase();
|
|
137
|
-
t.after(() => cleanup(base));
|
|
138
|
-
|
|
139
|
-
const diag = diagnoseExpectedArtifact("run-uat", "M001/S01", base);
|
|
140
|
-
assert.ok(diag, "run-uat should have a diagnostic message");
|
|
141
|
-
assert.ok(
|
|
142
|
-
diag!.includes("ASSESSMENT"),
|
|
143
|
-
`run-uat diagnostic should reference ASSESSMENT, got: ${diag}`,
|
|
144
|
-
);
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
test("verifyExpectedArtifact passes for run-uat when ASSESSMENT file exists (#2873)", (t) => {
|
|
148
|
-
// Regression test: run-uat writes S##-ASSESSMENT.md via gsd_summary_save,
|
|
149
|
-
// but verification looked for S##-UAT.md, causing false stuck retries.
|
|
150
|
-
const base = makeTmpBase();
|
|
151
|
-
t.after(() => cleanup(base));
|
|
152
|
-
|
|
153
|
-
// Write the ASSESSMENT file (what gsd_summary_save actually produces)
|
|
154
|
-
const assessPath = join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-ASSESSMENT.md");
|
|
155
|
-
writeFileSync(assessPath, "---\nverdict: PASS\n---\n# UAT Assessment\n");
|
|
156
|
-
|
|
157
|
-
const verified = verifyExpectedArtifact("run-uat", "M001/S01", base);
|
|
158
|
-
assert.ok(verified, "verifyExpectedArtifact should pass when ASSESSMENT file exists");
|
|
114
|
+
assert.ok(uatResult!.includes("UAT"));
|
|
159
115
|
});
|
|
160
116
|
|
|
161
117
|
// ─── diagnoseExpectedArtifact ─────────────────────────────────────────────
|
|
@@ -741,72 +697,6 @@ test("verifyExpectedArtifact complete-milestone fails with only .gsd/ files (#17
|
|
|
741
697
|
assert.equal(result, false, "complete-milestone should fail verification when only .gsd/ files present");
|
|
742
698
|
});
|
|
743
699
|
|
|
744
|
-
// ─── reconcileMergeState: silent nativeCommit failure (#2542) ─────────────
|
|
745
|
-
|
|
746
|
-
import { reconcileMergeState } from "../../auto-recovery.ts";
|
|
747
|
-
import { chmodSync } from "node:fs";
|
|
748
|
-
|
|
749
|
-
function makeMockCtx(): { ctx: any; notifications: Array<{ msg: string; level: string }> } {
|
|
750
|
-
const notifications: Array<{ msg: string; level: string }> = [];
|
|
751
|
-
const ctx = {
|
|
752
|
-
ui: {
|
|
753
|
-
notify(msg: string, level: string) {
|
|
754
|
-
notifications.push({ msg, level });
|
|
755
|
-
},
|
|
756
|
-
},
|
|
757
|
-
};
|
|
758
|
-
return { ctx, notifications };
|
|
759
|
-
}
|
|
760
|
-
|
|
761
|
-
test("reconcileMergeState returns false and notifies error when nativeCommit fails (#2542)", (t) => {
|
|
762
|
-
const base = makeGitBase();
|
|
763
|
-
t.after(() => cleanup(base));
|
|
764
|
-
|
|
765
|
-
// Create a second branch with a commit, then start a merge on main
|
|
766
|
-
execFileSync("git", ["checkout", "-b", "feature"], { cwd: base, stdio: "ignore" });
|
|
767
|
-
writeFileSync(join(base, "feature.txt"), "feature content");
|
|
768
|
-
execFileSync("git", ["add", "."], { cwd: base, stdio: "ignore" });
|
|
769
|
-
execFileSync("git", ["commit", "-m", "add feature"], { cwd: base, stdio: "ignore" });
|
|
770
|
-
execFileSync("git", ["checkout", "main"], { cwd: base, stdio: "ignore" });
|
|
771
|
-
|
|
772
|
-
// Start merge (no conflicts — fast path with MERGE_HEAD)
|
|
773
|
-
execFileSync("git", ["merge", "--no-ff", "--no-commit", "feature"], { cwd: base, stdio: "ignore" });
|
|
774
|
-
|
|
775
|
-
// Verify MERGE_HEAD exists
|
|
776
|
-
assert.ok(existsSync(join(base, ".git", "MERGE_HEAD")), "MERGE_HEAD should exist");
|
|
777
|
-
|
|
778
|
-
// Make .git/objects read-only so git cannot write the commit object,
|
|
779
|
-
// causing nativeCommit to throw a non-"nothing to commit" error.
|
|
780
|
-
const objectsDir = join(base, ".git", "objects");
|
|
781
|
-
chmodSync(objectsDir, 0o444);
|
|
782
|
-
t.after(() => { try { chmodSync(objectsDir, 0o755); } catch { /* cleanup */ } });
|
|
783
|
-
|
|
784
|
-
const { ctx, notifications } = makeMockCtx();
|
|
785
|
-
const result = reconcileMergeState(base, ctx);
|
|
786
|
-
|
|
787
|
-
// The function should return false to signal reconciliation failure
|
|
788
|
-
// (Currently it silently swallows the error and returns true — this test should FAIL before the fix)
|
|
789
|
-
assert.equal(result, false, "reconcileMergeState should return false when nativeCommit fails");
|
|
790
|
-
const errorNotifications = notifications.filter(n => n.level === "error");
|
|
791
|
-
assert.ok(errorNotifications.length > 0, "should notify an error when nativeCommit fails");
|
|
792
|
-
assert.ok(
|
|
793
|
-
errorNotifications[0].msg.includes("Failed to finalize"),
|
|
794
|
-
"error notification should describe the commit failure",
|
|
795
|
-
);
|
|
796
|
-
});
|
|
797
|
-
|
|
798
|
-
test("reconcileMergeState returns true when no merge state present", (t) => {
|
|
799
|
-
// When there's no MERGE_HEAD or SQUASH_MSG, reconcileMergeState returns false (no dirty state)
|
|
800
|
-
const base = makeGitBase();
|
|
801
|
-
t.after(() => cleanup(base));
|
|
802
|
-
|
|
803
|
-
const { ctx, notifications } = makeMockCtx();
|
|
804
|
-
const result = reconcileMergeState(base, ctx);
|
|
805
|
-
|
|
806
|
-
assert.equal(result, false, "should return false when no merge state exists");
|
|
807
|
-
assert.equal(notifications.length, 0, "should not notify when no merge state present");
|
|
808
|
-
});
|
|
809
|
-
|
|
810
700
|
test("verifyExpectedArtifact complete-milestone passes with impl files (#1703)", (t) => {
|
|
811
701
|
const base = makeGitBase();
|
|
812
702
|
t.after(() => cleanup(base));
|
package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts
CHANGED
|
@@ -638,107 +638,6 @@ describe("auto-worktree-milestone-merge", { timeout: 300_000 }, () => {
|
|
|
638
638
|
"#1906: codeFilesChanged must be false when only .gsd/ files were merged");
|
|
639
639
|
});
|
|
640
640
|
|
|
641
|
-
test("#2912: MERGE_HEAD cleaned up after squash-merge conflict", () => {
|
|
642
|
-
const repo = freshRepo();
|
|
643
|
-
const wtPath = createAutoWorktree(repo, "M291");
|
|
644
|
-
|
|
645
|
-
// Create a file on main that will conflict with the milestone branch
|
|
646
|
-
run("git checkout main", repo);
|
|
647
|
-
writeFileSync(join(repo, "conflict.ts"), "// main version\nexport const x = 1;\n");
|
|
648
|
-
run("git add .", repo);
|
|
649
|
-
run("git commit -m 'add conflict.ts on main'", repo);
|
|
650
|
-
|
|
651
|
-
// Switch back to milestone branch and create conflicting content
|
|
652
|
-
run("git checkout milestone/M291", wtPath);
|
|
653
|
-
writeFileSync(join(wtPath, "conflict.ts"), "// milestone version\nexport const x = 2;\n");
|
|
654
|
-
run("git add .", wtPath);
|
|
655
|
-
run("git commit -m 'add conflict.ts on milestone'", wtPath);
|
|
656
|
-
|
|
657
|
-
const roadmap = makeRoadmap("M291", "Conflict milestone", [
|
|
658
|
-
{ id: "S01", title: "Conflict test" },
|
|
659
|
-
]);
|
|
660
|
-
|
|
661
|
-
// The merge should throw MergeConflictError due to conflict.ts
|
|
662
|
-
let threw = false;
|
|
663
|
-
try {
|
|
664
|
-
mergeMilestoneToMain(repo, "M291", roadmap);
|
|
665
|
-
} catch (err: unknown) {
|
|
666
|
-
threw = true;
|
|
667
|
-
// Verify it's a merge conflict error
|
|
668
|
-
assert.ok(
|
|
669
|
-
err instanceof Error && err.message.includes("conflict"),
|
|
670
|
-
"should throw a conflict-related error",
|
|
671
|
-
);
|
|
672
|
-
}
|
|
673
|
-
assert.ok(threw, "mergeMilestoneToMain must throw on code conflict");
|
|
674
|
-
|
|
675
|
-
// BUG #2912: MERGE_HEAD must NOT be left on disk after the error
|
|
676
|
-
const mergeHeadPath = join(repo, ".git", "MERGE_HEAD");
|
|
677
|
-
assert.ok(
|
|
678
|
-
!existsSync(mergeHeadPath),
|
|
679
|
-
"#2912: MERGE_HEAD must be cleaned up after merge conflict error",
|
|
680
|
-
);
|
|
681
|
-
});
|
|
682
|
-
|
|
683
|
-
test("#2912: stale MERGE_HEAD from native merge is cleaned after successful commit", () => {
|
|
684
|
-
const repo = freshRepo();
|
|
685
|
-
const wtPath = createAutoWorktree(repo, "M292");
|
|
686
|
-
|
|
687
|
-
addSliceToMilestone(repo, wtPath, "M292", "S01", "Feature A", [
|
|
688
|
-
{ file: "feature-a.ts", content: "export const a = true;\n", message: "add feature a" },
|
|
689
|
-
]);
|
|
690
|
-
|
|
691
|
-
const roadmap = makeRoadmap("M292", "Clean merge", [
|
|
692
|
-
{ id: "S01", title: "Feature A" },
|
|
693
|
-
]);
|
|
694
|
-
|
|
695
|
-
// Simulate what libgit2's merge implementation does: it creates MERGE_HEAD
|
|
696
|
-
// even for squash merges (unlike CLI git). We plant MERGE_HEAD before calling
|
|
697
|
-
// mergeMilestoneToMain to verify the success path cleans it up.
|
|
698
|
-
// We cannot plant it before the call because the function manages checkout
|
|
699
|
-
// internally, so instead we verify after the call.
|
|
700
|
-
mergeMilestoneToMain(repo, "M292", roadmap);
|
|
701
|
-
|
|
702
|
-
// After successful merge+commit, MERGE_HEAD must not linger
|
|
703
|
-
const mergeHeadPath = join(repo, ".git", "MERGE_HEAD");
|
|
704
|
-
assert.ok(
|
|
705
|
-
!existsSync(mergeHeadPath),
|
|
706
|
-
"#2912: MERGE_HEAD must be cleaned up after successful merge",
|
|
707
|
-
);
|
|
708
|
-
});
|
|
709
|
-
|
|
710
|
-
test("#2912: planted MERGE_HEAD is cleaned up in success path", () => {
|
|
711
|
-
// This test directly verifies the cleanup code handles a MERGE_HEAD file
|
|
712
|
-
// left by the native (libgit2) merge path. We hook into the merge by
|
|
713
|
-
// planting MERGE_HEAD right after nativeMergeSquash would create it.
|
|
714
|
-
const repo = freshRepo();
|
|
715
|
-
const wtPath = createAutoWorktree(repo, "M293");
|
|
716
|
-
|
|
717
|
-
addSliceToMilestone(repo, wtPath, "M293", "S01", "Feature B", [
|
|
718
|
-
{ file: "feature-b.ts", content: "export const b = true;\n", message: "add feature b" },
|
|
719
|
-
]);
|
|
720
|
-
|
|
721
|
-
const roadmap = makeRoadmap("M293", "Planted MERGE_HEAD", [
|
|
722
|
-
{ id: "S01", title: "Feature B" },
|
|
723
|
-
]);
|
|
724
|
-
|
|
725
|
-
// Plant a fake MERGE_HEAD in the git dir to simulate libgit2 behavior.
|
|
726
|
-
// We need to do this after the function checks out main but before it
|
|
727
|
-
// commits. Since we can't intercept mid-function, we plant it before
|
|
728
|
-
// the call. If the function cleans it up, the test passes.
|
|
729
|
-
const gitDir = join(repo, ".git");
|
|
730
|
-
const fakeHead = run("git rev-parse HEAD", repo);
|
|
731
|
-
writeFileSync(join(gitDir, "MERGE_HEAD"), fakeHead + "\n");
|
|
732
|
-
|
|
733
|
-
mergeMilestoneToMain(repo, "M293", roadmap);
|
|
734
|
-
|
|
735
|
-
// The planted MERGE_HEAD must be cleaned up
|
|
736
|
-
assert.ok(
|
|
737
|
-
!existsSync(join(gitDir, "MERGE_HEAD")),
|
|
738
|
-
"#2912: planted MERGE_HEAD must be removed by success-path cleanup",
|
|
739
|
-
);
|
|
740
|
-
});
|
|
741
|
-
|
|
742
641
|
test("#1906: codeFilesChanged=true when real code is merged", () => {
|
|
743
642
|
const repo = freshRepo();
|
|
744
643
|
const wtPath = createAutoWorktree(repo, "M190");
|
|
@@ -20,7 +20,6 @@ import {
|
|
|
20
20
|
enterAutoWorktree,
|
|
21
21
|
getAutoWorktreeOriginalBase,
|
|
22
22
|
getActiveAutoWorktreeContext,
|
|
23
|
-
syncGsdStateToWorktree,
|
|
24
23
|
} from "../../auto-worktree.ts";
|
|
25
24
|
|
|
26
25
|
// Note: execSync is used intentionally in tests for git operations with
|
|
@@ -287,62 +286,4 @@ describe("auto-worktree lifecycle", () => {
|
|
|
287
286
|
teardownAutoWorktree(tempDir, "M004");
|
|
288
287
|
}
|
|
289
288
|
});
|
|
290
|
-
|
|
291
|
-
test("#2791: mcp.json copied into worktree via copyPlanningArtifacts", () => {
|
|
292
|
-
tempDir = createTempRepo();
|
|
293
|
-
const msDir = join(tempDir, ".gsd", "milestones", "M003");
|
|
294
|
-
mkdirSync(msDir, { recursive: true });
|
|
295
|
-
writeFileSync(join(msDir, "CONTEXT.md"), "# M003 Context\n");
|
|
296
|
-
run("git add .", tempDir);
|
|
297
|
-
run("git commit -m \"add milestone\"", tempDir);
|
|
298
|
-
|
|
299
|
-
// Create mcp.json in .gsd/ AFTER the commit (untracked, like real usage).
|
|
300
|
-
// copyPlanningArtifacts should copy it into the worktree's .gsd/.
|
|
301
|
-
writeFileSync(
|
|
302
|
-
join(tempDir, ".gsd", "mcp.json"),
|
|
303
|
-
JSON.stringify({ servers: { test: { command: "echo" } } }),
|
|
304
|
-
);
|
|
305
|
-
|
|
306
|
-
const wtPath = createAutoWorktree(tempDir, "M003");
|
|
307
|
-
|
|
308
|
-
try {
|
|
309
|
-
assert.ok(
|
|
310
|
-
existsSync(join(wtPath, ".gsd", "mcp.json")),
|
|
311
|
-
"mcp.json should be copied into worktree .gsd/ on creation",
|
|
312
|
-
);
|
|
313
|
-
} finally {
|
|
314
|
-
teardownAutoWorktree(tempDir, "M003");
|
|
315
|
-
}
|
|
316
|
-
});
|
|
317
|
-
|
|
318
|
-
test("#2791: mcp.json synced via syncGsdStateToWorktree (ROOT_STATE_FILES)", () => {
|
|
319
|
-
tempDir = createTempRepo();
|
|
320
|
-
const msDir = join(tempDir, ".gsd", "milestones", "M003");
|
|
321
|
-
mkdirSync(msDir, { recursive: true });
|
|
322
|
-
writeFileSync(join(msDir, "CONTEXT.md"), "# M003 Context\n");
|
|
323
|
-
run("git add .", tempDir);
|
|
324
|
-
run("git commit -m \"add milestone\"", tempDir);
|
|
325
|
-
|
|
326
|
-
// Create worktree first (no mcp.json yet)
|
|
327
|
-
const wtPath = createAutoWorktree(tempDir, "M003");
|
|
328
|
-
|
|
329
|
-
try {
|
|
330
|
-
// Now add mcp.json to the main .gsd/ after worktree was created
|
|
331
|
-
writeFileSync(
|
|
332
|
-
join(tempDir, ".gsd", "mcp.json"),
|
|
333
|
-
JSON.stringify({ servers: { test: { command: "echo" } } }),
|
|
334
|
-
);
|
|
335
|
-
|
|
336
|
-
// Sync should pick up the new mcp.json
|
|
337
|
-
const { synced } = syncGsdStateToWorktree(tempDir, wtPath);
|
|
338
|
-
|
|
339
|
-
assert.ok(synced.includes("mcp.json"), "mcp.json should be in the synced list");
|
|
340
|
-
assert.ok(
|
|
341
|
-
existsSync(join(wtPath, ".gsd", "mcp.json")),
|
|
342
|
-
"mcp.json should exist in worktree after sync",
|
|
343
|
-
);
|
|
344
|
-
} finally {
|
|
345
|
-
teardownAutoWorktree(tempDir, "M003");
|
|
346
|
-
}
|
|
347
|
-
});
|
|
348
289
|
});
|