gsd-pi 2.58.0-dev.778d6ac → 2.58.0-dev.d63175c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/cli.js +35 -49
- package/dist/headless-ui.d.ts +0 -17
- package/dist/headless-ui.js +3 -97
- package/dist/headless.js +6 -67
- package/dist/help-text.js +0 -1
- package/dist/onboarding.js +0 -44
- package/dist/resource-loader.js +1 -16
- package/dist/resources/agents/researcher.md +1 -1
- package/dist/resources/extensions/ask-user-questions.js +3 -16
- package/dist/resources/extensions/async-jobs/extension-manifest.json +1 -1
- package/dist/resources/extensions/bg-shell/extension-manifest.json +1 -1
- package/dist/resources/extensions/browser-tools/extension-manifest.json +1 -1
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +6 -14
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +36 -59
- package/dist/resources/extensions/context7/extension-manifest.json +1 -1
- package/dist/resources/extensions/get-secrets-from-user.js +5 -8
- package/dist/resources/extensions/google-search/extension-manifest.json +1 -1
- package/dist/resources/extensions/google-search/index.js +1 -2
- package/dist/resources/extensions/gsd/auto/phases.js +21 -25
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +2 -2
- package/dist/resources/extensions/gsd/auto-dashboard.js +20 -37
- package/dist/resources/extensions/gsd/auto-dispatch.js +2 -17
- package/dist/resources/extensions/gsd/auto-model-selection.js +3 -26
- package/dist/resources/extensions/gsd/auto-post-unit.js +4 -16
- package/dist/resources/extensions/gsd/auto-prompts.js +1 -1
- package/dist/resources/extensions/gsd/auto-recovery.js +5 -13
- package/dist/resources/extensions/gsd/auto-start.js +22 -35
- package/dist/resources/extensions/gsd/auto-worktree.js +12 -196
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +0 -32
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +8 -80
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -32
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +18 -33
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -44
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +0 -67
- package/dist/resources/extensions/gsd/captures.js +4 -56
- package/dist/resources/extensions/gsd/db-writer.js +8 -116
- package/dist/resources/extensions/gsd/doctor-git-checks.js +0 -28
- package/dist/resources/extensions/gsd/doctor-providers.js +1 -2
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +4 -5
- package/dist/resources/extensions/gsd/doctor.js +1 -3
- package/dist/resources/extensions/gsd/error-classifier.js +10 -13
- package/dist/resources/extensions/gsd/extension-manifest.json +1 -16
- package/dist/resources/extensions/gsd/forensics.js +20 -123
- package/dist/resources/extensions/gsd/git-service.js +1 -23
- package/dist/resources/extensions/gsd/gitignore.js +0 -33
- package/dist/resources/extensions/gsd/gsd-db.js +9 -36
- package/dist/resources/extensions/gsd/guided-flow.js +44 -106
- package/dist/resources/extensions/gsd/health-widget-core.js +0 -31
- package/dist/resources/extensions/gsd/health-widget.js +0 -17
- package/dist/resources/extensions/gsd/index.js +1 -1
- package/dist/resources/extensions/gsd/memory-extractor.js +0 -7
- package/dist/resources/extensions/gsd/migrate-external.js +1 -8
- package/dist/resources/extensions/gsd/model-cost-table.js +0 -18
- package/dist/resources/extensions/gsd/model-router.js +1 -35
- package/dist/resources/extensions/gsd/native-git-bridge.js +0 -17
- package/dist/resources/extensions/gsd/notifications.js +1 -16
- package/dist/resources/extensions/gsd/parallel-eligibility.js +2 -13
- package/dist/resources/extensions/gsd/parallel-merge.js +5 -78
- package/dist/resources/extensions/gsd/parsers-legacy.js +3 -20
- package/dist/resources/extensions/gsd/paths.js +0 -43
- package/dist/resources/extensions/gsd/preferences-models.js +1 -14
- package/dist/resources/extensions/gsd/preferences-types.js +1 -2
- package/dist/resources/extensions/gsd/preferences.js +16 -13
- package/dist/resources/extensions/gsd/prompt-loader.js +1 -4
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -4
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
- package/dist/resources/extensions/gsd/prompts/discuss.md +1 -1
- package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -3
- package/dist/resources/extensions/gsd/prompts/forensics.md +2 -2
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +0 -2
- package/dist/resources/extensions/gsd/prompts/rethink.md +1 -1
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +0 -1
- package/dist/resources/extensions/gsd/repo-identity.js +11 -205
- package/dist/resources/extensions/gsd/rethink.js +0 -5
- package/dist/resources/extensions/gsd/roadmap-slices.js +4 -5
- package/dist/resources/extensions/gsd/state.js +27 -85
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +1 -20
- package/dist/resources/extensions/gsd/tools/complete-task.js +71 -34
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +2 -12
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +1 -29
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +3 -14
- package/dist/resources/extensions/gsd/triage-resolution.js +7 -22
- package/dist/resources/extensions/gsd/undo.js +2 -2
- package/dist/resources/extensions/gsd/unit-ownership.js +33 -164
- package/dist/resources/extensions/gsd/verdict-parser.js +8 -20
- package/dist/resources/extensions/gsd/workflow-manifest.js +5 -24
- package/dist/resources/extensions/gsd/workflow-projections.js +63 -95
- package/dist/resources/extensions/gsd/workflow-reconcile.js +5 -35
- package/dist/resources/extensions/gsd/workspace-index.js +0 -24
- package/dist/resources/extensions/gsd/worktree-manager.js +1 -105
- package/dist/resources/extensions/gsd/worktree-resolver.js +3 -20
- package/dist/resources/extensions/mcp-client/index.js +7 -11
- package/dist/resources/extensions/search-the-web/extension-manifest.json +1 -1
- package/dist/resources/extensions/shared/interview-ui.js +1 -11
- package/dist/resources/skills/create-gsd-extension/SKILL.md +3 -5
- package/dist/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +4 -5
- package/dist/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
- package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
- package/dist/resources/skills/create-gsd-extension/workflows/debug-extension.md +3 -5
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -17
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- package/dist/web/standalone/.next/required-server-files.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -17
- package/dist/web/standalone/.next/server/chunks/2229.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/6502.8b732f67a11b11b4.js +9 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-a1c1e452c6b32d04.js → webpack-61d3afac6d0f0ce7.js} +1 -1
- package/dist/web/standalone/.next/static/css/a58ef8a151aa0493.css +1 -0
- package/dist/web/standalone/server.js +1 -1
- package/dist/web-mode.js +1 -2
- package/package.json +2 -2
- package/packages/native/dist/ast/index.js +5 -9
- package/packages/native/dist/ast/types.js +1 -2
- package/packages/native/dist/clipboard/index.js +7 -12
- package/packages/native/dist/clipboard/types.js +1 -2
- package/packages/native/dist/diff/index.js +7 -12
- package/packages/native/dist/diff/types.js +1 -2
- package/packages/native/dist/fd/index.js +3 -6
- package/packages/native/dist/fd/types.js +1 -2
- package/packages/native/dist/glob/index.js +5 -9
- package/packages/native/dist/glob/types.js +1 -2
- package/packages/native/dist/grep/index.js +5 -9
- package/packages/native/dist/grep/types.js +1 -2
- package/packages/native/dist/gsd-parser/index.js +11 -18
- package/packages/native/dist/gsd-parser/types.js +1 -2
- package/packages/native/dist/highlight/index.js +7 -12
- package/packages/native/dist/highlight/types.js +1 -2
- package/packages/native/dist/html/index.js +3 -6
- package/packages/native/dist/html/types.js +1 -2
- package/packages/native/dist/image/index.js +5 -10
- package/packages/native/dist/image/types.js +4 -7
- package/packages/native/dist/index.js +17 -70
- package/packages/native/dist/json-parse/index.js +8 -13
- package/packages/native/dist/native.js +10 -47
- package/packages/native/dist/ps/index.js +9 -15
- package/packages/native/dist/ps/types.js +1 -2
- package/packages/native/dist/stream-process/index.js +7 -12
- package/packages/native/dist/text/index.js +14 -24
- package/packages/native/dist/text/types.js +2 -5
- package/packages/native/dist/truncate/index.js +7 -12
- package/packages/native/dist/ttsr/index.js +7 -12
- package/packages/native/dist/ttsr/types.js +1 -2
- package/packages/native/dist/xxhash/index.js +5 -9
- package/packages/native/package.json +19 -19
- package/packages/native/src/native.ts +8 -9
- package/packages/pi-agent-core/dist/agent-loop.js +2 -3
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/proxy.d.ts +1 -1
- package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/proxy.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.ts +2 -3
- package/packages/pi-agent-core/src/proxy.ts +1 -1
- package/packages/pi-ai/dist/env-api-keys.js +0 -1
- package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
- package/packages/pi-ai/dist/index.d.ts +0 -1
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +0 -1
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +2 -19
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +3 -3
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/dist/utils/json-parse.d.ts +0 -3
- package/packages/pi-ai/dist/utils/json-parse.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/json-parse.js +1 -24
- package/packages/pi-ai/dist/utils/json-parse.js.map +1 -1
- package/packages/pi-ai/src/env-api-keys.ts +0 -1
- package/packages/pi-ai/src/index.ts +0 -1
- package/packages/pi-ai/src/providers/anthropic-shared.ts +2 -17
- package/packages/pi-ai/src/types.ts +2 -3
- package/packages/pi-ai/src/utils/json-parse.ts +1 -28
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +0 -4
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +0 -31
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +1 -17
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +2 -62
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/exec.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/exec.js +1 -3
- package/packages/pi-coding-agent/dist/core/exec.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +0 -4
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js +0 -2
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +0 -5
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +0 -5
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/index.js +1 -1
- package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/index.js +0 -3
- package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +0 -3
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/messages.js +2 -31
- package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +0 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +0 -10
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +1 -12
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +0 -6
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +1 -48
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -10
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js +4 -13
- package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +2 -2
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +0 -4
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts +0 -1
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js +0 -5
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +1 -38
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +1 -94
- package/packages/pi-coding-agent/src/core/exec.ts +1 -3
- package/packages/pi-coding-agent/src/core/extensions/index.ts +0 -4
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +0 -5
- package/packages/pi-coding-agent/src/core/index.ts +0 -6
- package/packages/pi-coding-agent/src/core/lsp/index.ts +0 -3
- package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +0 -3
- package/packages/pi-coding-agent/src/core/messages.ts +2 -29
- package/packages/pi-coding-agent/src/core/model-resolver.ts +0 -1
- package/packages/pi-coding-agent/src/core/resource-loader.ts +1 -20
- package/packages/pi-coding-agent/src/core/retry-handler.ts +1 -52
- package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +3 -11
- package/packages/pi-coding-agent/src/core/tools/read.ts +4 -14
- package/packages/pi-coding-agent/src/index.ts +0 -6
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +0 -7
- package/packages/pi-coding-agent/src/modes/rpc/remote-terminal.ts +0 -6
- package/packages/pi-tui/dist/terminal.d.ts +0 -2
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +0 -9
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +0 -9
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/src/terminal.ts +0 -14
- package/packages/pi-tui/src/tui.ts +0 -8
- package/scripts/ensure-workspace-builds.cjs +14 -45
- package/src/resources/agents/researcher.md +1 -1
- package/src/resources/extensions/ask-user-questions.ts +3 -21
- package/src/resources/extensions/async-jobs/extension-manifest.json +1 -1
- package/src/resources/extensions/bg-shell/extension-manifest.json +1 -1
- package/src/resources/extensions/browser-tools/extension-manifest.json +1 -1
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +6 -13
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +35 -63
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +0 -28
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +1 -108
- package/src/resources/extensions/context7/extension-manifest.json +1 -1
- package/src/resources/extensions/get-secrets-from-user.ts +5 -8
- package/src/resources/extensions/google-search/extension-manifest.json +1 -1
- package/src/resources/extensions/google-search/index.ts +1 -2
- package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -1
- package/src/resources/extensions/gsd/auto/phases.ts +34 -43
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
- package/src/resources/extensions/gsd/auto-dashboard.ts +19 -37
- package/src/resources/extensions/gsd/auto-dispatch.ts +2 -18
- package/src/resources/extensions/gsd/auto-model-selection.ts +5 -26
- package/src/resources/extensions/gsd/auto-post-unit.ts +4 -18
- package/src/resources/extensions/gsd/auto-prompts.ts +1 -1
- package/src/resources/extensions/gsd/auto-recovery.ts +5 -12
- package/src/resources/extensions/gsd/auto-start.ts +26 -35
- package/src/resources/extensions/gsd/auto-worktree.ts +9 -190
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +0 -31
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +8 -85
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -38
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +19 -31
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -50
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +0 -75
- package/src/resources/extensions/gsd/captures.ts +3 -63
- package/src/resources/extensions/gsd/db-writer.ts +7 -140
- package/src/resources/extensions/gsd/doctor-git-checks.ts +0 -26
- package/src/resources/extensions/gsd/doctor-providers.ts +1 -2
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +4 -5
- package/src/resources/extensions/gsd/doctor.ts +1 -3
- package/src/resources/extensions/gsd/error-classifier.ts +11 -14
- package/src/resources/extensions/gsd/extension-manifest.json +1 -16
- package/src/resources/extensions/gsd/forensics.ts +20 -144
- package/src/resources/extensions/gsd/git-service.ts +3 -26
- package/src/resources/extensions/gsd/gitignore.ts +0 -33
- package/src/resources/extensions/gsd/gsd-db.ts +7 -43
- package/src/resources/extensions/gsd/guided-flow.ts +45 -114
- package/src/resources/extensions/gsd/health-widget-core.ts +0 -34
- package/src/resources/extensions/gsd/health-widget.ts +0 -17
- package/src/resources/extensions/gsd/index.ts +0 -1
- package/src/resources/extensions/gsd/memory-extractor.ts +0 -8
- package/src/resources/extensions/gsd/migrate-external.ts +1 -9
- package/src/resources/extensions/gsd/model-cost-table.ts +0 -19
- package/src/resources/extensions/gsd/model-router.ts +1 -35
- package/src/resources/extensions/gsd/native-git-bridge.ts +0 -17
- package/src/resources/extensions/gsd/notifications.ts +0 -16
- package/src/resources/extensions/gsd/parallel-eligibility.ts +2 -15
- package/src/resources/extensions/gsd/parallel-merge.ts +4 -87
- package/src/resources/extensions/gsd/parsers-legacy.ts +3 -22
- package/src/resources/extensions/gsd/paths.ts +0 -42
- package/src/resources/extensions/gsd/preferences-models.ts +1 -14
- package/src/resources/extensions/gsd/preferences-types.ts +1 -2
- package/src/resources/extensions/gsd/preferences.ts +15 -13
- package/src/resources/extensions/gsd/prompt-loader.ts +1 -4
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -4
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
- package/src/resources/extensions/gsd/prompts/discuss.md +1 -1
- package/src/resources/extensions/gsd/prompts/execute-task.md +1 -3
- package/src/resources/extensions/gsd/prompts/forensics.md +2 -2
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +0 -2
- package/src/resources/extensions/gsd/prompts/rethink.md +1 -1
- package/src/resources/extensions/gsd/prompts/triage-captures.md +0 -1
- package/src/resources/extensions/gsd/repo-identity.ts +11 -186
- package/src/resources/extensions/gsd/rethink.ts +0 -6
- package/src/resources/extensions/gsd/roadmap-slices.ts +4 -5
- package/src/resources/extensions/gsd/state.ts +32 -84
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +0 -29
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +1 -71
- package/src/resources/extensions/gsd/tests/captures.test.ts +0 -103
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +0 -27
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +0 -21
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +12 -7
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +5 -78
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +0 -29
- package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +0 -40
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +1 -20
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +0 -117
- package/src/resources/extensions/gsd/tests/empty-db-reconciliation.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -31
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +12 -125
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +0 -67
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +1 -111
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +0 -101
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +0 -59
- package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +0 -110
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +2 -85
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +0 -34
- package/src/resources/extensions/gsd/tests/model-router.test.ts +3 -68
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +0 -28
- package/src/resources/extensions/gsd/tests/notifications.test.ts +0 -45
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +1 -33
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +0 -29
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +0 -38
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +0 -117
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +0 -97
- package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +0 -134
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +1 -2
- package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +0 -8
- package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +17 -100
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +1 -4
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +0 -48
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +0 -92
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +1 -48
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +5 -29
- package/src/resources/extensions/gsd/tools/complete-task.ts +74 -36
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +1 -13
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +0 -36
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +2 -20
- package/src/resources/extensions/gsd/triage-resolution.ts +6 -23
- package/src/resources/extensions/gsd/types.ts +2 -4
- package/src/resources/extensions/gsd/undo.ts +2 -2
- package/src/resources/extensions/gsd/unit-ownership.ts +35 -206
- package/src/resources/extensions/gsd/verdict-parser.ts +6 -21
- package/src/resources/extensions/gsd/workflow-logger.ts +1 -3
- package/src/resources/extensions/gsd/workflow-manifest.ts +5 -22
- package/src/resources/extensions/gsd/workflow-projections.ts +64 -97
- package/src/resources/extensions/gsd/workflow-reconcile.ts +10 -39
- package/src/resources/extensions/gsd/workspace-index.ts +0 -30
- package/src/resources/extensions/gsd/worktree-manager.ts +1 -120
- package/src/resources/extensions/gsd/worktree-resolver.ts +3 -22
- package/src/resources/extensions/mcp-client/index.ts +7 -13
- package/src/resources/extensions/search-the-web/extension-manifest.json +1 -1
- package/src/resources/extensions/shared/interview-ui.ts +1 -12
- package/src/resources/skills/create-gsd-extension/SKILL.md +3 -5
- package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +4 -5
- package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
- package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
- package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +3 -5
- package/dist/resources/extensions/gsd/milestone-validation-gates.js +0 -45
- package/dist/resources/extensions/ollama/index.js +0 -112
- package/dist/resources/extensions/ollama/model-capabilities.js +0 -115
- package/dist/resources/extensions/ollama/ollama-client.js +0 -168
- package/dist/resources/extensions/ollama/ollama-commands.js +0 -194
- package/dist/resources/extensions/ollama/ollama-discovery.js +0 -69
- package/dist/resources/extensions/ollama/ollama-tool.js +0 -184
- package/dist/resources/extensions/ollama/types.js +0 -2
- package/dist/startup-model-validation.d.ts +0 -39
- package/dist/startup-model-validation.js +0 -50
- package/dist/web/standalone/.next/static/chunks/6502.7593d7797a4b3999.js +0 -9
- package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +0 -1
- package/packages/native/src/__tests__/module-compat.test.mjs +0 -91
- package/packages/pi-agent-core/src/agent-loop.test.ts +0 -45
- package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts +0 -2
- package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts.map +0 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js +0 -25
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +0 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.d.ts +0 -37
- package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +0 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.js +0 -75
- package/packages/pi-ai/dist/utils/repair-tool-json.js.map +0 -1
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts +0 -2
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts.map +0 -1
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +0 -73
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +0 -1
- package/packages/pi-ai/src/providers/anthropic-shared.test.ts +0 -29
- package/packages/pi-ai/src/utils/repair-tool-json.ts +0 -88
- package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +0 -102
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts +0 -6
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +0 -176
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts +0 -28
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js +0 -37
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js +0 -63
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts +0 -19
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js +0 -115
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js +0 -109
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts +0 -44
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js +0 -97
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js +0 -181
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/messages.test.d.ts +0 -9
- package/packages/pi-coding-agent/dist/core/messages.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/messages.test.js +0 -86
- package/packages/pi-coding-agent/dist/core/messages.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts +0 -9
- package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js +0 -193
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts +0 -16
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +0 -80
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +0 -1
- package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +0 -236
- package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +0 -77
- package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +0 -62
- package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +0 -134
- package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +0 -137
- package/packages/pi-coding-agent/src/core/image-overflow-recovery.test.ts +0 -228
- package/packages/pi-coding-agent/src/core/image-overflow-recovery.ts +0 -118
- package/packages/pi-coding-agent/src/core/messages.test.ts +0 -114
- package/packages/pi-coding-agent/src/core/retry-handler.test.ts +0 -255
- package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +0 -92
- package/src/resources/extensions/gsd/milestone-validation-gates.ts +0 -56
- package/src/resources/extensions/gsd/tests/auto-mode-interactive-guard.test.ts +0 -71
- package/src/resources/extensions/gsd/tests/cli-provider-rate-limit.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/completion-hierarchy-guards.test.ts +0 -192
- package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +0 -131
- package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +0 -127
- package/src/resources/extensions/gsd/tests/dynamic-routing-default.test.ts +0 -20
- package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +0 -74
- package/src/resources/extensions/gsd/tests/event-replay-idempotency.test.ts +0 -140
- package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -129
- package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
- package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +0 -164
- package/src/resources/extensions/gsd/tests/guided-flow-dynamic-routing.test.ts +0 -135
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +0 -97
- package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +0 -107
- package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +0 -243
- package/src/resources/extensions/gsd/tests/integration/gitignore-staging-2570.test.ts +0 -150
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +0 -959
- package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +0 -105
- package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +0 -116
- package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +0 -159
- package/src/resources/extensions/gsd/tests/parallel-eligibility-ghost.test.ts +0 -150
- package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +0 -70
- package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +0 -297
- package/src/resources/extensions/gsd/tests/prompt-loader-replacement.test.ts +0 -178
- package/src/resources/extensions/gsd/tests/prompt-tool-names.test.ts +0 -69
- package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +0 -157
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +0 -90
- package/src/resources/extensions/gsd/tests/reconciliation-edge-cases.test.ts +0 -162
- package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +0 -233
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +0 -305
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +0 -405
- package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +0 -257
- package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +0 -1628
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +0 -106
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +0 -174
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +0 -221
- package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +0 -289
- package/src/resources/extensions/gsd/tests/vacuum-recovery.test.ts +0 -154
- package/src/resources/extensions/gsd/tests/verdict-parser.test.ts +0 -156
- package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +0 -82
- package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +0 -140
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +0 -101
- package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +0 -95
- package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +0 -55
- package/src/resources/extensions/ollama/index.ts +0 -130
- package/src/resources/extensions/ollama/model-capabilities.ts +0 -145
- package/src/resources/extensions/ollama/ollama-client.ts +0 -196
- package/src/resources/extensions/ollama/ollama-commands.ts +0 -248
- package/src/resources/extensions/ollama/ollama-discovery.ts +0 -106
- package/src/resources/extensions/ollama/ollama-tool.ts +0 -218
- package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +0 -162
- package/src/resources/extensions/ollama/tests/ollama-client.test.ts +0 -38
- package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +0 -28
- package/src/resources/extensions/ollama/types.ts +0 -130
- package/src/resources/extensions/shared/tests/ask-user-freetext.test.ts +0 -156
- /package/dist/web/standalone/.next/static/{R0D4xaIPl5kg93edN7Oo0 → 5DLsjFHdSB6_a1EDQVjr7}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{R0D4xaIPl5kg93edN7Oo0 → 5DLsjFHdSB6_a1EDQVjr7}/_ssgManifest.js +0 -0
|
@@ -9,7 +9,6 @@ import {
|
|
|
9
9
|
closeDatabase,
|
|
10
10
|
insertMilestone,
|
|
11
11
|
insertSlice,
|
|
12
|
-
insertAssessment,
|
|
13
12
|
getSlice,
|
|
14
13
|
getMilestoneSlices,
|
|
15
14
|
getAssessment,
|
|
@@ -324,119 +323,3 @@ test('handleReassessRoadmap returns structured error payloads with actionable me
|
|
|
324
323
|
cleanup(base);
|
|
325
324
|
}
|
|
326
325
|
});
|
|
327
|
-
|
|
328
|
-
// ─── Bug #2957: Stale VALIDATION survives roadmap remediation ────────────
|
|
329
|
-
|
|
330
|
-
test('handleReassessRoadmap invalidates stale milestone-validation when roadmap changes (#2957)', async () => {
|
|
331
|
-
const base = makeTmpBase();
|
|
332
|
-
openDatabase(join(base, '.gsd', 'gsd.db'));
|
|
333
|
-
|
|
334
|
-
try {
|
|
335
|
-
// Seed: M001 with S01-S04 all complete, plus a stale VALIDATION with needs-remediation
|
|
336
|
-
insertMilestone({ id: 'M001', title: 'Test Milestone', status: 'active' });
|
|
337
|
-
insertSlice({ id: 'S01', milestoneId: 'M001', title: 'Slice One', status: 'complete', demo: 'Demo' });
|
|
338
|
-
insertSlice({ id: 'S02', milestoneId: 'M001', title: 'Slice Two', status: 'complete', demo: 'Demo' });
|
|
339
|
-
insertSlice({ id: 'S03', milestoneId: 'M001', title: 'Slice Three', status: 'complete', demo: 'Demo' });
|
|
340
|
-
insertSlice({ id: 'S04', milestoneId: 'M001', title: 'Slice Four', status: 'complete', demo: 'Demo' });
|
|
341
|
-
|
|
342
|
-
// Insert milestone-validation assessment with needs-remediation verdict (stale)
|
|
343
|
-
const validationPath = join('.gsd', 'milestones', 'M001', 'M001-VALIDATION.md');
|
|
344
|
-
insertAssessment({
|
|
345
|
-
path: validationPath,
|
|
346
|
-
milestoneId: 'M001',
|
|
347
|
-
sliceId: null,
|
|
348
|
-
taskId: null,
|
|
349
|
-
status: 'needs-remediation',
|
|
350
|
-
scope: 'milestone-validation',
|
|
351
|
-
fullContent: '---\nverdict: needs-remediation\nremediation_round: 0\n---\n\n# Validation\nNeeds remediation.',
|
|
352
|
-
});
|
|
353
|
-
|
|
354
|
-
// Verify the validation row exists before reassess
|
|
355
|
-
const adapter = _getAdapter()!;
|
|
356
|
-
const before = adapter.prepare(
|
|
357
|
-
`SELECT * FROM assessments WHERE milestone_id = 'M001' AND scope = 'milestone-validation'`,
|
|
358
|
-
).get() as Record<string, unknown> | undefined;
|
|
359
|
-
assert.ok(before, 'milestone-validation row should exist before reassess');
|
|
360
|
-
|
|
361
|
-
// Now reassess the roadmap: add remediation slice S05
|
|
362
|
-
// This simulates the scenario from #2957 where validation produced needs-remediation
|
|
363
|
-
// and then roadmap was reassessed to add a remediation slice
|
|
364
|
-
const result = await handleReassessRoadmap({
|
|
365
|
-
milestoneId: 'M001',
|
|
366
|
-
completedSliceId: 'S04',
|
|
367
|
-
verdict: 'on-track',
|
|
368
|
-
assessment: 'S04 completed. Adding remediation slice S05.',
|
|
369
|
-
sliceChanges: {
|
|
370
|
-
modified: [],
|
|
371
|
-
added: [
|
|
372
|
-
{
|
|
373
|
-
sliceId: 'S05',
|
|
374
|
-
title: 'Remediation Slice',
|
|
375
|
-
risk: 'low',
|
|
376
|
-
depends: ['S04'],
|
|
377
|
-
demo: 'Fix the issues found during validation.',
|
|
378
|
-
},
|
|
379
|
-
],
|
|
380
|
-
removed: [],
|
|
381
|
-
},
|
|
382
|
-
}, base);
|
|
383
|
-
|
|
384
|
-
assert.ok(!('error' in result), `unexpected error: ${'error' in result ? result.error : ''}`);
|
|
385
|
-
|
|
386
|
-
// The stale milestone-validation row must be deleted after roadmap changes
|
|
387
|
-
const after = adapter.prepare(
|
|
388
|
-
`SELECT * FROM assessments WHERE milestone_id = 'M001' AND scope = 'milestone-validation'`,
|
|
389
|
-
).get() as Record<string, unknown> | undefined;
|
|
390
|
-
assert.equal(after, undefined, 'milestone-validation row should be deleted after roadmap changes — stale validation must not survive remediation (#2957)');
|
|
391
|
-
} finally {
|
|
392
|
-
cleanup(base);
|
|
393
|
-
}
|
|
394
|
-
});
|
|
395
|
-
|
|
396
|
-
test('handleReassessRoadmap does NOT invalidate validation when no roadmap structural changes (#2957)', async () => {
|
|
397
|
-
const base = makeTmpBase();
|
|
398
|
-
openDatabase(join(base, '.gsd', 'gsd.db'));
|
|
399
|
-
|
|
400
|
-
try {
|
|
401
|
-
// Seed: M001 with slices, plus a validation with pass verdict
|
|
402
|
-
insertMilestone({ id: 'M001', title: 'Test Milestone', status: 'active' });
|
|
403
|
-
insertSlice({ id: 'S01', milestoneId: 'M001', title: 'Slice One', status: 'complete', demo: 'Demo' });
|
|
404
|
-
insertSlice({ id: 'S02', milestoneId: 'M001', title: 'Slice Two', status: 'pending', demo: 'Demo' });
|
|
405
|
-
|
|
406
|
-
// Insert milestone-validation assessment with pass verdict
|
|
407
|
-
const validationPath = join('.gsd', 'milestones', 'M001', 'M001-VALIDATION.md');
|
|
408
|
-
insertAssessment({
|
|
409
|
-
path: validationPath,
|
|
410
|
-
milestoneId: 'M001',
|
|
411
|
-
sliceId: null,
|
|
412
|
-
taskId: null,
|
|
413
|
-
status: 'pass',
|
|
414
|
-
scope: 'milestone-validation',
|
|
415
|
-
fullContent: '---\nverdict: pass\nremediation_round: 0\n---\n\n# Validation\nAll good.',
|
|
416
|
-
});
|
|
417
|
-
|
|
418
|
-
// Reassess with no structural changes (empty added/modified/removed)
|
|
419
|
-
const result = await handleReassessRoadmap({
|
|
420
|
-
milestoneId: 'M001',
|
|
421
|
-
completedSliceId: 'S01',
|
|
422
|
-
verdict: 'confirmed',
|
|
423
|
-
assessment: 'S01 completed. No changes needed.',
|
|
424
|
-
sliceChanges: {
|
|
425
|
-
modified: [],
|
|
426
|
-
added: [],
|
|
427
|
-
removed: [],
|
|
428
|
-
},
|
|
429
|
-
}, base);
|
|
430
|
-
|
|
431
|
-
assert.ok(!('error' in result), `unexpected error: ${'error' in result ? result.error : ''}`);
|
|
432
|
-
|
|
433
|
-
// Validation should still exist when no structural changes occurred
|
|
434
|
-
const adapter = _getAdapter()!;
|
|
435
|
-
const row = adapter.prepare(
|
|
436
|
-
`SELECT * FROM assessments WHERE milestone_id = 'M001' AND scope = 'milestone-validation'`,
|
|
437
|
-
).get() as Record<string, unknown> | undefined;
|
|
438
|
-
assert.ok(row, 'milestone-validation row should survive when no structural changes occurred');
|
|
439
|
-
} finally {
|
|
440
|
-
cleanup(base);
|
|
441
|
-
}
|
|
442
|
-
});
|
|
@@ -296,100 +296,3 @@ Do the second thing.
|
|
|
296
296
|
assert.equal(slices[0]?.id, "S01");
|
|
297
297
|
assert.equal(slices[1]?.id, "S02");
|
|
298
298
|
});
|
|
299
|
-
|
|
300
|
-
// ── Regression tests for #2567 ─────────────────────────────────────────────
|
|
301
|
-
// Prose H3 parser fails on common LLM-generated patterns: numbered prefixes,
|
|
302
|
-
// parenthetical numbering, bracketed IDs, and indented headings.
|
|
303
|
-
|
|
304
|
-
test("parseRoadmapSlices: numbered H3 headers under ## Slices (#2567)", () => {
|
|
305
|
-
const numberedContent = `# M002: My Milestone
|
|
306
|
-
|
|
307
|
-
**Vision:** Ship the product.
|
|
308
|
-
|
|
309
|
-
## Slices
|
|
310
|
-
|
|
311
|
-
### 1. S01: Setup Environment
|
|
312
|
-
Set up the dev environment and tooling.
|
|
313
|
-
|
|
314
|
-
### 2. S02: Build Core
|
|
315
|
-
Implement the core logic.
|
|
316
|
-
**Depends on:** S01
|
|
317
|
-
|
|
318
|
-
### 3. S03: Polish UI
|
|
319
|
-
Final polish and theming.
|
|
320
|
-
**Depends on:** S01, S02
|
|
321
|
-
`;
|
|
322
|
-
const slices = parseRoadmapSlices(numberedContent);
|
|
323
|
-
assert.equal(slices.length, 3, "should parse 3 slices from numbered H3 headers");
|
|
324
|
-
assert.equal(slices[0]?.id, "S01");
|
|
325
|
-
assert.equal(slices[0]?.title, "Setup Environment");
|
|
326
|
-
assert.equal(slices[1]?.id, "S02");
|
|
327
|
-
assert.deepEqual(slices[1]?.depends, ["S01"]);
|
|
328
|
-
assert.equal(slices[2]?.id, "S03");
|
|
329
|
-
assert.deepEqual(slices[2]?.depends, ["S01", "S02"]);
|
|
330
|
-
});
|
|
331
|
-
|
|
332
|
-
test("parseRoadmapSlices: parenthetical-numbered H3 headers (#2567)", () => {
|
|
333
|
-
const parenContent = `# M002: Milestone
|
|
334
|
-
|
|
335
|
-
**Vision:** Ship.
|
|
336
|
-
|
|
337
|
-
## Slices
|
|
338
|
-
|
|
339
|
-
### (1) S01: Setup
|
|
340
|
-
Setup work.
|
|
341
|
-
|
|
342
|
-
### (2) S02: Build
|
|
343
|
-
Build work.
|
|
344
|
-
**Depends on:** S01
|
|
345
|
-
`;
|
|
346
|
-
const slices = parseRoadmapSlices(parenContent);
|
|
347
|
-
assert.equal(slices.length, 2, "should parse slices with parenthetical numbering");
|
|
348
|
-
assert.equal(slices[0]?.id, "S01");
|
|
349
|
-
assert.equal(slices[0]?.title, "Setup");
|
|
350
|
-
assert.equal(slices[1]?.id, "S02");
|
|
351
|
-
assert.deepEqual(slices[1]?.depends, ["S01"]);
|
|
352
|
-
});
|
|
353
|
-
|
|
354
|
-
test("parseRoadmapSlices: bracketed slice IDs in H3 headers (#2567)", () => {
|
|
355
|
-
const bracketContent = `# M002: Milestone
|
|
356
|
-
|
|
357
|
-
**Vision:** Ship.
|
|
358
|
-
|
|
359
|
-
## Slices
|
|
360
|
-
|
|
361
|
-
### [S01] Setup Environment
|
|
362
|
-
Setup work.
|
|
363
|
-
|
|
364
|
-
### [S02] Build Core
|
|
365
|
-
Build work.
|
|
366
|
-
**Depends on:** S01
|
|
367
|
-
`;
|
|
368
|
-
const slices = parseRoadmapSlices(bracketContent);
|
|
369
|
-
assert.equal(slices.length, 2, "should parse slices with bracketed IDs");
|
|
370
|
-
assert.equal(slices[0]?.id, "S01");
|
|
371
|
-
assert.equal(slices[0]?.title, "Setup Environment");
|
|
372
|
-
assert.equal(slices[1]?.id, "S02");
|
|
373
|
-
assert.deepEqual(slices[1]?.depends, ["S01"]);
|
|
374
|
-
});
|
|
375
|
-
|
|
376
|
-
test("parseRoadmapSlices: indented H3 headers under ## Slices (#2567)", () => {
|
|
377
|
-
const indentedContent = `# M002: Milestone
|
|
378
|
-
|
|
379
|
-
**Vision:** Ship.
|
|
380
|
-
|
|
381
|
-
## Slices
|
|
382
|
-
|
|
383
|
-
### S01: Setup
|
|
384
|
-
Setup work.
|
|
385
|
-
|
|
386
|
-
### S02: Build
|
|
387
|
-
Build work.
|
|
388
|
-
`;
|
|
389
|
-
const slices = parseRoadmapSlices(indentedContent);
|
|
390
|
-
assert.equal(slices.length, 2, "should parse slices from indented H3 headers");
|
|
391
|
-
assert.equal(slices[0]?.id, "S01");
|
|
392
|
-
assert.equal(slices[0]?.title, "Setup");
|
|
393
|
-
assert.equal(slices[1]?.id, "S02");
|
|
394
|
-
assert.equal(slices[1]?.title, "Build");
|
|
395
|
-
});
|
|
@@ -183,137 +183,3 @@ test("secure_env_collect: detectDestination — convex file (not dir) does not t
|
|
|
183
183
|
rmSync(tmp, { recursive: true, force: true });
|
|
184
184
|
}
|
|
185
185
|
});
|
|
186
|
-
|
|
187
|
-
// ─── Bug #2997: undefined vs null handling ──────────────────────────────────
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* When ctx.ui.custom() returns undefined (e.g. noOpUIContext, component
|
|
191
|
-
* disposal, abort), the strict null checks (=== null / !== null) let
|
|
192
|
-
* undefined slip through as a "provided" value, crashing writeEnvKey
|
|
193
|
-
* which calls .replace() on it.
|
|
194
|
-
*
|
|
195
|
-
* These tests verify the fix: loose equality (== null / != null) so that
|
|
196
|
-
* both null AND undefined are treated as "skipped".
|
|
197
|
-
*/
|
|
198
|
-
|
|
199
|
-
// Helper to dynamically load the orchestrator
|
|
200
|
-
async function loadOrchestrator(): Promise<{
|
|
201
|
-
collectSecretsFromManifest: Function;
|
|
202
|
-
}> {
|
|
203
|
-
const mod = await import("../../get-secrets-from-user.ts");
|
|
204
|
-
return { collectSecretsFromManifest: mod.collectSecretsFromManifest };
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
// Helper to dynamically load files.ts functions
|
|
208
|
-
async function loadFilesExports(): Promise<{
|
|
209
|
-
formatSecretsManifest: (m: any) => string;
|
|
210
|
-
}> {
|
|
211
|
-
const mod = await import("../files.ts");
|
|
212
|
-
return { formatSecretsManifest: mod.formatSecretsManifest };
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
function makeManifest(entries: Array<{ key: string; status?: string; formatHint?: string; guidance?: string[] }>): any {
|
|
216
|
-
return {
|
|
217
|
-
milestone: "M001",
|
|
218
|
-
generatedAt: "2026-03-12T00:00:00Z",
|
|
219
|
-
entries: entries.map((e) => ({
|
|
220
|
-
key: e.key,
|
|
221
|
-
service: "TestService",
|
|
222
|
-
dashboardUrl: "",
|
|
223
|
-
guidance: e.guidance ?? [],
|
|
224
|
-
formatHint: e.formatHint ?? "",
|
|
225
|
-
status: e.status ?? "pending",
|
|
226
|
-
destination: "dotenv",
|
|
227
|
-
})),
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
async function writeManifestFile(dir: string, manifest: any): Promise<string> {
|
|
232
|
-
const { formatSecretsManifest } = await loadFilesExports();
|
|
233
|
-
const milestoneDir = join(dir, ".gsd", "milestones", "M001");
|
|
234
|
-
mkdirSync(milestoneDir, { recursive: true });
|
|
235
|
-
const filePath = join(milestoneDir, "M001-SECRETS.md");
|
|
236
|
-
writeFileSync(filePath, formatSecretsManifest(manifest));
|
|
237
|
-
return filePath;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
test("secure_env_collect #2997: undefined from ctx.ui.custom() is treated as skipped, not provided", async (t) => {
|
|
241
|
-
const { collectSecretsFromManifest } = await loadOrchestrator();
|
|
242
|
-
|
|
243
|
-
const tmp = makeTempDir("sec-undefined-test");
|
|
244
|
-
t.after(() => {
|
|
245
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
const manifest = makeManifest([
|
|
249
|
-
{ key: "SECRET_THAT_RETURNS_UNDEFINED", status: "pending" },
|
|
250
|
-
]);
|
|
251
|
-
await writeManifestFile(tmp, manifest);
|
|
252
|
-
|
|
253
|
-
let callIndex = 0;
|
|
254
|
-
const mockCtx = {
|
|
255
|
-
cwd: tmp,
|
|
256
|
-
hasUI: true,
|
|
257
|
-
ui: {
|
|
258
|
-
// First call is summary screen, second is collect — return undefined
|
|
259
|
-
// to simulate noOpUIContext or component disposal
|
|
260
|
-
custom: async (_factory: any) => {
|
|
261
|
-
callIndex++;
|
|
262
|
-
if (callIndex <= 1) return null; // summary screen dismiss
|
|
263
|
-
return undefined; // BUG TRIGGER: should be treated as skipped
|
|
264
|
-
},
|
|
265
|
-
},
|
|
266
|
-
};
|
|
267
|
-
|
|
268
|
-
// Before the fix, this crashes with:
|
|
269
|
-
// "Cannot read properties of undefined (reading 'replace')"
|
|
270
|
-
const result = await collectSecretsFromManifest(tmp, "M001", mockCtx as any);
|
|
271
|
-
|
|
272
|
-
// The undefined-returning key must appear in skipped, not in applied
|
|
273
|
-
assert.ok(
|
|
274
|
-
result.skipped.includes("SECRET_THAT_RETURNS_UNDEFINED"),
|
|
275
|
-
"Key returning undefined should be in skipped list",
|
|
276
|
-
);
|
|
277
|
-
assert.ok(
|
|
278
|
-
!result.applied.includes("SECRET_THAT_RETURNS_UNDEFINED"),
|
|
279
|
-
"Key returning undefined must NOT be in applied list",
|
|
280
|
-
);
|
|
281
|
-
});
|
|
282
|
-
|
|
283
|
-
test("secure_env_collect #2997: null from ctx.ui.custom() is still treated as skipped (regression guard)", async (t) => {
|
|
284
|
-
const { collectSecretsFromManifest } = await loadOrchestrator();
|
|
285
|
-
|
|
286
|
-
const tmp = makeTempDir("sec-null-test");
|
|
287
|
-
t.after(() => {
|
|
288
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
289
|
-
});
|
|
290
|
-
|
|
291
|
-
const manifest = makeManifest([
|
|
292
|
-
{ key: "SECRET_THAT_RETURNS_NULL", status: "pending" },
|
|
293
|
-
]);
|
|
294
|
-
await writeManifestFile(tmp, manifest);
|
|
295
|
-
|
|
296
|
-
let callIndex = 0;
|
|
297
|
-
const mockCtx = {
|
|
298
|
-
cwd: tmp,
|
|
299
|
-
hasUI: true,
|
|
300
|
-
ui: {
|
|
301
|
-
custom: async (_factory: any) => {
|
|
302
|
-
callIndex++;
|
|
303
|
-
if (callIndex <= 1) return null; // summary screen dismiss
|
|
304
|
-
return null; // explicit null skip
|
|
305
|
-
},
|
|
306
|
-
},
|
|
307
|
-
};
|
|
308
|
-
|
|
309
|
-
const result = await collectSecretsFromManifest(tmp, "M001", mockCtx as any);
|
|
310
|
-
|
|
311
|
-
assert.ok(
|
|
312
|
-
result.skipped.includes("SECRET_THAT_RETURNS_NULL"),
|
|
313
|
-
"Key returning null should be in skipped list",
|
|
314
|
-
);
|
|
315
|
-
assert.ok(
|
|
316
|
-
!result.applied.includes("SECRET_THAT_RETURNS_NULL"),
|
|
317
|
-
"Key returning null must NOT be in applied list",
|
|
318
|
-
);
|
|
319
|
-
});
|
|
@@ -24,7 +24,6 @@ function makeMockPi() {
|
|
|
24
24
|
const RENAME_MAP: Array<{ canonical: string; alias: string }> = [
|
|
25
25
|
{ canonical: "gsd_decision_save", alias: "gsd_save_decision" },
|
|
26
26
|
{ canonical: "gsd_requirement_update", alias: "gsd_update_requirement" },
|
|
27
|
-
{ canonical: "gsd_requirement_save", alias: "gsd_save_requirement" },
|
|
28
27
|
{ canonical: "gsd_summary_save", alias: "gsd_save_summary" },
|
|
29
28
|
{ canonical: "gsd_milestone_generate_id", alias: "gsd_generate_milestone_id" },
|
|
30
29
|
{ canonical: "gsd_task_complete", alias: "gsd_complete_task" },
|
|
@@ -45,7 +44,7 @@ console.log('\n── Tool naming: registration count ──');
|
|
|
45
44
|
const pi = makeMockPi();
|
|
46
45
|
registerDbTools(pi);
|
|
47
46
|
|
|
48
|
-
assert.deepStrictEqual(pi.tools.length,
|
|
47
|
+
assert.deepStrictEqual(pi.tools.length, 27, 'Should register exactly 27 tools (13 canonical + 13 aliases + 1 gate tool)');
|
|
49
48
|
|
|
50
49
|
// ─── Both names exist for each pair ──────────────────────────────────────────
|
|
51
50
|
|
|
@@ -212,14 +212,6 @@ test("resolution: buildQuickTaskPrompt includes capture text and ID", () => {
|
|
|
212
212
|
assert.ok(prompt.includes("add retry logic to OAuth"), "should include capture text");
|
|
213
213
|
assert.ok(prompt.includes("Quick Task"), "should have Quick Task header");
|
|
214
214
|
assert.ok(prompt.includes("Do NOT modify"), "should warn about plan files");
|
|
215
|
-
assert.ok(
|
|
216
|
-
prompt.includes("Verify the issue still exists"),
|
|
217
|
-
"should instruct agent to verify issue still exists (#2872)",
|
|
218
|
-
);
|
|
219
|
-
assert.ok(
|
|
220
|
-
prompt.includes("Already resolved"),
|
|
221
|
-
"should instruct agent to report already resolved if fixed (#2872)",
|
|
222
|
-
);
|
|
223
215
|
});
|
|
224
216
|
|
|
225
217
|
// ─── markCaptureExecuted ─────────────────────────────────────────────────────
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
import test from 'node:test';
|
|
5
5
|
import assert from 'node:assert/strict';
|
|
6
|
-
import { mkdtempSync, rmSync } from 'node:fs';
|
|
6
|
+
import { mkdtempSync, rmSync, existsSync, readFileSync } from 'node:fs';
|
|
7
7
|
import { join } from 'node:path';
|
|
8
8
|
import { tmpdir } from 'node:os';
|
|
9
9
|
|
|
@@ -14,8 +14,6 @@ import {
|
|
|
14
14
|
checkOwnership,
|
|
15
15
|
taskUnitKey,
|
|
16
16
|
sliceUnitKey,
|
|
17
|
-
initOwnershipTable,
|
|
18
|
-
closeOwnershipDb,
|
|
19
17
|
} from '../unit-ownership.ts';
|
|
20
18
|
|
|
21
19
|
function makeTmpBase(): string {
|
|
@@ -36,51 +34,28 @@ test('sliceUnitKey: builds correct key', () => {
|
|
|
36
34
|
assert.equal(sliceUnitKey('M001', 'S01'), 'M001/S01');
|
|
37
35
|
});
|
|
38
36
|
|
|
39
|
-
// ─── Claim / get / release
|
|
37
|
+
// ─── Claim / get / release ───────────────────────────────────────────────
|
|
40
38
|
|
|
41
|
-
test('claimUnit: creates
|
|
39
|
+
test('claimUnit: creates claim file and records agent', () => {
|
|
42
40
|
const base = makeTmpBase();
|
|
43
41
|
try {
|
|
44
|
-
|
|
45
|
-
const claimed = claimUnit(base, 'M001/S01/T01', 'executor-01');
|
|
42
|
+
claimUnit(base, 'M001/S01/T01', 'executor-01');
|
|
46
43
|
|
|
47
|
-
assert.
|
|
44
|
+
assert.ok(existsSync(join(base, '.gsd', 'unit-claims.json')), 'claim file should exist');
|
|
48
45
|
assert.equal(getOwner(base, 'M001/S01/T01'), 'executor-01');
|
|
49
46
|
} finally {
|
|
50
|
-
closeOwnershipDb(base);
|
|
51
47
|
cleanup(base);
|
|
52
48
|
}
|
|
53
49
|
});
|
|
54
50
|
|
|
55
|
-
test('claimUnit:
|
|
51
|
+
test('claimUnit: overwrites existing claim (last writer wins)', () => {
|
|
56
52
|
const base = makeTmpBase();
|
|
57
53
|
try {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
const second = claimUnit(base, 'M001/S01/T01', 'executor-02');
|
|
54
|
+
claimUnit(base, 'M001/S01/T01', 'executor-01');
|
|
55
|
+
claimUnit(base, 'M001/S01/T01', 'executor-02');
|
|
61
56
|
|
|
62
|
-
assert.equal(
|
|
63
|
-
assert.equal(second, false, 'second claim should fail (first-writer-wins)');
|
|
64
|
-
assert.equal(getOwner(base, 'M001/S01/T01'), 'executor-01',
|
|
65
|
-
'original owner must be preserved');
|
|
57
|
+
assert.equal(getOwner(base, 'M001/S01/T01'), 'executor-02');
|
|
66
58
|
} finally {
|
|
67
|
-
closeOwnershipDb(base);
|
|
68
|
-
cleanup(base);
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
test('claimUnit: same agent re-claiming same unit succeeds', () => {
|
|
73
|
-
const base = makeTmpBase();
|
|
74
|
-
try {
|
|
75
|
-
initOwnershipTable(base);
|
|
76
|
-
const first = claimUnit(base, 'M001/S01/T01', 'agent-a');
|
|
77
|
-
const second = claimUnit(base, 'M001/S01/T01', 'agent-a');
|
|
78
|
-
|
|
79
|
-
assert.equal(first, true);
|
|
80
|
-
assert.equal(second, true, 're-claim by same agent should succeed');
|
|
81
|
-
assert.equal(getOwner(base, 'M001/S01/T01'), 'agent-a');
|
|
82
|
-
} finally {
|
|
83
|
-
closeOwnershipDb(base);
|
|
84
59
|
cleanup(base);
|
|
85
60
|
}
|
|
86
61
|
});
|
|
@@ -88,25 +63,21 @@ test('claimUnit: same agent re-claiming same unit succeeds', () => {
|
|
|
88
63
|
test('claimUnit: multiple units can be claimed independently', () => {
|
|
89
64
|
const base = makeTmpBase();
|
|
90
65
|
try {
|
|
91
|
-
initOwnershipTable(base);
|
|
92
66
|
claimUnit(base, 'M001/S01/T01', 'agent-a');
|
|
93
67
|
claimUnit(base, 'M001/S01/T02', 'agent-b');
|
|
94
68
|
|
|
95
69
|
assert.equal(getOwner(base, 'M001/S01/T01'), 'agent-a');
|
|
96
70
|
assert.equal(getOwner(base, 'M001/S01/T02'), 'agent-b');
|
|
97
71
|
} finally {
|
|
98
|
-
closeOwnershipDb(base);
|
|
99
72
|
cleanup(base);
|
|
100
73
|
}
|
|
101
74
|
});
|
|
102
75
|
|
|
103
|
-
test('getOwner: returns null when no
|
|
76
|
+
test('getOwner: returns null when no claim file exists', () => {
|
|
104
77
|
const base = makeTmpBase();
|
|
105
78
|
try {
|
|
106
|
-
initOwnershipTable(base);
|
|
107
79
|
assert.equal(getOwner(base, 'M001/S01/T01'), null);
|
|
108
80
|
} finally {
|
|
109
|
-
closeOwnershipDb(base);
|
|
110
81
|
cleanup(base);
|
|
111
82
|
}
|
|
112
83
|
});
|
|
@@ -114,11 +85,9 @@ test('getOwner: returns null when no DB initialized', () => {
|
|
|
114
85
|
test('getOwner: returns null for unclaimed unit', () => {
|
|
115
86
|
const base = makeTmpBase();
|
|
116
87
|
try {
|
|
117
|
-
initOwnershipTable(base);
|
|
118
88
|
claimUnit(base, 'M001/S01/T01', 'agent-a');
|
|
119
89
|
assert.equal(getOwner(base, 'M001/S01/T99'), null);
|
|
120
90
|
} finally {
|
|
121
|
-
closeOwnershipDb(base);
|
|
122
91
|
cleanup(base);
|
|
123
92
|
}
|
|
124
93
|
});
|
|
@@ -126,13 +95,11 @@ test('getOwner: returns null for unclaimed unit', () => {
|
|
|
126
95
|
test('releaseUnit: removes claim', () => {
|
|
127
96
|
const base = makeTmpBase();
|
|
128
97
|
try {
|
|
129
|
-
initOwnershipTable(base);
|
|
130
98
|
claimUnit(base, 'M001/S01/T01', 'agent-a');
|
|
131
99
|
releaseUnit(base, 'M001/S01/T01');
|
|
132
100
|
|
|
133
101
|
assert.equal(getOwner(base, 'M001/S01/T01'), null);
|
|
134
102
|
} finally {
|
|
135
|
-
closeOwnershipDb(base);
|
|
136
103
|
cleanup(base);
|
|
137
104
|
}
|
|
138
105
|
});
|
|
@@ -140,43 +107,32 @@ test('releaseUnit: removes claim', () => {
|
|
|
140
107
|
test('releaseUnit: no-op for non-existent claim', () => {
|
|
141
108
|
const base = makeTmpBase();
|
|
142
109
|
try {
|
|
143
|
-
initOwnershipTable(base);
|
|
144
110
|
// Should not throw
|
|
145
111
|
releaseUnit(base, 'M001/S01/T01');
|
|
146
112
|
} finally {
|
|
147
|
-
closeOwnershipDb(base);
|
|
148
113
|
cleanup(base);
|
|
149
114
|
}
|
|
150
115
|
});
|
|
151
116
|
|
|
152
|
-
|
|
117
|
+
// ─── checkOwnership ──────────────────────────────────────────────────────
|
|
118
|
+
|
|
119
|
+
test('checkOwnership: returns null when no actorName provided (opt-in)', () => {
|
|
153
120
|
const base = makeTmpBase();
|
|
154
121
|
try {
|
|
155
|
-
initOwnershipTable(base);
|
|
156
122
|
claimUnit(base, 'M001/S01/T01', 'agent-a');
|
|
157
|
-
releaseUnit(base, 'M001/S01/T01');
|
|
158
123
|
|
|
159
|
-
|
|
160
|
-
assert.equal(
|
|
161
|
-
assert.equal(getOwner(base, 'M001/S01/T01'), 'agent-b');
|
|
124
|
+
// No actorName → ownership not enforced
|
|
125
|
+
assert.equal(checkOwnership(base, 'M001/S01/T01', undefined), null);
|
|
162
126
|
} finally {
|
|
163
|
-
closeOwnershipDb(base);
|
|
164
127
|
cleanup(base);
|
|
165
128
|
}
|
|
166
129
|
});
|
|
167
130
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
test('checkOwnership: returns null when no actorName provided (opt-in)', () => {
|
|
131
|
+
test('checkOwnership: returns null when no claim file exists', () => {
|
|
171
132
|
const base = makeTmpBase();
|
|
172
133
|
try {
|
|
173
|
-
|
|
174
|
-
claimUnit(base, 'M001/S01/T01', 'agent-a');
|
|
175
|
-
|
|
176
|
-
// No actorName → ownership not enforced
|
|
177
|
-
assert.equal(checkOwnership(base, 'M001/S01/T01', undefined), null);
|
|
134
|
+
assert.equal(checkOwnership(base, 'M001/S01/T01', 'agent-a'), null);
|
|
178
135
|
} finally {
|
|
179
|
-
closeOwnershipDb(base);
|
|
180
136
|
cleanup(base);
|
|
181
137
|
}
|
|
182
138
|
});
|
|
@@ -184,13 +140,11 @@ test('checkOwnership: returns null when no actorName provided (opt-in)', () => {
|
|
|
184
140
|
test('checkOwnership: returns null when unit is unclaimed', () => {
|
|
185
141
|
const base = makeTmpBase();
|
|
186
142
|
try {
|
|
187
|
-
initOwnershipTable(base);
|
|
188
143
|
claimUnit(base, 'M001/S01/T01', 'agent-a');
|
|
189
144
|
|
|
190
145
|
// Different unit, unclaimed
|
|
191
146
|
assert.equal(checkOwnership(base, 'M001/S01/T99', 'agent-b'), null);
|
|
192
147
|
} finally {
|
|
193
|
-
closeOwnershipDb(base);
|
|
194
148
|
cleanup(base);
|
|
195
149
|
}
|
|
196
150
|
});
|
|
@@ -198,12 +152,10 @@ test('checkOwnership: returns null when unit is unclaimed', () => {
|
|
|
198
152
|
test('checkOwnership: returns null when actor matches owner', () => {
|
|
199
153
|
const base = makeTmpBase();
|
|
200
154
|
try {
|
|
201
|
-
initOwnershipTable(base);
|
|
202
155
|
claimUnit(base, 'M001/S01/T01', 'agent-a');
|
|
203
156
|
|
|
204
157
|
assert.equal(checkOwnership(base, 'M001/S01/T01', 'agent-a'), null);
|
|
205
158
|
} finally {
|
|
206
|
-
closeOwnershipDb(base);
|
|
207
159
|
cleanup(base);
|
|
208
160
|
}
|
|
209
161
|
});
|
|
@@ -211,7 +163,6 @@ test('checkOwnership: returns null when actor matches owner', () => {
|
|
|
211
163
|
test('checkOwnership: returns error string when actor does not match owner', () => {
|
|
212
164
|
const base = makeTmpBase();
|
|
213
165
|
try {
|
|
214
|
-
initOwnershipTable(base);
|
|
215
166
|
claimUnit(base, 'M001/S01/T01', 'agent-a');
|
|
216
167
|
|
|
217
168
|
const err = checkOwnership(base, 'M001/S01/T01', 'agent-b');
|
|
@@ -219,40 +170,6 @@ test('checkOwnership: returns error string when actor does not match owner', ()
|
|
|
219
170
|
assert.match(err!, /owned by agent-a/);
|
|
220
171
|
assert.match(err!, /not agent-b/);
|
|
221
172
|
} finally {
|
|
222
|
-
closeOwnershipDb(base);
|
|
223
|
-
cleanup(base);
|
|
224
|
-
}
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
// ─── Race condition: first-writer-wins atomicity ─────────────────────────
|
|
228
|
-
|
|
229
|
-
test('claimUnit: concurrent claims — only first writer wins (no lost update)', () => {
|
|
230
|
-
const base = makeTmpBase();
|
|
231
|
-
try {
|
|
232
|
-
initOwnershipTable(base);
|
|
233
|
-
|
|
234
|
-
// Simulate the race described in #2728:
|
|
235
|
-
// Two agents both try to claim the same unit.
|
|
236
|
-
// With SQLite INSERT OR IGNORE, only the first succeeds.
|
|
237
|
-
const results: boolean[] = [];
|
|
238
|
-
const agents = ['agent-alpha', 'agent-beta', 'agent-gamma'];
|
|
239
|
-
for (const agent of agents) {
|
|
240
|
-
results.push(claimUnit(base, 'M001/S01/T01', agent));
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
// Exactly one agent should have won
|
|
244
|
-
const wins = results.filter(r => r === true);
|
|
245
|
-
assert.equal(wins.length, 1, 'exactly one agent should win the claim');
|
|
246
|
-
|
|
247
|
-
// The winner is the first agent (deterministic in single-threaded)
|
|
248
|
-
assert.equal(results[0], true);
|
|
249
|
-
assert.equal(results[1], false);
|
|
250
|
-
assert.equal(results[2], false);
|
|
251
|
-
|
|
252
|
-
// The owner must be the first agent
|
|
253
|
-
assert.equal(getOwner(base, 'M001/S01/T01'), 'agent-alpha');
|
|
254
|
-
} finally {
|
|
255
|
-
closeOwnershipDb(base);
|
|
256
173
|
cleanup(base);
|
|
257
174
|
}
|
|
258
175
|
});
|
|
@@ -6,7 +6,7 @@ import { tmpdir } from "node:os";
|
|
|
6
6
|
import { randomUUID } from "node:crypto";
|
|
7
7
|
|
|
8
8
|
import { handleValidateMilestone } from "../tools/validate-milestone.js";
|
|
9
|
-
import { openDatabase, closeDatabase, _getAdapter, insertMilestone
|
|
9
|
+
import { openDatabase, closeDatabase, _getAdapter, insertMilestone } from "../gsd-db.js";
|
|
10
10
|
import { clearPathCache } from "../paths.js";
|
|
11
11
|
import { clearParseCache } from "../files.js";
|
|
12
12
|
|
|
@@ -45,7 +45,6 @@ describe("handleValidateMilestone write ordering (#2725)", () => {
|
|
|
45
45
|
const dbPath = join(base, ".gsd", "gsd.db");
|
|
46
46
|
openDatabase(dbPath);
|
|
47
47
|
insertMilestone({ id: "M001" });
|
|
48
|
-
insertSlice({ id: "S01", milestoneId: "M001" });
|
|
49
48
|
|
|
50
49
|
const result = await handleValidateMilestone(VALID_PARAMS, base);
|
|
51
50
|
assert.ok(!("error" in result), `unexpected error: ${"error" in result ? result.error : ""}`);
|
|
@@ -72,7 +71,6 @@ describe("handleValidateMilestone write ordering (#2725)", () => {
|
|
|
72
71
|
const dbPath = join(base, ".gsd", "gsd.db");
|
|
73
72
|
openDatabase(dbPath);
|
|
74
73
|
insertMilestone({ id: "M001" });
|
|
75
|
-
insertSlice({ id: "S01", milestoneId: "M001" });
|
|
76
74
|
|
|
77
75
|
const result = await handleValidateMilestone(
|
|
78
76
|
{ ...VALID_PARAMS, verificationClasses: undefined },
|
|
@@ -90,7 +88,6 @@ describe("handleValidateMilestone write ordering (#2725)", () => {
|
|
|
90
88
|
const dbPath = join(base, ".gsd", "gsd.db");
|
|
91
89
|
openDatabase(dbPath);
|
|
92
90
|
insertMilestone({ id: "M001" });
|
|
93
|
-
insertSlice({ id: "S01", milestoneId: "M001" });
|
|
94
91
|
|
|
95
92
|
// Force disk write failure by replacing the milestone directory with a
|
|
96
93
|
// regular file. saveFile() will fail because it cannot write inside a
|