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,405 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Regression tests for issue #2945: State corruption in milestone/slice completion workflow.
|
|
3
|
-
*
|
|
4
|
-
* Covers all 4 sub-bugs:
|
|
5
|
-
* Bug 1: ROADMAP corrupted by inline UAT content in table rows
|
|
6
|
-
* Bug 2: complete-milestone event replay bypasses task validation
|
|
7
|
-
* Bug 3: Worktree directory not cleaned up after mergeAndExit
|
|
8
|
-
* Bug 4: Quality gate records not written by validate-milestone
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { describe, test, beforeEach, afterEach } from "node:test";
|
|
12
|
-
import assert from "node:assert/strict";
|
|
13
|
-
import { mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync, existsSync } from "node:fs";
|
|
14
|
-
import { join } from "node:path";
|
|
15
|
-
import { tmpdir } from "node:os";
|
|
16
|
-
import {
|
|
17
|
-
openDatabase,
|
|
18
|
-
closeDatabase,
|
|
19
|
-
insertMilestone,
|
|
20
|
-
insertSlice,
|
|
21
|
-
insertTask,
|
|
22
|
-
getMilestoneSlices,
|
|
23
|
-
getSliceTasks,
|
|
24
|
-
getGateResults,
|
|
25
|
-
} from "../gsd-db.ts";
|
|
26
|
-
import { renderRoadmapContent } from "../workflow-projections.ts";
|
|
27
|
-
import type { MilestoneRow, SliceRow } from "../gsd-db.ts";
|
|
28
|
-
import type { AutoSession } from "../auto/session.ts";
|
|
29
|
-
|
|
30
|
-
// ─── Fixture helpers ────────────────────────────────────────────────────────
|
|
31
|
-
|
|
32
|
-
function tempDbPath(): string {
|
|
33
|
-
const dir = mkdtempSync(join(tmpdir(), "gsd-2945-"));
|
|
34
|
-
return join(dir, "test.db");
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
function cleanupDb(dbPath: string): void {
|
|
38
|
-
closeDatabase();
|
|
39
|
-
try {
|
|
40
|
-
const dir = join(dbPath, "..");
|
|
41
|
-
rmSync(dir, { recursive: true, force: true });
|
|
42
|
-
} catch {
|
|
43
|
-
// best effort
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function createTempProject(): { basePath: string } {
|
|
48
|
-
const basePath = mkdtempSync(join(tmpdir(), "gsd-2945-project-"));
|
|
49
|
-
mkdirSync(join(basePath, ".gsd", "milestones", "M001"), { recursive: true });
|
|
50
|
-
return { basePath };
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function makeMilestoneRow(overrides: Partial<MilestoneRow> = {}): MilestoneRow {
|
|
54
|
-
return {
|
|
55
|
-
id: "M001",
|
|
56
|
-
title: "Test Milestone",
|
|
57
|
-
vision: "Build a test milestone",
|
|
58
|
-
status: "active",
|
|
59
|
-
depends_on: [],
|
|
60
|
-
created_at: new Date().toISOString(),
|
|
61
|
-
completed_at: null,
|
|
62
|
-
success_criteria: ["SC1", "SC2"],
|
|
63
|
-
key_risks: [],
|
|
64
|
-
proof_strategy: [],
|
|
65
|
-
verification_contract: "",
|
|
66
|
-
verification_integration: "",
|
|
67
|
-
verification_operational: "",
|
|
68
|
-
verification_uat: "",
|
|
69
|
-
definition_of_done: [],
|
|
70
|
-
requirement_coverage: "",
|
|
71
|
-
boundary_map_markdown: "",
|
|
72
|
-
...overrides,
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function makeSliceRow(id: string, overrides: Partial<SliceRow> = {}): SliceRow {
|
|
77
|
-
return {
|
|
78
|
-
id,
|
|
79
|
-
milestone_id: "M001",
|
|
80
|
-
title: `Slice ${id}`,
|
|
81
|
-
goal: `Goal for ${id}`,
|
|
82
|
-
demo: `Demo for ${id}`,
|
|
83
|
-
risk: "medium",
|
|
84
|
-
status: "pending",
|
|
85
|
-
sequence: parseInt(id.replace("S", ""), 10) || 0,
|
|
86
|
-
depends: [],
|
|
87
|
-
created_at: new Date().toISOString(),
|
|
88
|
-
completed_at: null,
|
|
89
|
-
full_summary_md: "",
|
|
90
|
-
full_uat_md: "",
|
|
91
|
-
success_criteria: "",
|
|
92
|
-
proof_level: "",
|
|
93
|
-
integration_closure: "",
|
|
94
|
-
observability_impact: "",
|
|
95
|
-
replan_triggered_at: null,
|
|
96
|
-
...overrides,
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
101
|
-
// Bug 1: ROADMAP corrupted by inline UAT content
|
|
102
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
103
|
-
|
|
104
|
-
describe("#2945 Bug 1: ROADMAP table cell corruption by UAT content", () => {
|
|
105
|
-
|
|
106
|
-
test("renderRoadmapContent does NOT inject full_uat_md into table rows when demo is empty", () => {
|
|
107
|
-
const milestone = makeMilestoneRow();
|
|
108
|
-
|
|
109
|
-
const longUatContent = `### Preconditions
|
|
110
|
-
- Database initialized
|
|
111
|
-
- Service running
|
|
112
|
-
|
|
113
|
-
### Steps
|
|
114
|
-
1. Open the application
|
|
115
|
-
2. Navigate to settings
|
|
116
|
-
3. Enable dark mode
|
|
117
|
-
|
|
118
|
-
### Expected
|
|
119
|
-
- Theme changes to dark
|
|
120
|
-
- All components update`;
|
|
121
|
-
|
|
122
|
-
const slices: SliceRow[] = [
|
|
123
|
-
makeSliceRow("S01", {
|
|
124
|
-
status: "complete",
|
|
125
|
-
demo: "", // empty demo
|
|
126
|
-
full_uat_md: longUatContent, // full UAT content in DB
|
|
127
|
-
}),
|
|
128
|
-
makeSliceRow("S02", {
|
|
129
|
-
status: "pending",
|
|
130
|
-
demo: "Advanced stuff works",
|
|
131
|
-
}),
|
|
132
|
-
];
|
|
133
|
-
|
|
134
|
-
const content = renderRoadmapContent(milestone, slices);
|
|
135
|
-
|
|
136
|
-
// The roadmap table row for S01 should NOT contain UAT content
|
|
137
|
-
assert.ok(
|
|
138
|
-
!content.includes("Preconditions"),
|
|
139
|
-
"roadmap table row must not contain UAT preconditions",
|
|
140
|
-
);
|
|
141
|
-
assert.ok(
|
|
142
|
-
!content.includes("Navigate to settings"),
|
|
143
|
-
"roadmap table row must not contain UAT steps",
|
|
144
|
-
);
|
|
145
|
-
|
|
146
|
-
// Each table row should be a reasonable length (under 200 chars)
|
|
147
|
-
const lines = content.split("\n");
|
|
148
|
-
const s01Row = lines.find(l => l.includes("| S01 |"));
|
|
149
|
-
assert.ok(s01Row, "S01 should appear as a table row");
|
|
150
|
-
assert.ok(
|
|
151
|
-
s01Row!.length < 200,
|
|
152
|
-
`S01 row should be under 200 chars, got ${s01Row!.length}: ${s01Row!.slice(0, 100)}...`,
|
|
153
|
-
);
|
|
154
|
-
|
|
155
|
-
// S02 should still be visible
|
|
156
|
-
assert.ok(content.includes("| S02 |"), "S02 must still be visible in roadmap table");
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
test("renderRoadmapContent uses 'TBD' fallback when demo is empty, not full_uat_md", () => {
|
|
160
|
-
const milestone = makeMilestoneRow();
|
|
161
|
-
const slices: SliceRow[] = [
|
|
162
|
-
makeSliceRow("S01", { demo: "", full_uat_md: "Long UAT content here" }),
|
|
163
|
-
];
|
|
164
|
-
|
|
165
|
-
const content = renderRoadmapContent(milestone, slices);
|
|
166
|
-
assert.ok(
|
|
167
|
-
content.includes("TBD"),
|
|
168
|
-
"empty demo should fallback to 'TBD', not full_uat_md",
|
|
169
|
-
);
|
|
170
|
-
assert.ok(
|
|
171
|
-
!content.includes("Long UAT content here"),
|
|
172
|
-
"full_uat_md should never appear in roadmap table",
|
|
173
|
-
);
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
test("renderRoadmapContent preserves demo field when present", () => {
|
|
177
|
-
const milestone = makeMilestoneRow();
|
|
178
|
-
const slices: SliceRow[] = [
|
|
179
|
-
makeSliceRow("S01", { demo: "Basic functionality works", full_uat_md: "Full UAT" }),
|
|
180
|
-
];
|
|
181
|
-
|
|
182
|
-
const content = renderRoadmapContent(milestone, slices);
|
|
183
|
-
assert.ok(
|
|
184
|
-
content.includes("Basic functionality works"),
|
|
185
|
-
"demo field should be used when present",
|
|
186
|
-
);
|
|
187
|
-
assert.ok(
|
|
188
|
-
!content.includes("Full UAT"),
|
|
189
|
-
"full_uat_md should not be used when demo is present",
|
|
190
|
-
);
|
|
191
|
-
});
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
195
|
-
// Bug 2: complete-milestone event replay bypasses task validation
|
|
196
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
197
|
-
|
|
198
|
-
describe("#2945 Bug 2: workflow-reconcile bypasses task validation for complete_slice", () => {
|
|
199
|
-
let dbPath: string;
|
|
200
|
-
|
|
201
|
-
beforeEach(() => {
|
|
202
|
-
dbPath = tempDbPath();
|
|
203
|
-
openDatabase(dbPath);
|
|
204
|
-
});
|
|
205
|
-
|
|
206
|
-
afterEach(() => {
|
|
207
|
-
cleanupDb(dbPath);
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
test("replaySliceComplete must not mark slice done when tasks are pending", async () => {
|
|
211
|
-
// Set up: M001 with S01 that has 2 tasks, one pending
|
|
212
|
-
insertMilestone({ id: "M001" });
|
|
213
|
-
insertSlice({ id: "S01", milestoneId: "M001" });
|
|
214
|
-
insertTask({ id: "T01", sliceId: "S01", milestoneId: "M001", status: "complete", title: "Done task" });
|
|
215
|
-
insertTask({ id: "T02", sliceId: "S01", milestoneId: "M001", status: "pending", title: "Pending task" });
|
|
216
|
-
|
|
217
|
-
// Import and call replaySliceComplete directly
|
|
218
|
-
const { replaySliceComplete } = await import("../workflow-reconcile.ts");
|
|
219
|
-
replaySliceComplete("M001", "S01", new Date().toISOString());
|
|
220
|
-
|
|
221
|
-
// The slice should NOT be marked done because T02 is still pending
|
|
222
|
-
const slices = getMilestoneSlices("M001");
|
|
223
|
-
const s01 = slices.find(s => s.id === "S01");
|
|
224
|
-
assert.ok(s01, "S01 should exist");
|
|
225
|
-
assert.notStrictEqual(
|
|
226
|
-
s01!.status,
|
|
227
|
-
"done",
|
|
228
|
-
"replaySliceComplete must not mark slice as done when tasks are pending",
|
|
229
|
-
);
|
|
230
|
-
assert.notStrictEqual(
|
|
231
|
-
s01!.status,
|
|
232
|
-
"complete",
|
|
233
|
-
"replaySliceComplete must not mark slice as complete when tasks are pending",
|
|
234
|
-
);
|
|
235
|
-
});
|
|
236
|
-
|
|
237
|
-
test("replaySliceComplete marks slice done when all tasks are complete", async () => {
|
|
238
|
-
insertMilestone({ id: "M001" });
|
|
239
|
-
insertSlice({ id: "S01", milestoneId: "M001" });
|
|
240
|
-
insertTask({ id: "T01", sliceId: "S01", milestoneId: "M001", status: "complete", title: "Done task" });
|
|
241
|
-
insertTask({ id: "T02", sliceId: "S01", milestoneId: "M001", status: "done", title: "Also done" });
|
|
242
|
-
|
|
243
|
-
const { replaySliceComplete } = await import("../workflow-reconcile.ts");
|
|
244
|
-
replaySliceComplete("M001", "S01", new Date().toISOString());
|
|
245
|
-
|
|
246
|
-
const slices = getMilestoneSlices("M001");
|
|
247
|
-
const s01 = slices.find(s => s.id === "S01");
|
|
248
|
-
assert.ok(s01, "S01 should exist");
|
|
249
|
-
assert.strictEqual(
|
|
250
|
-
s01!.status,
|
|
251
|
-
"done",
|
|
252
|
-
"replaySliceComplete should mark slice as done when all tasks are complete",
|
|
253
|
-
);
|
|
254
|
-
});
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
258
|
-
// Bug 3: Worktree directory not cleaned up after mergeAndExit
|
|
259
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
260
|
-
|
|
261
|
-
describe("#2945 Bug 3: mergeAndExit must teardown worktree after successful merge", () => {
|
|
262
|
-
|
|
263
|
-
test("_mergeWorktreeMode calls teardownAutoWorktree after successful merge", async () => {
|
|
264
|
-
// Test the WorktreeResolver to verify teardown is called after merge.
|
|
265
|
-
// We use a mock-based approach since actual worktrees require a git repo.
|
|
266
|
-
let teardownCalled = false;
|
|
267
|
-
let teardownMilestoneId = "";
|
|
268
|
-
|
|
269
|
-
const mockSession = {
|
|
270
|
-
basePath: "/mock/worktree/M001",
|
|
271
|
-
originalBasePath: "/mock/project",
|
|
272
|
-
isolationDegraded: false,
|
|
273
|
-
gitService: {} as unknown,
|
|
274
|
-
} as unknown as AutoSession;
|
|
275
|
-
|
|
276
|
-
const mockDeps = {
|
|
277
|
-
isInAutoWorktree: () => true,
|
|
278
|
-
shouldUseWorktreeIsolation: () => true,
|
|
279
|
-
getIsolationMode: () => "worktree" as const,
|
|
280
|
-
mergeMilestoneToMain: () => ({ pushed: false, codeFilesChanged: true }),
|
|
281
|
-
syncWorktreeStateBack: () => ({ synced: [] }),
|
|
282
|
-
teardownAutoWorktree: (basePath: string, mid: string) => {
|
|
283
|
-
teardownCalled = true;
|
|
284
|
-
teardownMilestoneId = mid;
|
|
285
|
-
},
|
|
286
|
-
createAutoWorktree: () => "",
|
|
287
|
-
enterAutoWorktree: () => "",
|
|
288
|
-
getAutoWorktreePath: () => null,
|
|
289
|
-
autoCommitCurrentBranch: () => {},
|
|
290
|
-
getCurrentBranch: () => "main",
|
|
291
|
-
autoWorktreeBranch: () => "gsd/M001",
|
|
292
|
-
resolveMilestoneFile: () => "/mock/roadmap.md",
|
|
293
|
-
readFileSync: () => "# Roadmap content",
|
|
294
|
-
GitServiceImpl: class {} as unknown as new (p: string, c: unknown) => unknown,
|
|
295
|
-
loadEffectiveGSDPreferences: () => undefined,
|
|
296
|
-
invalidateAllCaches: () => {},
|
|
297
|
-
captureIntegrationBranch: () => {},
|
|
298
|
-
};
|
|
299
|
-
|
|
300
|
-
// Import and create resolver
|
|
301
|
-
// We test the behavior contract: after a successful merge, teardown must be called
|
|
302
|
-
const { WorktreeResolver } = await import("../worktree-resolver.ts");
|
|
303
|
-
const resolver = new WorktreeResolver(mockSession, mockDeps);
|
|
304
|
-
|
|
305
|
-
const ctx = { notify: () => {} };
|
|
306
|
-
resolver.mergeAndExit("M001", ctx);
|
|
307
|
-
|
|
308
|
-
assert.ok(
|
|
309
|
-
teardownCalled,
|
|
310
|
-
"teardownAutoWorktree must be called after successful merge in worktree mode",
|
|
311
|
-
);
|
|
312
|
-
assert.strictEqual(
|
|
313
|
-
teardownMilestoneId,
|
|
314
|
-
"M001",
|
|
315
|
-
"teardown must be called with the correct milestone ID",
|
|
316
|
-
);
|
|
317
|
-
});
|
|
318
|
-
});
|
|
319
|
-
|
|
320
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
321
|
-
// Bug 4: Quality gate records not written by validate-milestone
|
|
322
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
323
|
-
|
|
324
|
-
describe("#2945 Bug 4: validate-milestone must persist quality_gates records", () => {
|
|
325
|
-
let dbPath: string;
|
|
326
|
-
let basePath: string;
|
|
327
|
-
|
|
328
|
-
beforeEach(() => {
|
|
329
|
-
dbPath = tempDbPath();
|
|
330
|
-
openDatabase(dbPath);
|
|
331
|
-
const proj = createTempProject();
|
|
332
|
-
basePath = proj.basePath;
|
|
333
|
-
});
|
|
334
|
-
|
|
335
|
-
afterEach(() => {
|
|
336
|
-
cleanupDb(dbPath);
|
|
337
|
-
try { rmSync(basePath, { recursive: true, force: true }); } catch {}
|
|
338
|
-
});
|
|
339
|
-
|
|
340
|
-
test("handleValidateMilestone persists quality_gates records in DB", async () => {
|
|
341
|
-
// Set up milestone with slices
|
|
342
|
-
insertMilestone({ id: "M001" });
|
|
343
|
-
insertSlice({ id: "S01", milestoneId: "M001" });
|
|
344
|
-
|
|
345
|
-
const { handleValidateMilestone } = await import("../tools/validate-milestone.ts");
|
|
346
|
-
|
|
347
|
-
const result = await handleValidateMilestone({
|
|
348
|
-
milestoneId: "M001",
|
|
349
|
-
verdict: "pass",
|
|
350
|
-
remediationRound: 0,
|
|
351
|
-
successCriteriaChecklist: "- [x] SC1 met\n- [x] SC2 met",
|
|
352
|
-
sliceDeliveryAudit: "All slices delivered",
|
|
353
|
-
crossSliceIntegration: "Integration verified",
|
|
354
|
-
requirementCoverage: "100% coverage",
|
|
355
|
-
verdictRationale: "All checks pass",
|
|
356
|
-
}, basePath);
|
|
357
|
-
|
|
358
|
-
assert.ok(!("error" in result), `handler should succeed, got: ${JSON.stringify(result)}`);
|
|
359
|
-
|
|
360
|
-
// Quality gate records should exist in DB for this milestone
|
|
361
|
-
// Use a wildcard slice_id since milestone-level gates use a sentinel
|
|
362
|
-
const adapter = (await import("../gsd-db.ts"))._getAdapter()!;
|
|
363
|
-
const gates = adapter.prepare(
|
|
364
|
-
"SELECT * FROM quality_gates WHERE milestone_id = 'M001'"
|
|
365
|
-
).all();
|
|
366
|
-
|
|
367
|
-
assert.ok(
|
|
368
|
-
gates.length > 0,
|
|
369
|
-
`validate-milestone must persist quality_gates records in DB, found ${gates.length}`,
|
|
370
|
-
);
|
|
371
|
-
});
|
|
372
|
-
|
|
373
|
-
test("handleValidateMilestone records verdict correctly in quality_gates", async () => {
|
|
374
|
-
insertMilestone({ id: "M001" });
|
|
375
|
-
insertSlice({ id: "S01", milestoneId: "M001" });
|
|
376
|
-
|
|
377
|
-
const { handleValidateMilestone } = await import("../tools/validate-milestone.ts");
|
|
378
|
-
|
|
379
|
-
await handleValidateMilestone({
|
|
380
|
-
milestoneId: "M001",
|
|
381
|
-
verdict: "needs-remediation",
|
|
382
|
-
remediationRound: 1,
|
|
383
|
-
successCriteriaChecklist: "- [ ] SC1 not met",
|
|
384
|
-
sliceDeliveryAudit: "S01 incomplete",
|
|
385
|
-
crossSliceIntegration: "Not tested",
|
|
386
|
-
requirementCoverage: "50% coverage",
|
|
387
|
-
verdictRationale: "Needs work",
|
|
388
|
-
remediationPlan: "Fix S01",
|
|
389
|
-
}, basePath);
|
|
390
|
-
|
|
391
|
-
const adapter = (await import("../gsd-db.ts"))._getAdapter()!;
|
|
392
|
-
const gates = adapter.prepare(
|
|
393
|
-
"SELECT * FROM quality_gates WHERE milestone_id = 'M001'"
|
|
394
|
-
).all();
|
|
395
|
-
|
|
396
|
-
assert.ok(gates.length > 0, "quality_gates records must exist");
|
|
397
|
-
|
|
398
|
-
// At least one gate should have a non-empty verdict
|
|
399
|
-
const withVerdict = gates.filter((g: Record<string, unknown>) => g["verdict"] && g["verdict"] !== "");
|
|
400
|
-
assert.ok(
|
|
401
|
-
withVerdict.length > 0,
|
|
402
|
-
"at least one quality_gate should have a recorded verdict",
|
|
403
|
-
);
|
|
404
|
-
});
|
|
405
|
-
});
|
|
@@ -1,257 +0,0 @@
|
|
|
1
|
-
// GSD State Machine Regression Tests — Completion Hierarchy & State Derivation (#3161)
|
|
2
|
-
|
|
3
|
-
import { describe, test, beforeEach, afterEach } from "node:test";
|
|
4
|
-
import assert from "node:assert/strict";
|
|
5
|
-
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
6
|
-
import { join } from "node:path";
|
|
7
|
-
import { tmpdir } from "node:os";
|
|
8
|
-
|
|
9
|
-
import { deriveState, isGhostMilestone, invalidateStateCache } from "../state.ts";
|
|
10
|
-
|
|
11
|
-
// ─── Fixture Helpers ───────────────────────────────────────────────────────
|
|
12
|
-
|
|
13
|
-
function createFixtureBase(): string {
|
|
14
|
-
const base = mkdtempSync(join(tmpdir(), "gsd-parity-test-"));
|
|
15
|
-
mkdirSync(join(base, ".gsd", "milestones"), { recursive: true });
|
|
16
|
-
return base;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
function cleanup(base: string): void {
|
|
20
|
-
rmSync(base, { recursive: true, force: true });
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function writeMilestoneFile(base: string, mid: string, suffix: string, content: string): void {
|
|
24
|
-
const dir = join(base, ".gsd", "milestones", mid);
|
|
25
|
-
mkdirSync(dir, { recursive: true });
|
|
26
|
-
writeFileSync(join(dir, `${mid}-${suffix}.md`), content);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function writeMilestoneValidation(base: string, mid: string, verdict: string = "pass"): void {
|
|
30
|
-
const dir = join(base, ".gsd", "milestones", mid);
|
|
31
|
-
mkdirSync(dir, { recursive: true });
|
|
32
|
-
writeFileSync(
|
|
33
|
-
join(dir, `${mid}-VALIDATION.md`),
|
|
34
|
-
`---\nverdict: ${verdict}\nremediation_round: 0\n---\n\n# Validation\nValidated.`,
|
|
35
|
-
);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// ─── Setup / Teardown ──────────────────────────────────────────────────────
|
|
39
|
-
|
|
40
|
-
beforeEach(() => {
|
|
41
|
-
invalidateStateCache();
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
afterEach(() => {
|
|
45
|
-
invalidateStateCache();
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
49
|
-
// Tests
|
|
50
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
51
|
-
|
|
52
|
-
describe("state-derivation-parity", () => {
|
|
53
|
-
|
|
54
|
-
// ─── Test 1: ghost milestone with only META.json ─────────────────────────
|
|
55
|
-
test("ghost milestone with only META.json is correctly detected", () => {
|
|
56
|
-
const base = createFixtureBase();
|
|
57
|
-
try {
|
|
58
|
-
const dir = join(base, ".gsd", "milestones", "M001");
|
|
59
|
-
mkdirSync(dir, { recursive: true });
|
|
60
|
-
// Write only META.json — no CONTEXT, CONTEXT-DRAFT, ROADMAP, or SUMMARY
|
|
61
|
-
writeFileSync(join(dir, "META.json"), JSON.stringify({ id: "M001", createdAt: new Date().toISOString() }));
|
|
62
|
-
|
|
63
|
-
assert.ok(
|
|
64
|
-
isGhostMilestone(base, "M001"),
|
|
65
|
-
"milestone with only META.json is a ghost",
|
|
66
|
-
);
|
|
67
|
-
} finally {
|
|
68
|
-
cleanup(base);
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
// ─── Test 2: non-ghost milestone with CONTEXT is not ghost ───────────────
|
|
73
|
-
test("non-ghost milestone with CONTEXT is not ghost", () => {
|
|
74
|
-
const base = createFixtureBase();
|
|
75
|
-
try {
|
|
76
|
-
writeMilestoneFile(base, "M001", "CONTEXT", "# M001 Context\n\nThis milestone has real content.");
|
|
77
|
-
|
|
78
|
-
assert.ok(
|
|
79
|
-
!isGhostMilestone(base, "M001"),
|
|
80
|
-
"milestone with CONTEXT.md is not a ghost",
|
|
81
|
-
);
|
|
82
|
-
} finally {
|
|
83
|
-
cleanup(base);
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
// ─── Test 3: empty milestones dir derives pre-planning phase ─────────────
|
|
88
|
-
test("empty milestones dir derives pre-planning phase", async () => {
|
|
89
|
-
const base = createFixtureBase();
|
|
90
|
-
try {
|
|
91
|
-
const state = await deriveState(base);
|
|
92
|
-
assert.equal(state.phase, "pre-planning", "empty milestones dir yields pre-planning phase");
|
|
93
|
-
assert.equal(state.activeMilestone, null, "no active milestone for empty dir");
|
|
94
|
-
assert.equal(state.activeSlice, null, "no active slice for empty dir");
|
|
95
|
-
assert.deepEqual(state.registry, [], "registry is empty for empty dir");
|
|
96
|
-
} finally {
|
|
97
|
-
cleanup(base);
|
|
98
|
-
}
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
// ─── Test 4: state includes blockers field for future blocked-phase detection ──
|
|
102
|
-
test("deriveState result always includes a defined phase and nextAction", async () => {
|
|
103
|
-
// Document that the state shape includes a `phase` string and `nextAction` string.
|
|
104
|
-
// Triggering "blocked" via filesystem alone requires circular dep setup which
|
|
105
|
-
// is outside the scope of these parity tests. Instead we verify the shape.
|
|
106
|
-
const base = createFixtureBase();
|
|
107
|
-
try {
|
|
108
|
-
// Provide a milestone with a ROADMAP that has a single incomplete slice
|
|
109
|
-
const dir = join(base, ".gsd", "milestones", "M001");
|
|
110
|
-
mkdirSync(dir, { recursive: true });
|
|
111
|
-
writeFileSync(
|
|
112
|
-
join(dir, "M001-ROADMAP.md"),
|
|
113
|
-
`# M001: Test\n\n**Vision:** Parity check.\n\n## Slices\n\n- [ ] **S01: First Slice** \`risk:low\` \`depends:[]\`\n > After this: First slice done.\n`,
|
|
114
|
-
);
|
|
115
|
-
|
|
116
|
-
const state = await deriveState(base);
|
|
117
|
-
|
|
118
|
-
assert.ok(typeof state.phase === "string", "state.phase is a string");
|
|
119
|
-
assert.ok(typeof state.nextAction === "string", "state.nextAction is a string");
|
|
120
|
-
// The state object is the same shape regardless of phase — blockers would
|
|
121
|
-
// appear when the phase is "blocked". We document that the field may exist.
|
|
122
|
-
assert.ok("activeMilestone" in state, "state has activeMilestone field");
|
|
123
|
-
assert.ok("registry" in state, "state has registry field");
|
|
124
|
-
} finally {
|
|
125
|
-
cleanup(base);
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
// ─── Test 5: CONTEXT-DRAFT but no CONTEXT returns needs-discussion ────────
|
|
130
|
-
test("deriveState with CONTEXT-DRAFT but no CONTEXT returns needs-discussion", async () => {
|
|
131
|
-
const base = createFixtureBase();
|
|
132
|
-
try {
|
|
133
|
-
writeMilestoneFile(
|
|
134
|
-
base,
|
|
135
|
-
"M001",
|
|
136
|
-
"CONTEXT-DRAFT",
|
|
137
|
-
"# Draft Context\n\nSeed discussion material for M001.",
|
|
138
|
-
);
|
|
139
|
-
|
|
140
|
-
const state = await deriveState(base);
|
|
141
|
-
assert.equal(
|
|
142
|
-
state.phase,
|
|
143
|
-
"needs-discussion",
|
|
144
|
-
"CONTEXT-DRAFT with no CONTEXT yields needs-discussion phase",
|
|
145
|
-
);
|
|
146
|
-
assert.equal(state.activeMilestone?.id, "M001", "active milestone is M001");
|
|
147
|
-
assert.equal(state.activeSlice, null, "no active slice in needs-discussion phase");
|
|
148
|
-
} finally {
|
|
149
|
-
cleanup(base);
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
// ─── Test 6: deriveState skips ghost milestones when finding active milestone ──
|
|
154
|
-
test("deriveState skips ghost milestones when finding active milestone", async () => {
|
|
155
|
-
const base = createFixtureBase();
|
|
156
|
-
try {
|
|
157
|
-
// M001: ghost — just an empty directory
|
|
158
|
-
mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
|
|
159
|
-
|
|
160
|
-
// M002: has CONTEXT-DRAFT — should become active
|
|
161
|
-
writeMilestoneFile(
|
|
162
|
-
base,
|
|
163
|
-
"M002",
|
|
164
|
-
"CONTEXT-DRAFT",
|
|
165
|
-
"# Draft for M002\n\nThis is the real milestone.",
|
|
166
|
-
);
|
|
167
|
-
|
|
168
|
-
const state = await deriveState(base);
|
|
169
|
-
|
|
170
|
-
// M001 is a ghost so it is skipped; M002 becomes the active milestone
|
|
171
|
-
assert.equal(
|
|
172
|
-
state.activeMilestone?.id,
|
|
173
|
-
"M002",
|
|
174
|
-
"ghost M001 is skipped; M002 is the active milestone",
|
|
175
|
-
);
|
|
176
|
-
assert.equal(
|
|
177
|
-
state.phase,
|
|
178
|
-
"needs-discussion",
|
|
179
|
-
"phase is needs-discussion because M002 has only CONTEXT-DRAFT",
|
|
180
|
-
);
|
|
181
|
-
} finally {
|
|
182
|
-
cleanup(base);
|
|
183
|
-
}
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
// ─── Bonus: isGhostMilestone returns true for fully empty directory ───────
|
|
187
|
-
test("isGhostMilestone returns true for milestone directory with no files", () => {
|
|
188
|
-
const base = createFixtureBase();
|
|
189
|
-
try {
|
|
190
|
-
mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
|
|
191
|
-
// No files at all in the directory
|
|
192
|
-
assert.ok(
|
|
193
|
-
isGhostMilestone(base, "M001"),
|
|
194
|
-
"milestone directory with no files is a ghost",
|
|
195
|
-
);
|
|
196
|
-
} finally {
|
|
197
|
-
cleanup(base);
|
|
198
|
-
}
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
// ─── Bonus: isGhostMilestone returns false when ROADMAP exists ────────────
|
|
202
|
-
test("isGhostMilestone returns false when ROADMAP exists", () => {
|
|
203
|
-
const base = createFixtureBase();
|
|
204
|
-
try {
|
|
205
|
-
writeMilestoneFile(base, "M001", "ROADMAP", "# M001\n\n## Slices\n\n- [ ] **S01: First** `risk:low` `depends:[]`\n > After this: done.\n");
|
|
206
|
-
assert.ok(
|
|
207
|
-
!isGhostMilestone(base, "M001"),
|
|
208
|
-
"milestone with ROADMAP is not a ghost",
|
|
209
|
-
);
|
|
210
|
-
} finally {
|
|
211
|
-
cleanup(base);
|
|
212
|
-
}
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
// ─── Bonus: isGhostMilestone returns false when CONTEXT-DRAFT exists ──────
|
|
216
|
-
test("isGhostMilestone returns false when CONTEXT-DRAFT exists", () => {
|
|
217
|
-
const base = createFixtureBase();
|
|
218
|
-
try {
|
|
219
|
-
writeMilestoneFile(base, "M001", "CONTEXT-DRAFT", "# Draft\n\nSeed material.");
|
|
220
|
-
assert.ok(
|
|
221
|
-
!isGhostMilestone(base, "M001"),
|
|
222
|
-
"milestone with CONTEXT-DRAFT is not a ghost",
|
|
223
|
-
);
|
|
224
|
-
} finally {
|
|
225
|
-
cleanup(base);
|
|
226
|
-
}
|
|
227
|
-
});
|
|
228
|
-
|
|
229
|
-
// ─── Bonus: multiple ghost milestones before a real one are all skipped ───
|
|
230
|
-
test("deriveState skips multiple ghost milestones to find the first real one", async () => {
|
|
231
|
-
const base = createFixtureBase();
|
|
232
|
-
try {
|
|
233
|
-
// M001 and M002: ghosts
|
|
234
|
-
mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
|
|
235
|
-
mkdirSync(join(base, ".gsd", "milestones", "M002"), { recursive: true });
|
|
236
|
-
|
|
237
|
-
// M003: has CONTEXT-DRAFT — first real milestone
|
|
238
|
-
writeMilestoneFile(base, "M003", "CONTEXT-DRAFT", "# M003 Draft\n\nFirst substantive milestone.");
|
|
239
|
-
|
|
240
|
-
const state = await deriveState(base);
|
|
241
|
-
|
|
242
|
-
assert.equal(
|
|
243
|
-
state.activeMilestone?.id,
|
|
244
|
-
"M003",
|
|
245
|
-
"both ghost milestones skipped; M003 is active",
|
|
246
|
-
);
|
|
247
|
-
assert.equal(
|
|
248
|
-
state.phase,
|
|
249
|
-
"needs-discussion",
|
|
250
|
-
"phase is needs-discussion for M003 with CONTEXT-DRAFT",
|
|
251
|
-
);
|
|
252
|
-
} finally {
|
|
253
|
-
cleanup(base);
|
|
254
|
-
}
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
});
|