gsd-pi 2.58.0-dev.778d6ac → 2.58.0-dev.d63175c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/cli.js +35 -49
- package/dist/headless-ui.d.ts +0 -17
- package/dist/headless-ui.js +3 -97
- package/dist/headless.js +6 -67
- package/dist/help-text.js +0 -1
- package/dist/onboarding.js +0 -44
- package/dist/resource-loader.js +1 -16
- package/dist/resources/agents/researcher.md +1 -1
- package/dist/resources/extensions/ask-user-questions.js +3 -16
- package/dist/resources/extensions/async-jobs/extension-manifest.json +1 -1
- package/dist/resources/extensions/bg-shell/extension-manifest.json +1 -1
- package/dist/resources/extensions/browser-tools/extension-manifest.json +1 -1
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +6 -14
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +36 -59
- package/dist/resources/extensions/context7/extension-manifest.json +1 -1
- package/dist/resources/extensions/get-secrets-from-user.js +5 -8
- package/dist/resources/extensions/google-search/extension-manifest.json +1 -1
- package/dist/resources/extensions/google-search/index.js +1 -2
- package/dist/resources/extensions/gsd/auto/phases.js +21 -25
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +2 -2
- package/dist/resources/extensions/gsd/auto-dashboard.js +20 -37
- package/dist/resources/extensions/gsd/auto-dispatch.js +2 -17
- package/dist/resources/extensions/gsd/auto-model-selection.js +3 -26
- package/dist/resources/extensions/gsd/auto-post-unit.js +4 -16
- package/dist/resources/extensions/gsd/auto-prompts.js +1 -1
- package/dist/resources/extensions/gsd/auto-recovery.js +5 -13
- package/dist/resources/extensions/gsd/auto-start.js +22 -35
- package/dist/resources/extensions/gsd/auto-worktree.js +12 -196
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +0 -32
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +8 -80
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -32
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +18 -33
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -44
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +0 -67
- package/dist/resources/extensions/gsd/captures.js +4 -56
- package/dist/resources/extensions/gsd/db-writer.js +8 -116
- package/dist/resources/extensions/gsd/doctor-git-checks.js +0 -28
- package/dist/resources/extensions/gsd/doctor-providers.js +1 -2
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +4 -5
- package/dist/resources/extensions/gsd/doctor.js +1 -3
- package/dist/resources/extensions/gsd/error-classifier.js +10 -13
- package/dist/resources/extensions/gsd/extension-manifest.json +1 -16
- package/dist/resources/extensions/gsd/forensics.js +20 -123
- package/dist/resources/extensions/gsd/git-service.js +1 -23
- package/dist/resources/extensions/gsd/gitignore.js +0 -33
- package/dist/resources/extensions/gsd/gsd-db.js +9 -36
- package/dist/resources/extensions/gsd/guided-flow.js +44 -106
- package/dist/resources/extensions/gsd/health-widget-core.js +0 -31
- package/dist/resources/extensions/gsd/health-widget.js +0 -17
- package/dist/resources/extensions/gsd/index.js +1 -1
- package/dist/resources/extensions/gsd/memory-extractor.js +0 -7
- package/dist/resources/extensions/gsd/migrate-external.js +1 -8
- package/dist/resources/extensions/gsd/model-cost-table.js +0 -18
- package/dist/resources/extensions/gsd/model-router.js +1 -35
- package/dist/resources/extensions/gsd/native-git-bridge.js +0 -17
- package/dist/resources/extensions/gsd/notifications.js +1 -16
- package/dist/resources/extensions/gsd/parallel-eligibility.js +2 -13
- package/dist/resources/extensions/gsd/parallel-merge.js +5 -78
- package/dist/resources/extensions/gsd/parsers-legacy.js +3 -20
- package/dist/resources/extensions/gsd/paths.js +0 -43
- package/dist/resources/extensions/gsd/preferences-models.js +1 -14
- package/dist/resources/extensions/gsd/preferences-types.js +1 -2
- package/dist/resources/extensions/gsd/preferences.js +16 -13
- package/dist/resources/extensions/gsd/prompt-loader.js +1 -4
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -4
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
- package/dist/resources/extensions/gsd/prompts/discuss.md +1 -1
- package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -3
- package/dist/resources/extensions/gsd/prompts/forensics.md +2 -2
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +0 -2
- package/dist/resources/extensions/gsd/prompts/rethink.md +1 -1
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +0 -1
- package/dist/resources/extensions/gsd/repo-identity.js +11 -205
- package/dist/resources/extensions/gsd/rethink.js +0 -5
- package/dist/resources/extensions/gsd/roadmap-slices.js +4 -5
- package/dist/resources/extensions/gsd/state.js +27 -85
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +1 -20
- package/dist/resources/extensions/gsd/tools/complete-task.js +71 -34
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +2 -12
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +1 -29
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +3 -14
- package/dist/resources/extensions/gsd/triage-resolution.js +7 -22
- package/dist/resources/extensions/gsd/undo.js +2 -2
- package/dist/resources/extensions/gsd/unit-ownership.js +33 -164
- package/dist/resources/extensions/gsd/verdict-parser.js +8 -20
- package/dist/resources/extensions/gsd/workflow-manifest.js +5 -24
- package/dist/resources/extensions/gsd/workflow-projections.js +63 -95
- package/dist/resources/extensions/gsd/workflow-reconcile.js +5 -35
- package/dist/resources/extensions/gsd/workspace-index.js +0 -24
- package/dist/resources/extensions/gsd/worktree-manager.js +1 -105
- package/dist/resources/extensions/gsd/worktree-resolver.js +3 -20
- package/dist/resources/extensions/mcp-client/index.js +7 -11
- package/dist/resources/extensions/search-the-web/extension-manifest.json +1 -1
- package/dist/resources/extensions/shared/interview-ui.js +1 -11
- package/dist/resources/skills/create-gsd-extension/SKILL.md +3 -5
- package/dist/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +4 -5
- package/dist/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
- package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
- package/dist/resources/skills/create-gsd-extension/workflows/debug-extension.md +3 -5
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -17
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- package/dist/web/standalone/.next/required-server-files.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -17
- package/dist/web/standalone/.next/server/chunks/2229.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/6502.8b732f67a11b11b4.js +9 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-a1c1e452c6b32d04.js → webpack-61d3afac6d0f0ce7.js} +1 -1
- package/dist/web/standalone/.next/static/css/a58ef8a151aa0493.css +1 -0
- package/dist/web/standalone/server.js +1 -1
- package/dist/web-mode.js +1 -2
- package/package.json +2 -2
- package/packages/native/dist/ast/index.js +5 -9
- package/packages/native/dist/ast/types.js +1 -2
- package/packages/native/dist/clipboard/index.js +7 -12
- package/packages/native/dist/clipboard/types.js +1 -2
- package/packages/native/dist/diff/index.js +7 -12
- package/packages/native/dist/diff/types.js +1 -2
- package/packages/native/dist/fd/index.js +3 -6
- package/packages/native/dist/fd/types.js +1 -2
- package/packages/native/dist/glob/index.js +5 -9
- package/packages/native/dist/glob/types.js +1 -2
- package/packages/native/dist/grep/index.js +5 -9
- package/packages/native/dist/grep/types.js +1 -2
- package/packages/native/dist/gsd-parser/index.js +11 -18
- package/packages/native/dist/gsd-parser/types.js +1 -2
- package/packages/native/dist/highlight/index.js +7 -12
- package/packages/native/dist/highlight/types.js +1 -2
- package/packages/native/dist/html/index.js +3 -6
- package/packages/native/dist/html/types.js +1 -2
- package/packages/native/dist/image/index.js +5 -10
- package/packages/native/dist/image/types.js +4 -7
- package/packages/native/dist/index.js +17 -70
- package/packages/native/dist/json-parse/index.js +8 -13
- package/packages/native/dist/native.js +10 -47
- package/packages/native/dist/ps/index.js +9 -15
- package/packages/native/dist/ps/types.js +1 -2
- package/packages/native/dist/stream-process/index.js +7 -12
- package/packages/native/dist/text/index.js +14 -24
- package/packages/native/dist/text/types.js +2 -5
- package/packages/native/dist/truncate/index.js +7 -12
- package/packages/native/dist/ttsr/index.js +7 -12
- package/packages/native/dist/ttsr/types.js +1 -2
- package/packages/native/dist/xxhash/index.js +5 -9
- package/packages/native/package.json +19 -19
- package/packages/native/src/native.ts +8 -9
- package/packages/pi-agent-core/dist/agent-loop.js +2 -3
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/proxy.d.ts +1 -1
- package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/proxy.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.ts +2 -3
- package/packages/pi-agent-core/src/proxy.ts +1 -1
- package/packages/pi-ai/dist/env-api-keys.js +0 -1
- package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
- package/packages/pi-ai/dist/index.d.ts +0 -1
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +0 -1
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +2 -19
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +3 -3
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/dist/utils/json-parse.d.ts +0 -3
- package/packages/pi-ai/dist/utils/json-parse.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/json-parse.js +1 -24
- package/packages/pi-ai/dist/utils/json-parse.js.map +1 -1
- package/packages/pi-ai/src/env-api-keys.ts +0 -1
- package/packages/pi-ai/src/index.ts +0 -1
- package/packages/pi-ai/src/providers/anthropic-shared.ts +2 -17
- package/packages/pi-ai/src/types.ts +2 -3
- package/packages/pi-ai/src/utils/json-parse.ts +1 -28
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +0 -4
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +0 -31
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +1 -17
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +2 -62
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/exec.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/exec.js +1 -3
- package/packages/pi-coding-agent/dist/core/exec.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +0 -4
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js +0 -2
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +0 -5
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +0 -5
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/index.js +1 -1
- package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/index.js +0 -3
- package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +0 -3
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/messages.js +2 -31
- package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +0 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +0 -10
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +1 -12
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +0 -6
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +1 -48
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -10
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js +4 -13
- package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +2 -2
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +0 -4
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts +0 -1
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js +0 -5
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +1 -38
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +1 -94
- package/packages/pi-coding-agent/src/core/exec.ts +1 -3
- package/packages/pi-coding-agent/src/core/extensions/index.ts +0 -4
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +0 -5
- package/packages/pi-coding-agent/src/core/index.ts +0 -6
- package/packages/pi-coding-agent/src/core/lsp/index.ts +0 -3
- package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +0 -3
- package/packages/pi-coding-agent/src/core/messages.ts +2 -29
- package/packages/pi-coding-agent/src/core/model-resolver.ts +0 -1
- package/packages/pi-coding-agent/src/core/resource-loader.ts +1 -20
- package/packages/pi-coding-agent/src/core/retry-handler.ts +1 -52
- package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +3 -11
- package/packages/pi-coding-agent/src/core/tools/read.ts +4 -14
- package/packages/pi-coding-agent/src/index.ts +0 -6
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +0 -7
- package/packages/pi-coding-agent/src/modes/rpc/remote-terminal.ts +0 -6
- package/packages/pi-tui/dist/terminal.d.ts +0 -2
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +0 -9
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +0 -9
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/src/terminal.ts +0 -14
- package/packages/pi-tui/src/tui.ts +0 -8
- package/scripts/ensure-workspace-builds.cjs +14 -45
- package/src/resources/agents/researcher.md +1 -1
- package/src/resources/extensions/ask-user-questions.ts +3 -21
- package/src/resources/extensions/async-jobs/extension-manifest.json +1 -1
- package/src/resources/extensions/bg-shell/extension-manifest.json +1 -1
- package/src/resources/extensions/browser-tools/extension-manifest.json +1 -1
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +6 -13
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +35 -63
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +0 -28
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +1 -108
- package/src/resources/extensions/context7/extension-manifest.json +1 -1
- package/src/resources/extensions/get-secrets-from-user.ts +5 -8
- package/src/resources/extensions/google-search/extension-manifest.json +1 -1
- package/src/resources/extensions/google-search/index.ts +1 -2
- package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -1
- package/src/resources/extensions/gsd/auto/phases.ts +34 -43
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
- package/src/resources/extensions/gsd/auto-dashboard.ts +19 -37
- package/src/resources/extensions/gsd/auto-dispatch.ts +2 -18
- package/src/resources/extensions/gsd/auto-model-selection.ts +5 -26
- package/src/resources/extensions/gsd/auto-post-unit.ts +4 -18
- package/src/resources/extensions/gsd/auto-prompts.ts +1 -1
- package/src/resources/extensions/gsd/auto-recovery.ts +5 -12
- package/src/resources/extensions/gsd/auto-start.ts +26 -35
- package/src/resources/extensions/gsd/auto-worktree.ts +9 -190
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +0 -31
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +8 -85
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -38
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +19 -31
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -50
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +0 -75
- package/src/resources/extensions/gsd/captures.ts +3 -63
- package/src/resources/extensions/gsd/db-writer.ts +7 -140
- package/src/resources/extensions/gsd/doctor-git-checks.ts +0 -26
- package/src/resources/extensions/gsd/doctor-providers.ts +1 -2
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +4 -5
- package/src/resources/extensions/gsd/doctor.ts +1 -3
- package/src/resources/extensions/gsd/error-classifier.ts +11 -14
- package/src/resources/extensions/gsd/extension-manifest.json +1 -16
- package/src/resources/extensions/gsd/forensics.ts +20 -144
- package/src/resources/extensions/gsd/git-service.ts +3 -26
- package/src/resources/extensions/gsd/gitignore.ts +0 -33
- package/src/resources/extensions/gsd/gsd-db.ts +7 -43
- package/src/resources/extensions/gsd/guided-flow.ts +45 -114
- package/src/resources/extensions/gsd/health-widget-core.ts +0 -34
- package/src/resources/extensions/gsd/health-widget.ts +0 -17
- package/src/resources/extensions/gsd/index.ts +0 -1
- package/src/resources/extensions/gsd/memory-extractor.ts +0 -8
- package/src/resources/extensions/gsd/migrate-external.ts +1 -9
- package/src/resources/extensions/gsd/model-cost-table.ts +0 -19
- package/src/resources/extensions/gsd/model-router.ts +1 -35
- package/src/resources/extensions/gsd/native-git-bridge.ts +0 -17
- package/src/resources/extensions/gsd/notifications.ts +0 -16
- package/src/resources/extensions/gsd/parallel-eligibility.ts +2 -15
- package/src/resources/extensions/gsd/parallel-merge.ts +4 -87
- package/src/resources/extensions/gsd/parsers-legacy.ts +3 -22
- package/src/resources/extensions/gsd/paths.ts +0 -42
- package/src/resources/extensions/gsd/preferences-models.ts +1 -14
- package/src/resources/extensions/gsd/preferences-types.ts +1 -2
- package/src/resources/extensions/gsd/preferences.ts +15 -13
- package/src/resources/extensions/gsd/prompt-loader.ts +1 -4
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -4
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
- package/src/resources/extensions/gsd/prompts/discuss.md +1 -1
- package/src/resources/extensions/gsd/prompts/execute-task.md +1 -3
- package/src/resources/extensions/gsd/prompts/forensics.md +2 -2
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +0 -2
- package/src/resources/extensions/gsd/prompts/rethink.md +1 -1
- package/src/resources/extensions/gsd/prompts/triage-captures.md +0 -1
- package/src/resources/extensions/gsd/repo-identity.ts +11 -186
- package/src/resources/extensions/gsd/rethink.ts +0 -6
- package/src/resources/extensions/gsd/roadmap-slices.ts +4 -5
- package/src/resources/extensions/gsd/state.ts +32 -84
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +0 -29
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +1 -71
- package/src/resources/extensions/gsd/tests/captures.test.ts +0 -103
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +0 -27
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +0 -21
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +12 -7
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +5 -78
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +0 -29
- package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +0 -40
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +1 -20
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +0 -117
- package/src/resources/extensions/gsd/tests/empty-db-reconciliation.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -31
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +12 -125
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +0 -67
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +1 -111
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +0 -101
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +0 -59
- package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +0 -110
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +2 -85
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +0 -34
- package/src/resources/extensions/gsd/tests/model-router.test.ts +3 -68
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +0 -28
- package/src/resources/extensions/gsd/tests/notifications.test.ts +0 -45
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +1 -33
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +0 -29
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +0 -38
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +0 -117
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +0 -97
- package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +0 -134
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +1 -2
- package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +0 -8
- package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +17 -100
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +1 -4
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +0 -48
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +0 -92
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +1 -48
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +5 -29
- package/src/resources/extensions/gsd/tools/complete-task.ts +74 -36
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +1 -13
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +0 -36
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +2 -20
- package/src/resources/extensions/gsd/triage-resolution.ts +6 -23
- package/src/resources/extensions/gsd/types.ts +2 -4
- package/src/resources/extensions/gsd/undo.ts +2 -2
- package/src/resources/extensions/gsd/unit-ownership.ts +35 -206
- package/src/resources/extensions/gsd/verdict-parser.ts +6 -21
- package/src/resources/extensions/gsd/workflow-logger.ts +1 -3
- package/src/resources/extensions/gsd/workflow-manifest.ts +5 -22
- package/src/resources/extensions/gsd/workflow-projections.ts +64 -97
- package/src/resources/extensions/gsd/workflow-reconcile.ts +10 -39
- package/src/resources/extensions/gsd/workspace-index.ts +0 -30
- package/src/resources/extensions/gsd/worktree-manager.ts +1 -120
- package/src/resources/extensions/gsd/worktree-resolver.ts +3 -22
- package/src/resources/extensions/mcp-client/index.ts +7 -13
- package/src/resources/extensions/search-the-web/extension-manifest.json +1 -1
- package/src/resources/extensions/shared/interview-ui.ts +1 -12
- package/src/resources/skills/create-gsd-extension/SKILL.md +3 -5
- package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +4 -5
- package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
- package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
- package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +3 -5
- package/dist/resources/extensions/gsd/milestone-validation-gates.js +0 -45
- package/dist/resources/extensions/ollama/index.js +0 -112
- package/dist/resources/extensions/ollama/model-capabilities.js +0 -115
- package/dist/resources/extensions/ollama/ollama-client.js +0 -168
- package/dist/resources/extensions/ollama/ollama-commands.js +0 -194
- package/dist/resources/extensions/ollama/ollama-discovery.js +0 -69
- package/dist/resources/extensions/ollama/ollama-tool.js +0 -184
- package/dist/resources/extensions/ollama/types.js +0 -2
- package/dist/startup-model-validation.d.ts +0 -39
- package/dist/startup-model-validation.js +0 -50
- package/dist/web/standalone/.next/static/chunks/6502.7593d7797a4b3999.js +0 -9
- package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +0 -1
- package/packages/native/src/__tests__/module-compat.test.mjs +0 -91
- package/packages/pi-agent-core/src/agent-loop.test.ts +0 -45
- package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts +0 -2
- package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts.map +0 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js +0 -25
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +0 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.d.ts +0 -37
- package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +0 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.js +0 -75
- package/packages/pi-ai/dist/utils/repair-tool-json.js.map +0 -1
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts +0 -2
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts.map +0 -1
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +0 -73
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +0 -1
- package/packages/pi-ai/src/providers/anthropic-shared.test.ts +0 -29
- package/packages/pi-ai/src/utils/repair-tool-json.ts +0 -88
- package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +0 -102
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts +0 -6
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +0 -176
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts +0 -28
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js +0 -37
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js +0 -63
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts +0 -19
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js +0 -115
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js +0 -109
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts +0 -44
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js +0 -97
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js +0 -181
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/messages.test.d.ts +0 -9
- package/packages/pi-coding-agent/dist/core/messages.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/messages.test.js +0 -86
- package/packages/pi-coding-agent/dist/core/messages.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts +0 -9
- package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js +0 -193
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts +0 -16
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +0 -80
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +0 -1
- package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +0 -236
- package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +0 -77
- package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +0 -62
- package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +0 -134
- package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +0 -137
- package/packages/pi-coding-agent/src/core/image-overflow-recovery.test.ts +0 -228
- package/packages/pi-coding-agent/src/core/image-overflow-recovery.ts +0 -118
- package/packages/pi-coding-agent/src/core/messages.test.ts +0 -114
- package/packages/pi-coding-agent/src/core/retry-handler.test.ts +0 -255
- package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +0 -92
- package/src/resources/extensions/gsd/milestone-validation-gates.ts +0 -56
- package/src/resources/extensions/gsd/tests/auto-mode-interactive-guard.test.ts +0 -71
- package/src/resources/extensions/gsd/tests/cli-provider-rate-limit.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/completion-hierarchy-guards.test.ts +0 -192
- package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +0 -131
- package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +0 -127
- package/src/resources/extensions/gsd/tests/dynamic-routing-default.test.ts +0 -20
- package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +0 -74
- package/src/resources/extensions/gsd/tests/event-replay-idempotency.test.ts +0 -140
- package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -129
- package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
- package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +0 -164
- package/src/resources/extensions/gsd/tests/guided-flow-dynamic-routing.test.ts +0 -135
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +0 -97
- package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +0 -107
- package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +0 -243
- package/src/resources/extensions/gsd/tests/integration/gitignore-staging-2570.test.ts +0 -150
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +0 -959
- package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +0 -105
- package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +0 -116
- package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +0 -159
- package/src/resources/extensions/gsd/tests/parallel-eligibility-ghost.test.ts +0 -150
- package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +0 -70
- package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +0 -297
- package/src/resources/extensions/gsd/tests/prompt-loader-replacement.test.ts +0 -178
- package/src/resources/extensions/gsd/tests/prompt-tool-names.test.ts +0 -69
- package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +0 -157
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +0 -90
- package/src/resources/extensions/gsd/tests/reconciliation-edge-cases.test.ts +0 -162
- package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +0 -233
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +0 -305
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +0 -405
- package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +0 -257
- package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +0 -1628
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +0 -106
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +0 -174
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +0 -221
- package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +0 -289
- package/src/resources/extensions/gsd/tests/vacuum-recovery.test.ts +0 -154
- package/src/resources/extensions/gsd/tests/verdict-parser.test.ts +0 -156
- package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +0 -82
- package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +0 -140
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +0 -101
- package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +0 -95
- package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +0 -55
- package/src/resources/extensions/ollama/index.ts +0 -130
- package/src/resources/extensions/ollama/model-capabilities.ts +0 -145
- package/src/resources/extensions/ollama/ollama-client.ts +0 -196
- package/src/resources/extensions/ollama/ollama-commands.ts +0 -248
- package/src/resources/extensions/ollama/ollama-discovery.ts +0 -106
- package/src/resources/extensions/ollama/ollama-tool.ts +0 -218
- package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +0 -162
- package/src/resources/extensions/ollama/tests/ollama-client.test.ts +0 -38
- package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +0 -28
- package/src/resources/extensions/ollama/types.ts +0 -130
- package/src/resources/extensions/shared/tests/ask-user-freetext.test.ts +0 -156
- /package/dist/web/standalone/.next/static/{R0D4xaIPl5kg93edN7Oo0 → 5DLsjFHdSB6_a1EDQVjr7}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{R0D4xaIPl5kg93edN7Oo0 → 5DLsjFHdSB6_a1EDQVjr7}/_ssgManifest.js +0 -0
|
@@ -1,289 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* uat-stuck-loop-orphaned-worktree.test.ts — Regression tests for #2821.
|
|
3
|
-
*
|
|
4
|
-
* Reproduces two cascading bugs:
|
|
5
|
-
*
|
|
6
|
-
* Bug 1 — UAT stuck-loop: syncProjectRootToWorktree uses force:false for
|
|
7
|
-
* milestone files. When the project root has an ASSESSMENT with a verdict
|
|
8
|
-
* but the worktree has a stale/empty ASSESSMENT (or none at all after DB
|
|
9
|
-
* rebuild), the verdict is NOT synced into the worktree. checkNeedsRunUat
|
|
10
|
-
* finds no verdict → re-dispatches run-uat indefinitely.
|
|
11
|
-
*
|
|
12
|
-
* Bug 2 — Orphaned worktree: removeWorktree silently swallows failures when
|
|
13
|
-
* git worktree remove fails (untracked files, CWD inside worktree, etc.).
|
|
14
|
-
* The worktree directory and branch persist on disk after teardown.
|
|
15
|
-
* teardownAutoWorktree has a fallback rmSync but it also fails when the
|
|
16
|
-
* git internal .git/worktrees/<name> directory holds a lock.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
import { describe, test, beforeEach, afterEach } from "node:test";
|
|
20
|
-
import assert from "node:assert/strict";
|
|
21
|
-
import {
|
|
22
|
-
mkdtempSync,
|
|
23
|
-
mkdirSync,
|
|
24
|
-
writeFileSync,
|
|
25
|
-
rmSync,
|
|
26
|
-
existsSync,
|
|
27
|
-
readFileSync,
|
|
28
|
-
} from "node:fs";
|
|
29
|
-
import { join } from "node:path";
|
|
30
|
-
import { tmpdir } from "node:os";
|
|
31
|
-
import { execFileSync } from "node:child_process";
|
|
32
|
-
|
|
33
|
-
import { syncProjectRootToWorktree } from "../auto-worktree.ts";
|
|
34
|
-
import {
|
|
35
|
-
createWorktree,
|
|
36
|
-
removeWorktree,
|
|
37
|
-
worktreePath,
|
|
38
|
-
} from "../worktree-manager.ts";
|
|
39
|
-
|
|
40
|
-
function git(args: string[], cwd: string): string {
|
|
41
|
-
return execFileSync("git", args, {
|
|
42
|
-
cwd,
|
|
43
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
44
|
-
encoding: "utf-8",
|
|
45
|
-
}).trim();
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function makeBaseRepo(): string {
|
|
49
|
-
const base = mkdtempSync(join(tmpdir(), "gsd-2821-"));
|
|
50
|
-
git(["init", "-b", "main"], base);
|
|
51
|
-
git(["config", "user.name", "Test"], base);
|
|
52
|
-
git(["config", "user.email", "test@test.com"], base);
|
|
53
|
-
writeFileSync(join(base, "README.md"), "# test\n");
|
|
54
|
-
mkdirSync(join(base, ".gsd", "milestones", "M011"), { recursive: true });
|
|
55
|
-
git(["add", "."], base);
|
|
56
|
-
git(["commit", "-m", "init"], base);
|
|
57
|
-
return base;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// ─── Bug 1: ASSESSMENT force-sync ─────────────────────────────────────────
|
|
61
|
-
|
|
62
|
-
describe("#2821 Bug 1 — ASSESSMENT file force-synced on resume", () => {
|
|
63
|
-
let mainBase: string;
|
|
64
|
-
let wtBase: string;
|
|
65
|
-
|
|
66
|
-
beforeEach(() => {
|
|
67
|
-
mainBase = mkdtempSync(join(tmpdir(), "gsd-2821-main-"));
|
|
68
|
-
wtBase = mkdtempSync(join(tmpdir(), "gsd-2821-wt-"));
|
|
69
|
-
mkdirSync(join(mainBase, ".gsd", "milestones", "M011", "slices", "S01"), {
|
|
70
|
-
recursive: true,
|
|
71
|
-
});
|
|
72
|
-
mkdirSync(join(wtBase, ".gsd", "milestones", "M011", "slices", "S01"), {
|
|
73
|
-
recursive: true,
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
afterEach(() => {
|
|
78
|
-
rmSync(mainBase, { recursive: true, force: true });
|
|
79
|
-
rmSync(wtBase, { recursive: true, force: true });
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
test("force-syncs ASSESSMENT with verdict from project root into worktree when worktree copy has no verdict", () => {
|
|
83
|
-
// Project root has ASSESSMENT with a PASS verdict (written by run-uat, synced by post-unit)
|
|
84
|
-
const prAssessment = join(
|
|
85
|
-
mainBase,
|
|
86
|
-
".gsd",
|
|
87
|
-
"milestones",
|
|
88
|
-
"M011",
|
|
89
|
-
"slices",
|
|
90
|
-
"S01",
|
|
91
|
-
"S01-ASSESSMENT.md",
|
|
92
|
-
);
|
|
93
|
-
writeFileSync(
|
|
94
|
-
prAssessment,
|
|
95
|
-
"---\nverdict: pass\n---\n# S01 Assessment\nAll tests pass.\n",
|
|
96
|
-
);
|
|
97
|
-
|
|
98
|
-
// Worktree has a stale ASSESSMENT with FAIL verdict (from the initial run-uat execution)
|
|
99
|
-
const wtAssessment = join(
|
|
100
|
-
wtBase,
|
|
101
|
-
".gsd",
|
|
102
|
-
"milestones",
|
|
103
|
-
"M011",
|
|
104
|
-
"slices",
|
|
105
|
-
"S01",
|
|
106
|
-
"S01-ASSESSMENT.md",
|
|
107
|
-
);
|
|
108
|
-
writeFileSync(
|
|
109
|
-
wtAssessment,
|
|
110
|
-
"---\nverdict: fail\n---\n# S01 Assessment\nSome tests fail.\n",
|
|
111
|
-
);
|
|
112
|
-
|
|
113
|
-
syncProjectRootToWorktree(mainBase, wtBase, "M011");
|
|
114
|
-
|
|
115
|
-
// The worktree ASSESSMENT must now have the project root's PASS verdict
|
|
116
|
-
const content = readFileSync(wtAssessment, "utf-8");
|
|
117
|
-
assert.ok(
|
|
118
|
-
content.includes("verdict: pass"),
|
|
119
|
-
`Expected worktree ASSESSMENT to have verdict:pass after sync, got: ${content.slice(0, 100)}`,
|
|
120
|
-
);
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
test("force-syncs ASSESSMENT from project root when worktree has no ASSESSMENT at all", () => {
|
|
124
|
-
// Project root has ASSESSMENT with verdict
|
|
125
|
-
const prAssessment = join(
|
|
126
|
-
mainBase,
|
|
127
|
-
".gsd",
|
|
128
|
-
"milestones",
|
|
129
|
-
"M011",
|
|
130
|
-
"slices",
|
|
131
|
-
"S01",
|
|
132
|
-
"S01-ASSESSMENT.md",
|
|
133
|
-
);
|
|
134
|
-
writeFileSync(
|
|
135
|
-
prAssessment,
|
|
136
|
-
"---\nverdict: pass\n---\n# S01 Assessment\n",
|
|
137
|
-
);
|
|
138
|
-
|
|
139
|
-
// Worktree has NO ASSESSMENT (deleted during DB rebuild)
|
|
140
|
-
// — file simply doesn't exist
|
|
141
|
-
|
|
142
|
-
syncProjectRootToWorktree(mainBase, wtBase, "M011");
|
|
143
|
-
|
|
144
|
-
const wtAssessment = join(
|
|
145
|
-
wtBase,
|
|
146
|
-
".gsd",
|
|
147
|
-
"milestones",
|
|
148
|
-
"M011",
|
|
149
|
-
"slices",
|
|
150
|
-
"S01",
|
|
151
|
-
"S01-ASSESSMENT.md",
|
|
152
|
-
);
|
|
153
|
-
assert.ok(
|
|
154
|
-
existsSync(wtAssessment),
|
|
155
|
-
"ASSESSMENT should be copied to worktree when missing",
|
|
156
|
-
);
|
|
157
|
-
const content = readFileSync(wtAssessment, "utf-8");
|
|
158
|
-
assert.ok(
|
|
159
|
-
content.includes("verdict: pass"),
|
|
160
|
-
`Synced ASSESSMENT should contain verdict:pass, got: ${content.slice(0, 100)}`,
|
|
161
|
-
);
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
test("does NOT overwrite worktree ASSESSMENT when project root has no verdict", () => {
|
|
165
|
-
// Project root has ASSESSMENT without verdict (incomplete)
|
|
166
|
-
const prAssessment = join(
|
|
167
|
-
mainBase,
|
|
168
|
-
".gsd",
|
|
169
|
-
"milestones",
|
|
170
|
-
"M011",
|
|
171
|
-
"slices",
|
|
172
|
-
"S01",
|
|
173
|
-
"S01-ASSESSMENT.md",
|
|
174
|
-
);
|
|
175
|
-
writeFileSync(prAssessment, "# S01 Assessment\nIn progress...\n");
|
|
176
|
-
|
|
177
|
-
// Worktree has ASSESSMENT with verdict:fail
|
|
178
|
-
const wtAssessment = join(
|
|
179
|
-
wtBase,
|
|
180
|
-
".gsd",
|
|
181
|
-
"milestones",
|
|
182
|
-
"M011",
|
|
183
|
-
"slices",
|
|
184
|
-
"S01",
|
|
185
|
-
"S01-ASSESSMENT.md",
|
|
186
|
-
);
|
|
187
|
-
writeFileSync(
|
|
188
|
-
wtAssessment,
|
|
189
|
-
"---\nverdict: fail\n---\n# S01 Assessment\nSome tests fail.\n",
|
|
190
|
-
);
|
|
191
|
-
|
|
192
|
-
syncProjectRootToWorktree(mainBase, wtBase, "M011");
|
|
193
|
-
|
|
194
|
-
// Worktree copy should NOT be overwritten by the verdictless project root copy
|
|
195
|
-
const content = readFileSync(wtAssessment, "utf-8");
|
|
196
|
-
assert.ok(
|
|
197
|
-
content.includes("verdict: fail"),
|
|
198
|
-
`Worktree ASSESSMENT should keep verdict:fail when project root has no verdict, got: ${content.slice(0, 100)}`,
|
|
199
|
-
);
|
|
200
|
-
});
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
// ─── Bug 2: Orphaned worktree cleanup ─────────────────────────────────────
|
|
204
|
-
|
|
205
|
-
describe("#2821 Bug 2 — removeWorktree cleans up despite untracked files", () => {
|
|
206
|
-
let base: string;
|
|
207
|
-
|
|
208
|
-
beforeEach(() => {
|
|
209
|
-
base = makeBaseRepo();
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
afterEach(() => {
|
|
213
|
-
rmSync(base, { recursive: true, force: true });
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
test("removes worktree directory even when it contains untracked files", () => {
|
|
217
|
-
const info = createWorktree(base, "M011", {
|
|
218
|
-
branch: "milestone/M011",
|
|
219
|
-
});
|
|
220
|
-
|
|
221
|
-
// Simulate run-uat writing untracked files (S01-UAT-RESULT.md, ASSESSMENT)
|
|
222
|
-
mkdirSync(
|
|
223
|
-
join(info.path, ".gsd", "milestones", "M011", "slices", "S01"),
|
|
224
|
-
{ recursive: true },
|
|
225
|
-
);
|
|
226
|
-
writeFileSync(
|
|
227
|
-
join(
|
|
228
|
-
info.path,
|
|
229
|
-
".gsd",
|
|
230
|
-
"milestones",
|
|
231
|
-
"M011",
|
|
232
|
-
"slices",
|
|
233
|
-
"S01",
|
|
234
|
-
"S01-UAT-RESULT.md",
|
|
235
|
-
),
|
|
236
|
-
"# UAT Result\nverdict: fail\n",
|
|
237
|
-
);
|
|
238
|
-
writeFileSync(
|
|
239
|
-
join(
|
|
240
|
-
info.path,
|
|
241
|
-
".gsd",
|
|
242
|
-
"milestones",
|
|
243
|
-
"M011",
|
|
244
|
-
"slices",
|
|
245
|
-
"S01",
|
|
246
|
-
"S01-ASSESSMENT.md",
|
|
247
|
-
),
|
|
248
|
-
"---\nverdict: fail\n---\n# Assessment\n",
|
|
249
|
-
);
|
|
250
|
-
|
|
251
|
-
removeWorktree(base, "M011", {
|
|
252
|
-
branch: "milestone/M011",
|
|
253
|
-
deleteBranch: true,
|
|
254
|
-
force: true,
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
const wtDir = worktreePath(base, "M011");
|
|
258
|
-
assert.ok(
|
|
259
|
-
!existsSync(wtDir),
|
|
260
|
-
`Worktree directory should be removed after teardown, but still exists at ${wtDir}`,
|
|
261
|
-
);
|
|
262
|
-
});
|
|
263
|
-
|
|
264
|
-
test("removes git internal worktree metadata after filesystem removal", () => {
|
|
265
|
-
createWorktree(base, "M011", {
|
|
266
|
-
branch: "milestone/M011",
|
|
267
|
-
});
|
|
268
|
-
|
|
269
|
-
removeWorktree(base, "M011", {
|
|
270
|
-
branch: "milestone/M011",
|
|
271
|
-
deleteBranch: true,
|
|
272
|
-
force: true,
|
|
273
|
-
});
|
|
274
|
-
|
|
275
|
-
// The git internal worktree directory should be cleaned up
|
|
276
|
-
const gitInternalWorktreeDir = join(base, ".git", "worktrees", "M011");
|
|
277
|
-
assert.ok(
|
|
278
|
-
!existsSync(gitInternalWorktreeDir),
|
|
279
|
-
`Git internal worktree dir should be removed: ${gitInternalWorktreeDir}`,
|
|
280
|
-
);
|
|
281
|
-
|
|
282
|
-
// The branch should be deleted
|
|
283
|
-
const branches = git(["branch"], base);
|
|
284
|
-
assert.ok(
|
|
285
|
-
!branches.includes("milestone/M011"),
|
|
286
|
-
"milestone/M011 branch should be deleted after removeWorktree",
|
|
287
|
-
);
|
|
288
|
-
});
|
|
289
|
-
});
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import { describe, test } from 'node:test';
|
|
2
|
-
import assert from 'node:assert/strict';
|
|
3
|
-
import * as fs from 'node:fs';
|
|
4
|
-
import * as path from 'node:path';
|
|
5
|
-
import * as os from 'node:os';
|
|
6
|
-
import { createRequire } from 'node:module';
|
|
7
|
-
import {
|
|
8
|
-
openDatabase,
|
|
9
|
-
closeDatabase,
|
|
10
|
-
isDbAvailable,
|
|
11
|
-
_getAdapter,
|
|
12
|
-
} from '../gsd-db.ts';
|
|
13
|
-
|
|
14
|
-
const _require = createRequire(import.meta.url);
|
|
15
|
-
|
|
16
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
17
|
-
// Helpers
|
|
18
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
19
|
-
|
|
20
|
-
function tempDbPath(): string {
|
|
21
|
-
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-vacuum-test-'));
|
|
22
|
-
return path.join(dir, 'test.db');
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function cleanup(dbPath: string): void {
|
|
26
|
-
closeDatabase();
|
|
27
|
-
try {
|
|
28
|
-
const dir = path.dirname(dbPath);
|
|
29
|
-
for (const f of fs.readdirSync(dir)) {
|
|
30
|
-
fs.unlinkSync(path.join(dir, f));
|
|
31
|
-
}
|
|
32
|
-
fs.rmdirSync(dir);
|
|
33
|
-
} catch { /* best effort */ }
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Create a SQLite DB with a corrupt freelist that causes DDL to fail
|
|
38
|
-
* with "database disk image is malformed" but is recoverable via VACUUM.
|
|
39
|
-
*
|
|
40
|
-
* Strategy:
|
|
41
|
-
* 1. Create a DB with schema_version at v0 (so initSchema needs to run DDL)
|
|
42
|
-
* 2. Add padding rows to create many pages, then delete + drop to free them
|
|
43
|
-
* 3. Corrupt the freelist trunk pointer to point at a B-tree page
|
|
44
|
-
*
|
|
45
|
-
* This simulates the real-world scenario described in #2519: an interrupted
|
|
46
|
-
* WAL checkpoint leaves the freelist in an inconsistent state.
|
|
47
|
-
*/
|
|
48
|
-
function createCorruptFreelistDb(dbPath: string): void {
|
|
49
|
-
// Use node:sqlite directly to build the minimal corrupt DB
|
|
50
|
-
const sqlite = _require('node:sqlite');
|
|
51
|
-
const db = new sqlite.DatabaseSync(dbPath);
|
|
52
|
-
db.exec('PRAGMA journal_mode=WAL');
|
|
53
|
-
db.exec('CREATE TABLE schema_version (version INTEGER NOT NULL, applied_at TEXT NOT NULL)');
|
|
54
|
-
db.exec("INSERT INTO schema_version VALUES (0, '2024-01-01')");
|
|
55
|
-
// Pad with data to create many pages, then free them
|
|
56
|
-
db.exec('CREATE TABLE _padding (id INTEGER PRIMARY KEY, data TEXT)');
|
|
57
|
-
for (let i = 0; i < 30; i++) {
|
|
58
|
-
db.exec(`INSERT INTO _padding (data) VALUES ('${'x'.repeat(4000)}')`);
|
|
59
|
-
}
|
|
60
|
-
db.exec('DELETE FROM _padding');
|
|
61
|
-
db.exec('DROP TABLE _padding');
|
|
62
|
-
db.exec('PRAGMA wal_checkpoint(TRUNCATE)');
|
|
63
|
-
db.close();
|
|
64
|
-
|
|
65
|
-
// Remove WAL/SHM files to ensure clean file-only state
|
|
66
|
-
try { fs.unlinkSync(dbPath + '-wal'); } catch { /* may not exist */ }
|
|
67
|
-
try { fs.unlinkSync(dbPath + '-shm'); } catch { /* may not exist */ }
|
|
68
|
-
|
|
69
|
-
// Corrupt: point freelist trunk (offset 32-35) to page 2 (a B-tree page),
|
|
70
|
-
// and claim 10 free pages (offset 36-39)
|
|
71
|
-
const fd = fs.openSync(dbPath, 'r+');
|
|
72
|
-
try {
|
|
73
|
-
const buf = Buffer.alloc(8);
|
|
74
|
-
buf.writeUInt32BE(2, 0); // trunk page = page 2 (actually a B-tree page)
|
|
75
|
-
buf.writeUInt32BE(10, 4); // freelist count = 10
|
|
76
|
-
fs.writeSync(fd, buf, 0, 8, 32);
|
|
77
|
-
} finally {
|
|
78
|
-
fs.closeSync(fd);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
83
|
-
// Tests
|
|
84
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
85
|
-
|
|
86
|
-
describe('openDatabase VACUUM recovery on corrupt freelist', () => {
|
|
87
|
-
|
|
88
|
-
test('recovers a file-backed DB with corrupt freelist via VACUUM', () => {
|
|
89
|
-
const dbPath = tempDbPath();
|
|
90
|
-
|
|
91
|
-
// Create a DB with corrupt freelist (schema at v0 so initSchema runs DDL)
|
|
92
|
-
createCorruptFreelistDb(dbPath);
|
|
93
|
-
|
|
94
|
-
// Without the fix, this throws "database disk image is malformed".
|
|
95
|
-
// With the fix, openDatabase detects "malformed", runs VACUUM, retries.
|
|
96
|
-
const ok = openDatabase(dbPath);
|
|
97
|
-
assert.ok(ok, 'openDatabase should succeed after VACUUM recovery');
|
|
98
|
-
assert.ok(isDbAvailable(), 'DB should be available after recovery');
|
|
99
|
-
|
|
100
|
-
// Verify full schema was applied
|
|
101
|
-
const adapter = _getAdapter()!;
|
|
102
|
-
const row = adapter.prepare(
|
|
103
|
-
'SELECT MAX(version) as version FROM schema_version',
|
|
104
|
-
).get();
|
|
105
|
-
assert.ok(
|
|
106
|
-
typeof row?.['version'] === 'number' && (row['version'] as number) > 0,
|
|
107
|
-
'schema_version should have a positive version after recovery',
|
|
108
|
-
);
|
|
109
|
-
|
|
110
|
-
cleanup(dbPath);
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
test('does not attempt VACUUM for non-malformed errors', () => {
|
|
114
|
-
// openDatabase with :memory: never hits the fileBacked VACUUM path,
|
|
115
|
-
// so non-malformed errors propagate directly. We verify by checking
|
|
116
|
-
// that a non-file error from an in-memory DB propagates unchanged.
|
|
117
|
-
// (In-memory DBs always succeed for initSchema, so this is a design
|
|
118
|
-
// check — the VACUUM path is only for fileBacked = true.)
|
|
119
|
-
const ok = openDatabase(':memory:');
|
|
120
|
-
assert.ok(ok, 'in-memory DB should open fine');
|
|
121
|
-
closeDatabase();
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
test('throws if VACUUM itself fails on unrecoverable corruption', () => {
|
|
125
|
-
const dbPath = tempDbPath();
|
|
126
|
-
|
|
127
|
-
// Create a file with valid SQLite header but thoroughly corrupt content
|
|
128
|
-
const page = Buffer.alloc(4096);
|
|
129
|
-
// SQLite magic: "SQLite format 3\0"
|
|
130
|
-
page.write('SQLite format 3\0', 0, 'utf8');
|
|
131
|
-
// Page size: 4096 (big-endian at offset 16)
|
|
132
|
-
page.writeUInt16BE(4096, 16);
|
|
133
|
-
page[18] = 1; // write version
|
|
134
|
-
page[19] = 1; // read version
|
|
135
|
-
page[20] = 0; // reserved space
|
|
136
|
-
page[21] = 64; // max embedded payload fraction
|
|
137
|
-
page[22] = 32; // min embedded payload fraction
|
|
138
|
-
page[23] = 32; // leaf payload fraction
|
|
139
|
-
page.writeUInt32BE(1, 28); // page_count = 1
|
|
140
|
-
page.writeUInt32BE(999, 32); // corrupt freelist trunk
|
|
141
|
-
page.writeUInt32BE(5, 36); // freelist count = 5
|
|
142
|
-
|
|
143
|
-
fs.writeFileSync(dbPath, page);
|
|
144
|
-
|
|
145
|
-
// Should throw — VACUUM cannot save a thoroughly corrupt file
|
|
146
|
-
assert.throws(
|
|
147
|
-
() => openDatabase(dbPath),
|
|
148
|
-
/./,
|
|
149
|
-
'should throw for unrecoverable corruption',
|
|
150
|
-
);
|
|
151
|
-
|
|
152
|
-
cleanup(dbPath);
|
|
153
|
-
});
|
|
154
|
-
});
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for verdict-parser.ts — extraction, normalization, and schema validation.
|
|
3
|
-
*
|
|
4
|
-
* Regression tests for #2960: extractVerdict() must detect verdicts in both
|
|
5
|
-
* YAML frontmatter and common markdown body patterns (LLM manual writes).
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { describe, it } from "node:test";
|
|
9
|
-
import assert from "node:assert/strict";
|
|
10
|
-
import {
|
|
11
|
-
extractVerdict,
|
|
12
|
-
hasVerdict,
|
|
13
|
-
isAcceptableUatVerdict,
|
|
14
|
-
isValidMilestoneVerdict,
|
|
15
|
-
} from "../verdict-parser.ts";
|
|
16
|
-
|
|
17
|
-
// ── extractVerdict ──────────────────────────────────────────────────────────
|
|
18
|
-
|
|
19
|
-
describe("extractVerdict", () => {
|
|
20
|
-
it("extracts verdict from YAML frontmatter", () => {
|
|
21
|
-
const content = "---\nverdict: pass\n---\n\n# Validation";
|
|
22
|
-
assert.equal(extractVerdict(content), "pass");
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it("normalizes 'passed' to 'pass' in frontmatter", () => {
|
|
26
|
-
const content = "---\nverdict: passed\n---\n";
|
|
27
|
-
assert.equal(extractVerdict(content), "pass");
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
it("extracts case-insensitive verdict from frontmatter", () => {
|
|
31
|
-
const content = "---\nVerdict: PASS\n---\n";
|
|
32
|
-
assert.equal(extractVerdict(content), "pass");
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
it("extracts needs-remediation from frontmatter", () => {
|
|
36
|
-
const content = "---\nverdict: needs-remediation\n---\n";
|
|
37
|
-
assert.equal(extractVerdict(content), "needs-remediation");
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it("returns undefined when content has no frontmatter and no markdown verdict", () => {
|
|
41
|
-
const content = "# Just a heading\n\nSome text without any verdict.";
|
|
42
|
-
assert.equal(extractVerdict(content), undefined);
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
// ── Regression: #2960 — markdown body verdicts ─────────────────────────
|
|
46
|
-
|
|
47
|
-
it("detects **Verdict:** PASS in markdown body (#2960)", () => {
|
|
48
|
-
const content = [
|
|
49
|
-
"# M013 — Milestone Validation",
|
|
50
|
-
"",
|
|
51
|
-
"**Verdict:** PASS",
|
|
52
|
-
"",
|
|
53
|
-
"All slices completed successfully.",
|
|
54
|
-
].join("\n");
|
|
55
|
-
assert.equal(extractVerdict(content), "pass");
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
it("detects **Verdict:** with emoji prefix in markdown body (#2960)", () => {
|
|
59
|
-
const content = [
|
|
60
|
-
"# Milestone Validation",
|
|
61
|
-
"",
|
|
62
|
-
"**Verdict:** ✅ PASS",
|
|
63
|
-
"",
|
|
64
|
-
"Everything looks good.",
|
|
65
|
-
].join("\n");
|
|
66
|
-
assert.equal(extractVerdict(content), "pass");
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
it("detects **Verdict:** needs-remediation in markdown body (#2960)", () => {
|
|
70
|
-
const content = [
|
|
71
|
-
"# Milestone Validation",
|
|
72
|
-
"",
|
|
73
|
-
"**Verdict:** needs-remediation",
|
|
74
|
-
"",
|
|
75
|
-
"Several issues found.",
|
|
76
|
-
].join("\n");
|
|
77
|
-
assert.equal(extractVerdict(content), "needs-remediation");
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
it("normalizes 'passed' to 'pass' in markdown body (#2960)", () => {
|
|
81
|
-
const content = "# Validation\n\n**Verdict:** Passed\n";
|
|
82
|
-
assert.equal(extractVerdict(content), "pass");
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
it("detects verdict without colon in bold pattern (#2960)", () => {
|
|
86
|
-
const content = "# Validation\n\n**Verdict** PASS\n";
|
|
87
|
-
assert.equal(extractVerdict(content), "pass");
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
it("prefers frontmatter verdict over markdown body", () => {
|
|
91
|
-
const content = [
|
|
92
|
-
"---",
|
|
93
|
-
"verdict: needs-remediation",
|
|
94
|
-
"---",
|
|
95
|
-
"",
|
|
96
|
-
"**Verdict:** PASS",
|
|
97
|
-
].join("\n");
|
|
98
|
-
assert.equal(extractVerdict(content), "needs-remediation");
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
// ── hasVerdict ────────────────────────────────────────────────────────────
|
|
103
|
-
|
|
104
|
-
describe("hasVerdict", () => {
|
|
105
|
-
it("returns true when verdict field exists", () => {
|
|
106
|
-
assert.equal(hasVerdict("verdict: pass"), true);
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
it("returns false when no verdict field exists", () => {
|
|
110
|
-
assert.equal(hasVerdict("# Just a heading"), false);
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
// ── isAcceptableUatVerdict ───────────────────────────────────────────────
|
|
115
|
-
|
|
116
|
-
describe("isAcceptableUatVerdict", () => {
|
|
117
|
-
it("accepts pass verdict", () => {
|
|
118
|
-
assert.equal(isAcceptableUatVerdict("pass", undefined), true);
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
it("accepts passed verdict", () => {
|
|
122
|
-
assert.equal(isAcceptableUatVerdict("passed", undefined), true);
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
it("rejects fail verdict", () => {
|
|
126
|
-
assert.equal(isAcceptableUatVerdict("fail", undefined), false);
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
it("accepts partial for mixed UAT type", () => {
|
|
130
|
-
assert.equal(isAcceptableUatVerdict("partial", "mixed"), true);
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
it("rejects partial for artifact-driven UAT type", () => {
|
|
134
|
-
assert.equal(isAcceptableUatVerdict("partial", "artifact-driven"), false);
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
// ── isValidMilestoneVerdict ──────────────────────────────────────────────
|
|
139
|
-
|
|
140
|
-
describe("isValidMilestoneVerdict", () => {
|
|
141
|
-
it("accepts pass", () => {
|
|
142
|
-
assert.equal(isValidMilestoneVerdict("pass"), true);
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
it("accepts needs-attention", () => {
|
|
146
|
-
assert.equal(isValidMilestoneVerdict("needs-attention"), true);
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
it("accepts needs-remediation", () => {
|
|
150
|
-
assert.equal(isValidMilestoneVerdict("needs-remediation"), true);
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
it("rejects unknown verdict", () => {
|
|
154
|
-
assert.equal(isValidMilestoneVerdict("fail"), false);
|
|
155
|
-
});
|
|
156
|
-
});
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Regression test for #2931: completing-milestone gate should treat
|
|
3
|
-
* "None required", "N/A", "Not applicable", etc. as equivalent to "none"
|
|
4
|
-
* and skip the operational verification content check entirely.
|
|
5
|
-
*/
|
|
6
|
-
import { test } from "node:test";
|
|
7
|
-
import assert from "node:assert/strict";
|
|
8
|
-
|
|
9
|
-
import { isVerificationNotApplicable } from "../auto-dispatch.ts";
|
|
10
|
-
|
|
11
|
-
test("isVerificationNotApplicable: bare 'none' is not applicable", () => {
|
|
12
|
-
assert.equal(isVerificationNotApplicable("none"), true);
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
test("isVerificationNotApplicable: 'None' (capitalized) is not applicable", () => {
|
|
16
|
-
assert.equal(isVerificationNotApplicable("None"), true);
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
test("isVerificationNotApplicable: 'NONE' (uppercase) is not applicable", () => {
|
|
20
|
-
assert.equal(isVerificationNotApplicable("NONE"), true);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
test("isVerificationNotApplicable: 'None required' is not applicable (#2931)", () => {
|
|
24
|
-
assert.equal(isVerificationNotApplicable("None required"), true);
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
test("isVerificationNotApplicable: 'None needed' is not applicable", () => {
|
|
28
|
-
assert.equal(isVerificationNotApplicable("None needed"), true);
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
test("isVerificationNotApplicable: 'None planned' is not applicable", () => {
|
|
32
|
-
assert.equal(isVerificationNotApplicable("None planned"), true);
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
test("isVerificationNotApplicable: 'N/A' is not applicable", () => {
|
|
36
|
-
assert.equal(isVerificationNotApplicable("N/A"), true);
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
test("isVerificationNotApplicable: 'n/a' is not applicable", () => {
|
|
40
|
-
assert.equal(isVerificationNotApplicable("n/a"), true);
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
test("isVerificationNotApplicable: 'Not applicable' is not applicable", () => {
|
|
44
|
-
assert.equal(isVerificationNotApplicable("Not applicable"), true);
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
test("isVerificationNotApplicable: 'Not required' is not applicable", () => {
|
|
48
|
-
assert.equal(isVerificationNotApplicable("Not required"), true);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
test("isVerificationNotApplicable: 'Not needed' is not applicable", () => {
|
|
52
|
-
assert.equal(isVerificationNotApplicable("Not needed"), true);
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
test("isVerificationNotApplicable: 'No operational verification needed' is not applicable", () => {
|
|
56
|
-
assert.equal(isVerificationNotApplicable("No operational verification needed"), true);
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
test("isVerificationNotApplicable: 'No operational' is not applicable", () => {
|
|
60
|
-
assert.equal(isVerificationNotApplicable("No operational"), true);
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
test("isVerificationNotApplicable: empty string is not applicable", () => {
|
|
64
|
-
assert.equal(isVerificationNotApplicable(""), true);
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
test("isVerificationNotApplicable: whitespace-only is not applicable", () => {
|
|
68
|
-
assert.equal(isVerificationNotApplicable(" "), true);
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
// Positive cases: these SHOULD require verification
|
|
72
|
-
test("isVerificationNotApplicable: 'Run load tests' requires verification", () => {
|
|
73
|
-
assert.equal(isVerificationNotApplicable("Run load tests"), false);
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
test("isVerificationNotApplicable: 'Verify API response times under load' requires verification", () => {
|
|
77
|
-
assert.equal(isVerificationNotApplicable("Verify API response times under load"), false);
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
test("isVerificationNotApplicable: 'Monitor error rates for 24h' requires verification", () => {
|
|
81
|
-
assert.equal(isVerificationNotApplicable("Monitor error rates for 24h"), false);
|
|
82
|
-
});
|