gsd-pi 2.58.0 → 2.59.0-dev.023bd39
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 +60 -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/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 +17 -2
- 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 +199 -12
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +32 -0
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +80 -8
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +42 -34
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +66 -12
- 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/codebase-generator.js +279 -0
- package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
- package/dist/resources/extensions/gsd/commands-codebase.js +115 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +41 -4
- package/dist/resources/extensions/gsd/complexity-classifier.js +8 -6
- package/dist/resources/extensions/gsd/db-writer.js +116 -8
- package/dist/resources/extensions/gsd/doctor-git-checks.js +76 -1
- package/dist/resources/extensions/gsd/doctor-proactive.js +34 -1
- 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 +12 -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 +105 -2
- package/dist/resources/extensions/gsd/gitignore.js +33 -0
- package/dist/resources/extensions/gsd/gsd-db.js +36 -9
- 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 +39 -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/parsers-legacy.js +20 -3
- package/dist/resources/extensions/gsd/paths.js +45 -0
- package/dist/resources/extensions/gsd/preferences-models.js +14 -1
- package/dist/resources/extensions/gsd/preferences-types.js +3 -1
- package/dist/resources/extensions/gsd/preferences.js +13 -16
- 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/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 +14 -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/watch/header-renderer.js +241 -0
- 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/search-the-web/url-utils.js +17 -0
- package/dist/resources/extensions/shared/interview-ui.js +11 -1
- package/dist/resources/skills/btw/SKILL.md +42 -0
- 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/security-overrides.d.ts +11 -0
- package/dist/security-overrides.js +41 -0
- 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 +14 -14
- 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 +4 -4
- 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 +14 -14
- 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-61d3afac6d0f0ce7.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/dist/welcome-screen.d.ts +1 -0
- package/dist/welcome-screen.js +32 -6
- package/package.json +2 -2
- package/packages/daemon/src/daemon.ts +1 -1
- package/packages/daemon/src/discord-bot.ts +11 -0
- package/packages/daemon/src/event-bridge.ts +15 -9
- package/packages/daemon/src/event-formatter.ts +30 -2
- 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/resolve-config-value.d.ts +8 -0
- package/packages/pi-coding-agent/dist/core/resolve-config-value.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resolve-config-value.js +23 -2
- package/packages/pi-coding-agent/dist/core/resolve-config-value.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +89 -2
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.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/settings-manager-security.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/settings-manager-security.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/settings-manager-security.test.js +83 -0
- package/packages/pi-coding-agent/dist/core/settings-manager-security.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +14 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +36 -3
- package/packages/pi-coding-agent/dist/core/settings-manager.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 +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 +3 -2
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +2 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/armin.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/armin.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js +9 -8
- package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +0 -3
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +2 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bordered-loader.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bordered-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js +5 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js +4 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js +4 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +2 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +8 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js +4 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +26 -12
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js +4 -4
- package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +46 -14
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js +2 -8
- package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js +4 -4
- package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +2 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +8 -3
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js +3 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.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 +19 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +22 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +122 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +57 -4
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.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/resolve-config-value.test.ts +111 -1
- package/packages/pi-coding-agent/src/core/resolve-config-value.ts +26 -2
- 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/settings-manager-security.test.ts +102 -0
- package/packages/pi-coding-agent/src/core/settings-manager.ts +44 -3
- 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 +11 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/armin.ts +9 -9
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +0 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +3 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/bordered-loader.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/branch-summary-message.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/config-selector.ts +7 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/countdown-timer.ts +3 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/custom-message.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.ts +4 -3
- package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +2 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +3 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/extension-input.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/extension-selector.ts +4 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +27 -13
- package/packages/pi-coding-agent/src/modes/interactive/components/oauth-selector.ts +4 -4
- package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +45 -14
- package/packages/pi-coding-agent/src/modes/interactive/components/scoped-models-selector.ts +2 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/session-selector.ts +4 -4
- package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +2 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +8 -3
- package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.ts +3 -2
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +24 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +156 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +21 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +73 -3
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +1 -1
- 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/dist/modes/interactive/theme/themes.js +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- 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/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 +18 -2
- 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 +193 -9
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +31 -0
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +85 -8
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +38 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +41 -35
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +72 -12
- 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/codebase-generator.ts +351 -0
- package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
- package/src/resources/extensions/gsd/commands-codebase.ts +164 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +46 -4
- package/src/resources/extensions/gsd/complexity-classifier.ts +8 -6
- package/src/resources/extensions/gsd/db-writer.ts +140 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +75 -1
- package/src/resources/extensions/gsd/doctor-proactive.ts +35 -1
- 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-types.ts +2 -0
- package/src/resources/extensions/gsd/doctor.ts +3 -1
- package/src/resources/extensions/gsd/error-classifier.ts +13 -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 +119 -3
- package/src/resources/extensions/gsd/gitignore.ts +33 -0
- package/src/resources/extensions/gsd/gsd-db.ts +43 -7
- 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 +41 -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/parsers-legacy.ts +22 -3
- package/src/resources/extensions/gsd/paths.ts +44 -0
- package/src/resources/extensions/gsd/preferences-models.ts +14 -1
- package/src/resources/extensions/gsd/preferences-types.ts +10 -1
- package/src/resources/extensions/gsd/preferences.ts +13 -15
- 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/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 +29 -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/codebase-generator.test.ts +488 -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/complexity-classifier.test.ts +4 -4
- 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/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 +134 -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/doctor-git.test.ts +72 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +68 -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/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/project-relocation-recovery.test.ts +297 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +29 -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/terminated-transient.test.ts +44 -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 +4 -1
- 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-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 +20 -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/watch/header-renderer.ts +275 -0
- 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/search-the-web/url-utils.ts +19 -0
- 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/btw/SKILL.md +42 -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.8b732f67a11b11b4.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/{IoheXIe-5DH7ieX8AUo8U → QlWL-8CXgQpzV3ehkNMzh}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{IoheXIe-5DH7ieX8AUo8U → QlWL-8CXgQpzV3ehkNMzh}/_ssgManifest.js +0 -0
|
@@ -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();
|
|
@@ -30,7 +30,7 @@ import { checkOwnership, taskUnitKey } from "../unit-ownership.js";
|
|
|
30
30
|
import { saveFile, clearParseCache } from "../files.js";
|
|
31
31
|
import { invalidateStateCache } from "../state.js";
|
|
32
32
|
import { renderPlanCheckboxes } from "../markdown-renderer.js";
|
|
33
|
-
import { renderAllProjections } from "../workflow-projections.js";
|
|
33
|
+
import { renderAllProjections, renderSummaryContent } from "../workflow-projections.js";
|
|
34
34
|
import { writeManifest } from "../workflow-manifest.js";
|
|
35
35
|
import { appendEvent } from "../workflow-events.js";
|
|
36
36
|
|
|
@@ -41,79 +41,40 @@ export interface CompleteTaskResult {
|
|
|
41
41
|
summaryPath: string;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
+
import type { TaskRow } from "../gsd-db.js";
|
|
45
|
+
|
|
44
46
|
/**
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
+
* Build a TaskRow-shaped object from CompleteTaskParams so the unified
|
|
48
|
+
* renderSummaryContent() can be used at completion time (#2720).
|
|
47
49
|
*/
|
|
48
|
-
function
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
:
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
:
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
params.
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
id: ${params.taskId}
|
|
77
|
-
parent: ${params.sliceId}
|
|
78
|
-
milestone: ${params.milestoneId}
|
|
79
|
-
key_files:
|
|
80
|
-
${keyFilesYaml}
|
|
81
|
-
key_decisions:
|
|
82
|
-
${keyDecisionsYaml}
|
|
83
|
-
duration: ""
|
|
84
|
-
verification_result: ${verificationResult}
|
|
85
|
-
completed_at: ${now}
|
|
86
|
-
blocker_discovered: ${params.blockerDiscovered}
|
|
87
|
-
---
|
|
88
|
-
|
|
89
|
-
# ${params.taskId}: ${title}
|
|
90
|
-
|
|
91
|
-
**${params.oneLiner}**
|
|
92
|
-
|
|
93
|
-
## What Happened
|
|
94
|
-
|
|
95
|
-
${params.narrative}
|
|
96
|
-
|
|
97
|
-
## Verification
|
|
98
|
-
|
|
99
|
-
${params.verification}
|
|
100
|
-
|
|
101
|
-
## Verification Evidence
|
|
102
|
-
|
|
103
|
-
${evidenceTable}
|
|
104
|
-
|
|
105
|
-
## Deviations
|
|
106
|
-
|
|
107
|
-
${params.deviations || "None."}
|
|
108
|
-
|
|
109
|
-
## Known Issues
|
|
110
|
-
|
|
111
|
-
${params.knownIssues || "None."}
|
|
112
|
-
|
|
113
|
-
## Files Created/Modified
|
|
114
|
-
|
|
115
|
-
${params.keyFiles.map(f => `- \`${f}\``).join("\n") || "None."}
|
|
116
|
-
`;
|
|
50
|
+
function paramsToTaskRow(params: CompleteTaskParams, completedAt: string): TaskRow {
|
|
51
|
+
return {
|
|
52
|
+
milestone_id: params.milestoneId,
|
|
53
|
+
slice_id: params.sliceId,
|
|
54
|
+
id: params.taskId,
|
|
55
|
+
title: params.oneLiner || params.taskId,
|
|
56
|
+
status: "complete",
|
|
57
|
+
one_liner: params.oneLiner,
|
|
58
|
+
narrative: params.narrative,
|
|
59
|
+
verification_result: params.verification,
|
|
60
|
+
duration: "",
|
|
61
|
+
completed_at: completedAt,
|
|
62
|
+
blocker_discovered: params.blockerDiscovered,
|
|
63
|
+
deviations: params.deviations,
|
|
64
|
+
known_issues: params.knownIssues,
|
|
65
|
+
key_files: params.keyFiles,
|
|
66
|
+
key_decisions: params.keyDecisions,
|
|
67
|
+
full_summary_md: "",
|
|
68
|
+
description: "",
|
|
69
|
+
estimate: "",
|
|
70
|
+
files: [],
|
|
71
|
+
verify: "",
|
|
72
|
+
inputs: [],
|
|
73
|
+
expected_output: [],
|
|
74
|
+
observability_impact: "",
|
|
75
|
+
full_plan_md: "",
|
|
76
|
+
sequence: 0,
|
|
77
|
+
};
|
|
117
78
|
}
|
|
118
79
|
|
|
119
80
|
/**
|
|
@@ -218,8 +179,9 @@ export async function handleCompleteTask(
|
|
|
218
179
|
// If disk render fails, roll back the DB status so deriveState() and
|
|
219
180
|
// verifyExpectedArtifact() stay consistent (both say "not done").
|
|
220
181
|
|
|
221
|
-
// Render summary markdown
|
|
222
|
-
const
|
|
182
|
+
// Render summary markdown via the single source of truth (#2720)
|
|
183
|
+
const taskRow = paramsToTaskRow(params, completedAt);
|
|
184
|
+
const summaryMd = renderSummaryContent(taskRow, params.sliceId, params.milestoneId, params.verificationEvidence);
|
|
223
185
|
|
|
224
186
|
// Resolve and write summary to disk
|
|
225
187
|
let summaryPath: string;
|
|
@@ -4,6 +4,7 @@ import { isNonEmptyString, validateStringArray } from "../validation.js";
|
|
|
4
4
|
import {
|
|
5
5
|
transaction,
|
|
6
6
|
getMilestone,
|
|
7
|
+
getMilestoneSlices,
|
|
7
8
|
insertMilestone,
|
|
8
9
|
insertSlice,
|
|
9
10
|
upsertMilestonePlanning,
|
|
@@ -189,6 +190,17 @@ export async function handlePlanMilestone(
|
|
|
189
190
|
return;
|
|
190
191
|
}
|
|
191
192
|
|
|
193
|
+
// Guard: refuse to re-plan a milestone that has completed slices (#2960).
|
|
194
|
+
// INSERT OR IGNORE on slices won't overwrite existing rows, but a full
|
|
195
|
+
// re-plan after worktree recreation or DB resync can create new slice rows
|
|
196
|
+
// that shadow completed work. Block early when any slice is already done.
|
|
197
|
+
const existingSlices = getMilestoneSlices(params.milestoneId);
|
|
198
|
+
const completedSlices = existingSlices.filter(s => isClosedStatus(s.status));
|
|
199
|
+
if (completedSlices.length > 0) {
|
|
200
|
+
guardError = `cannot re-plan milestone ${params.milestoneId}: ${completedSlices.length} slice(s) already completed (${completedSlices.map(s => s.id).join(", ")}). Use gsd_reassess_roadmap to modify the roadmap.`;
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
|
|
192
204
|
// Validate depends_on: all dependencies must exist and be complete
|
|
193
205
|
if (params.dependsOn && params.dependsOn.length > 0) {
|
|
194
206
|
for (const depId of params.dependsOn) {
|
|
@@ -223,7 +235,7 @@ export async function handlePlanMilestone(
|
|
|
223
235
|
definitionOfDone: params.definitionOfDone,
|
|
224
236
|
requirementCoverage: params.requirementCoverage,
|
|
225
237
|
boundaryMapMarkdown: params.boundaryMapMarkdown,
|
|
226
|
-
});
|
|
238
|
+
}, params.title);
|
|
227
239
|
|
|
228
240
|
for (const slice of params.slices) {
|
|
229
241
|
insertSlice({
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { join } from "node:path";
|
|
2
|
+
import { existsSync, unlinkSync } from "node:fs";
|
|
2
3
|
import { clearParseCache } from "../files.js";
|
|
3
4
|
import { isClosedStatus } from "../status-guards.js";
|
|
4
5
|
import { isNonEmptyString } from "../validation.js";
|
|
@@ -10,6 +11,7 @@ import {
|
|
|
10
11
|
insertSlice,
|
|
11
12
|
updateSliceFields,
|
|
12
13
|
insertAssessment,
|
|
14
|
+
deleteAssessmentByScope,
|
|
13
15
|
deleteSlice,
|
|
14
16
|
} from "../gsd-db.js";
|
|
15
17
|
import { invalidateStateCache } from "../state.js";
|
|
@@ -200,6 +202,21 @@ export async function handleReassessRoadmap(
|
|
|
200
202
|
for (const removedId of params.sliceChanges.removed) {
|
|
201
203
|
deleteSlice(params.milestoneId, removedId);
|
|
202
204
|
}
|
|
205
|
+
|
|
206
|
+
// ── Invalidate stale milestone validation (#2957) ──────────────
|
|
207
|
+
// When roadmap structure changes (slices added/modified/removed),
|
|
208
|
+
// any prior milestone-validation verdict is stale. Delete the DB
|
|
209
|
+
// row so deriveState() returns phase: 'validating-milestone' once
|
|
210
|
+
// the new slices complete, rather than advancing directly to
|
|
211
|
+
// 'completing-milestone' with a stale needs-remediation verdict.
|
|
212
|
+
const hasStructuralChanges =
|
|
213
|
+
params.sliceChanges.added.length > 0 ||
|
|
214
|
+
params.sliceChanges.modified.length > 0 ||
|
|
215
|
+
params.sliceChanges.removed.length > 0;
|
|
216
|
+
|
|
217
|
+
if (hasStructuralChanges) {
|
|
218
|
+
deleteAssessmentByScope(params.milestoneId, "milestone-validation");
|
|
219
|
+
}
|
|
203
220
|
});
|
|
204
221
|
} catch (err) {
|
|
205
222
|
return { error: `db write failed: ${(err as Error).message}` };
|
|
@@ -218,6 +235,25 @@ export async function handleReassessRoadmap(
|
|
|
218
235
|
completedSliceId: params.completedSliceId,
|
|
219
236
|
});
|
|
220
237
|
|
|
238
|
+
// ── Remove stale VALIDATION file from disk (#2957) ────────────
|
|
239
|
+
const hasStructuralChanges =
|
|
240
|
+
params.sliceChanges.added.length > 0 ||
|
|
241
|
+
params.sliceChanges.modified.length > 0 ||
|
|
242
|
+
params.sliceChanges.removed.length > 0;
|
|
243
|
+
|
|
244
|
+
if (hasStructuralChanges) {
|
|
245
|
+
const validationFile = join(
|
|
246
|
+
basePath, ".gsd", "milestones", params.milestoneId,
|
|
247
|
+
`${params.milestoneId}-VALIDATION.md`,
|
|
248
|
+
);
|
|
249
|
+
try {
|
|
250
|
+
if (existsSync(validationFile)) unlinkSync(validationFile);
|
|
251
|
+
} catch {
|
|
252
|
+
// Best-effort: DB row is already deleted, so state derivation
|
|
253
|
+
// will not see the file-based verdict as authoritative.
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
221
257
|
// ── Invalidate caches ─────────────────────────────────────────
|
|
222
258
|
invalidateStateCache();
|
|
223
259
|
clearParseCache();
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* validate-milestone handler — the core operation behind gsd_validate_milestone.
|
|
3
3
|
*
|
|
4
|
-
* Persists milestone validation results to the assessments table
|
|
5
|
-
* renders VALIDATION.md to disk, and invalidates caches.
|
|
4
|
+
* Persists milestone validation results to the assessments table and
|
|
5
|
+
* quality_gates table, renders VALIDATION.md to disk, and invalidates caches.
|
|
6
|
+
*
|
|
7
|
+
* #2945 Bug 4: Previously only wrote to assessments — quality_gates records
|
|
8
|
+
* were never persisted, causing M002+ milestones to have zero gate records
|
|
9
|
+
* despite passing validation.
|
|
6
10
|
*/
|
|
7
11
|
|
|
8
12
|
import { join } from "node:path";
|
|
@@ -11,11 +15,13 @@ import {
|
|
|
11
15
|
transaction,
|
|
12
16
|
insertAssessment,
|
|
13
17
|
deleteAssessmentByScope,
|
|
18
|
+
getMilestoneSlices,
|
|
14
19
|
} from "../gsd-db.js";
|
|
15
20
|
import { resolveMilestonePath, clearPathCache } from "../paths.js";
|
|
16
21
|
import { saveFile, clearParseCache } from "../files.js";
|
|
17
22
|
import { invalidateStateCache } from "../state.js";
|
|
18
23
|
import { VALIDATION_VERDICTS, isValidMilestoneVerdict } from "../verdict-parser.js";
|
|
24
|
+
import { insertMilestoneValidationGates } from "../milestone-validation-gates.js";
|
|
19
25
|
|
|
20
26
|
export interface ValidateMilestoneParams {
|
|
21
27
|
milestoneId: string;
|
|
@@ -112,6 +118,18 @@ export async function handleValidateMilestone(
|
|
|
112
118
|
scope: 'milestone-validation',
|
|
113
119
|
fullContent: validationMd,
|
|
114
120
|
});
|
|
121
|
+
|
|
122
|
+
// #2945 Bug 4: persist quality_gates records alongside the assessment.
|
|
123
|
+
// Previously only the assessment was written, leaving M002+ milestones
|
|
124
|
+
// with zero quality_gate records despite passing validation.
|
|
125
|
+
const slices = getMilestoneSlices(params.milestoneId);
|
|
126
|
+
const sliceId = slices.length > 0 ? slices[0].id : "_milestone";
|
|
127
|
+
insertMilestoneValidationGates(
|
|
128
|
+
params.milestoneId,
|
|
129
|
+
sliceId,
|
|
130
|
+
params.verdict,
|
|
131
|
+
validatedAt,
|
|
132
|
+
);
|
|
115
133
|
});
|
|
116
134
|
|
|
117
135
|
// ── Filesystem render (outside transaction) ────────────────────────────
|
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
loadActionableCaptures,
|
|
23
23
|
markCaptureResolved,
|
|
24
24
|
markCaptureExecuted,
|
|
25
|
+
stampCaptureMilestone,
|
|
25
26
|
} from "./captures.js";
|
|
26
27
|
|
|
27
28
|
// ─── Resolution Executors ─────────────────────────────────────────────────────
|
|
@@ -271,11 +272,15 @@ export function buildQuickTaskPrompt(capture: CaptureEntry): string {
|
|
|
271
272
|
``,
|
|
272
273
|
`## Instructions`,
|
|
273
274
|
``,
|
|
274
|
-
`1.
|
|
275
|
-
`
|
|
276
|
-
`
|
|
277
|
-
`
|
|
278
|
-
`
|
|
275
|
+
`1. **Verify the issue still exists.** Before making any changes, inspect the`,
|
|
276
|
+
` relevant code to confirm the problem described above is actually present in`,
|
|
277
|
+
` the current codebase. If the issue has already been fixed (e.g., by planned`,
|
|
278
|
+
` milestone work), report "Already resolved — no changes needed." and stop.`,
|
|
279
|
+
`2. Execute this task as a small, self-contained change.`,
|
|
280
|
+
`3. Do NOT modify any \`.gsd/\` plan files — this is a one-off, not a planned task.`,
|
|
281
|
+
`4. Commit your changes with a descriptive message.`,
|
|
282
|
+
`5. Keep changes minimal and focused on the capture text.`,
|
|
283
|
+
`6. When done, say: "Quick task complete."`,
|
|
279
284
|
].join("\n");
|
|
280
285
|
}
|
|
281
286
|
|
|
@@ -324,7 +329,19 @@ export function executeTriageResolutions(
|
|
|
324
329
|
actions: [],
|
|
325
330
|
};
|
|
326
331
|
|
|
327
|
-
const actionable = loadActionableCaptures(basePath);
|
|
332
|
+
const actionable = loadActionableCaptures(basePath, mid || undefined);
|
|
333
|
+
|
|
334
|
+
// Reconciliation: stamp actionable captures that are missing the Milestone field
|
|
335
|
+
// with the current milestone ID. This covers captures resolved by the triage LLM
|
|
336
|
+
// before the prompt included the Milestone instruction, and acts as a safety net
|
|
337
|
+
// when the LLM omits the field (#2872).
|
|
338
|
+
if (mid) {
|
|
339
|
+
for (const capture of actionable) {
|
|
340
|
+
if (!capture.resolvedInMilestone) {
|
|
341
|
+
stampCaptureMilestone(basePath, capture.id, mid);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
328
345
|
|
|
329
346
|
// Also process deferred captures that target milestone IDs — create
|
|
330
347
|
// milestone directories so deriveState() discovers them.
|
|
@@ -249,6 +249,8 @@ export interface GSDState {
|
|
|
249
249
|
slices?: { done: number; total: number };
|
|
250
250
|
tasks?: { done: number; total: number };
|
|
251
251
|
};
|
|
252
|
+
/** When phase=complete, holds the last completed milestone (instead of activeMilestone). */
|
|
253
|
+
lastCompletedMilestone?: ActiveRef | null;
|
|
252
254
|
}
|
|
253
255
|
|
|
254
256
|
// ─── Post-Unit Hook Types ─────────────────────────────────────────────────
|
|
@@ -563,8 +565,8 @@ export interface CompleteSliceParams {
|
|
|
563
565
|
|
|
564
566
|
// ─── Quality Gates ───────────────────────────────────────────────────────
|
|
565
567
|
|
|
566
|
-
export type GateId = "Q3" | "Q4" | "Q5" | "Q6" | "Q7" | "Q8";
|
|
567
|
-
export type GateScope = "slice" | "task";
|
|
568
|
+
export type GateId = "Q3" | "Q4" | "Q5" | "Q6" | "Q7" | "Q8" | "MV01" | "MV02" | "MV03" | "MV04";
|
|
569
|
+
export type GateScope = "slice" | "task" | "milestone";
|
|
568
570
|
export type GateStatus = "pending" | "complete" | "omitted";
|
|
569
571
|
export type GateVerdict = "pass" | "flag" | "omitted" | "";
|
|
570
572
|
|