gsd-pi 2.57.0 → 2.58.0-dev.778d6ac
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 +49 -35
- package/dist/headless-ui.d.ts +17 -0
- package/dist/headless-ui.js +97 -3
- package/dist/headless.js +67 -6
- package/dist/help-text.js +1 -0
- package/dist/onboarding.js +44 -0
- package/dist/resource-loader.js +16 -1
- package/dist/resources/agents/researcher.md +1 -1
- package/dist/resources/extensions/ask-user-questions.js +16 -3
- 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 +14 -6
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +59 -36
- package/dist/resources/extensions/context7/extension-manifest.json +1 -1
- package/dist/resources/extensions/get-secrets-from-user.js +8 -5
- package/dist/resources/extensions/google-search/extension-manifest.json +1 -1
- package/dist/resources/extensions/google-search/index.js +2 -1
- package/dist/resources/extensions/gsd/auto/infra-errors.js +4 -0
- package/dist/resources/extensions/gsd/auto/phases.js +25 -21
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +2 -2
- package/dist/resources/extensions/gsd/auto-dashboard.js +37 -20
- package/dist/resources/extensions/gsd/auto-dispatch.js +20 -5
- package/dist/resources/extensions/gsd/auto-model-selection.js +26 -3
- package/dist/resources/extensions/gsd/auto-post-unit.js +16 -4
- package/dist/resources/extensions/gsd/auto-prompts.js +1 -1
- package/dist/resources/extensions/gsd/auto-recovery.js +13 -5
- package/dist/resources/extensions/gsd/auto-start.js +35 -22
- package/dist/resources/extensions/gsd/auto-worktree.js +203 -14
- package/dist/resources/extensions/gsd/auto.js +4 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +32 -0
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +82 -9
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +33 -18
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +44 -11
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +67 -0
- package/dist/resources/extensions/gsd/captures.js +56 -4
- package/dist/resources/extensions/gsd/db-writer.js +116 -8
- package/dist/resources/extensions/gsd/dispatch-guard.js +11 -1
- package/dist/resources/extensions/gsd/doctor-git-checks.js +28 -0
- package/dist/resources/extensions/gsd/doctor-providers.js +2 -1
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +5 -4
- package/dist/resources/extensions/gsd/doctor.js +3 -1
- package/dist/resources/extensions/gsd/error-classifier.js +13 -10
- package/dist/resources/extensions/gsd/extension-manifest.json +16 -1
- package/dist/resources/extensions/gsd/forensics.js +123 -20
- package/dist/resources/extensions/gsd/git-service.js +23 -1
- package/dist/resources/extensions/gsd/gitignore.js +33 -0
- package/dist/resources/extensions/gsd/gsd-db.js +44 -10
- package/dist/resources/extensions/gsd/guided-flow.js +106 -44
- package/dist/resources/extensions/gsd/health-widget-core.js +31 -0
- package/dist/resources/extensions/gsd/health-widget.js +17 -0
- package/dist/resources/extensions/gsd/index.js +1 -1
- package/dist/resources/extensions/gsd/memory-extractor.js +7 -0
- package/dist/resources/extensions/gsd/migrate-external.js +8 -1
- package/dist/resources/extensions/gsd/milestone-validation-gates.js +45 -0
- package/dist/resources/extensions/gsd/model-cost-table.js +18 -0
- package/dist/resources/extensions/gsd/model-router.js +35 -1
- package/dist/resources/extensions/gsd/native-git-bridge.js +17 -0
- package/dist/resources/extensions/gsd/notifications.js +16 -1
- package/dist/resources/extensions/gsd/parallel-eligibility.js +13 -2
- package/dist/resources/extensions/gsd/parallel-merge.js +78 -5
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +23 -6
- package/dist/resources/extensions/gsd/parsers-legacy.js +20 -3
- package/dist/resources/extensions/gsd/paths.js +43 -0
- package/dist/resources/extensions/gsd/preferences-models.js +14 -1
- package/dist/resources/extensions/gsd/preferences-types.js +2 -1
- package/dist/resources/extensions/gsd/preferences.js +42 -31
- package/dist/resources/extensions/gsd/prompt-loader.js +4 -1
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -2
- 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 +3 -1
- 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 +2 -0
- package/dist/resources/extensions/gsd/prompts/rethink.md +1 -1
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -0
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
- package/dist/resources/extensions/gsd/repo-identity.js +205 -11
- package/dist/resources/extensions/gsd/rethink.js +5 -0
- package/dist/resources/extensions/gsd/roadmap-slices.js +5 -4
- package/dist/resources/extensions/gsd/state.js +85 -27
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +20 -1
- package/dist/resources/extensions/gsd/tools/complete-task.js +34 -71
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +12 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +29 -1
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +18 -3
- package/dist/resources/extensions/gsd/triage-resolution.js +22 -7
- package/dist/resources/extensions/gsd/undo.js +2 -2
- package/dist/resources/extensions/gsd/unit-ownership.js +164 -33
- package/dist/resources/extensions/gsd/verdict-parser.js +20 -8
- package/dist/resources/extensions/gsd/workflow-manifest.js +24 -5
- package/dist/resources/extensions/gsd/workflow-projections.js +95 -63
- package/dist/resources/extensions/gsd/workflow-reconcile.js +35 -5
- package/dist/resources/extensions/gsd/workspace-index.js +24 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +105 -1
- package/dist/resources/extensions/gsd/worktree-resolver.js +20 -3
- package/dist/resources/extensions/mcp-client/index.js +11 -7
- package/dist/resources/extensions/ollama/index.js +112 -0
- package/dist/resources/extensions/ollama/model-capabilities.js +115 -0
- package/dist/resources/extensions/ollama/ollama-client.js +168 -0
- package/dist/resources/extensions/ollama/ollama-commands.js +194 -0
- package/dist/resources/extensions/ollama/ollama-discovery.js +69 -0
- package/dist/resources/extensions/ollama/ollama-tool.js +184 -0
- package/dist/resources/extensions/ollama/types.js +2 -0
- package/dist/resources/extensions/search-the-web/extension-manifest.json +1 -1
- package/dist/resources/extensions/shared/interview-ui.js +11 -1
- package/dist/resources/skills/create-gsd-extension/SKILL.md +5 -3
- package/dist/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +5 -4
- 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 +5 -3
- package/dist/startup-model-validation.d.ts +39 -0
- package/dist/startup-model-validation.js +50 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- 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.js +2 -2
- 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 +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
- 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 +4 -4
- 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.js +1 -1
- 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.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.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.js +2 -2
- 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.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.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.js +2 -2
- 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.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.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.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.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.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.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.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.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.js +2 -2
- 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.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.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.js +2 -2
- 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.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.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.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.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.js +2 -2
- 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.js +2 -2
- 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.js +2 -2
- 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.js +4 -4
- 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.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 +5 -5
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
- 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 +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page.js +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 +12 -12
- package/dist/web/standalone/.next/server/chunks/2229.js +2 -2
- package/dist/web/standalone/.next/server/chunks/7471.js +3 -3
- 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/middleware.js +2 -2
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +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.7593d7797a4b3999.js +9 -0
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-0c485498795110d6.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-4332cbd5dd1be584.js → webpack-a1c1e452c6b32d04.js} +1 -1
- package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/dist/web-mode.js +2 -1
- package/package.json +2 -2
- package/packages/daemon/src/cli.ts +49 -0
- package/packages/daemon/src/daemon.test.ts +104 -1
- package/packages/daemon/src/daemon.ts +24 -1
- package/packages/daemon/src/discord-bot.ts +73 -3
- package/packages/daemon/src/event-bridge.ts +15 -9
- package/packages/daemon/src/event-formatter.ts +30 -2
- package/packages/daemon/src/index.ts +9 -0
- package/packages/daemon/src/launchd.test.ts +356 -0
- package/packages/daemon/src/launchd.ts +242 -0
- package/packages/daemon/src/message-batcher.test.ts +2 -2
- package/packages/daemon/src/message-batcher.ts +9 -3
- package/packages/daemon/src/orchestrator.test.ts +1 -0
- package/packages/daemon/src/orchestrator.ts +106 -2
- package/packages/native/dist/ast/index.js +9 -5
- package/packages/native/dist/ast/types.js +2 -1
- package/packages/native/dist/clipboard/index.js +12 -7
- package/packages/native/dist/clipboard/types.js +2 -1
- package/packages/native/dist/diff/index.js +12 -7
- package/packages/native/dist/diff/types.js +2 -1
- package/packages/native/dist/fd/index.js +6 -3
- package/packages/native/dist/fd/types.js +2 -1
- package/packages/native/dist/glob/index.js +9 -5
- package/packages/native/dist/glob/types.js +2 -1
- package/packages/native/dist/grep/index.js +9 -5
- package/packages/native/dist/grep/types.js +2 -1
- package/packages/native/dist/gsd-parser/index.js +18 -11
- package/packages/native/dist/gsd-parser/types.js +2 -1
- package/packages/native/dist/highlight/index.js +12 -7
- package/packages/native/dist/highlight/types.js +2 -1
- package/packages/native/dist/html/index.js +6 -3
- package/packages/native/dist/html/types.js +2 -1
- package/packages/native/dist/image/index.js +10 -5
- package/packages/native/dist/image/types.js +7 -4
- package/packages/native/dist/index.js +70 -17
- package/packages/native/dist/json-parse/index.js +13 -8
- package/packages/native/dist/native.js +47 -10
- package/packages/native/dist/ps/index.js +15 -9
- package/packages/native/dist/ps/types.js +2 -1
- package/packages/native/dist/stream-process/index.js +12 -7
- package/packages/native/dist/text/index.js +24 -14
- package/packages/native/dist/text/types.js +5 -2
- package/packages/native/dist/truncate/index.js +12 -7
- package/packages/native/dist/ttsr/index.js +12 -7
- package/packages/native/dist/ttsr/types.js +2 -1
- package/packages/native/dist/xxhash/index.js +9 -5
- package/packages/native/package.json +19 -19
- package/packages/native/src/__tests__/module-compat.test.mjs +91 -0
- package/packages/native/src/native.ts +9 -8
- package/packages/pi-agent-core/dist/agent-loop.js +3 -2
- 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.test.ts +45 -0
- package/packages/pi-agent-core/src/agent-loop.ts +3 -2
- package/packages/pi-agent-core/src/proxy.ts +1 -1
- package/packages/pi-ai/dist/env-api-keys.js +1 -0
- package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
- package/packages/pi-ai/dist/index.d.ts +1 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +1 -0
- 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 +19 -2
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js +25 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -0
- 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 +3 -0
- package/packages/pi-ai/dist/utils/json-parse.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/json-parse.js +24 -1
- package/packages/pi-ai/dist/utils/json-parse.js.map +1 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.d.ts +37 -0
- package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/repair-tool-json.js +75 -0
- package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -0
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts +2 -0
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +73 -0
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -0
- package/packages/pi-ai/src/env-api-keys.ts +1 -0
- package/packages/pi-ai/src/index.ts +1 -0
- package/packages/pi-ai/src/providers/anthropic-shared.test.ts +29 -0
- package/packages/pi-ai/src/providers/anthropic-shared.ts +17 -2
- package/packages/pi-ai/src/types.ts +3 -2
- package/packages/pi-ai/src/utils/json-parse.ts +28 -1
- package/packages/pi-ai/src/utils/repair-tool-json.ts +88 -0
- package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +102 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +4 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +31 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +17 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +62 -2
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts +6 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +176 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/exec.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/exec.js +3 -1
- package/packages/pi-coding-agent/dist/core/exec.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts +28 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js +37 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js +63 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts +19 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js +115 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js +109 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +4 -0
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js +2 -0
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +5 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +5 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts +44 -0
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js +97 -0
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js +181 -0
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js.map +1 -0
- 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 +3 -0
- 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 +3 -0
- 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 +31 -2
- package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/messages.test.d.ts +9 -0
- package/packages/pi-coding-agent/dist/core/messages.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/messages.test.js +86 -0
- package/packages/pi-coding-agent/dist/core/messages.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +10 -0
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +12 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +6 -0
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +48 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts +9 -0
- package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js +193 -0
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -0
- 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 +10 -3
- 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 +13 -4
- package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts +16 -0
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +80 -0
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -0
- 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 +4 -0
- 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 +1 -0
- 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 +5 -0
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +38 -1
- package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +236 -0
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +94 -1
- package/packages/pi-coding-agent/src/core/exec.ts +3 -1
- package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +77 -0
- package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +62 -0
- package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +134 -0
- package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +137 -0
- package/packages/pi-coding-agent/src/core/extensions/index.ts +4 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +5 -0
- package/packages/pi-coding-agent/src/core/image-overflow-recovery.test.ts +228 -0
- package/packages/pi-coding-agent/src/core/image-overflow-recovery.ts +118 -0
- package/packages/pi-coding-agent/src/core/index.ts +6 -0
- package/packages/pi-coding-agent/src/core/lsp/index.ts +3 -0
- package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +3 -0
- package/packages/pi-coding-agent/src/core/messages.test.ts +114 -0
- package/packages/pi-coding-agent/src/core/messages.ts +29 -2
- package/packages/pi-coding-agent/src/core/model-resolver.ts +1 -0
- package/packages/pi-coding-agent/src/core/resource-loader.ts +20 -1
- package/packages/pi-coding-agent/src/core/retry-handler.test.ts +255 -0
- package/packages/pi-coding-agent/src/core/retry-handler.ts +52 -1
- package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +11 -3
- package/packages/pi-coding-agent/src/core/tools/read.ts +14 -4
- package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +92 -0
- package/packages/pi-coding-agent/src/index.ts +6 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +7 -0
- package/packages/pi-coding-agent/src/modes/rpc/remote-terminal.ts +6 -0
- package/packages/pi-tui/dist/terminal.d.ts +2 -0
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +9 -0
- 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 +9 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/src/terminal.ts +14 -0
- package/packages/pi-tui/src/tui.ts +8 -0
- package/pkg/package.json +1 -1
- package/scripts/ensure-workspace-builds.cjs +45 -14
- package/src/resources/agents/researcher.md +1 -1
- package/src/resources/extensions/ask-user-questions.ts +21 -3
- 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 +13 -6
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +63 -35
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +28 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +108 -1
- package/src/resources/extensions/context7/extension-manifest.json +1 -1
- package/src/resources/extensions/get-secrets-from-user.ts +8 -5
- package/src/resources/extensions/google-search/extension-manifest.json +1 -1
- package/src/resources/extensions/google-search/index.ts +2 -1
- package/src/resources/extensions/gsd/auto/infra-errors.ts +3 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
- package/src/resources/extensions/gsd/auto/phases.ts +43 -34
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
- package/src/resources/extensions/gsd/auto-dashboard.ts +37 -19
- package/src/resources/extensions/gsd/auto-dispatch.ts +21 -5
- package/src/resources/extensions/gsd/auto-model-selection.ts +26 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +18 -4
- package/src/resources/extensions/gsd/auto-prompts.ts +1 -1
- package/src/resources/extensions/gsd/auto-recovery.ts +12 -5
- package/src/resources/extensions/gsd/auto-start.ts +35 -26
- package/src/resources/extensions/gsd/auto-worktree.ts +197 -11
- package/src/resources/extensions/gsd/auto.ts +5 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +31 -0
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +87 -9
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +38 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +31 -19
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +50 -11
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +75 -0
- package/src/resources/extensions/gsd/captures.ts +63 -3
- package/src/resources/extensions/gsd/db-writer.ts +140 -7
- package/src/resources/extensions/gsd/dispatch-guard.ts +12 -1
- package/src/resources/extensions/gsd/doctor-git-checks.ts +26 -0
- package/src/resources/extensions/gsd/doctor-providers.ts +2 -1
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +5 -4
- package/src/resources/extensions/gsd/doctor.ts +3 -1
- package/src/resources/extensions/gsd/error-classifier.ts +14 -11
- package/src/resources/extensions/gsd/extension-manifest.json +16 -1
- package/src/resources/extensions/gsd/forensics.ts +144 -20
- package/src/resources/extensions/gsd/git-service.ts +26 -3
- package/src/resources/extensions/gsd/gitignore.ts +33 -0
- package/src/resources/extensions/gsd/gsd-db.ts +49 -8
- package/src/resources/extensions/gsd/guided-flow.ts +114 -45
- package/src/resources/extensions/gsd/health-widget-core.ts +34 -0
- package/src/resources/extensions/gsd/health-widget.ts +17 -0
- package/src/resources/extensions/gsd/index.ts +1 -0
- package/src/resources/extensions/gsd/memory-extractor.ts +8 -0
- package/src/resources/extensions/gsd/migrate-external.ts +9 -1
- package/src/resources/extensions/gsd/milestone-validation-gates.ts +56 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +19 -0
- package/src/resources/extensions/gsd/model-router.ts +35 -1
- package/src/resources/extensions/gsd/native-git-bridge.ts +17 -0
- package/src/resources/extensions/gsd/notifications.ts +16 -0
- package/src/resources/extensions/gsd/parallel-eligibility.ts +15 -2
- package/src/resources/extensions/gsd/parallel-merge.ts +87 -4
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +23 -6
- package/src/resources/extensions/gsd/parsers-legacy.ts +22 -3
- package/src/resources/extensions/gsd/paths.ts +42 -0
- package/src/resources/extensions/gsd/preferences-models.ts +14 -1
- package/src/resources/extensions/gsd/preferences-types.ts +2 -1
- package/src/resources/extensions/gsd/preferences.ts +45 -29
- package/src/resources/extensions/gsd/prompt-loader.ts +4 -1
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -2
- 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 +3 -1
- 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 +2 -0
- package/src/resources/extensions/gsd/prompts/rethink.md +1 -1
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -0
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
- package/src/resources/extensions/gsd/repo-identity.ts +186 -11
- package/src/resources/extensions/gsd/rethink.ts +6 -0
- package/src/resources/extensions/gsd/roadmap-slices.ts +5 -4
- package/src/resources/extensions/gsd/state.ts +84 -32
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/auto-mode-interactive-guard.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +71 -1
- package/src/resources/extensions/gsd/tests/captures.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/cli-provider-rate-limit.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/completion-hierarchy-guards.test.ts +192 -0
- package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +131 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +7 -12
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +78 -5
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +20 -1
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/dynamic-routing-default.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +74 -0
- package/src/resources/extensions/gsd/tests/event-replay-idempotency.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +129 -0
- package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +96 -0
- package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +125 -12
- package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +164 -0
- package/src/resources/extensions/gsd/tests/guided-flow-dynamic-routing.test.ts +135 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +111 -1
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +101 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +243 -0
- package/src/resources/extensions/gsd/tests/integration/gitignore-staging-2570.test.ts +150 -0
- package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +110 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +959 -0
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +85 -2
- package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/model-router.test.ts +68 -3
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/notifications.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +159 -0
- package/src/resources/extensions/gsd/tests/parallel-eligibility-ghost.test.ts +150 -0
- package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +9 -8
- package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/preferences.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +297 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/prompt-loader-replacement.test.ts +178 -0
- package/src/resources/extensions/gsd/tests/prompt-tool-names.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/reconciliation-edge-cases.test.ts +162 -0
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +134 -0
- package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +233 -0
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +305 -0
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +405 -0
- package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +257 -0
- package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +1628 -0
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +174 -0
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +221 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +289 -0
- package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +100 -17
- package/src/resources/extensions/gsd/tests/vacuum-recovery.test.ts +154 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +27 -2
- package/src/resources/extensions/gsd/tests/validation-gate-patterns.test.ts +44 -2
- package/src/resources/extensions/gsd/tests/verdict-parser.test.ts +156 -0
- package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +175 -0
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +101 -0
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +48 -1
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +29 -5
- package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +95 -0
- package/src/resources/extensions/gsd/tools/complete-task.ts +36 -74
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +13 -1
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +36 -0
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -2
- package/src/resources/extensions/gsd/triage-resolution.ts +23 -6
- package/src/resources/extensions/gsd/types.ts +4 -2
- package/src/resources/extensions/gsd/undo.ts +2 -2
- package/src/resources/extensions/gsd/unit-ownership.ts +206 -35
- package/src/resources/extensions/gsd/verdict-parser.ts +21 -6
- package/src/resources/extensions/gsd/workflow-logger.ts +3 -1
- package/src/resources/extensions/gsd/workflow-manifest.ts +22 -5
- package/src/resources/extensions/gsd/workflow-projections.ts +97 -64
- package/src/resources/extensions/gsd/workflow-reconcile.ts +39 -10
- package/src/resources/extensions/gsd/workspace-index.ts +30 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +120 -1
- package/src/resources/extensions/gsd/worktree-resolver.ts +22 -3
- package/src/resources/extensions/mcp-client/index.ts +13 -7
- package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +55 -0
- package/src/resources/extensions/ollama/index.ts +130 -0
- package/src/resources/extensions/ollama/model-capabilities.ts +145 -0
- package/src/resources/extensions/ollama/ollama-client.ts +196 -0
- package/src/resources/extensions/ollama/ollama-commands.ts +248 -0
- package/src/resources/extensions/ollama/ollama-discovery.ts +106 -0
- package/src/resources/extensions/ollama/ollama-tool.ts +218 -0
- package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +162 -0
- package/src/resources/extensions/ollama/tests/ollama-client.test.ts +38 -0
- package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +28 -0
- package/src/resources/extensions/ollama/types.ts +130 -0
- package/src/resources/extensions/search-the-web/extension-manifest.json +1 -1
- package/src/resources/extensions/shared/interview-ui.ts +12 -1
- package/src/resources/extensions/shared/tests/ask-user-freetext.test.ts +156 -0
- package/src/resources/skills/create-gsd-extension/SKILL.md +5 -3
- package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +5 -4
- 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 +5 -3
- package/dist/web/standalone/.next/static/chunks/6502.2305d0afd2385711.js +0 -9
- package/dist/web/standalone/.next/static/chunks/app/page-62be3b5fa91e4c8f.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
- package/dist/web/standalone/.next/static/css/a58ef8a151aa0493.css +0 -1
- package/src/resources/extensions/gsd/tests/empty-db-reconciliation.test.ts +0 -79
- /package/dist/web/standalone/.next/static/{yowc5qPtuKxjOr22KmOAy → R0D4xaIPl5kg93edN7Oo0}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{yowc5qPtuKxjOr22KmOAy → R0D4xaIPl5kg93edN7Oo0}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* worktree-db-respawn-truncation.test.ts — Regression test for #2815.
|
|
3
|
+
*
|
|
4
|
+
* Verifies that syncProjectRootToWorktree does NOT delete a non-empty
|
|
5
|
+
* worktree gsd.db. On worker respawn, gsd-migrate populates the DB
|
|
6
|
+
* (~1.7MB) before the auto-loop calls syncProjectRootToWorktree. The
|
|
7
|
+
* sync step must preserve the freshly-migrated DB to avoid truncating
|
|
8
|
+
* it to 0 bytes and causing "no such table: slices" failures.
|
|
9
|
+
*
|
|
10
|
+
* Covers:
|
|
11
|
+
* - Non-empty worktree gsd.db preserved after sync (#2815)
|
|
12
|
+
* - Empty (0-byte) worktree gsd.db still deleted (#853 preserved)
|
|
13
|
+
* - WAL/SHM sidecar files cleaned up when empty DB is deleted
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { mkdtempSync, mkdirSync, writeFileSync, rmSync, existsSync, readFileSync, statSync } from 'node:fs';
|
|
17
|
+
import { join } from 'node:path';
|
|
18
|
+
import { tmpdir } from 'node:os';
|
|
19
|
+
|
|
20
|
+
import { syncProjectRootToWorktree } from '../auto-worktree.ts';
|
|
21
|
+
import { describe, test } from 'node:test';
|
|
22
|
+
import assert from 'node:assert/strict';
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
function createBase(name: string): string {
|
|
26
|
+
const base = mkdtempSync(join(tmpdir(), `gsd-wt-respawn-${name}-`));
|
|
27
|
+
mkdirSync(join(base, '.gsd', 'milestones'), { recursive: true });
|
|
28
|
+
return base;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function cleanup(base: string): void {
|
|
32
|
+
rmSync(base, { recursive: true, force: true });
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
describe('worktree-db-respawn-truncation (#2815)', async () => {
|
|
36
|
+
|
|
37
|
+
// ─── 1. Non-empty worktree gsd.db preserved after sync ───────────────
|
|
38
|
+
console.log('\n=== 1. non-empty worktree gsd.db preserved after sync (#2815) ===');
|
|
39
|
+
{
|
|
40
|
+
const mainBase = createBase('main');
|
|
41
|
+
const wtBase = createBase('wt');
|
|
42
|
+
|
|
43
|
+
try {
|
|
44
|
+
// Set up milestone artifacts in main project root
|
|
45
|
+
const m001Dir = join(mainBase, '.gsd', 'milestones', 'M001');
|
|
46
|
+
mkdirSync(m001Dir, { recursive: true });
|
|
47
|
+
writeFileSync(join(m001Dir, 'M001-ROADMAP.md'), '# Roadmap');
|
|
48
|
+
|
|
49
|
+
// Simulate a freshly-migrated worktree DB (non-empty, like after gsd-migrate)
|
|
50
|
+
// Real DBs are ~1.7MB; we use a smaller payload to prove the size check works
|
|
51
|
+
const fakeDbContent = Buffer.alloc(4096, 0x42); // 4KB non-empty DB
|
|
52
|
+
writeFileSync(join(wtBase, '.gsd', 'gsd.db'), fakeDbContent);
|
|
53
|
+
|
|
54
|
+
const sizeBefore = statSync(join(wtBase, '.gsd', 'gsd.db')).size;
|
|
55
|
+
assert.ok(sizeBefore > 0, 'gsd.db is non-empty before sync');
|
|
56
|
+
|
|
57
|
+
syncProjectRootToWorktree(mainBase, wtBase, 'M001');
|
|
58
|
+
|
|
59
|
+
// The non-empty DB must survive the sync
|
|
60
|
+
assert.ok(
|
|
61
|
+
existsSync(join(wtBase, '.gsd', 'gsd.db')),
|
|
62
|
+
'#2815: non-empty gsd.db must not be deleted by sync',
|
|
63
|
+
);
|
|
64
|
+
const sizeAfter = statSync(join(wtBase, '.gsd', 'gsd.db')).size;
|
|
65
|
+
assert.equal(
|
|
66
|
+
sizeAfter,
|
|
67
|
+
sizeBefore,
|
|
68
|
+
'#2815: gsd.db size must be unchanged after sync',
|
|
69
|
+
);
|
|
70
|
+
} finally {
|
|
71
|
+
cleanup(mainBase);
|
|
72
|
+
cleanup(wtBase);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// ─── 2. Empty (0-byte) worktree gsd.db still deleted ─────────────────
|
|
77
|
+
console.log('\n=== 2. empty (0-byte) worktree gsd.db still deleted (#853) ===');
|
|
78
|
+
{
|
|
79
|
+
const mainBase = createBase('main');
|
|
80
|
+
const wtBase = createBase('wt');
|
|
81
|
+
|
|
82
|
+
try {
|
|
83
|
+
const m001Dir = join(mainBase, '.gsd', 'milestones', 'M001');
|
|
84
|
+
mkdirSync(m001Dir, { recursive: true });
|
|
85
|
+
writeFileSync(join(m001Dir, 'M001-ROADMAP.md'), '# Roadmap');
|
|
86
|
+
|
|
87
|
+
// Create an empty (0-byte) gsd.db — this is stale/corrupt and should be deleted
|
|
88
|
+
writeFileSync(join(wtBase, '.gsd', 'gsd.db'), '');
|
|
89
|
+
assert.ok(existsSync(join(wtBase, '.gsd', 'gsd.db')), 'empty gsd.db exists before sync');
|
|
90
|
+
|
|
91
|
+
syncProjectRootToWorktree(mainBase, wtBase, 'M001');
|
|
92
|
+
|
|
93
|
+
assert.ok(
|
|
94
|
+
!existsSync(join(wtBase, '.gsd', 'gsd.db')),
|
|
95
|
+
'#853: empty gsd.db must still be deleted after sync',
|
|
96
|
+
);
|
|
97
|
+
} finally {
|
|
98
|
+
cleanup(mainBase);
|
|
99
|
+
cleanup(wtBase);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// ─── 3. Milestone artifacts still synced when DB is preserved ────────
|
|
104
|
+
console.log('\n=== 3. milestone artifacts still synced even when DB preserved ===');
|
|
105
|
+
{
|
|
106
|
+
const mainBase = createBase('main');
|
|
107
|
+
const wtBase = createBase('wt');
|
|
108
|
+
|
|
109
|
+
try {
|
|
110
|
+
const m001Dir = join(mainBase, '.gsd', 'milestones', 'M001');
|
|
111
|
+
mkdirSync(m001Dir, { recursive: true });
|
|
112
|
+
writeFileSync(join(m001Dir, 'M001-ROADMAP.md'), '# Roadmap');
|
|
113
|
+
mkdirSync(join(m001Dir, 'slices', 'S01'), { recursive: true });
|
|
114
|
+
writeFileSync(join(m001Dir, 'slices', 'S01', 'S01-PLAN.md'), '# Plan');
|
|
115
|
+
|
|
116
|
+
// Non-empty DB in worktree
|
|
117
|
+
writeFileSync(join(wtBase, '.gsd', 'gsd.db'), 'populated-db-data');
|
|
118
|
+
|
|
119
|
+
syncProjectRootToWorktree(mainBase, wtBase, 'M001');
|
|
120
|
+
|
|
121
|
+
// Artifacts must still be synced
|
|
122
|
+
assert.ok(
|
|
123
|
+
existsSync(join(wtBase, '.gsd', 'milestones', 'M001', 'M001-ROADMAP.md')),
|
|
124
|
+
'milestone artifacts synced even with preserved DB',
|
|
125
|
+
);
|
|
126
|
+
assert.ok(
|
|
127
|
+
existsSync(join(wtBase, '.gsd', 'milestones', 'M001', 'slices', 'S01', 'S01-PLAN.md')),
|
|
128
|
+
'slice artifacts synced even with preserved DB',
|
|
129
|
+
);
|
|
130
|
+
// DB must still exist
|
|
131
|
+
assert.ok(
|
|
132
|
+
existsSync(join(wtBase, '.gsd', 'gsd.db')),
|
|
133
|
+
'#2815: DB preserved alongside artifact sync',
|
|
134
|
+
);
|
|
135
|
+
} finally {
|
|
136
|
+
cleanup(mainBase);
|
|
137
|
+
cleanup(wtBase);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
});
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* worktree-db-same-file.test.ts — Regression test for #2823.
|
|
3
|
+
*
|
|
4
|
+
* Verifies that reconcileWorktreeDb() does not ATTACH a WAL-mode DB file
|
|
5
|
+
* to itself when the worktree DB path resolves to the same physical file
|
|
6
|
+
* as the main DB path (shared-WAL / symlink layout).
|
|
7
|
+
*
|
|
8
|
+
* Also verifies that the auto-loop classifies "database disk image is
|
|
9
|
+
* malformed" as an infrastructure error to prevent wasting retries.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { describe, test, beforeEach, afterEach } from "node:test";
|
|
13
|
+
import assert from "node:assert/strict";
|
|
14
|
+
import {
|
|
15
|
+
existsSync,
|
|
16
|
+
mkdirSync,
|
|
17
|
+
mkdtempSync,
|
|
18
|
+
rmSync,
|
|
19
|
+
symlinkSync,
|
|
20
|
+
writeFileSync,
|
|
21
|
+
} from "node:fs";
|
|
22
|
+
import { join } from "node:path";
|
|
23
|
+
import { tmpdir } from "node:os";
|
|
24
|
+
|
|
25
|
+
import {
|
|
26
|
+
openDatabase,
|
|
27
|
+
closeDatabase,
|
|
28
|
+
reconcileWorktreeDb,
|
|
29
|
+
insertDecision,
|
|
30
|
+
} from "../gsd-db.ts";
|
|
31
|
+
import { isInfrastructureError } from "../auto/infra-errors.ts";
|
|
32
|
+
|
|
33
|
+
// ─── Fix 1 & 2: reconcileWorktreeDb same-file guard ─────────────────
|
|
34
|
+
|
|
35
|
+
describe("#2823: reconcileWorktreeDb same-file guard", () => {
|
|
36
|
+
let tmpDir: string;
|
|
37
|
+
|
|
38
|
+
beforeEach(() => {
|
|
39
|
+
tmpDir = mkdtempSync(join(tmpdir(), "gsd-2823-"));
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
afterEach(() => {
|
|
43
|
+
closeDatabase();
|
|
44
|
+
rmSync(tmpDir, { recursive: true, force: true });
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test("returns zero result when both paths resolve to the same file", () => {
|
|
48
|
+
const mainGsd = join(tmpDir, "main", ".gsd");
|
|
49
|
+
mkdirSync(mainGsd, { recursive: true });
|
|
50
|
+
const mainDbPath = join(mainGsd, "gsd.db");
|
|
51
|
+
|
|
52
|
+
// Create a real DB at mainDbPath
|
|
53
|
+
openDatabase(mainDbPath);
|
|
54
|
+
insertDecision({
|
|
55
|
+
id: "D001",
|
|
56
|
+
when_context: "2026-01-01",
|
|
57
|
+
scope: "M001",
|
|
58
|
+
decision: "Test decision",
|
|
59
|
+
choice: "Test choice",
|
|
60
|
+
rationale: "Test rationale",
|
|
61
|
+
revisable: "yes",
|
|
62
|
+
made_by: "agent",
|
|
63
|
+
superseded_by: null,
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// Create a worktree path that resolves to the same file via symlink
|
|
67
|
+
const wtGsd = join(tmpDir, "worktree", ".gsd");
|
|
68
|
+
mkdirSync(join(tmpDir, "worktree"), { recursive: true });
|
|
69
|
+
symlinkSync(mainGsd, wtGsd, "junction");
|
|
70
|
+
const worktreeDbPath = join(wtGsd, "gsd.db");
|
|
71
|
+
|
|
72
|
+
// Both paths exist and resolve to the same physical file
|
|
73
|
+
assert.ok(existsSync(mainDbPath), "main DB exists");
|
|
74
|
+
assert.ok(existsSync(worktreeDbPath), "worktree DB path exists (via symlink)");
|
|
75
|
+
|
|
76
|
+
// This should NOT attempt ATTACH — should return zero result
|
|
77
|
+
const result = reconcileWorktreeDb(mainDbPath, worktreeDbPath);
|
|
78
|
+
|
|
79
|
+
assert.equal(result.decisions, 0, "no decisions reconciled");
|
|
80
|
+
assert.equal(result.requirements, 0, "no requirements reconciled");
|
|
81
|
+
assert.equal(result.artifacts, 0, "no artifacts reconciled");
|
|
82
|
+
assert.equal(result.conflicts.length, 0, "no conflicts");
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test("returns zero result when both paths are identical strings", () => {
|
|
86
|
+
const mainGsd = join(tmpDir, "project", ".gsd");
|
|
87
|
+
mkdirSync(mainGsd, { recursive: true });
|
|
88
|
+
const dbPath = join(mainGsd, "gsd.db");
|
|
89
|
+
|
|
90
|
+
openDatabase(dbPath);
|
|
91
|
+
insertDecision({
|
|
92
|
+
id: "D001",
|
|
93
|
+
when_context: "2026-01-01",
|
|
94
|
+
scope: "M001",
|
|
95
|
+
decision: "Test",
|
|
96
|
+
choice: "Test",
|
|
97
|
+
rationale: "Test",
|
|
98
|
+
revisable: "yes",
|
|
99
|
+
made_by: "agent",
|
|
100
|
+
superseded_by: null,
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// Same exact path — should bail immediately
|
|
104
|
+
const result = reconcileWorktreeDb(dbPath, dbPath);
|
|
105
|
+
|
|
106
|
+
assert.equal(result.decisions, 0);
|
|
107
|
+
assert.equal(result.conflicts.length, 0);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test("still reconciles when paths are genuinely different files", () => {
|
|
111
|
+
// Main DB
|
|
112
|
+
const mainGsd = join(tmpDir, "main", ".gsd");
|
|
113
|
+
mkdirSync(mainGsd, { recursive: true });
|
|
114
|
+
const mainDbPath = join(mainGsd, "gsd.db");
|
|
115
|
+
|
|
116
|
+
openDatabase(mainDbPath);
|
|
117
|
+
insertDecision({
|
|
118
|
+
id: "D001",
|
|
119
|
+
when_context: "2026-01-01",
|
|
120
|
+
scope: "M001",
|
|
121
|
+
decision: "Main decision",
|
|
122
|
+
choice: "Main choice",
|
|
123
|
+
rationale: "Main rationale",
|
|
124
|
+
revisable: "yes",
|
|
125
|
+
made_by: "agent",
|
|
126
|
+
superseded_by: null,
|
|
127
|
+
});
|
|
128
|
+
closeDatabase();
|
|
129
|
+
|
|
130
|
+
// Create a separate worktree DB with different data
|
|
131
|
+
const wtGsd = join(tmpDir, "worktree", ".gsd");
|
|
132
|
+
mkdirSync(wtGsd, { recursive: true });
|
|
133
|
+
const worktreeDbPath = join(wtGsd, "gsd.db");
|
|
134
|
+
|
|
135
|
+
openDatabase(worktreeDbPath);
|
|
136
|
+
insertDecision({
|
|
137
|
+
id: "D002",
|
|
138
|
+
when_context: "2026-01-01",
|
|
139
|
+
scope: "M001",
|
|
140
|
+
decision: "WT decision",
|
|
141
|
+
choice: "WT choice",
|
|
142
|
+
rationale: "WT rationale",
|
|
143
|
+
revisable: "yes",
|
|
144
|
+
made_by: "agent",
|
|
145
|
+
superseded_by: null,
|
|
146
|
+
});
|
|
147
|
+
closeDatabase();
|
|
148
|
+
|
|
149
|
+
// Re-open main and reconcile — should work normally
|
|
150
|
+
openDatabase(mainDbPath);
|
|
151
|
+
const result = reconcileWorktreeDb(mainDbPath, worktreeDbPath);
|
|
152
|
+
|
|
153
|
+
assert.ok(
|
|
154
|
+
result.decisions > 0,
|
|
155
|
+
"should reconcile decisions from a genuinely different DB",
|
|
156
|
+
);
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
// ─── Fix 3: infrastructure error classification ─────────────────────
|
|
161
|
+
|
|
162
|
+
describe("#2823: malformed DB classified as infrastructure error", () => {
|
|
163
|
+
test("database disk image is malformed is detected as infra error", () => {
|
|
164
|
+
const err = new Error("database disk image is malformed");
|
|
165
|
+
const code = isInfrastructureError(err);
|
|
166
|
+
assert.ok(code !== null, "should be classified as infrastructure error");
|
|
167
|
+
assert.equal(code, "SQLITE_CORRUPT");
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
test("other SQLite errors are not falsely classified", () => {
|
|
171
|
+
const err = new Error("SQLITE_BUSY: database is locked");
|
|
172
|
+
const code = isInfrastructureError(err);
|
|
173
|
+
assert.equal(code, null, "SQLITE_BUSY should not be infra error (it's transient)");
|
|
174
|
+
});
|
|
175
|
+
});
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* worktree-nested-git-safety.test.ts — #2616
|
|
3
|
+
*
|
|
4
|
+
* When scaffolding tools (create-next-app, cargo init, etc.) run inside a
|
|
5
|
+
* worktree, they create nested .git directories. Git treats these as gitlinks
|
|
6
|
+
* (mode 160000) without a .gitmodules entry, so the worktree cleanup destroys
|
|
7
|
+
* the only copy of those object databases — causing permanent data loss.
|
|
8
|
+
*
|
|
9
|
+
* This test verifies that removeWorktree detects nested .git directories
|
|
10
|
+
* (orphaned gitlinks) and absorbs or removes them before cleanup so files
|
|
11
|
+
* are tracked as regular content instead of unreachable gitlink pointers.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { readFileSync } from "node:fs";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import { createTestContext } from "./test-helpers.ts";
|
|
17
|
+
|
|
18
|
+
const { assertTrue, report } = createTestContext();
|
|
19
|
+
|
|
20
|
+
const srcPath = join(import.meta.dirname, "..", "worktree-manager.ts");
|
|
21
|
+
const src = readFileSync(srcPath, "utf-8");
|
|
22
|
+
|
|
23
|
+
console.log("\n=== #2616: Worktree cleanup detects nested .git directories ===");
|
|
24
|
+
|
|
25
|
+
// ── Test 1: removeWorktree scans for nested .git directories ─────────
|
|
26
|
+
|
|
27
|
+
const removeWorktreeIdx = src.indexOf("export function removeWorktree");
|
|
28
|
+
assertTrue(removeWorktreeIdx > 0, "worktree-manager.ts exports removeWorktree");
|
|
29
|
+
|
|
30
|
+
const fnBody = src.slice(removeWorktreeIdx, removeWorktreeIdx + 5000);
|
|
31
|
+
|
|
32
|
+
const detectsNestedGit =
|
|
33
|
+
fnBody.includes("nested") && fnBody.includes(".git") ||
|
|
34
|
+
fnBody.includes("gitlink") ||
|
|
35
|
+
fnBody.includes("160000") ||
|
|
36
|
+
fnBody.includes("findNestedGitDirs") ||
|
|
37
|
+
fnBody.includes("nestedGitDirs");
|
|
38
|
+
|
|
39
|
+
assertTrue(
|
|
40
|
+
detectsNestedGit,
|
|
41
|
+
"removeWorktree detects nested .git directories or gitlinks (#2616)",
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
// ── Test 2: A helper function exists to find nested .git directories ──
|
|
45
|
+
|
|
46
|
+
const hasNestedGitHelper =
|
|
47
|
+
src.includes("findNestedGitDirs") ||
|
|
48
|
+
src.includes("detectNestedGitDirs") ||
|
|
49
|
+
src.includes("scanNestedGit") ||
|
|
50
|
+
src.includes("absorbNestedGit") ||
|
|
51
|
+
src.includes("nestedGitDirs");
|
|
52
|
+
|
|
53
|
+
assertTrue(
|
|
54
|
+
hasNestedGitHelper,
|
|
55
|
+
"worktree-manager has a helper to find nested .git directories (#2616)",
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
// ── Test 3: Nested .git dirs are absorbed or removed before cleanup ───
|
|
59
|
+
|
|
60
|
+
const absorbsOrRemoves =
|
|
61
|
+
fnBody.includes("absorb") ||
|
|
62
|
+
fnBody.includes("rmSync") && fnBody.includes("nested") ||
|
|
63
|
+
(fnBody.includes("nestedGitDirs") || fnBody.includes("findNestedGitDirs")) &&
|
|
64
|
+
(fnBody.includes("rm") || fnBody.includes("absorb") || fnBody.includes("remove"));
|
|
65
|
+
|
|
66
|
+
assertTrue(
|
|
67
|
+
absorbsOrRemoves,
|
|
68
|
+
"removeWorktree absorbs or removes nested .git dirs before cleanup (#2616)",
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
// ── Test 4: A warning is logged when nested .git dirs are found ───────
|
|
72
|
+
|
|
73
|
+
const warnsAboutNestedGit =
|
|
74
|
+
fnBody.includes("nested") && fnBody.includes("logWarning") ||
|
|
75
|
+
fnBody.includes("gitlink") && fnBody.includes("logWarning") ||
|
|
76
|
+
fnBody.includes("scaffold") && fnBody.includes("logWarning");
|
|
77
|
+
|
|
78
|
+
assertTrue(
|
|
79
|
+
warnsAboutNestedGit,
|
|
80
|
+
"removeWorktree warns when nested .git directories are detected (#2616)",
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
// ── Test 5: The findNestedGitDirs helper correctly identifies nested repos ──
|
|
84
|
+
// Verify the helper scans subdirectories but skips .gsd/, node_modules/, .git/
|
|
85
|
+
|
|
86
|
+
const helperBody = src.includes("findNestedGitDirs")
|
|
87
|
+
? src.slice(src.indexOf("findNestedGitDirs"))
|
|
88
|
+
: "";
|
|
89
|
+
|
|
90
|
+
const skipsExcludedDirs =
|
|
91
|
+
helperBody.includes("node_modules") ||
|
|
92
|
+
helperBody.includes(".gsd") ||
|
|
93
|
+
helperBody.includes("skip") ||
|
|
94
|
+
helperBody.includes("exclude");
|
|
95
|
+
|
|
96
|
+
assertTrue(
|
|
97
|
+
skipsExcludedDirs,
|
|
98
|
+
"findNestedGitDirs skips node_modules and other excluded directories (#2616)",
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
report();
|
|
@@ -481,7 +481,8 @@ test("mergeAndExit resolves roadmap from worktree when missing at project root (
|
|
|
481
481
|
|
|
482
482
|
// Should have called mergeMilestoneToMain, not bare teardown
|
|
483
483
|
assert.equal(findCalls(deps.calls, "mergeMilestoneToMain").length, 1);
|
|
484
|
-
|
|
484
|
+
// #2945 Bug 3: secondary teardown is now called after merge for cleanup
|
|
485
|
+
assert.equal(findCalls(deps.calls, "teardownAutoWorktree").length, 1);
|
|
485
486
|
assert.equal(s.basePath, "/project"); // restored
|
|
486
487
|
assert.ok(ctx.messages.some((m) => m.msg.includes("merged to main")));
|
|
487
488
|
});
|
|
@@ -913,3 +914,49 @@ test("isolationDegraded is reset by session.reset() (#2483)", () => {
|
|
|
913
914
|
|
|
914
915
|
assert.equal(s.isolationDegraded, false);
|
|
915
916
|
});
|
|
917
|
+
|
|
918
|
+
// ─── #2625 — Default isolation mode change must not orphan worktree commits ──
|
|
919
|
+
|
|
920
|
+
test("mergeAndExit still merges when mode is 'none' but session is in a worktree (#2625)", () => {
|
|
921
|
+
// Scenario: user upgraded from a version where default was "worktree" to one
|
|
922
|
+
// where default is "none". They have an active worktree with committed work.
|
|
923
|
+
// mergeAndExit must detect the active worktree and merge regardless of config.
|
|
924
|
+
const s = makeSession({
|
|
925
|
+
basePath: "/project/.gsd/worktrees/M001",
|
|
926
|
+
originalBasePath: "/project",
|
|
927
|
+
});
|
|
928
|
+
const deps = makeDeps({
|
|
929
|
+
isInAutoWorktree: () => true,
|
|
930
|
+
getIsolationMode: () => "none", // config says "none" — but we ARE in a worktree
|
|
931
|
+
});
|
|
932
|
+
const ctx = makeNotifyCtx();
|
|
933
|
+
const resolver = new WorktreeResolver(s, deps);
|
|
934
|
+
|
|
935
|
+
resolver.mergeAndExit("M001", ctx);
|
|
936
|
+
|
|
937
|
+
// Must still merge — not skip silently
|
|
938
|
+
assert.equal(findCalls(deps.calls, "mergeMilestoneToMain").length, 1,
|
|
939
|
+
"must call mergeMilestoneToMain even when isolation mode is 'none' but we are in a worktree");
|
|
940
|
+
assert.equal(s.basePath, "/project", "basePath must be restored to project root");
|
|
941
|
+
assert.ok(ctx.messages.some((m) => m.msg.includes("merged to main")),
|
|
942
|
+
"must notify about the merge");
|
|
943
|
+
});
|
|
944
|
+
|
|
945
|
+
test("mergeAndExit in none mode remains a no-op when NOT in a worktree (#2625)", () => {
|
|
946
|
+
// When mode is "none" and we are genuinely not in a worktree, it should still be a no-op.
|
|
947
|
+
const s = makeSession({
|
|
948
|
+
basePath: "/project",
|
|
949
|
+
originalBasePath: "/project",
|
|
950
|
+
});
|
|
951
|
+
const deps = makeDeps({
|
|
952
|
+
isInAutoWorktree: () => false,
|
|
953
|
+
getIsolationMode: () => "none",
|
|
954
|
+
});
|
|
955
|
+
const ctx = makeNotifyCtx();
|
|
956
|
+
const resolver = new WorktreeResolver(s, deps);
|
|
957
|
+
|
|
958
|
+
resolver.mergeAndExit("M001", ctx);
|
|
959
|
+
|
|
960
|
+
assert.equal(findCalls(deps.calls, "mergeMilestoneToMain").length, 0,
|
|
961
|
+
"must NOT merge when not in a worktree and mode is none");
|
|
962
|
+
});
|
|
@@ -100,8 +100,8 @@ describe('worktree-sync-milestones', async () => {
|
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
-
// ─── 3. gsd.db deleted in worktree after sync
|
|
104
|
-
console.log('\n=== 3. gsd.db deleted in worktree after sync ===');
|
|
103
|
+
// ─── 3. empty gsd.db deleted in worktree after sync ────────────────────
|
|
104
|
+
console.log('\n=== 3. empty gsd.db deleted in worktree after sync ===');
|
|
105
105
|
{
|
|
106
106
|
const mainBase = createBase('main');
|
|
107
107
|
const wtBase = createBase('wt');
|
|
@@ -111,13 +111,37 @@ describe('worktree-sync-milestones', async () => {
|
|
|
111
111
|
mkdirSync(m001Dir, { recursive: true });
|
|
112
112
|
writeFileSync(join(m001Dir, 'M001-ROADMAP.md'), '# Roadmap');
|
|
113
113
|
|
|
114
|
-
// Worktree has
|
|
115
|
-
writeFileSync(join(wtBase, '.gsd', 'gsd.db'), '
|
|
114
|
+
// Worktree has an empty (0-byte) gsd.db — stale/corrupt
|
|
115
|
+
writeFileSync(join(wtBase, '.gsd', 'gsd.db'), '');
|
|
116
116
|
assert.ok(existsSync(join(wtBase, '.gsd', 'gsd.db')), 'gsd.db exists before sync');
|
|
117
117
|
|
|
118
118
|
syncProjectRootToWorktree(mainBase, wtBase, 'M001');
|
|
119
119
|
|
|
120
|
-
assert.ok(!existsSync(join(wtBase, '.gsd', 'gsd.db')), '#853: gsd.db deleted after sync');
|
|
120
|
+
assert.ok(!existsSync(join(wtBase, '.gsd', 'gsd.db')), '#853: empty gsd.db deleted after sync');
|
|
121
|
+
} finally {
|
|
122
|
+
cleanup(mainBase);
|
|
123
|
+
cleanup(wtBase);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// ─── 3b. non-empty gsd.db preserved in worktree after sync (#2815) ───
|
|
128
|
+
console.log('\n=== 3b. non-empty gsd.db preserved in worktree after sync (#2815) ===');
|
|
129
|
+
{
|
|
130
|
+
const mainBase = createBase('main');
|
|
131
|
+
const wtBase = createBase('wt');
|
|
132
|
+
|
|
133
|
+
try {
|
|
134
|
+
const m001Dir = join(mainBase, '.gsd', 'milestones', 'M001');
|
|
135
|
+
mkdirSync(m001Dir, { recursive: true });
|
|
136
|
+
writeFileSync(join(m001Dir, 'M001-ROADMAP.md'), '# Roadmap');
|
|
137
|
+
|
|
138
|
+
// Worktree has a populated gsd.db (e.g. from gsd-migrate on respawn)
|
|
139
|
+
writeFileSync(join(wtBase, '.gsd', 'gsd.db'), 'migrated-db-content');
|
|
140
|
+
assert.ok(existsSync(join(wtBase, '.gsd', 'gsd.db')), 'gsd.db exists before sync');
|
|
141
|
+
|
|
142
|
+
syncProjectRootToWorktree(mainBase, wtBase, 'M001');
|
|
143
|
+
|
|
144
|
+
assert.ok(existsSync(join(wtBase, '.gsd', 'gsd.db')), '#2815: non-empty gsd.db preserved after sync');
|
|
121
145
|
} finally {
|
|
122
146
|
cleanup(mainBase);
|
|
123
147
|
cleanup(wtBase);
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
|
|
4
|
+
import { createTestContext } from "./test-helpers.ts";
|
|
5
|
+
|
|
6
|
+
const { assertTrue, assertMatch, assertNoMatch, report } = createTestContext();
|
|
7
|
+
|
|
8
|
+
// ─── #2942: Zombie .gsd state skips init wizard ─────────────────────────────
|
|
9
|
+
//
|
|
10
|
+
// A partially initialized .gsd/ (symlink exists but no PREFERENCES.md or
|
|
11
|
+
// milestones/) causes the init wizard gate in showSmartEntry to be skipped,
|
|
12
|
+
// resulting in an uninitialized project session.
|
|
13
|
+
|
|
14
|
+
console.log("\n=== #2942: zombie .gsd state must not skip init wizard ===");
|
|
15
|
+
|
|
16
|
+
// ── guided-flow.ts — init wizard gate must check bootstrap completeness ──
|
|
17
|
+
|
|
18
|
+
const guidedFlowSrc = readFileSync(
|
|
19
|
+
join(import.meta.dirname, "..", "guided-flow.ts"),
|
|
20
|
+
"utf-8",
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
// Find the showSmartEntry function
|
|
24
|
+
const smartEntryIdx = guidedFlowSrc.indexOf("export async function showSmartEntry(");
|
|
25
|
+
assertTrue(smartEntryIdx >= 0, "guided-flow.ts defines showSmartEntry");
|
|
26
|
+
|
|
27
|
+
// Extract the region between showSmartEntry and the first showProjectInit call
|
|
28
|
+
// This is where the init wizard gate lives.
|
|
29
|
+
const afterSmartEntry = smartEntryIdx >= 0 ? guidedFlowSrc.slice(smartEntryIdx, smartEntryIdx + 3000) : "";
|
|
30
|
+
|
|
31
|
+
// The gate must NOT be a bare `!existsSync(gsdRoot(basePath))` check.
|
|
32
|
+
// It must also verify that bootstrap artifacts (PREFERENCES.md or milestones/) exist.
|
|
33
|
+
assertTrue(
|
|
34
|
+
afterSmartEntry.includes("PREFERENCES.md") || afterSmartEntry.includes("PREFERENCES"),
|
|
35
|
+
"init wizard gate checks for PREFERENCES.md, not just .gsd/ existence (#2942)",
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
assertTrue(
|
|
39
|
+
afterSmartEntry.includes("milestones"),
|
|
40
|
+
"init wizard gate checks for milestones/ directory, not just .gsd/ existence (#2942)",
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
// The init wizard should be shown when .gsd/ exists but has no bootstrap artifacts.
|
|
44
|
+
// The old code was: if (!existsSync(gsdRoot(basePath))) { ... showProjectInit ... }
|
|
45
|
+
// The fix should use a compound check so zombie states trigger the wizard.
|
|
46
|
+
// Verify we no longer have the bare existence check as the sole gate.
|
|
47
|
+
|
|
48
|
+
// Find the specific init wizard gate pattern — the detection preamble block.
|
|
49
|
+
const detectionPreambleIdx = afterSmartEntry.indexOf("Detection preamble");
|
|
50
|
+
const detectionRegion = detectionPreambleIdx >= 0
|
|
51
|
+
? afterSmartEntry.slice(detectionPreambleIdx, detectionPreambleIdx + 600)
|
|
52
|
+
: afterSmartEntry.slice(0, 1500);
|
|
53
|
+
|
|
54
|
+
// The gate condition must reference PREFERENCES.md or milestones (bootstrap artifacts)
|
|
55
|
+
assertMatch(
|
|
56
|
+
detectionRegion,
|
|
57
|
+
/PREFERENCES\.md|milestones/,
|
|
58
|
+
"detection preamble gate references bootstrap artifacts, not just directory existence (#2942)",
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
// ── auto-start.ts — milestones/ dir creation must not be dead code ──────────
|
|
62
|
+
|
|
63
|
+
console.log("\n=== #2942: auto-start milestones/ bootstrap not dead code ===");
|
|
64
|
+
|
|
65
|
+
const autoStartSrc = readFileSync(
|
|
66
|
+
join(import.meta.dirname, "..", "auto-start.ts"),
|
|
67
|
+
"utf-8",
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
// After ensureGsdSymlink, the code that creates milestones/ must check for
|
|
71
|
+
// the milestones directory specifically (not .gsd/ which ensureGsdSymlink already created).
|
|
72
|
+
const symlinkIdx = autoStartSrc.indexOf("ensureGsdSymlink(base)");
|
|
73
|
+
assertTrue(symlinkIdx >= 0, "auto-start.ts calls ensureGsdSymlink(base)");
|
|
74
|
+
|
|
75
|
+
const afterSymlink = symlinkIdx >= 0 ? autoStartSrc.slice(symlinkIdx, symlinkIdx + 800) : "";
|
|
76
|
+
|
|
77
|
+
// The milestones bootstrap must check milestones path, not gsdDir
|
|
78
|
+
// Old (dead) code: if (!existsSync(gsdDir)) { mkdirSync(join(gsdDir, "milestones"), ...) }
|
|
79
|
+
// Fixed code should check: if (!existsSync(milestonesPath)) or similar
|
|
80
|
+
assertTrue(
|
|
81
|
+
afterSymlink.includes("milestones") && afterSymlink.includes("mkdirSync"),
|
|
82
|
+
"auto-start.ts creates milestones/ directory after ensureGsdSymlink (#2942)",
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
// The guard for milestones/ creation should NOT be `!existsSync(gsdDir)` —
|
|
86
|
+
// that's dead code since ensureGsdSymlink already created gsdDir.
|
|
87
|
+
// It should check for the milestones/ dir directly.
|
|
88
|
+
const mkdirRegion = afterSymlink.slice(0, afterSymlink.indexOf("mkdirSync") + 200);
|
|
89
|
+
assertMatch(
|
|
90
|
+
mkdirRegion,
|
|
91
|
+
/existsSync\([^)]*milestones/,
|
|
92
|
+
"milestones bootstrap checks milestones path existence, not .gsd/ (#2942)",
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
report();
|