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,97 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Regression test for #2985 Bugs 3 & 4:
|
|
3
|
-
* Bug 3 — module-level pendingAutoStart singleton clobbers concurrent sessions.
|
|
4
|
-
* Bug 4 — getDiscussionMilestoneId() returns wrong project's milestone under concurrency.
|
|
5
|
-
*
|
|
6
|
-
* pendingAutoStart must be keyed by basePath so concurrent discuss sessions
|
|
7
|
-
* in different projects are independent. getDiscussionMilestoneId() must accept
|
|
8
|
-
* a basePath parameter to perform a keyed lookup.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { describe, test, beforeEach } from "node:test";
|
|
12
|
-
import assert from "node:assert/strict";
|
|
13
|
-
|
|
14
|
-
import {
|
|
15
|
-
getDiscussionMilestoneId,
|
|
16
|
-
setPendingAutoStart,
|
|
17
|
-
clearPendingAutoStart,
|
|
18
|
-
} from "../guided-flow.ts";
|
|
19
|
-
|
|
20
|
-
// ─── Tests ─────────────────────────────────────────────────────────────────
|
|
21
|
-
|
|
22
|
-
describe("#2985 Bug 3 — concurrent discuss sessions must be independent", () => {
|
|
23
|
-
beforeEach(() => {
|
|
24
|
-
clearPendingAutoStart();
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
test("second session does not clobber first session's pending auto-start", () => {
|
|
28
|
-
// Simulate two concurrent discuss sessions for different projects
|
|
29
|
-
const projectA = "/projects/alpha";
|
|
30
|
-
const projectB = "/projects/beta";
|
|
31
|
-
|
|
32
|
-
setPendingAutoStart(projectA, {
|
|
33
|
-
basePath: projectA,
|
|
34
|
-
milestoneId: "M001-aaa111",
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
setPendingAutoStart(projectB, {
|
|
38
|
-
basePath: projectB,
|
|
39
|
-
milestoneId: "M002-bbb222",
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
// Both sessions should be retrievable
|
|
43
|
-
const milestoneA = getDiscussionMilestoneId(projectA);
|
|
44
|
-
const milestoneB = getDiscussionMilestoneId(projectB);
|
|
45
|
-
|
|
46
|
-
assert.equal(milestoneA, "M001-aaa111", "projectA's milestone should be preserved");
|
|
47
|
-
assert.equal(milestoneB, "M002-bbb222", "projectB's milestone should be preserved");
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
test("clearing one session does not affect the other", () => {
|
|
51
|
-
const projectA = "/projects/alpha";
|
|
52
|
-
const projectB = "/projects/beta";
|
|
53
|
-
|
|
54
|
-
setPendingAutoStart(projectA, { basePath: projectA, milestoneId: "M001-aaa111" });
|
|
55
|
-
setPendingAutoStart(projectB, { basePath: projectB, milestoneId: "M002-bbb222" });
|
|
56
|
-
|
|
57
|
-
// Clear only projectA
|
|
58
|
-
clearPendingAutoStart(projectA);
|
|
59
|
-
|
|
60
|
-
assert.equal(getDiscussionMilestoneId(projectA), null, "projectA should be cleared");
|
|
61
|
-
assert.equal(getDiscussionMilestoneId(projectB), "M002-bbb222", "projectB should survive");
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
describe("#2985 Bug 4 — getDiscussionMilestoneId must be keyed by basePath", () => {
|
|
66
|
-
beforeEach(() => {
|
|
67
|
-
clearPendingAutoStart();
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
test("getDiscussionMilestoneId(basePath) returns correct milestone for each project", () => {
|
|
71
|
-
setPendingAutoStart("/proj/a", { basePath: "/proj/a", milestoneId: "M001" });
|
|
72
|
-
setPendingAutoStart("/proj/b", { basePath: "/proj/b", milestoneId: "M002" });
|
|
73
|
-
|
|
74
|
-
assert.equal(getDiscussionMilestoneId("/proj/a"), "M001");
|
|
75
|
-
assert.equal(getDiscussionMilestoneId("/proj/b"), "M002");
|
|
76
|
-
assert.equal(getDiscussionMilestoneId("/proj/unknown"), null);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
test("getDiscussionMilestoneId() without basePath returns null when multiple sessions exist", () => {
|
|
80
|
-
setPendingAutoStart("/proj/a", { basePath: "/proj/a", milestoneId: "M001" });
|
|
81
|
-
setPendingAutoStart("/proj/b", { basePath: "/proj/b", milestoneId: "M002" });
|
|
82
|
-
|
|
83
|
-
// Without a key, the function should not blindly return the first entry
|
|
84
|
-
const result = getDiscussionMilestoneId();
|
|
85
|
-
// When there's ambiguity (multiple sessions), it should return null
|
|
86
|
-
// to force callers to be explicit
|
|
87
|
-
assert.equal(result, null, "should not return arbitrary milestone when multiple sessions exist");
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
test("getDiscussionMilestoneId() without basePath returns the milestone when only one session", () => {
|
|
91
|
-
setPendingAutoStart("/proj/a", { basePath: "/proj/a", milestoneId: "M001" });
|
|
92
|
-
|
|
93
|
-
// With only one session, backward compat — return it
|
|
94
|
-
const result = getDiscussionMilestoneId();
|
|
95
|
-
assert.equal(result, "M001", "should return the only active milestone for backward compat");
|
|
96
|
-
});
|
|
97
|
-
});
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import { describe, it } from "node:test";
|
|
2
|
-
import assert from "node:assert/strict";
|
|
3
|
-
import { readFileSync } from "node:fs";
|
|
4
|
-
import { join, dirname } from "node:path";
|
|
5
|
-
import { fileURLToPath } from "node:url";
|
|
6
|
-
|
|
7
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
|
-
const gsdDir = join(__dirname, "..");
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Regression tests for #2826: hook/* completed-unit keys were parsed
|
|
12
|
-
* incorrectly by forensics + doctor, causing false-positive missing-artifact
|
|
13
|
-
* errors for all hook units.
|
|
14
|
-
*
|
|
15
|
-
* The root cause: `key.indexOf("/")` splits "hook/telegram-progress/M007/S01"
|
|
16
|
-
* into unitType="hook" + unitId="telegram-progress/M007/S01" instead of
|
|
17
|
-
* unitType="hook/telegram-progress" + unitId="M007/S01".
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
describe("splitCompletedKey (#2826)", () => {
|
|
21
|
-
it("is exported from forensics.ts", () => {
|
|
22
|
-
const source = readFileSync(join(gsdDir, "forensics.ts"), "utf-8");
|
|
23
|
-
assert.ok(
|
|
24
|
-
source.includes("export function splitCompletedKey"),
|
|
25
|
-
"forensics.ts must export splitCompletedKey helper",
|
|
26
|
-
);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it("splits simple unit types correctly", async () => {
|
|
30
|
-
const { splitCompletedKey } = await import("../forensics.ts");
|
|
31
|
-
const result = splitCompletedKey("execute-task/M007/S01/T01");
|
|
32
|
-
assert.deepStrictEqual(result, {
|
|
33
|
-
unitType: "execute-task",
|
|
34
|
-
unitId: "M007/S01/T01",
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it("splits hook unit types preserving the compound hook/<hookName> prefix", async () => {
|
|
39
|
-
const { splitCompletedKey } = await import("../forensics.ts");
|
|
40
|
-
const result = splitCompletedKey("hook/telegram-progress/M007/S01");
|
|
41
|
-
assert.deepStrictEqual(result, {
|
|
42
|
-
unitType: "hook/telegram-progress",
|
|
43
|
-
unitId: "M007/S01",
|
|
44
|
-
});
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
it("splits hook unit types with task-level unitId", async () => {
|
|
48
|
-
const { splitCompletedKey } = await import("../forensics.ts");
|
|
49
|
-
const result = splitCompletedKey("hook/telegram-progress/M007/S02/T01");
|
|
50
|
-
assert.deepStrictEqual(result, {
|
|
51
|
-
unitType: "hook/telegram-progress",
|
|
52
|
-
unitId: "M007/S02/T01",
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
it("returns null for malformed keys without a slash", async () => {
|
|
57
|
-
const { splitCompletedKey } = await import("../forensics.ts");
|
|
58
|
-
assert.strictEqual(splitCompletedKey("noslash"), null);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it("returns null for malformed hook keys with only 'hook/' and no more segments", async () => {
|
|
62
|
-
const { splitCompletedKey } = await import("../forensics.ts");
|
|
63
|
-
// "hook/someName" has no unitId segment after the hook name
|
|
64
|
-
assert.strictEqual(splitCompletedKey("hook/someName"), null);
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
describe("forensics detectMissingArtifacts uses splitCompletedKey (#2826)", () => {
|
|
69
|
-
it("does not use indexOf for key splitting", () => {
|
|
70
|
-
const source = readFileSync(join(gsdDir, "forensics.ts"), "utf-8");
|
|
71
|
-
// Extract only the detectMissingArtifacts function body
|
|
72
|
-
const fnStart = source.indexOf("function detectMissingArtifacts");
|
|
73
|
-
assert.ok(fnStart !== -1, "detectMissingArtifacts must exist");
|
|
74
|
-
const fnBody = source.slice(fnStart, source.indexOf("\n}\n", fnStart) + 3);
|
|
75
|
-
|
|
76
|
-
assert.ok(
|
|
77
|
-
!fnBody.includes('key.indexOf("/")'),
|
|
78
|
-
"detectMissingArtifacts must not use key.indexOf('/') — use splitCompletedKey instead",
|
|
79
|
-
);
|
|
80
|
-
assert.ok(
|
|
81
|
-
fnBody.includes("splitCompletedKey"),
|
|
82
|
-
"detectMissingArtifacts must use splitCompletedKey helper",
|
|
83
|
-
);
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
describe("doctor-runtime-checks uses splitCompletedKey (#2826)", () => {
|
|
88
|
-
it("does not use indexOf for key splitting in orphaned-key check", () => {
|
|
89
|
-
const source = readFileSync(
|
|
90
|
-
join(gsdDir, "doctor-runtime-checks.ts"),
|
|
91
|
-
"utf-8",
|
|
92
|
-
);
|
|
93
|
-
// Find the orphaned completed-units section
|
|
94
|
-
const sectionStart = source.indexOf("Orphaned completed-units");
|
|
95
|
-
assert.ok(sectionStart !== -1, "orphaned completed-units section must exist");
|
|
96
|
-
const sectionBody = source.slice(sectionStart, source.indexOf("} catch", sectionStart));
|
|
97
|
-
|
|
98
|
-
assert.ok(
|
|
99
|
-
!sectionBody.includes('key.indexOf("/")'),
|
|
100
|
-
"doctor orphaned-key check must not use key.indexOf('/') — use splitCompletedKey instead",
|
|
101
|
-
);
|
|
102
|
-
assert.ok(
|
|
103
|
-
sectionBody.includes("splitCompletedKey"),
|
|
104
|
-
"doctor orphaned-key check must use splitCompletedKey helper",
|
|
105
|
-
);
|
|
106
|
-
});
|
|
107
|
-
});
|
|
@@ -1,243 +0,0 @@
|
|
|
1
|
-
import { describe, test } from 'node:test';
|
|
2
|
-
import assert from 'node:assert/strict';
|
|
3
|
-
import { mkdtempSync, mkdirSync, rmSync, writeFileSync, existsSync, readdirSync } from "node:fs";
|
|
4
|
-
import { join } from "node:path";
|
|
5
|
-
import { tmpdir } from "node:os";
|
|
6
|
-
|
|
7
|
-
import { runGSDDoctor } from "../../doctor.js";
|
|
8
|
-
import { parsePlan } from "../../parsers-legacy.js";
|
|
9
|
-
|
|
10
|
-
// ── Helpers ─────────────────────────────────────────────────────────────────
|
|
11
|
-
|
|
12
|
-
function makeBase(): { base: string; gsd: string; mDir: string } {
|
|
13
|
-
const base = mkdtempSync(join(tmpdir(), "gsd-doctor-fp-"));
|
|
14
|
-
const gsd = join(base, ".gsd");
|
|
15
|
-
const mDir = join(gsd, "milestones", "M001");
|
|
16
|
-
mkdirSync(join(mDir, "slices"), { recursive: true });
|
|
17
|
-
return { base, gsd, mDir };
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
function writeRoadmap(mDir: string, content: string): void {
|
|
21
|
-
writeFileSync(join(mDir, "M001-ROADMAP.md"), content);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function writeSlice(mDir: string, sliceId: string, planContent: string): string {
|
|
25
|
-
const sDir = join(mDir, "slices", sliceId);
|
|
26
|
-
const tDir = join(sDir, "tasks");
|
|
27
|
-
mkdirSync(tDir, { recursive: true });
|
|
28
|
-
writeFileSync(join(sDir, `${sliceId}-PLAN.md`), planContent);
|
|
29
|
-
return sDir;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
describe('doctor false-positives (#3105)', async () => {
|
|
33
|
-
|
|
34
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
35
|
-
// Bug 1: Orphaned worktree directory recreated by appendDoctorHistory
|
|
36
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
37
|
-
|
|
38
|
-
test('Bug 1: orphaned worktree check ignores dirs containing only .gsd/doctor-history.jsonl', async () => {
|
|
39
|
-
// Simulate: a worktree dir that only contains .gsd/doctor-history.jsonl
|
|
40
|
-
// (created by appendDoctorHistory writing to the worktree-scoped path).
|
|
41
|
-
// The orphan check should NOT warn about this directory.
|
|
42
|
-
const { base, gsd } = makeBase();
|
|
43
|
-
writeRoadmap(join(gsd, "milestones", "M001"), `# M001: Test\n\n## Slices\n- [ ] **S01: Slice** \`risk:low\` \`depends:[]\`\n > After this: done\n`);
|
|
44
|
-
writeSlice(join(gsd, "milestones", "M001"), "S01", "# S01: Slice\n\n**Goal:** G\n**Demo:** D\n\n## Tasks\n- [ ] **T01: Task** `est:10m`\n Pending.\n");
|
|
45
|
-
|
|
46
|
-
// Create a worktree directory that only has .gsd/doctor-history.jsonl
|
|
47
|
-
const wtDir = join(gsd, "worktrees", "M042");
|
|
48
|
-
const wtGsdDir = join(wtDir, ".gsd");
|
|
49
|
-
mkdirSync(wtGsdDir, { recursive: true });
|
|
50
|
-
writeFileSync(join(wtGsdDir, "doctor-history.jsonl"), '{"ts":"2026-01-01","ok":true}\n');
|
|
51
|
-
|
|
52
|
-
const result = await runGSDDoctor(base, { fix: false });
|
|
53
|
-
|
|
54
|
-
// Should NOT produce worktree_directory_orphaned for a dir that only has doctor history
|
|
55
|
-
const orphanIssues = result.issues.filter(
|
|
56
|
-
i => i.code === "worktree_directory_orphaned" && i.unitId === "M042"
|
|
57
|
-
);
|
|
58
|
-
assert.equal(orphanIssues.length, 0,
|
|
59
|
-
"should not warn about worktree dir that only contains .gsd/doctor-history.jsonl");
|
|
60
|
-
|
|
61
|
-
rmSync(base, { recursive: true, force: true });
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
65
|
-
// Bug 2: blocker_discovered + all tasks done = unfixable deadlock
|
|
66
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
67
|
-
|
|
68
|
-
test('Bug 2: blocker_discovered with all tasks done should not warn (implicitly resolved)', async () => {
|
|
69
|
-
// Scenario: blocker was discovered and resolved within the same task.
|
|
70
|
-
// blocker_discovered: true, no REPLAN, but all tasks are done.
|
|
71
|
-
// Neither blocker_discovered_no_replan nor stale_replan_file should fire.
|
|
72
|
-
const { base, mDir } = makeBase();
|
|
73
|
-
writeRoadmap(mDir, `# M001: Blocker Test\n\n## Slices\n- [ ] **S01: Slice** \`risk:low\` \`depends:[]\`\n > After this: done\n`);
|
|
74
|
-
const sDir = writeSlice(mDir, "S01",
|
|
75
|
-
"# S01: Slice\n\n**Goal:** G\n**Demo:** D\n\n## Tasks\n- [x] **T01: Task** `est:10m`\n Done.\n");
|
|
76
|
-
writeFileSync(join(sDir, "tasks", "T01-SUMMARY.md"), `---
|
|
77
|
-
id: T01
|
|
78
|
-
parent: S01
|
|
79
|
-
milestone: M001
|
|
80
|
-
provides: []
|
|
81
|
-
requires: []
|
|
82
|
-
affects: []
|
|
83
|
-
key_files: []
|
|
84
|
-
key_decisions: []
|
|
85
|
-
patterns_established: []
|
|
86
|
-
observability_surfaces: []
|
|
87
|
-
drill_down_paths: []
|
|
88
|
-
duration: 10m
|
|
89
|
-
verification_result: passed
|
|
90
|
-
completed_at: 2026-01-01T00:00:00Z
|
|
91
|
-
blocker_discovered: true
|
|
92
|
-
---
|
|
93
|
-
|
|
94
|
-
# T01: Task
|
|
95
|
-
|
|
96
|
-
**Done**
|
|
97
|
-
|
|
98
|
-
## What Happened
|
|
99
|
-
Found a blocker, resolved it in-task.
|
|
100
|
-
|
|
101
|
-
## Diagnostics
|
|
102
|
-
- log
|
|
103
|
-
`);
|
|
104
|
-
|
|
105
|
-
const result = await runGSDDoctor(base, { fix: false });
|
|
106
|
-
|
|
107
|
-
// Should NOT produce blocker_discovered_no_replan when all tasks are done
|
|
108
|
-
const blockerIssues = result.issues.filter(i => i.code === "blocker_discovered_no_replan");
|
|
109
|
-
assert.equal(blockerIssues.length, 0,
|
|
110
|
-
"should not warn about blocker_discovered when all tasks are done (blocker was implicitly resolved)");
|
|
111
|
-
|
|
112
|
-
// Also should NOT produce stale_replan_file (no REPLAN exists, so this shouldn't fire anyway)
|
|
113
|
-
const staleReplanIssues = result.issues.filter(i => i.code === "stale_replan_file");
|
|
114
|
-
assert.equal(staleReplanIssues.length, 0,
|
|
115
|
-
"should not produce stale_replan_file when no REPLAN exists");
|
|
116
|
-
|
|
117
|
-
rmSync(base, { recursive: true, force: true });
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
test('Bug 2: blocker_discovered with incomplete tasks should still warn', async () => {
|
|
121
|
-
// Sanity check: when there IS an incomplete task and blocker_discovered, warn as before.
|
|
122
|
-
const { base, mDir } = makeBase();
|
|
123
|
-
writeRoadmap(mDir, `# M001: Blocker Warn Test\n\n## Slices\n- [ ] **S01: Slice** \`risk:low\` \`depends:[]\`\n > After this: done\n`);
|
|
124
|
-
const sDir = writeSlice(mDir, "S01",
|
|
125
|
-
"# S01: Slice\n\n**Goal:** G\n**Demo:** D\n\n## Tasks\n- [x] **T01: Task A** `est:10m`\n Done.\n- [ ] **T02: Task B** `est:10m`\n Pending.\n");
|
|
126
|
-
writeFileSync(join(sDir, "tasks", "T01-SUMMARY.md"), `---
|
|
127
|
-
id: T01
|
|
128
|
-
parent: S01
|
|
129
|
-
milestone: M001
|
|
130
|
-
provides: []
|
|
131
|
-
requires: []
|
|
132
|
-
affects: []
|
|
133
|
-
key_files: []
|
|
134
|
-
key_decisions: []
|
|
135
|
-
patterns_established: []
|
|
136
|
-
observability_surfaces: []
|
|
137
|
-
drill_down_paths: []
|
|
138
|
-
duration: 10m
|
|
139
|
-
verification_result: passed
|
|
140
|
-
completed_at: 2026-01-01T00:00:00Z
|
|
141
|
-
blocker_discovered: true
|
|
142
|
-
---
|
|
143
|
-
|
|
144
|
-
# T01: Task A
|
|
145
|
-
|
|
146
|
-
**Done**
|
|
147
|
-
|
|
148
|
-
## What Happened
|
|
149
|
-
Found blocker, but T02 is still pending.
|
|
150
|
-
|
|
151
|
-
## Diagnostics
|
|
152
|
-
- log
|
|
153
|
-
`);
|
|
154
|
-
|
|
155
|
-
const result = await runGSDDoctor(base, { fix: false });
|
|
156
|
-
|
|
157
|
-
const blockerIssues = result.issues.filter(i => i.code === "blocker_discovered_no_replan");
|
|
158
|
-
assert.ok(blockerIssues.length > 0,
|
|
159
|
-
"should still warn about blocker_discovered when some tasks are not done");
|
|
160
|
-
|
|
161
|
-
rmSync(base, { recursive: true, force: true });
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
165
|
-
// Bug 3: Multi-task plan — T02+ outside ## Tasks section
|
|
166
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
167
|
-
|
|
168
|
-
test('Bug 3: parsePlan finds all tasks even when interleaved with detail sections', () => {
|
|
169
|
-
// Multi-task plan where T02 checkbox appears after T01's ## Steps heading,
|
|
170
|
-
// which ends the ## Tasks section for extractSection().
|
|
171
|
-
const planContent = `# S01: Demo Slice
|
|
172
|
-
|
|
173
|
-
**Goal:** Build the demo
|
|
174
|
-
**Demo:** Run it
|
|
175
|
-
|
|
176
|
-
## Must-Haves
|
|
177
|
-
- Feature A
|
|
178
|
-
|
|
179
|
-
## Tasks
|
|
180
|
-
- [x] **T01: First task** \`est:30m\`
|
|
181
|
-
Implement the first thing.
|
|
182
|
-
## Steps
|
|
183
|
-
1. Step one
|
|
184
|
-
2. Step two
|
|
185
|
-
## Must-Haves
|
|
186
|
-
- Requirement A
|
|
187
|
-
- [x] **T02: Second task** \`est:1h\`
|
|
188
|
-
Implement the second thing.
|
|
189
|
-
## Steps
|
|
190
|
-
1. Step one
|
|
191
|
-
2. Step two
|
|
192
|
-
`;
|
|
193
|
-
|
|
194
|
-
const plan = parsePlan(planContent);
|
|
195
|
-
const taskIds = plan.tasks.map(t => t.id);
|
|
196
|
-
|
|
197
|
-
assert.ok(taskIds.includes("T01"), "should find T01");
|
|
198
|
-
assert.ok(taskIds.includes("T02"), "should find T02 even when after T01 detail headings");
|
|
199
|
-
assert.equal(plan.tasks.length, 2, "should find exactly 2 tasks");
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
test('Bug 3: task_file_not_in_plan should not fire for T02 in multi-task plan', async () => {
|
|
203
|
-
const { base, mDir } = makeBase();
|
|
204
|
-
writeRoadmap(mDir, `# M001: Multi-Task Test\n\n## Slices\n- [ ] **S01: Slice** \`risk:low\` \`depends:[]\`\n > After this: done\n`);
|
|
205
|
-
|
|
206
|
-
// Plan with interleaved headings (the problematic format)
|
|
207
|
-
const sDir = writeSlice(mDir, "S01", `# S01: Demo Slice
|
|
208
|
-
|
|
209
|
-
**Goal:** Build the demo
|
|
210
|
-
**Demo:** Run it
|
|
211
|
-
|
|
212
|
-
## Must-Haves
|
|
213
|
-
- Feature A
|
|
214
|
-
|
|
215
|
-
## Tasks
|
|
216
|
-
- [x] **T01: First task** \`est:30m\`
|
|
217
|
-
Implement the first thing.
|
|
218
|
-
## Steps
|
|
219
|
-
1. Step one
|
|
220
|
-
## Must-Haves
|
|
221
|
-
- Req A
|
|
222
|
-
- [x] **T02: Second task** \`est:1h\`
|
|
223
|
-
Implement the second thing.
|
|
224
|
-
## Steps
|
|
225
|
-
1. Step one
|
|
226
|
-
`);
|
|
227
|
-
|
|
228
|
-
// Both tasks have summaries on disk
|
|
229
|
-
writeFileSync(join(sDir, "tasks", "T01-SUMMARY.md"), "---\nstatus: done\ncompleted_at: 2026-01-01T00:00:00Z\n---\n# T01\nDone.\n");
|
|
230
|
-
writeFileSync(join(sDir, "tasks", "T02-SUMMARY.md"), "---\nstatus: done\ncompleted_at: 2026-01-01T00:00:00Z\n---\n# T02\nDone.\n");
|
|
231
|
-
|
|
232
|
-
const result = await runGSDDoctor(base, { fix: false });
|
|
233
|
-
|
|
234
|
-
// T02 should NOT be flagged as "not in plan"
|
|
235
|
-
const notInPlan = result.issues.filter(
|
|
236
|
-
i => i.code === "task_file_not_in_plan" && i.message.includes("T02")
|
|
237
|
-
);
|
|
238
|
-
assert.equal(notInPlan.length, 0,
|
|
239
|
-
"should not report T02 as 'not in plan' when it exists in the interleaved plan format");
|
|
240
|
-
|
|
241
|
-
rmSync(base, { recursive: true, force: true });
|
|
242
|
-
});
|
|
243
|
-
});
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* gitignore-staging-2570.test.ts — Regression tests for #2570.
|
|
3
|
-
*
|
|
4
|
-
* Verifies that:
|
|
5
|
-
* 1. isGsdGitignored() detects when .gsd is covered by .gitignore
|
|
6
|
-
* 2. The rethink prompt uses {{commitInstruction}} instead of hardcoded git add .gsd/
|
|
7
|
-
* 3. rethink.ts passes the correct commitInstruction based on gitignore state
|
|
8
|
-
*
|
|
9
|
-
* Uses real temporary git repos — no mocks.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import test from "node:test";
|
|
13
|
-
import assert from "node:assert/strict";
|
|
14
|
-
import { execFileSync } from "node:child_process";
|
|
15
|
-
import {
|
|
16
|
-
mkdirSync,
|
|
17
|
-
mkdtempSync,
|
|
18
|
-
readFileSync,
|
|
19
|
-
rmSync,
|
|
20
|
-
writeFileSync,
|
|
21
|
-
} from "node:fs";
|
|
22
|
-
import { join } from "node:path";
|
|
23
|
-
import { tmpdir } from "node:os";
|
|
24
|
-
|
|
25
|
-
// Dynamic import — isGsdGitignored is the function under test (may not exist yet during TDD red phase)
|
|
26
|
-
const { isGsdGitignored } = await import("../../gitignore.ts");
|
|
27
|
-
|
|
28
|
-
// ─── Helpers ─────────────────────────────────────────────────────────
|
|
29
|
-
|
|
30
|
-
function git(dir: string, ...args: string[]): string {
|
|
31
|
-
return execFileSync("git", args, { cwd: dir, stdio: "pipe", encoding: "utf-8" }).trim();
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
function makeTempRepo(): string {
|
|
35
|
-
const dir = mkdtempSync(join(tmpdir(), "gsd-staging-2570-"));
|
|
36
|
-
git(dir, "init");
|
|
37
|
-
git(dir, "config", "user.email", "test@test.com");
|
|
38
|
-
git(dir, "config", "user.name", "Test");
|
|
39
|
-
writeFileSync(join(dir, "README.md"), "# init\n");
|
|
40
|
-
git(dir, "add", "-A");
|
|
41
|
-
git(dir, "commit", "-m", "init");
|
|
42
|
-
git(dir, "branch", "-M", "main");
|
|
43
|
-
return dir;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
function cleanup(dir: string): void {
|
|
47
|
-
try {
|
|
48
|
-
rmSync(dir, { recursive: true, force: true });
|
|
49
|
-
} catch {
|
|
50
|
-
// ignore
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// ─── isGsdGitignored ─────────────────────────────────────────────────
|
|
55
|
-
|
|
56
|
-
test("isGsdGitignored returns true when .gsd is in .gitignore (#2570)", (t) => {
|
|
57
|
-
const dir = makeTempRepo();
|
|
58
|
-
t.after(() => { cleanup(dir); });
|
|
59
|
-
|
|
60
|
-
writeFileSync(join(dir, ".gitignore"), ".gsd\n");
|
|
61
|
-
assert.equal(isGsdGitignored(dir), true);
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
test("isGsdGitignored returns true when .gsd/ (with slash) is in .gitignore", (t) => {
|
|
65
|
-
const dir = makeTempRepo();
|
|
66
|
-
t.after(() => { cleanup(dir); });
|
|
67
|
-
|
|
68
|
-
writeFileSync(join(dir, ".gitignore"), ".gsd/\n");
|
|
69
|
-
// Create .gsd directory so git check-ignore can match the directory-only pattern
|
|
70
|
-
mkdirSync(join(dir, ".gsd"), { recursive: true });
|
|
71
|
-
assert.equal(isGsdGitignored(dir), true);
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
test("isGsdGitignored returns false when .gsd is NOT in .gitignore", (t) => {
|
|
75
|
-
const dir = makeTempRepo();
|
|
76
|
-
t.after(() => { cleanup(dir); });
|
|
77
|
-
|
|
78
|
-
writeFileSync(join(dir, ".gitignore"), "node_modules/\n");
|
|
79
|
-
assert.equal(isGsdGitignored(dir), false);
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
test("isGsdGitignored returns false when no .gitignore exists", (t) => {
|
|
83
|
-
const dir = makeTempRepo();
|
|
84
|
-
t.after(() => { cleanup(dir); });
|
|
85
|
-
|
|
86
|
-
// No .gitignore — default
|
|
87
|
-
assert.equal(isGsdGitignored(dir), false);
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
// ─── rethink.md prompt template ─────────────────────────────────────
|
|
91
|
-
|
|
92
|
-
test("rethink.md prompt uses {{commitInstruction}} not hardcoded git add .gsd/ (#2570)", () => {
|
|
93
|
-
const promptPath = join(
|
|
94
|
-
import.meta.dirname!,
|
|
95
|
-
"..",
|
|
96
|
-
"..",
|
|
97
|
-
"prompts",
|
|
98
|
-
"rethink.md",
|
|
99
|
-
);
|
|
100
|
-
const content = readFileSync(promptPath, "utf-8");
|
|
101
|
-
|
|
102
|
-
// Must NOT contain hardcoded `git add .gsd/`
|
|
103
|
-
assert.ok(
|
|
104
|
-
!content.includes("git add .gsd/"),
|
|
105
|
-
`rethink.md must not contain hardcoded "git add .gsd/" — use {{commitInstruction}} instead.\nFound: ${content.match(/.*git add .gsd\/.*/)?.[0]}`,
|
|
106
|
-
);
|
|
107
|
-
|
|
108
|
-
// Must contain the {{commitInstruction}} placeholder
|
|
109
|
-
assert.ok(
|
|
110
|
-
content.includes("{{commitInstruction}}"),
|
|
111
|
-
"rethink.md must use {{commitInstruction}} template variable for commit step",
|
|
112
|
-
);
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
// ─── smartStage respects .gitignore for .gsd/ (#2570) ───────────────
|
|
116
|
-
|
|
117
|
-
test("smartStage does not stage .gsd/ files when .gsd is gitignored (#2570)", async (t) => {
|
|
118
|
-
// This imports GitServiceImpl to test through the public commit() method
|
|
119
|
-
// which calls smartStage() internally.
|
|
120
|
-
const { GitServiceImpl } = await import("../../git-service.ts");
|
|
121
|
-
|
|
122
|
-
const dir = makeTempRepo();
|
|
123
|
-
t.after(() => { cleanup(dir); });
|
|
124
|
-
|
|
125
|
-
// Add .gsd to .gitignore
|
|
126
|
-
writeFileSync(join(dir, ".gitignore"), ".gsd\nnode_modules/\n");
|
|
127
|
-
git(dir, "add", ".gitignore");
|
|
128
|
-
git(dir, "commit", "-m", "add gitignore with .gsd");
|
|
129
|
-
|
|
130
|
-
// Create .gsd/ milestone artifacts (NOT tracked, NOT symlinked)
|
|
131
|
-
mkdirSync(join(dir, ".gsd", "milestones", "M001", "slices", "S01"), { recursive: true });
|
|
132
|
-
writeFileSync(join(dir, ".gsd", "milestones", "M001", "slices", "S01", "S01-PLAN.md"), "# Plan");
|
|
133
|
-
writeFileSync(join(dir, ".gsd", "DECISIONS.md"), "# Decisions");
|
|
134
|
-
|
|
135
|
-
// Create a normal source file
|
|
136
|
-
writeFileSync(join(dir, "src.ts"), "export const x = 1;");
|
|
137
|
-
|
|
138
|
-
// Commit through GitServiceImpl (uses smartStage internally)
|
|
139
|
-
const svc = new GitServiceImpl(dir);
|
|
140
|
-
const msg = svc.commit({ message: "test: should not include .gsd files" });
|
|
141
|
-
assert.ok(msg !== null, "commit should succeed");
|
|
142
|
-
|
|
143
|
-
// Check what was committed
|
|
144
|
-
const committed = git(dir, "show", "--name-only", "HEAD");
|
|
145
|
-
assert.ok(committed.includes("src.ts"), "source files ARE committed");
|
|
146
|
-
assert.ok(
|
|
147
|
-
!committed.includes(".gsd/"),
|
|
148
|
-
`gitignored .gsd/ files must NOT be staged by smartStage.\nCommitted files: ${committed}`,
|
|
149
|
-
);
|
|
150
|
-
});
|