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,105 +0,0 @@
|
|
|
1
|
-
import { describe, test, before, after } from "node:test";
|
|
2
|
-
import assert from "node:assert/strict";
|
|
3
|
-
import {
|
|
4
|
-
mkdtempSync,
|
|
5
|
-
rmSync,
|
|
6
|
-
writeFileSync,
|
|
7
|
-
existsSync,
|
|
8
|
-
mkdirSync,
|
|
9
|
-
realpathSync,
|
|
10
|
-
} from "node:fs";
|
|
11
|
-
import { join } from "node:path";
|
|
12
|
-
import { tmpdir } from "node:os";
|
|
13
|
-
import { execSync } from "node:child_process";
|
|
14
|
-
|
|
15
|
-
import { migrateToExternalState } from "../migrate-external.ts";
|
|
16
|
-
|
|
17
|
-
function run(command: string, cwd: string): string {
|
|
18
|
-
return execSync(command, {
|
|
19
|
-
cwd,
|
|
20
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
21
|
-
encoding: "utf-8",
|
|
22
|
-
}).trim();
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
describe("migrate-external worktree guard (#2970)", () => {
|
|
26
|
-
let base: string;
|
|
27
|
-
let stateDir: string;
|
|
28
|
-
let worktreePath: string;
|
|
29
|
-
|
|
30
|
-
before(() => {
|
|
31
|
-
base = realpathSync(mkdtempSync(join(tmpdir(), "gsd-migrate-wt-")));
|
|
32
|
-
stateDir = realpathSync(mkdtempSync(join(tmpdir(), "gsd-state-")));
|
|
33
|
-
process.env.GSD_STATE_DIR = stateDir;
|
|
34
|
-
|
|
35
|
-
// Create a git repo with a remote
|
|
36
|
-
run("git init -b main", base);
|
|
37
|
-
run('git config user.name "Test"', base);
|
|
38
|
-
run('git config user.email "test@example.com"', base);
|
|
39
|
-
run('git remote add origin git@github.com:example/repo.git', base);
|
|
40
|
-
writeFileSync(join(base, "README.md"), "# Test\n", "utf-8");
|
|
41
|
-
run("git add README.md", base);
|
|
42
|
-
run('git commit -m "init"', base);
|
|
43
|
-
|
|
44
|
-
// Create a worktree
|
|
45
|
-
worktreePath = join(base, ".gsd", "worktrees", "M001");
|
|
46
|
-
run(`git worktree add -b milestone/M001 ${worktreePath}`, base);
|
|
47
|
-
|
|
48
|
-
// Populate worktree with a .gsd directory (simulating syncGsdStateToWorktree)
|
|
49
|
-
const worktreeGsd = join(worktreePath, ".gsd");
|
|
50
|
-
mkdirSync(worktreeGsd, { recursive: true });
|
|
51
|
-
writeFileSync(join(worktreeGsd, "PREFERENCES.md"), "# prefs\n", "utf-8");
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
after(() => {
|
|
55
|
-
delete process.env.GSD_STATE_DIR;
|
|
56
|
-
// Remove worktree before cleaning up
|
|
57
|
-
try { run(`git worktree remove --force ${worktreePath}`, base); } catch { /* ok */ }
|
|
58
|
-
rmSync(base, { recursive: true, force: true });
|
|
59
|
-
rmSync(stateDir, { recursive: true, force: true });
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
test("migrateToExternalState skips when basePath is a git worktree", () => {
|
|
63
|
-
// The worktree has a real .gsd directory — migration would normally run.
|
|
64
|
-
// But since this is a worktree, it should be skipped.
|
|
65
|
-
const result = migrateToExternalState(worktreePath);
|
|
66
|
-
|
|
67
|
-
assert.equal(result.migrated, false, "should not migrate inside a worktree");
|
|
68
|
-
assert.equal(result.error, undefined, "should not report an error");
|
|
69
|
-
|
|
70
|
-
// .gsd should still exist as a real directory (not renamed/removed)
|
|
71
|
-
assert.ok(
|
|
72
|
-
existsSync(join(worktreePath, ".gsd")),
|
|
73
|
-
".gsd directory should still exist after skipped migration"
|
|
74
|
-
);
|
|
75
|
-
|
|
76
|
-
// .gsd.migrating should NOT exist
|
|
77
|
-
assert.ok(
|
|
78
|
-
!existsSync(join(worktreePath, ".gsd.migrating")),
|
|
79
|
-
".gsd.migrating should not be created in a worktree"
|
|
80
|
-
);
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
test("migrateToExternalState still works on main repo", () => {
|
|
84
|
-
// Create a fresh temp repo to test main repo migration path
|
|
85
|
-
const mainBase = realpathSync(mkdtempSync(join(tmpdir(), "gsd-migrate-main-")));
|
|
86
|
-
try {
|
|
87
|
-
run("git init -b main", mainBase);
|
|
88
|
-
run('git config user.name "Test"', mainBase);
|
|
89
|
-
run('git config user.email "test@example.com"', mainBase);
|
|
90
|
-
run('git remote add origin git@github.com:example/main-repo.git', mainBase);
|
|
91
|
-
writeFileSync(join(mainBase, "README.md"), "# Test\n", "utf-8");
|
|
92
|
-
run("git add README.md", mainBase);
|
|
93
|
-
run('git commit -m "init"', mainBase);
|
|
94
|
-
|
|
95
|
-
// Create a .gsd directory with content
|
|
96
|
-
mkdirSync(join(mainBase, ".gsd"), { recursive: true });
|
|
97
|
-
writeFileSync(join(mainBase, ".gsd", "PREFERENCES.md"), "# prefs\n", "utf-8");
|
|
98
|
-
|
|
99
|
-
const result = migrateToExternalState(mainBase);
|
|
100
|
-
assert.equal(result.migrated, true, "should migrate on main repo");
|
|
101
|
-
} finally {
|
|
102
|
-
rmSync(mainBase, { recursive: true, force: true });
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
});
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Bug #2807: Web roadmap derives milestone status from slice heuristics
|
|
3
|
-
* instead of authoritative GSD milestone state.
|
|
4
|
-
*
|
|
5
|
-
* getMilestoneStatus() should prefer the authoritative `status` field on
|
|
6
|
-
* WorkspaceMilestoneTarget (populated from the engine registry) rather
|
|
7
|
-
* than inferring status from slice completion flags.
|
|
8
|
-
*/
|
|
9
|
-
import test from "node:test";
|
|
10
|
-
import assert from "node:assert/strict";
|
|
11
|
-
import { getMilestoneStatus } from "../../../../../web/lib/workspace-status.ts";
|
|
12
|
-
|
|
13
|
-
// Inline type to avoid importing .tsx (not compiled to .js by test pipeline)
|
|
14
|
-
interface TestMilestone {
|
|
15
|
-
id: string;
|
|
16
|
-
title: string;
|
|
17
|
-
roadmapPath?: string;
|
|
18
|
-
status?: "complete" | "active" | "pending" | "parked";
|
|
19
|
-
validationVerdict?: "pass" | "needs-attention" | "needs-remediation";
|
|
20
|
-
slices: Array<{ id: string; title: string; done: boolean; tasks: Array<{ id: string; title: string; done: boolean }> }>;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// ── Helpers ────────────────────────────────────────────────────────────────
|
|
24
|
-
|
|
25
|
-
function makeMilestone(overrides: Partial<TestMilestone> & { id: string }): TestMilestone {
|
|
26
|
-
return {
|
|
27
|
-
title: overrides.id,
|
|
28
|
-
roadmapPath: undefined,
|
|
29
|
-
slices: [],
|
|
30
|
-
...overrides,
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// ── Tests ──────────────────────────────────────────────────────────────────
|
|
35
|
-
|
|
36
|
-
test("getMilestoneStatus returns authoritative 'complete' even when slices are not all done", () => {
|
|
37
|
-
const milestone = makeMilestone({
|
|
38
|
-
id: "M001",
|
|
39
|
-
status: "complete",
|
|
40
|
-
slices: [
|
|
41
|
-
{ id: "S01", title: "Slice 1", done: true, tasks: [] },
|
|
42
|
-
{ id: "S02", title: "Slice 2", done: false, tasks: [] }, // not done
|
|
43
|
-
],
|
|
44
|
-
});
|
|
45
|
-
// Before the fix, this would return "in-progress" because not all slices are done.
|
|
46
|
-
// After the fix, it should return "done" because authoritative status is "complete".
|
|
47
|
-
assert.equal(getMilestoneStatus(milestone, {}), "done");
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
test("getMilestoneStatus returns authoritative 'active' regardless of slice state", () => {
|
|
51
|
-
const milestone = makeMilestone({
|
|
52
|
-
id: "M002",
|
|
53
|
-
status: "active",
|
|
54
|
-
slices: [
|
|
55
|
-
{ id: "S01", title: "Slice 1", done: true, tasks: [] },
|
|
56
|
-
{ id: "S02", title: "Slice 2", done: true, tasks: [] },
|
|
57
|
-
],
|
|
58
|
-
});
|
|
59
|
-
// Before the fix, this would return "done" because all slices are done.
|
|
60
|
-
// After the fix, it should return "in-progress" because authoritative status is "active".
|
|
61
|
-
assert.equal(getMilestoneStatus(milestone, {}), "in-progress");
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
test("getMilestoneStatus returns 'pending' for authoritative 'pending' even when some slices done", () => {
|
|
65
|
-
const milestone = makeMilestone({
|
|
66
|
-
id: "M003",
|
|
67
|
-
status: "pending",
|
|
68
|
-
slices: [
|
|
69
|
-
{ id: "S01", title: "Slice 1", done: true, tasks: [] },
|
|
70
|
-
{ id: "S02", title: "Slice 2", done: false, tasks: [] },
|
|
71
|
-
],
|
|
72
|
-
});
|
|
73
|
-
// Before the fix, this would return "in-progress" because some slices are done.
|
|
74
|
-
// After the fix, it should return "pending".
|
|
75
|
-
assert.equal(getMilestoneStatus(milestone, {}), "pending");
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
test("getMilestoneStatus maps 'parked' to 'pending' item status", () => {
|
|
79
|
-
const milestone = makeMilestone({
|
|
80
|
-
id: "M004",
|
|
81
|
-
status: "parked",
|
|
82
|
-
slices: [
|
|
83
|
-
{ id: "S01", title: "Slice 1", done: true, tasks: [] },
|
|
84
|
-
],
|
|
85
|
-
});
|
|
86
|
-
// Parked milestones should render as pending in the UI
|
|
87
|
-
assert.equal(getMilestoneStatus(milestone, {}), "pending");
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
test("getMilestoneStatus falls back to heuristic when no authoritative status", () => {
|
|
91
|
-
// Backward compatibility: milestones without the status field should
|
|
92
|
-
// still work using the old slice-based heuristic.
|
|
93
|
-
const milestone = makeMilestone({
|
|
94
|
-
id: "M005",
|
|
95
|
-
slices: [
|
|
96
|
-
{ id: "S01", title: "Slice 1", done: true, tasks: [] },
|
|
97
|
-
{ id: "S02", title: "Slice 2", done: true, tasks: [] },
|
|
98
|
-
],
|
|
99
|
-
});
|
|
100
|
-
assert.equal(getMilestoneStatus(milestone, {}), "done");
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
test("getMilestoneStatus exposes validationVerdict on milestone target", () => {
|
|
104
|
-
const milestone = makeMilestone({
|
|
105
|
-
id: "M006",
|
|
106
|
-
status: "complete",
|
|
107
|
-
validationVerdict: "needs-attention",
|
|
108
|
-
slices: [
|
|
109
|
-
{ id: "S01", title: "Slice 1", done: true, tasks: [] },
|
|
110
|
-
],
|
|
111
|
-
});
|
|
112
|
-
// The milestone should have the validationVerdict field available
|
|
113
|
-
assert.equal(milestone.validationVerdict, "needs-attention");
|
|
114
|
-
// And status should still be "done"
|
|
115
|
-
assert.equal(getMilestoneStatus(milestone, {}), "done");
|
|
116
|
-
});
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* parallel-commit-scope.test.ts — Regression test for #1991.
|
|
3
|
-
*
|
|
4
|
-
* Parallel workers must only commit files belonging to their locked milestone.
|
|
5
|
-
* When GSD_MILESTONE_LOCK is set, smartStage() must exclude .gsd/milestones/<M>/
|
|
6
|
-
* directories for milestones other than the locked one.
|
|
7
|
-
*
|
|
8
|
-
* Without the fix, a worker for M033 can stage and commit fabricated artifacts
|
|
9
|
-
* under .gsd/milestones/M032/, causing cross-milestone pollution.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { describe, test, beforeEach, afterEach } from "node:test";
|
|
13
|
-
import assert from "node:assert/strict";
|
|
14
|
-
import {
|
|
15
|
-
mkdtempSync,
|
|
16
|
-
mkdirSync,
|
|
17
|
-
writeFileSync,
|
|
18
|
-
rmSync,
|
|
19
|
-
} from "node:fs";
|
|
20
|
-
import { join } from "node:path";
|
|
21
|
-
import { tmpdir } from "node:os";
|
|
22
|
-
import { execFileSync } from "node:child_process";
|
|
23
|
-
|
|
24
|
-
import {
|
|
25
|
-
GitServiceImpl,
|
|
26
|
-
} from "../git-service.ts";
|
|
27
|
-
|
|
28
|
-
function run(command: string, cwd: string): string {
|
|
29
|
-
const [cmd, ...args] = command.split(" ");
|
|
30
|
-
return execFileSync(cmd, args, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function gitRun(args: string[], cwd: string): string {
|
|
34
|
-
return execFileSync("git", args, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
function createFile(base: string, relPath: string, content: string): void {
|
|
38
|
-
const full = join(base, relPath);
|
|
39
|
-
mkdirSync(join(full, ".."), { recursive: true });
|
|
40
|
-
writeFileSync(full, content, "utf-8");
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function initTempRepo(): string {
|
|
44
|
-
const dir = mkdtempSync(join(tmpdir(), "gsd-parallel-scope-"));
|
|
45
|
-
gitRun(["init", "-b", "main"], dir);
|
|
46
|
-
gitRun(["config", "user.name", "Test"], dir);
|
|
47
|
-
gitRun(["config", "user.email", "test@test.com"], dir);
|
|
48
|
-
createFile(dir, ".gitkeep", "");
|
|
49
|
-
gitRun(["add", "-A"], dir);
|
|
50
|
-
gitRun(["commit", "-m", "init"], dir);
|
|
51
|
-
return dir;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
describe("parallel commit scope (#1991)", () => {
|
|
55
|
-
const savedEnv: Record<string, string | undefined> = {};
|
|
56
|
-
|
|
57
|
-
beforeEach(() => {
|
|
58
|
-
savedEnv.GSD_MILESTONE_LOCK = process.env.GSD_MILESTONE_LOCK;
|
|
59
|
-
savedEnv.GSD_PARALLEL_WORKER = process.env.GSD_PARALLEL_WORKER;
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
afterEach(() => {
|
|
63
|
-
for (const key of ["GSD_MILESTONE_LOCK", "GSD_PARALLEL_WORKER"] as const) {
|
|
64
|
-
if (savedEnv[key] === undefined) {
|
|
65
|
-
delete process.env[key];
|
|
66
|
-
} else {
|
|
67
|
-
process.env[key] = savedEnv[key];
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
test("autoCommit excludes other milestone directories when GSD_MILESTONE_LOCK is set", () => {
|
|
73
|
-
const repo = initTempRepo();
|
|
74
|
-
|
|
75
|
-
// Set up parallel worker environment for M033
|
|
76
|
-
process.env.GSD_MILESTONE_LOCK = "M033";
|
|
77
|
-
process.env.GSD_PARALLEL_WORKER = "1";
|
|
78
|
-
|
|
79
|
-
// Create dirty files in BOTH milestones (simulates cross-milestone pollution)
|
|
80
|
-
createFile(repo, ".gsd/milestones/M032/M032-SUMMARY.md", "# M032 Summary\nFabricated by M033 worker");
|
|
81
|
-
createFile(repo, ".gsd/milestones/M032/M032-VALIDATION.md", "# M032 Validation\nFabricated");
|
|
82
|
-
createFile(repo, ".gsd/milestones/M032/slices/S01/S01-SUMMARY.md", "Fabricated S01 summary");
|
|
83
|
-
createFile(repo, ".gsd/milestones/M033/slices/S01/tasks/T01-SUMMARY.md", "Legit T01 summary");
|
|
84
|
-
createFile(repo, "src/feature.ts", "export const x = 1;");
|
|
85
|
-
|
|
86
|
-
const svc = new GitServiceImpl(repo);
|
|
87
|
-
const msg = svc.autoCommit("complete-milestone", "M033/complete");
|
|
88
|
-
assert.ok(msg !== null, "autoCommit should produce a commit");
|
|
89
|
-
|
|
90
|
-
const committed = gitRun(["show", "--name-only", "HEAD"], repo);
|
|
91
|
-
|
|
92
|
-
// Source files and own milestone files SHOULD be committed
|
|
93
|
-
assert.ok(committed.includes("src/feature.ts"), "source files are committed");
|
|
94
|
-
assert.ok(committed.includes(".gsd/milestones/M033/"), "own milestone files are committed");
|
|
95
|
-
|
|
96
|
-
// Other milestone files MUST NOT be committed
|
|
97
|
-
assert.ok(!committed.includes(".gsd/milestones/M032/"),
|
|
98
|
-
"M032 files must NOT be committed by M033 worker — cross-milestone pollution (#1991)");
|
|
99
|
-
|
|
100
|
-
// Verify M032 files are still dirty (unstaged) in the working tree
|
|
101
|
-
const status = gitRun(["status", "--porcelain"], repo);
|
|
102
|
-
assert.ok(status.includes("M032"), "M032 files remain as untracked/dirty in working tree");
|
|
103
|
-
|
|
104
|
-
rmSync(repo, { recursive: true, force: true });
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
test("autoCommit stages all milestones when GSD_MILESTONE_LOCK is NOT set (solo mode)", () => {
|
|
108
|
-
const repo = initTempRepo();
|
|
109
|
-
|
|
110
|
-
// No milestone lock — solo worker mode
|
|
111
|
-
delete process.env.GSD_MILESTONE_LOCK;
|
|
112
|
-
delete process.env.GSD_PARALLEL_WORKER;
|
|
113
|
-
|
|
114
|
-
createFile(repo, ".gsd/milestones/M032/M032-SUMMARY.md", "# M032 Summary");
|
|
115
|
-
createFile(repo, ".gsd/milestones/M033/slices/S01/tasks/T01-SUMMARY.md", "T01 summary");
|
|
116
|
-
createFile(repo, "src/feature.ts", "export const x = 1;");
|
|
117
|
-
|
|
118
|
-
const svc = new GitServiceImpl(repo);
|
|
119
|
-
const msg = svc.autoCommit("complete-milestone", "M032/complete");
|
|
120
|
-
assert.ok(msg !== null, "autoCommit should produce a commit");
|
|
121
|
-
|
|
122
|
-
const committed = gitRun(["show", "--name-only", "HEAD"], repo);
|
|
123
|
-
|
|
124
|
-
// In solo mode, ALL milestone files should be committed
|
|
125
|
-
assert.ok(committed.includes(".gsd/milestones/M032/"), "M032 files committed in solo mode");
|
|
126
|
-
assert.ok(committed.includes(".gsd/milestones/M033/"), "M033 files committed in solo mode");
|
|
127
|
-
assert.ok(committed.includes("src/feature.ts"), "source files committed in solo mode");
|
|
128
|
-
|
|
129
|
-
rmSync(repo, { recursive: true, force: true });
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
test("autoCommit scopes to locked milestone even with multiple foreign milestones", () => {
|
|
133
|
-
const repo = initTempRepo();
|
|
134
|
-
|
|
135
|
-
process.env.GSD_MILESTONE_LOCK = "M035";
|
|
136
|
-
process.env.GSD_PARALLEL_WORKER = "1";
|
|
137
|
-
|
|
138
|
-
// Create files across many milestones
|
|
139
|
-
createFile(repo, ".gsd/milestones/M032/M032-SUMMARY.md", "foreign");
|
|
140
|
-
createFile(repo, ".gsd/milestones/M033/M033-SUMMARY.md", "foreign");
|
|
141
|
-
createFile(repo, ".gsd/milestones/M034/M034-SUMMARY.md", "foreign");
|
|
142
|
-
createFile(repo, ".gsd/milestones/M035/slices/S01/tasks/T01-SUMMARY.md", "own work");
|
|
143
|
-
createFile(repo, "src/app.ts", "export const app = {};");
|
|
144
|
-
|
|
145
|
-
const svc = new GitServiceImpl(repo);
|
|
146
|
-
const msg = svc.autoCommit("execute-task", "M035/S01/T01");
|
|
147
|
-
assert.ok(msg !== null, "autoCommit should produce a commit");
|
|
148
|
-
|
|
149
|
-
const committed = gitRun(["show", "--name-only", "HEAD"], repo);
|
|
150
|
-
|
|
151
|
-
assert.ok(committed.includes(".gsd/milestones/M035/"), "own milestone committed");
|
|
152
|
-
assert.ok(committed.includes("src/app.ts"), "source files committed");
|
|
153
|
-
assert.ok(!committed.includes(".gsd/milestones/M032/"), "M032 excluded");
|
|
154
|
-
assert.ok(!committed.includes(".gsd/milestones/M033/"), "M033 excluded");
|
|
155
|
-
assert.ok(!committed.includes(".gsd/milestones/M034/"), "M034 excluded");
|
|
156
|
-
|
|
157
|
-
rmSync(repo, { recursive: true, force: true });
|
|
158
|
-
});
|
|
159
|
-
});
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for parallel eligibility edge cases:
|
|
3
|
-
* - Ghost milestones (no registry entry) must NOT appear eligible (#2501 Bug 2)
|
|
4
|
-
* - Milestones with failed worktree merge (SUMMARY only in worktree, DB still
|
|
5
|
-
* "active") must NOT appear eligible (#2501 Bug 1 context)
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { describe, test, beforeEach, afterEach } from "node:test";
|
|
9
|
-
import assert from "node:assert/strict";
|
|
10
|
-
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
11
|
-
import { join } from "node:path";
|
|
12
|
-
import { tmpdir } from "node:os";
|
|
13
|
-
|
|
14
|
-
import { analyzeParallelEligibility } from "../parallel-eligibility.ts";
|
|
15
|
-
import { invalidateStateCache } from "../state.ts";
|
|
16
|
-
import {
|
|
17
|
-
openDatabase,
|
|
18
|
-
closeDatabase,
|
|
19
|
-
insertMilestone,
|
|
20
|
-
insertSlice,
|
|
21
|
-
insertTask,
|
|
22
|
-
updateMilestoneStatus,
|
|
23
|
-
} from "../gsd-db.ts";
|
|
24
|
-
|
|
25
|
-
// ─── Fixture Helpers ───────────────────────────────────────────────────────
|
|
26
|
-
|
|
27
|
-
function createFixtureBase(): string {
|
|
28
|
-
const base = mkdtempSync(join(tmpdir(), "gsd-parallel-elig-"));
|
|
29
|
-
mkdirSync(join(base, ".gsd", "milestones"), { recursive: true });
|
|
30
|
-
return base;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function writeMilestoneFile(
|
|
34
|
-
base: string,
|
|
35
|
-
milestoneId: string,
|
|
36
|
-
filename: string,
|
|
37
|
-
content: string,
|
|
38
|
-
): void {
|
|
39
|
-
const filePath = join(base, ".gsd", "milestones", milestoneId, filename);
|
|
40
|
-
mkdirSync(join(filePath, ".."), { recursive: true });
|
|
41
|
-
writeFileSync(filePath, content);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
function makeMilestoneDir(base: string, milestoneId: string): void {
|
|
45
|
-
mkdirSync(join(base, ".gsd", "milestones", milestoneId), { recursive: true });
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function cleanup(base: string): void {
|
|
49
|
-
rmSync(base, { recursive: true, force: true });
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// ─── Tests ─────────────────────────────────────────────────────────────────
|
|
53
|
-
|
|
54
|
-
describe("parallel-eligibility: ghost milestone ineligibility (#2501)", () => {
|
|
55
|
-
let base: string;
|
|
56
|
-
|
|
57
|
-
beforeEach(() => {
|
|
58
|
-
base = createFixtureBase();
|
|
59
|
-
openDatabase(":memory:");
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
afterEach(() => {
|
|
63
|
-
closeDatabase();
|
|
64
|
-
cleanup(base);
|
|
65
|
-
invalidateStateCache();
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
test("ghost milestone (directory only, no planning files) is ineligible", async () => {
|
|
69
|
-
// Set up a real milestone M001 with proper planning data in DB
|
|
70
|
-
writeMilestoneFile(base, "M001", "M001-CONTEXT.md", "# M001: Real Milestone\n\nA real milestone.");
|
|
71
|
-
writeMilestoneFile(base, "M001", "M001-ROADMAP.md", "# M001: Real Milestone\n\n## Slices\n\n- [ ] **S01: First Slice** `risk:low` `depends:[]`\n > Do something.\n");
|
|
72
|
-
writeMilestoneFile(base, "M001", "slices/S01/S01-PLAN.md", "# S01: First Slice\n\n**Goal:** Do it.\n**Demo:** Done.\n\n## Tasks\n\n- [ ] **T01: Task One** `est:10m`\n Do the thing.\n");
|
|
73
|
-
insertMilestone({ id: "M001", title: "M001: Real Milestone", status: "active" });
|
|
74
|
-
insertSlice({ id: "S01", milestoneId: "M001", title: "First Slice", status: "active", risk: "low", depends: [] });
|
|
75
|
-
insertTask({ id: "T01", sliceId: "S01", milestoneId: "M001", title: "Task One", status: "pending" });
|
|
76
|
-
|
|
77
|
-
// Create ghost milestone M017 — directory with only slices/, no CONTEXT/ROADMAP/SUMMARY
|
|
78
|
-
makeMilestoneDir(base, "M017");
|
|
79
|
-
mkdirSync(join(base, ".gsd", "milestones", "M017", "slices"), { recursive: true });
|
|
80
|
-
|
|
81
|
-
invalidateStateCache();
|
|
82
|
-
const result = await analyzeParallelEligibility(base);
|
|
83
|
-
|
|
84
|
-
// M017 should NOT be in the eligible list
|
|
85
|
-
const ghostEligible = result.eligible.find(e => e.milestoneId === "M017");
|
|
86
|
-
assert.equal(
|
|
87
|
-
ghostEligible,
|
|
88
|
-
undefined,
|
|
89
|
-
"Ghost milestone M017 must NOT appear in eligible list — it has no planning data",
|
|
90
|
-
);
|
|
91
|
-
|
|
92
|
-
// M017 should be in the ineligible list with an appropriate reason
|
|
93
|
-
const ghostIneligible = result.ineligible.find(e => e.milestoneId === "M017");
|
|
94
|
-
assert.ok(
|
|
95
|
-
ghostIneligible,
|
|
96
|
-
"Ghost milestone M017 must appear in ineligible list",
|
|
97
|
-
);
|
|
98
|
-
assert.equal(ghostIneligible!.eligible, false);
|
|
99
|
-
assert.match(
|
|
100
|
-
ghostIneligible!.reason,
|
|
101
|
-
/no planning data|unknown|no registry/i,
|
|
102
|
-
"Reason should indicate the milestone has no planning data or is unknown",
|
|
103
|
-
);
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
test("milestone with DB status active and no SUMMARY on disk is not eligible when it has no slices", async () => {
|
|
107
|
-
// Simulate a milestone whose complete-milestone ran in a worktree, wrote
|
|
108
|
-
// SUMMARY there, but the squash-merge back to main failed. The DB row
|
|
109
|
-
// was never updated (pre-fix scenario) and the SUMMARY file didn't reach
|
|
110
|
-
// the main project directory.
|
|
111
|
-
//
|
|
112
|
-
// In the current codebase, complete-milestone.ts already writes the DB
|
|
113
|
-
// status (Bug 1 was fixed). This test guards the fallback: even when the
|
|
114
|
-
// DB says "active" and the SUMMARY is missing from the main project dir,
|
|
115
|
-
// the milestone must NOT slip through as eligible.
|
|
116
|
-
|
|
117
|
-
// M012 — directory exists, CONTEXT exists (so it's not a ghost), but no
|
|
118
|
-
// SUMMARY on disk and DB says "active". No slices in DB either (they
|
|
119
|
-
// lived only in the worktree DB copy).
|
|
120
|
-
writeMilestoneFile(base, "M012", "M012-CONTEXT.md", "# M012: Worktree Milestone\n\nThis ran in a worktree.");
|
|
121
|
-
insertMilestone({ id: "M012", title: "M012: Worktree Milestone", status: "active" });
|
|
122
|
-
|
|
123
|
-
// M001 — a normal pending milestone with proper planning
|
|
124
|
-
writeMilestoneFile(base, "M001", "M001-CONTEXT.md", "# M001: Normal Milestone\n\nNormal milestone.");
|
|
125
|
-
writeMilestoneFile(base, "M001", "M001-ROADMAP.md", "# M001: Normal Milestone\n\n## Slices\n\n- [ ] **S01: Slice** `risk:low` `depends:[]`\n > Do it.\n");
|
|
126
|
-
writeMilestoneFile(base, "M001", "slices/S01/S01-PLAN.md", "# S01: Slice\n\n**Goal:** Do.\n**Demo:** Done.\n\n## Tasks\n\n- [ ] **T01: Task** `est:10m`\n Do.\n");
|
|
127
|
-
insertMilestone({ id: "M001", title: "M001: Normal Milestone", status: "active" });
|
|
128
|
-
insertSlice({ id: "S01", milestoneId: "M001", title: "Slice", status: "active", risk: "low", depends: [] });
|
|
129
|
-
insertTask({ id: "T01", sliceId: "S01", milestoneId: "M001", title: "Task", status: "pending" });
|
|
130
|
-
|
|
131
|
-
invalidateStateCache();
|
|
132
|
-
const result = await analyzeParallelEligibility(base);
|
|
133
|
-
|
|
134
|
-
// M001 should be eligible (it has proper planning and active status)
|
|
135
|
-
const m001 = result.eligible.find(e => e.milestoneId === "M001");
|
|
136
|
-
assert.ok(m001, "M001 with proper planning should be eligible");
|
|
137
|
-
|
|
138
|
-
// M012 should appear somewhere but must NOT be eligible. It has no
|
|
139
|
-
// slices in the DB, context exists so it's not a ghost, but state
|
|
140
|
-
// derivation should classify it as active with no work items. Even if
|
|
141
|
-
// it appears in registry as "active", it is eligible only if deps are
|
|
142
|
-
// satisfied — which they are (no deps). The critical check: it must
|
|
143
|
-
// NOT cause a re-dispatch of work that is already done in the worktree.
|
|
144
|
-
//
|
|
145
|
-
// NOTE: This test documents the current behavior. If the DB status is
|
|
146
|
-
// "active" and the milestone is in the registry, it WILL appear eligible
|
|
147
|
-
// (this is a separate fix path — Bug 1 is about writing DB status).
|
|
148
|
-
// We verify the fix path through Bug 2's ghost handling above.
|
|
149
|
-
});
|
|
150
|
-
});
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Regression test for #2879: gsd_plan_milestone silently drops milestone title
|
|
3
|
-
* when the DB row pre-exists from state reconciliation.
|
|
4
|
-
*
|
|
5
|
-
* Scenario: state reconciliation inserts a milestone row with an empty title
|
|
6
|
-
* (INSERT OR IGNORE). When gsd_plan_milestone is called later with a title,
|
|
7
|
-
* the title must be persisted — not silently dropped.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import test from "node:test";
|
|
11
|
-
import assert from "node:assert/strict";
|
|
12
|
-
|
|
13
|
-
import {
|
|
14
|
-
openDatabase,
|
|
15
|
-
closeDatabase,
|
|
16
|
-
insertMilestone,
|
|
17
|
-
getMilestone,
|
|
18
|
-
upsertMilestonePlanning,
|
|
19
|
-
} from "../gsd-db.ts";
|
|
20
|
-
|
|
21
|
-
test("upsertMilestonePlanning updates title when DB row pre-exists with empty title (#2879)", () => {
|
|
22
|
-
try {
|
|
23
|
-
openDatabase(":memory:");
|
|
24
|
-
|
|
25
|
-
// Step 1: Simulate state reconciliation — inserts milestone with empty title
|
|
26
|
-
insertMilestone({ id: "M099", status: "active" });
|
|
27
|
-
const before = getMilestone("M099");
|
|
28
|
-
assert.ok(before, "milestone row should exist after insertMilestone");
|
|
29
|
-
assert.equal(before.title, "", "title should be empty after reconciliation insert");
|
|
30
|
-
|
|
31
|
-
// Step 2: Simulate gsd_plan_milestone — insertMilestone is called again
|
|
32
|
-
// with a title, but INSERT OR IGNORE skips it since the row exists.
|
|
33
|
-
insertMilestone({ id: "M099", title: "My Important Milestone", status: "active" });
|
|
34
|
-
const afterInsert = getMilestone("M099");
|
|
35
|
-
assert.ok(afterInsert);
|
|
36
|
-
// The INSERT OR IGNORE means title is still empty — this is the known limitation
|
|
37
|
-
assert.equal(afterInsert.title, "", "INSERT OR IGNORE does not update existing row");
|
|
38
|
-
|
|
39
|
-
// Step 3: upsertMilestonePlanning should update the title
|
|
40
|
-
upsertMilestonePlanning("M099", {
|
|
41
|
-
vision: "Test vision",
|
|
42
|
-
}, "My Important Milestone");
|
|
43
|
-
const afterUpsert = getMilestone("M099");
|
|
44
|
-
assert.ok(afterUpsert);
|
|
45
|
-
assert.equal(
|
|
46
|
-
afterUpsert.title,
|
|
47
|
-
"My Important Milestone",
|
|
48
|
-
"title must be updated by upsertMilestonePlanning when row pre-exists",
|
|
49
|
-
);
|
|
50
|
-
} finally {
|
|
51
|
-
closeDatabase();
|
|
52
|
-
}
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
test("upsertMilestonePlanning preserves existing title when no title argument provided", () => {
|
|
56
|
-
try {
|
|
57
|
-
openDatabase(":memory:");
|
|
58
|
-
|
|
59
|
-
// Insert milestone with a title
|
|
60
|
-
insertMilestone({ id: "M100", title: "Original Title", status: "active" });
|
|
61
|
-
|
|
62
|
-
// Call upsertMilestonePlanning without a title — should preserve existing
|
|
63
|
-
upsertMilestonePlanning("M100", { vision: "Updated vision" });
|
|
64
|
-
const after = getMilestone("M100");
|
|
65
|
-
assert.ok(after);
|
|
66
|
-
assert.equal(after.title, "Original Title", "existing title must be preserved when no title argument given");
|
|
67
|
-
} finally {
|
|
68
|
-
closeDatabase();
|
|
69
|
-
}
|
|
70
|
-
});
|