gsd-pi 2.63.0 → 2.64.0-dev.1a85e85
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 +46 -134
- package/dist/cli.js +48 -6
- package/dist/headless-query.js +11 -1
- package/dist/help-text.js +4 -1
- package/dist/onboarding.js +15 -8
- package/dist/resource-loader.js +18 -3
- package/dist/resources/extensions/cmux/index.js +21 -12
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +27 -0
- package/dist/resources/extensions/gsd/auto/finalize-timeout.js +40 -0
- package/dist/resources/extensions/gsd/auto/loop.js +4 -0
- package/dist/resources/extensions/gsd/auto/phases.js +157 -22
- package/dist/resources/extensions/gsd/auto/session.js +12 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +14 -8
- package/dist/resources/extensions/gsd/auto-model-selection.js +32 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +222 -11
- package/dist/resources/extensions/gsd/auto-prompts.js +25 -0
- package/dist/resources/extensions/gsd/auto-recovery.js +15 -7
- package/dist/resources/extensions/gsd/auto-start.js +10 -21
- package/dist/resources/extensions/gsd/auto-timers.js +2 -1
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +17 -0
- package/dist/resources/extensions/gsd/auto-verification.js +138 -1
- package/dist/resources/extensions/gsd/auto-worktree.js +13 -7
- package/dist/resources/extensions/gsd/auto.js +24 -2
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +147 -75
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +13 -0
- package/dist/resources/extensions/gsd/bootstrap/notify-interceptor.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +85 -0
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +3 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +40 -1
- package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +15 -0
- package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +54 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +50 -2
- package/dist/resources/extensions/gsd/commands/catalog.js +7 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -0
- package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +103 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +9 -4
- package/dist/resources/extensions/gsd/constants.js +42 -0
- package/dist/resources/extensions/gsd/db-writer.js +72 -4
- package/dist/resources/extensions/gsd/forensics.js +20 -4
- package/dist/resources/extensions/gsd/gsd-db.js +64 -17
- package/dist/resources/extensions/gsd/guided-flow.js +19 -0
- package/dist/resources/extensions/gsd/metrics.js +27 -1
- package/dist/resources/extensions/gsd/native-git-bridge.js +5 -3
- package/dist/resources/extensions/gsd/notification-overlay.js +224 -0
- package/dist/resources/extensions/gsd/notification-store.js +268 -0
- package/dist/resources/extensions/gsd/notification-widget.js +56 -0
- package/dist/resources/extensions/gsd/post-execution-checks.js +407 -0
- package/dist/resources/extensions/gsd/pre-execution-checks.js +464 -0
- package/dist/resources/extensions/gsd/preferences-types.js +6 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +33 -0
- package/dist/resources/extensions/gsd/preferences.js +11 -2
- package/dist/resources/extensions/gsd/prompt-loader.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +2 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -0
- package/dist/resources/extensions/gsd/prompts/doctor-heal.md +1 -0
- package/dist/resources/extensions/gsd/prompts/forensics.md +2 -0
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +2 -0
- package/dist/resources/extensions/gsd/prompts/system.md +4 -7
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -0
- package/dist/resources/extensions/gsd/roadmap-mutations.js +1 -1
- package/dist/resources/extensions/gsd/roadmap-slices.js +9 -5
- package/dist/resources/extensions/gsd/safety/content-validator.js +73 -0
- package/dist/resources/extensions/gsd/safety/destructive-guard.js +34 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +109 -0
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +83 -0
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +71 -0
- package/dist/resources/extensions/gsd/safety/git-checkpoint.js +91 -0
- package/dist/resources/extensions/gsd/safety/safety-harness.js +64 -0
- package/dist/resources/extensions/gsd/slice-parallel-conflict.js +67 -0
- package/dist/resources/extensions/gsd/slice-parallel-eligibility.js +51 -0
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +378 -0
- package/dist/resources/extensions/gsd/state.js +74 -14
- package/dist/resources/extensions/gsd/status-guards.js +11 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +17 -12
- package/dist/resources/extensions/gsd/tools/complete-slice.js +40 -26
- package/dist/resources/extensions/gsd/tools/complete-task.js +12 -12
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +33 -25
- package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -8
- package/dist/resources/extensions/gsd/verification-evidence.js +18 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +8 -0
- package/dist/resources/extensions/gsd/workflow-projections.js +21 -5
- package/dist/resources/extensions/gsd/worktree-manager.js +82 -29
- package/dist/resources/extensions/gsd/worktree-resolver.js +4 -3
- package/dist/resources/extensions/mcp-client/auth.js +101 -0
- package/dist/resources/extensions/mcp-client/index.js +10 -1
- package/dist/resources/extensions/ollama/index.js +28 -22
- package/dist/resources/extensions/ollama/model-capabilities.js +37 -34
- package/dist/resources/extensions/ollama/ndjson-stream.js +54 -0
- package/dist/resources/extensions/ollama/ollama-chat-provider.js +380 -0
- package/dist/resources/extensions/ollama/ollama-client.js +23 -32
- package/dist/resources/extensions/ollama/ollama-discovery.js +2 -7
- package/dist/resources/extensions/ollama/ollama-tool.js +62 -0
- package/dist/resources/extensions/ollama/thinking-parser.js +104 -0
- package/dist/update-cmd.js +4 -2
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +19 -18
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/required-server-files.json +4 -4
- package/dist/web/standalone/.next/routes-manifest.json +6 -0
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- 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 +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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/notifications/route.js +3 -0
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -0
- package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -0
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.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.js.nft.json +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.js.nft.json +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 +4 -4
- 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 +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- 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 +19 -18
- package/dist/web/standalone/.next/server/chunks/6897.js +12 -0
- package/dist/web/standalone/.next/server/chunks/7471.js +3 -3
- package/dist/web/standalone/.next/server/functions-config-manifest.json +1 -0
- package/dist/web/standalone/.next/server/middleware-build-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/app/_global-error/page-8805a20e15762c3c.js +1 -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/api/boot/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/experimental/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/notifications/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-8805a20e15762c3c.js +1 -0
- 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/app-error-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-8805a20e15762c3c.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/next/dist/client/components/builtin/not-found-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/ffabZXz8JdN3EzX9EKt-R/_buildManifest.js +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/welcome-screen.js +1 -1
- package/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.d.ts +8 -0
- package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +70 -3
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.test.ts +317 -5
- package/packages/pi-agent-core/src/agent-loop.ts +90 -6
- package/packages/pi-ai/dist/types.d.ts +16 -1
- 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/src/types.ts +18 -1
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +38 -0
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -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 +11 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +9 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +50 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +41 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +7 -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 +31 -4
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.test.js +28 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/provider-registration.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/extensions/provider-registration.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/provider-registration.test.js +46 -0
- package/packages/pi-coding-agent/dist/core/extensions/provider-registration.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +12 -0
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +3 -3
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js +24 -0
- package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +23 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +84 -57
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +9 -0
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +64 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +10 -0
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +53 -0
- package/packages/pi-coding-agent/src/core/auth-storage.ts +66 -1
- package/packages/pi-coding-agent/src/core/extensions/loader.test.ts +39 -1
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +34 -4
- package/packages/pi-coding-agent/src/core/extensions/provider-registration.test.ts +81 -0
- package/packages/pi-coding-agent/src/core/extensions/types.ts +2 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +14 -0
- package/packages/pi-coding-agent/src/core/model-resolver.ts +3 -3
- package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +42 -0
- package/packages/pi-coding-agent/src/core/resource-loader.ts +94 -57
- package/packages/pi-coding-agent/src/core/sdk.ts +10 -0
- package/pkg/package.json +1 -1
- package/src/resources/extensions/cmux/index.ts +18 -12
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +27 -0
- package/src/resources/extensions/gsd/auto/finalize-timeout.ts +46 -0
- package/src/resources/extensions/gsd/auto/loop.ts +5 -0
- package/src/resources/extensions/gsd/auto/phases.ts +194 -33
- package/src/resources/extensions/gsd/auto/session.ts +14 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +16 -7
- package/src/resources/extensions/gsd/auto-model-selection.ts +36 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +263 -12
- package/src/resources/extensions/gsd/auto-prompts.ts +21 -0
- package/src/resources/extensions/gsd/auto-recovery.ts +9 -8
- package/src/resources/extensions/gsd/auto-start.ts +11 -20
- package/src/resources/extensions/gsd/auto-timers.ts +2 -1
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
- package/src/resources/extensions/gsd/auto-verification.ts +190 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +14 -6
- package/src/resources/extensions/gsd/auto.ts +26 -1
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +160 -88
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +15 -0
- package/src/resources/extensions/gsd/bootstrap/notify-interceptor.ts +34 -0
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +98 -0
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +4 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +44 -1
- package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +19 -0
- package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +57 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +59 -2
- package/src/resources/extensions/gsd/commands/catalog.ts +7 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -0
- package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +139 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +10 -4
- package/src/resources/extensions/gsd/constants.ts +44 -0
- package/src/resources/extensions/gsd/db-writer.ts +78 -4
- package/src/resources/extensions/gsd/forensics.ts +21 -5
- package/src/resources/extensions/gsd/gsd-db.ts +64 -17
- package/src/resources/extensions/gsd/guided-flow.ts +22 -0
- package/src/resources/extensions/gsd/metrics.ts +28 -1
- package/src/resources/extensions/gsd/native-git-bridge.ts +5 -3
- package/src/resources/extensions/gsd/notification-overlay.ts +267 -0
- package/src/resources/extensions/gsd/notification-store.ts +288 -0
- package/src/resources/extensions/gsd/notification-widget.ts +68 -0
- package/src/resources/extensions/gsd/post-execution-checks.ts +539 -0
- package/src/resources/extensions/gsd/pre-execution-checks.ts +573 -0
- package/src/resources/extensions/gsd/preferences-types.ts +44 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +33 -0
- package/src/resources/extensions/gsd/preferences.ts +13 -2
- package/src/resources/extensions/gsd/prompt-loader.ts +8 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +2 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -0
- package/src/resources/extensions/gsd/prompts/doctor-heal.md +1 -0
- package/src/resources/extensions/gsd/prompts/forensics.md +2 -0
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +2 -0
- package/src/resources/extensions/gsd/prompts/system.md +4 -7
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -0
- package/src/resources/extensions/gsd/roadmap-mutations.ts +1 -1
- package/src/resources/extensions/gsd/roadmap-slices.ts +10 -5
- package/src/resources/extensions/gsd/safety/content-validator.ts +98 -0
- package/src/resources/extensions/gsd/safety/destructive-guard.ts +49 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +151 -0
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +120 -0
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +108 -0
- package/src/resources/extensions/gsd/safety/git-checkpoint.ts +106 -0
- package/src/resources/extensions/gsd/safety/safety-harness.ts +105 -0
- package/src/resources/extensions/gsd/slice-parallel-conflict.ts +86 -0
- package/src/resources/extensions/gsd/slice-parallel-eligibility.ts +73 -0
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +477 -0
- package/src/resources/extensions/gsd/state.ts +67 -12
- package/src/resources/extensions/gsd/status-guards.ts +13 -0
- package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +288 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +34 -13
- package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/cmux.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/complete-slice-string-coercion.test.ts +211 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/dashboard-model-label-ordering.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +109 -0
- package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +13 -9
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +134 -0
- package/src/resources/extensions/gsd/tests/deferred-slice-dispatch.test.ts +203 -0
- package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +130 -0
- package/src/resources/extensions/gsd/tests/doctor-fix-flag.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +526 -0
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/git-checkpoint.test.ts +94 -0
- package/src/resources/extensions/gsd/tests/insert-slice-no-wipe.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +27 -7
- package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/metrics.test.ts +116 -1
- package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +201 -0
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +249 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +82 -18
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +312 -0
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +813 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +999 -0
- package/src/resources/extensions/gsd/tests/pre-execution-fail-closed.test.ts +266 -0
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +457 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/shared-wal.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/slice-parallel-conflict.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/slice-parallel-eligibility.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +83 -0
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +349 -0
- package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +35 -2
- package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +148 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +34 -20
- package/src/resources/extensions/gsd/tools/complete-slice.ts +41 -26
- package/src/resources/extensions/gsd/tools/complete-task.ts +12 -12
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +55 -30
- package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -8
- package/src/resources/extensions/gsd/types.ts +44 -22
- package/src/resources/extensions/gsd/verification-evidence.ts +68 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +15 -1
- package/src/resources/extensions/gsd/workflow-projections.ts +23 -5
- package/src/resources/extensions/gsd/worktree-manager.ts +76 -28
- package/src/resources/extensions/gsd/worktree-resolver.ts +4 -3
- package/src/resources/extensions/mcp-client/auth.ts +149 -0
- package/src/resources/extensions/mcp-client/index.ts +16 -1
- package/src/resources/extensions/ollama/index.ts +26 -25
- package/src/resources/extensions/ollama/model-capabilities.ts +41 -34
- package/src/resources/extensions/ollama/ndjson-stream.ts +63 -0
- package/src/resources/extensions/ollama/ollama-auth-mode.test.ts +20 -0
- package/src/resources/extensions/ollama/ollama-chat-provider.ts +459 -0
- package/src/resources/extensions/ollama/ollama-client.ts +30 -30
- package/src/resources/extensions/ollama/ollama-discovery.ts +5 -8
- package/src/resources/extensions/ollama/ollama-tool.ts +69 -0
- package/src/resources/extensions/ollama/tests/ollama-chat-provider-stream.test.ts +82 -0
- package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +0 -27
- package/src/resources/extensions/ollama/thinking-parser.ts +116 -0
- package/src/resources/extensions/ollama/types.ts +23 -0
- package/dist/web/standalone/.next/server/chunks/2229.js +0 -12
- package/dist/web/standalone/.next/static/5FLUBNdqolRyyehCyChPd/_buildManifest.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/_global-error/page-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/boot/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/experimental/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-c4cc189e7b117ea2.js +0 -1
- 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/app-error-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-c4cc189e7b117ea2.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/chunks/next/dist/client/components/builtin/not-found-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-c4cc189e7b117ea2.js +0 -1
- /package/dist/web/standalone/.next/static/{5FLUBNdqolRyyehCyChPd → ffabZXz8JdN3EzX9EKt-R}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pre-execution-pause-wiring.test.ts — Integration tests for pre-execution check → pauseAuto wiring.
|
|
3
|
+
*
|
|
4
|
+
* Tests that verify the control flow from pre-execution checks through to pauseAuto:
|
|
5
|
+
* 1. When runPreExecutionChecks returns status: "fail" with blocking: true, pauseAuto is called
|
|
6
|
+
* 2. When enhanced_verification_strict: true and status: "warn", pauseAuto is also called
|
|
7
|
+
*
|
|
8
|
+
* These are integration-level tests that exercise the actual postUnitPostVerification function
|
|
9
|
+
* with controlled mocks for external dependencies.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { describe, test, mock, beforeEach, afterEach } from "node:test";
|
|
13
|
+
import assert from "node:assert/strict";
|
|
14
|
+
import { tmpdir } from "node:os";
|
|
15
|
+
import { mkdirSync, writeFileSync, rmSync } from "node:fs";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
|
|
18
|
+
import { postUnitPostVerification, type PostUnitContext } from "../auto-post-unit.ts";
|
|
19
|
+
import { AutoSession } from "../auto/session.ts";
|
|
20
|
+
import { openDatabase, closeDatabase, insertMilestone, insertSlice, insertTask } from "../gsd-db.ts";
|
|
21
|
+
import { invalidateAllCaches } from "../cache.ts";
|
|
22
|
+
import { _clearGsdRootCache } from "../paths.ts";
|
|
23
|
+
|
|
24
|
+
// ─── Test Fixtures ───────────────────────────────────────────────────────────
|
|
25
|
+
|
|
26
|
+
let tempDir: string;
|
|
27
|
+
let dbPath: string;
|
|
28
|
+
let originalCwd: string;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Create a minimal mock ExtensionContext.
|
|
32
|
+
*/
|
|
33
|
+
function makeMockCtx() {
|
|
34
|
+
return {
|
|
35
|
+
ui: {
|
|
36
|
+
notify: mock.fn(),
|
|
37
|
+
setStatus: () => {},
|
|
38
|
+
setWidget: () => {},
|
|
39
|
+
setFooter: () => {},
|
|
40
|
+
},
|
|
41
|
+
model: { id: "test-model" },
|
|
42
|
+
} as any;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Create a minimal mock ExtensionAPI.
|
|
47
|
+
*/
|
|
48
|
+
function makeMockPi() {
|
|
49
|
+
return {
|
|
50
|
+
sendMessage: mock.fn(),
|
|
51
|
+
setModel: mock.fn(async () => true),
|
|
52
|
+
} as any;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Create a minimal AutoSession for testing.
|
|
57
|
+
*/
|
|
58
|
+
function makeMockSession(basePath: string, currentUnit?: { type: string; id: string }): AutoSession {
|
|
59
|
+
const s = new AutoSession();
|
|
60
|
+
s.basePath = basePath;
|
|
61
|
+
s.active = true;
|
|
62
|
+
if (currentUnit) {
|
|
63
|
+
s.currentUnit = {
|
|
64
|
+
type: currentUnit.type,
|
|
65
|
+
id: currentUnit.id,
|
|
66
|
+
startedAt: Date.now(),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
return s;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Create a PostUnitContext with a mockable pauseAuto.
|
|
74
|
+
*/
|
|
75
|
+
function makePostUnitContext(
|
|
76
|
+
s: AutoSession,
|
|
77
|
+
ctx: ReturnType<typeof makeMockCtx>,
|
|
78
|
+
pi: ReturnType<typeof makeMockPi>,
|
|
79
|
+
pauseAutoMock: ReturnType<typeof mock.fn>,
|
|
80
|
+
): PostUnitContext {
|
|
81
|
+
return {
|
|
82
|
+
s,
|
|
83
|
+
ctx,
|
|
84
|
+
pi,
|
|
85
|
+
buildSnapshotOpts: () => ({}),
|
|
86
|
+
lockBase: () => tempDir,
|
|
87
|
+
stopAuto: mock.fn(async () => {}) as unknown as PostUnitContext["stopAuto"],
|
|
88
|
+
pauseAuto: pauseAutoMock as unknown as PostUnitContext["pauseAuto"],
|
|
89
|
+
updateProgressWidget: () => {},
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Set up a temp directory with GSD structure and DB.
|
|
95
|
+
* Also changes cwd so preferences loading finds the right PREFERENCES.md.
|
|
96
|
+
*/
|
|
97
|
+
function setupTestEnvironment(): void {
|
|
98
|
+
// Save original cwd so we can restore it
|
|
99
|
+
originalCwd = process.cwd();
|
|
100
|
+
|
|
101
|
+
tempDir = join(tmpdir(), `pre-exec-pause-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
102
|
+
mkdirSync(tempDir, { recursive: true });
|
|
103
|
+
|
|
104
|
+
// Create .gsd directory structure
|
|
105
|
+
const gsdDir = join(tempDir, ".gsd");
|
|
106
|
+
mkdirSync(gsdDir, { recursive: true });
|
|
107
|
+
|
|
108
|
+
// Create milestones directory structure
|
|
109
|
+
const milestonesDir = join(gsdDir, "milestones", "M001", "slices", "S01", "tasks");
|
|
110
|
+
mkdirSync(milestonesDir, { recursive: true });
|
|
111
|
+
|
|
112
|
+
// Change cwd so loadEffectiveGSDPreferences finds our PREFERENCES.md
|
|
113
|
+
process.chdir(tempDir);
|
|
114
|
+
|
|
115
|
+
// Clear gsdRoot cache so it finds the new .gsd directory
|
|
116
|
+
_clearGsdRootCache();
|
|
117
|
+
|
|
118
|
+
// Initialize DB
|
|
119
|
+
dbPath = join(gsdDir, "gsd.db");
|
|
120
|
+
openDatabase(dbPath);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Clean up test environment.
|
|
125
|
+
*/
|
|
126
|
+
function cleanupTestEnvironment(): void {
|
|
127
|
+
// Restore original cwd before cleanup
|
|
128
|
+
try {
|
|
129
|
+
process.chdir(originalCwd);
|
|
130
|
+
} catch {
|
|
131
|
+
// Ignore if original cwd doesn't exist
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
try {
|
|
135
|
+
closeDatabase();
|
|
136
|
+
} catch {
|
|
137
|
+
// Ignore close errors
|
|
138
|
+
}
|
|
139
|
+
try {
|
|
140
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
141
|
+
} catch {
|
|
142
|
+
// Ignore cleanup errors
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Create a PREFERENCES.md file with specified preferences.
|
|
148
|
+
* Uses YAML frontmatter format (---\nkey: value\n---).
|
|
149
|
+
* Also invalidates caches so the preferences are re-read.
|
|
150
|
+
*/
|
|
151
|
+
function writePreferences(prefs: Record<string, unknown>): void {
|
|
152
|
+
const yamlLines = Object.entries(prefs).map(([k, v]) => `${k}: ${JSON.stringify(v)}`);
|
|
153
|
+
const prefsContent = `---
|
|
154
|
+
${yamlLines.join("\n")}
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
# GSD Preferences
|
|
158
|
+
`;
|
|
159
|
+
writeFileSync(join(tempDir, ".gsd", "PREFERENCES.md"), prefsContent);
|
|
160
|
+
// Invalidate caches so the new preferences file is found
|
|
161
|
+
invalidateAllCaches();
|
|
162
|
+
_clearGsdRootCache();
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Create tasks in DB that will cause pre-execution checks to fail.
|
|
167
|
+
* A task that references a non-existent file will produce a blocking failure.
|
|
168
|
+
*/
|
|
169
|
+
function createFailingTasks(): void {
|
|
170
|
+
// Insert milestone first
|
|
171
|
+
insertMilestone({ id: "M001" });
|
|
172
|
+
|
|
173
|
+
// Insert slice
|
|
174
|
+
insertSlice({
|
|
175
|
+
id: "S01",
|
|
176
|
+
milestoneId: "M001",
|
|
177
|
+
title: "Test Slice",
|
|
178
|
+
risk: "low",
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
// Create a task that references a file that doesn't exist
|
|
182
|
+
// This will cause checkFilePathConsistency to produce a blocking failure
|
|
183
|
+
insertTask({
|
|
184
|
+
id: "T01",
|
|
185
|
+
sliceId: "S01",
|
|
186
|
+
milestoneId: "M001",
|
|
187
|
+
title: "Task with missing file",
|
|
188
|
+
status: "pending",
|
|
189
|
+
planning: {
|
|
190
|
+
description: "This task references a non-existent file",
|
|
191
|
+
estimate: "1h",
|
|
192
|
+
files: ["nonexistent-file-that-does-not-exist.ts"],
|
|
193
|
+
verify: "npm test",
|
|
194
|
+
inputs: [],
|
|
195
|
+
expectedOutput: [],
|
|
196
|
+
observabilityImpact: "",
|
|
197
|
+
},
|
|
198
|
+
sequence: 0,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Create tasks in DB that will produce only warnings (non-blocking issues).
|
|
204
|
+
* Interface contract mismatches produce warnings, not blocking failures.
|
|
205
|
+
*/
|
|
206
|
+
function createWarningOnlyTasks(): void {
|
|
207
|
+
// Insert milestone first
|
|
208
|
+
insertMilestone({ id: "M001" });
|
|
209
|
+
|
|
210
|
+
// Insert slice
|
|
211
|
+
insertSlice({
|
|
212
|
+
id: "S01",
|
|
213
|
+
milestoneId: "M001",
|
|
214
|
+
title: "Test Slice",
|
|
215
|
+
risk: "low",
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
// Create tasks with interface contract mismatch (produces warn, not fail)
|
|
219
|
+
insertTask({
|
|
220
|
+
id: "T01",
|
|
221
|
+
sliceId: "S01",
|
|
222
|
+
milestoneId: "M001",
|
|
223
|
+
title: "Task 1 with function signature",
|
|
224
|
+
status: "pending",
|
|
225
|
+
planning: {
|
|
226
|
+
description: `
|
|
227
|
+
\`\`\`typescript
|
|
228
|
+
function processData(input: string): boolean
|
|
229
|
+
\`\`\`
|
|
230
|
+
`.trim(),
|
|
231
|
+
estimate: "1h",
|
|
232
|
+
files: [],
|
|
233
|
+
verify: "npm test",
|
|
234
|
+
inputs: [],
|
|
235
|
+
expectedOutput: [],
|
|
236
|
+
observabilityImpact: "",
|
|
237
|
+
},
|
|
238
|
+
sequence: 0,
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
insertTask({
|
|
242
|
+
id: "T02",
|
|
243
|
+
sliceId: "S01",
|
|
244
|
+
milestoneId: "M001",
|
|
245
|
+
title: "Task 2 with mismatched signature",
|
|
246
|
+
status: "pending",
|
|
247
|
+
planning: {
|
|
248
|
+
description: `
|
|
249
|
+
\`\`\`typescript
|
|
250
|
+
function processData(input: number): string
|
|
251
|
+
\`\`\`
|
|
252
|
+
`.trim(),
|
|
253
|
+
estimate: "1h",
|
|
254
|
+
files: [],
|
|
255
|
+
verify: "npm test",
|
|
256
|
+
inputs: [],
|
|
257
|
+
expectedOutput: [],
|
|
258
|
+
observabilityImpact: "",
|
|
259
|
+
},
|
|
260
|
+
sequence: 1,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// ─── Tests ───────────────────────────────────────────────────────────────────
|
|
265
|
+
|
|
266
|
+
describe("Pre-execution checks → pauseAuto wiring", () => {
|
|
267
|
+
beforeEach(() => {
|
|
268
|
+
setupTestEnvironment();
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
afterEach(() => {
|
|
272
|
+
cleanupTestEnvironment();
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
test("pauseAuto is called when pre-execution checks return status: fail with blocking: true", async () => {
|
|
276
|
+
// Set up tasks that will cause a blocking failure
|
|
277
|
+
createFailingTasks();
|
|
278
|
+
|
|
279
|
+
// Create mocks
|
|
280
|
+
const ctx = makeMockCtx();
|
|
281
|
+
const pi = makeMockPi();
|
|
282
|
+
const pauseAutoMock = mock.fn(async () => {});
|
|
283
|
+
const s = makeMockSession(tempDir, { type: "plan-slice", id: "M001/S01" });
|
|
284
|
+
const pctx = makePostUnitContext(s, ctx, pi, pauseAutoMock);
|
|
285
|
+
|
|
286
|
+
// Call postUnitPostVerification
|
|
287
|
+
const result = await postUnitPostVerification(pctx);
|
|
288
|
+
|
|
289
|
+
// Verify pauseAuto was called
|
|
290
|
+
assert.equal(
|
|
291
|
+
pauseAutoMock.mock.callCount(),
|
|
292
|
+
1,
|
|
293
|
+
"pauseAuto should be called exactly once when pre-execution checks fail with blocking issues"
|
|
294
|
+
);
|
|
295
|
+
|
|
296
|
+
// Verify return value is "stopped"
|
|
297
|
+
assert.equal(
|
|
298
|
+
result,
|
|
299
|
+
"stopped",
|
|
300
|
+
"postUnitPostVerification should return 'stopped' when pre-execution checks fail"
|
|
301
|
+
);
|
|
302
|
+
|
|
303
|
+
// Verify UI was notified of the failure
|
|
304
|
+
const notifyCalls = ctx.ui.notify.mock.calls;
|
|
305
|
+
const errorNotify = notifyCalls.find(
|
|
306
|
+
(call: { arguments: unknown[] }) =>
|
|
307
|
+
call.arguments[1] === "error" &&
|
|
308
|
+
String(call.arguments[0]).includes("Pre-execution checks failed")
|
|
309
|
+
);
|
|
310
|
+
assert.ok(errorNotify, "Should show error notification about pre-execution check failure");
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
test("pauseAuto is called when enhanced_verification_strict: true and pre-execution returns warn", async () => {
|
|
314
|
+
// Write preferences with strict mode enabled
|
|
315
|
+
writePreferences({
|
|
316
|
+
enhanced_verification: true,
|
|
317
|
+
enhanced_verification_pre: true,
|
|
318
|
+
enhanced_verification_strict: true,
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
// Set up tasks that will produce only warnings (interface contract mismatch)
|
|
322
|
+
createWarningOnlyTasks();
|
|
323
|
+
|
|
324
|
+
// Create mocks
|
|
325
|
+
const ctx = makeMockCtx();
|
|
326
|
+
const pi = makeMockPi();
|
|
327
|
+
const pauseAutoMock = mock.fn(async () => {});
|
|
328
|
+
const s = makeMockSession(tempDir, { type: "plan-slice", id: "M001/S01" });
|
|
329
|
+
const pctx = makePostUnitContext(s, ctx, pi, pauseAutoMock);
|
|
330
|
+
|
|
331
|
+
// Call postUnitPostVerification
|
|
332
|
+
const result = await postUnitPostVerification(pctx);
|
|
333
|
+
|
|
334
|
+
// Verify pauseAuto was called (strict mode promotes warnings to blocking)
|
|
335
|
+
assert.equal(
|
|
336
|
+
pauseAutoMock.mock.callCount(),
|
|
337
|
+
1,
|
|
338
|
+
"pauseAuto should be called when strict mode is enabled and pre-execution returns warn"
|
|
339
|
+
);
|
|
340
|
+
|
|
341
|
+
// Verify return value is "stopped"
|
|
342
|
+
assert.equal(
|
|
343
|
+
result,
|
|
344
|
+
"stopped",
|
|
345
|
+
"postUnitPostVerification should return 'stopped' when strict mode treats warnings as blocking"
|
|
346
|
+
);
|
|
347
|
+
|
|
348
|
+
// Verify UI was notified of the warning
|
|
349
|
+
const notifyCalls = ctx.ui.notify.mock.calls;
|
|
350
|
+
const warnNotify = notifyCalls.find(
|
|
351
|
+
(call: { arguments: unknown[] }) =>
|
|
352
|
+
call.arguments[1] === "warning" &&
|
|
353
|
+
String(call.arguments[0]).includes("Pre-execution checks passed with warnings")
|
|
354
|
+
);
|
|
355
|
+
assert.ok(warnNotify, "Should show warning notification about pre-execution check warnings");
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
test("pauseAuto is NOT called when enhanced_verification_strict: false and pre-execution returns warn", async () => {
|
|
359
|
+
// Write preferences with strict mode disabled (default behavior)
|
|
360
|
+
writePreferences({
|
|
361
|
+
enhanced_verification: true,
|
|
362
|
+
enhanced_verification_pre: true,
|
|
363
|
+
enhanced_verification_strict: false,
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
// Set up tasks that will produce only warnings
|
|
367
|
+
createWarningOnlyTasks();
|
|
368
|
+
|
|
369
|
+
// Create mocks
|
|
370
|
+
const ctx = makeMockCtx();
|
|
371
|
+
const pi = makeMockPi();
|
|
372
|
+
const pauseAutoMock = mock.fn(async () => {});
|
|
373
|
+
const s = makeMockSession(tempDir, { type: "plan-slice", id: "M001/S01" });
|
|
374
|
+
const pctx = makePostUnitContext(s, ctx, pi, pauseAutoMock);
|
|
375
|
+
|
|
376
|
+
// Call postUnitPostVerification
|
|
377
|
+
const result = await postUnitPostVerification(pctx);
|
|
378
|
+
|
|
379
|
+
// Verify pauseAuto was NOT called (warnings don't block in non-strict mode)
|
|
380
|
+
assert.equal(
|
|
381
|
+
pauseAutoMock.mock.callCount(),
|
|
382
|
+
0,
|
|
383
|
+
"pauseAuto should NOT be called when strict mode is disabled and only warnings exist"
|
|
384
|
+
);
|
|
385
|
+
|
|
386
|
+
// Verify return value is "continue" (not "stopped")
|
|
387
|
+
assert.equal(
|
|
388
|
+
result,
|
|
389
|
+
"continue",
|
|
390
|
+
"postUnitPostVerification should return 'continue' when warnings don't block in non-strict mode"
|
|
391
|
+
);
|
|
392
|
+
});
|
|
393
|
+
|
|
394
|
+
test("pre-execution checks are skipped when unit type is not plan-slice", async () => {
|
|
395
|
+
// Set up tasks that would fail if checked
|
|
396
|
+
createFailingTasks();
|
|
397
|
+
|
|
398
|
+
// Create mocks with execute-task unit (not plan-slice)
|
|
399
|
+
const ctx = makeMockCtx();
|
|
400
|
+
const pi = makeMockPi();
|
|
401
|
+
const pauseAutoMock = mock.fn(async () => {});
|
|
402
|
+
const s = makeMockSession(tempDir, { type: "execute-task", id: "M001/S01/T01" });
|
|
403
|
+
const pctx = makePostUnitContext(s, ctx, pi, pauseAutoMock);
|
|
404
|
+
|
|
405
|
+
// Call postUnitPostVerification
|
|
406
|
+
const result = await postUnitPostVerification(pctx);
|
|
407
|
+
|
|
408
|
+
// Verify pauseAuto was NOT called (pre-execution checks only run for plan-slice)
|
|
409
|
+
assert.equal(
|
|
410
|
+
pauseAutoMock.mock.callCount(),
|
|
411
|
+
0,
|
|
412
|
+
"pauseAuto should NOT be called for non-plan-slice unit types"
|
|
413
|
+
);
|
|
414
|
+
|
|
415
|
+
// Verify return value is "continue"
|
|
416
|
+
assert.equal(
|
|
417
|
+
result,
|
|
418
|
+
"continue",
|
|
419
|
+
"postUnitPostVerification should return 'continue' for non-plan-slice unit types"
|
|
420
|
+
);
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
test("pre-execution checks are skipped when enhanced_verification_pre: false", async () => {
|
|
424
|
+
// Write preferences with pre-execution checks disabled
|
|
425
|
+
writePreferences({
|
|
426
|
+
enhanced_verification: true,
|
|
427
|
+
enhanced_verification_pre: false,
|
|
428
|
+
});
|
|
429
|
+
|
|
430
|
+
// Set up tasks that would fail if checked
|
|
431
|
+
createFailingTasks();
|
|
432
|
+
|
|
433
|
+
// Create mocks
|
|
434
|
+
const ctx = makeMockCtx();
|
|
435
|
+
const pi = makeMockPi();
|
|
436
|
+
const pauseAutoMock = mock.fn(async () => {});
|
|
437
|
+
const s = makeMockSession(tempDir, { type: "plan-slice", id: "M001/S01" });
|
|
438
|
+
const pctx = makePostUnitContext(s, ctx, pi, pauseAutoMock);
|
|
439
|
+
|
|
440
|
+
// Call postUnitPostVerification
|
|
441
|
+
const result = await postUnitPostVerification(pctx);
|
|
442
|
+
|
|
443
|
+
// Verify pauseAuto was NOT called (pre-execution checks disabled)
|
|
444
|
+
assert.equal(
|
|
445
|
+
pauseAutoMock.mock.callCount(),
|
|
446
|
+
0,
|
|
447
|
+
"pauseAuto should NOT be called when enhanced_verification_pre is disabled"
|
|
448
|
+
);
|
|
449
|
+
|
|
450
|
+
// Verify return value is "continue"
|
|
451
|
+
assert.equal(
|
|
452
|
+
result,
|
|
453
|
+
"continue",
|
|
454
|
+
"postUnitPostVerification should return 'continue' when pre-execution checks are disabled"
|
|
455
|
+
);
|
|
456
|
+
});
|
|
457
|
+
});
|
|
@@ -412,6 +412,16 @@ test("unrecognized format warning is emitted at most once (#2373)", () => {
|
|
|
412
412
|
}
|
|
413
413
|
});
|
|
414
414
|
|
|
415
|
+
test("parsePreferencesMarkdown parses heading+list format without frontmatter (#2036)", () => {
|
|
416
|
+
// A GSD agent recovery session wrote preferences in markdown heading+list
|
|
417
|
+
// format instead of YAML frontmatter. Since the heading+list fallback parser
|
|
418
|
+
// was added, this format is now handled gracefully.
|
|
419
|
+
const content = "## Git\n\n- isolation: none\n";
|
|
420
|
+
const result = parsePreferencesMarkdown(content);
|
|
421
|
+
assert.notEqual(result, null, "heading+list content should be parsed");
|
|
422
|
+
assert.deepStrictEqual(result!.git, { isolation: "none" });
|
|
423
|
+
});
|
|
424
|
+
|
|
415
425
|
// ── Experimental preferences ─────────────────────────────────────────────────
|
|
416
426
|
|
|
417
427
|
test("experimental.rtk: true is accepted and stored", () => {
|
|
@@ -231,6 +231,31 @@ test("complete-slice prompt uses camelCase parameter names matching TypeBox sche
|
|
|
231
231
|
assert.match(toolCallLine!, /sliceId/);
|
|
232
232
|
});
|
|
233
233
|
|
|
234
|
+
// ─── File system safety: complete-slice parity with complete-milestone (#2935) ──
|
|
235
|
+
|
|
236
|
+
test("complete-slice prompt includes filesystem safety guard against EISDIR", () => {
|
|
237
|
+
const prompt = readPrompt("complete-slice");
|
|
238
|
+
assert.match(
|
|
239
|
+
prompt,
|
|
240
|
+
/File system safety/i,
|
|
241
|
+
"complete-slice.md must include a 'File system safety' instruction to prevent EISDIR errors when the LLM passes a directory path to the read tool"
|
|
242
|
+
);
|
|
243
|
+
assert.match(
|
|
244
|
+
prompt,
|
|
245
|
+
/never pass.*directory path.*directly to the.*read.*tool/i,
|
|
246
|
+
"complete-slice.md must warn against passing directory paths to the read tool"
|
|
247
|
+
);
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
test("complete-milestone prompt still has its filesystem safety guard (regression)", () => {
|
|
251
|
+
const prompt = readPrompt("complete-milestone");
|
|
252
|
+
assert.match(
|
|
253
|
+
prompt,
|
|
254
|
+
/File system safety/i,
|
|
255
|
+
"complete-milestone.md must keep its filesystem safety guard"
|
|
256
|
+
);
|
|
257
|
+
});
|
|
258
|
+
|
|
234
259
|
test("reactive-execute prompt references tool calls instead of checkbox updates", () => {
|
|
235
260
|
const prompt = readPrompt("reactive-execute");
|
|
236
261
|
assert.doesNotMatch(prompt, /checkbox updates/);
|
|
@@ -133,6 +133,19 @@ test("parseRoadmapSlices: table with glyph completion markers (#2841)", () => {
|
|
|
133
133
|
assert.equal(slices[3]?.done, true);
|
|
134
134
|
});
|
|
135
135
|
|
|
136
|
+
test("parseRoadmapSlices: table with heavy check mark U+2714 (#2940)", () => {
|
|
137
|
+
const tableContent = [
|
|
138
|
+
"# M003: Heavy Check", "", "## Slices", "",
|
|
139
|
+
"| Slice | Title | Risk | Status |", "|---|---|---|---|",
|
|
140
|
+
"| S01 | First | Low | \u2714 |",
|
|
141
|
+
"| S02 | Second | High | Pending |", "",
|
|
142
|
+
].join("\n");
|
|
143
|
+
const slices = parseRoadmapSlices(tableContent);
|
|
144
|
+
assert.equal(slices.length, 2);
|
|
145
|
+
assert.equal(slices[0]?.done, true, "U+2714 heavy check mark should mark slice as done");
|
|
146
|
+
assert.equal(slices[1]?.done, false);
|
|
147
|
+
});
|
|
148
|
+
|
|
136
149
|
test("parseRoadmapSlices: table with dependencies column (#1736)", () => {
|
|
137
150
|
const tableContent = [
|
|
138
151
|
"# M004: Deps", "", "## Slices", "",
|
|
@@ -393,3 +406,59 @@ test("parseRoadmapSlices: indented H3 headers under ## Slices (#2567)", () => {
|
|
|
393
406
|
assert.equal(slices[1]?.id, "S02");
|
|
394
407
|
assert.equal(slices[1]?.title, "Build");
|
|
395
408
|
});
|
|
409
|
+
|
|
410
|
+
// ── Regression tests for #1884: ✅ (U+2705) completion marker ──────────────
|
|
411
|
+
|
|
412
|
+
test("parseRoadmapSlices: prose headers with ✅ suffix detected as done (#1884)", () => {
|
|
413
|
+
const proseContent = `# M013: Prose Roadmap
|
|
414
|
+
|
|
415
|
+
### S01: Plan Limits & Billing Foundation ✅
|
|
416
|
+
All tasks done.
|
|
417
|
+
|
|
418
|
+
### S02: Usage Tracking
|
|
419
|
+
Not done yet.
|
|
420
|
+
|
|
421
|
+
### S03: Notification System ✅
|
|
422
|
+
Also done.
|
|
423
|
+
`;
|
|
424
|
+
const slices = parseRoadmapSlices(proseContent);
|
|
425
|
+
assert.equal(slices.length, 3);
|
|
426
|
+
assert.equal(slices[0]?.id, "S01");
|
|
427
|
+
assert.equal(slices[0]?.done, true, "S01 with trailing ✅ should be done");
|
|
428
|
+
assert.equal(slices[0]?.title, "Plan Limits & Billing Foundation");
|
|
429
|
+
assert.equal(slices[1]?.done, false);
|
|
430
|
+
assert.equal(slices[2]?.done, true, "S03 with trailing ✅ should be done");
|
|
431
|
+
assert.equal(slices[2]?.title, "Notification System");
|
|
432
|
+
});
|
|
433
|
+
|
|
434
|
+
test("parseRoadmapSlices: prose headers with ✅ prefix before title detected as done (#1884)", () => {
|
|
435
|
+
const proseContent = `# M014: Prose
|
|
436
|
+
|
|
437
|
+
## ✅ S01: Done Slice
|
|
438
|
+
Complete.
|
|
439
|
+
|
|
440
|
+
## S02: Pending Slice
|
|
441
|
+
Not done.
|
|
442
|
+
`;
|
|
443
|
+
const slices = parseRoadmapSlices(proseContent);
|
|
444
|
+
assert.equal(slices.length, 2);
|
|
445
|
+
assert.equal(slices[0]?.done, true, "prefix ✅ should mark as done");
|
|
446
|
+
assert.equal(slices[0]?.title, "Done Slice");
|
|
447
|
+
assert.equal(slices[1]?.done, false);
|
|
448
|
+
});
|
|
449
|
+
|
|
450
|
+
test("parseRoadmapSlices: prose headers with ✅ after separator detected as done (#1884)", () => {
|
|
451
|
+
const proseContent = `# M015: Prose
|
|
452
|
+
|
|
453
|
+
## S01: ✅ First Feature
|
|
454
|
+
Done.
|
|
455
|
+
|
|
456
|
+
## S02: Second Feature
|
|
457
|
+
Not done.
|
|
458
|
+
`;
|
|
459
|
+
const slices = parseRoadmapSlices(proseContent);
|
|
460
|
+
assert.equal(slices.length, 2);
|
|
461
|
+
assert.equal(slices[0]?.done, true, "✅ after colon should mark as done");
|
|
462
|
+
assert.equal(slices[0]?.title, "First Feature");
|
|
463
|
+
assert.equal(slices[1]?.done, false);
|
|
464
|
+
});
|
|
@@ -68,6 +68,36 @@ describe('shared-wal', async () => {
|
|
|
68
68
|
'forward-slash worktree path resolves correctly');
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
+
// ─── Test (e1): external-state worktree resolves to project state DB (#2952) ───
|
|
72
|
+
console.log('\n=== shared-wal: resolve external-state worktree path (#2952) ===');
|
|
73
|
+
{
|
|
74
|
+
// External-state layout: ~/.gsd/projects/<hash>/worktrees/<MID>
|
|
75
|
+
// Should resolve to: ~/.gsd/projects/<hash>/gsd.db
|
|
76
|
+
const stateRoot = '/home/user/.gsd/projects/a1b2c3d4';
|
|
77
|
+
const worktreePath = join(stateRoot, 'worktrees', 'M002');
|
|
78
|
+
const result = resolveProjectRootDbPath(worktreePath);
|
|
79
|
+
assert.deepStrictEqual(result, join(stateRoot, 'gsd.db'),
|
|
80
|
+
'external-state worktree path resolves to project state DB (#2952)');
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// ─── Test (e2): external-state worktree nested subdir (#2952) ─────────
|
|
84
|
+
console.log('\n=== shared-wal: resolve external-state worktree nested subdir (#2952) ===');
|
|
85
|
+
{
|
|
86
|
+
const stateRoot = '/home/user/.gsd/projects/deadbeef42';
|
|
87
|
+
const nestedPath = join(stateRoot, 'worktrees', 'M003', 'src', 'lib');
|
|
88
|
+
const result = resolveProjectRootDbPath(nestedPath);
|
|
89
|
+
assert.deepStrictEqual(result, join(stateRoot, 'gsd.db'),
|
|
90
|
+
'external-state nested worktree subdir resolves to project state DB (#2952)');
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// ─── Test (e3): external-state worktree with forward slashes (#2952) ──
|
|
94
|
+
console.log('\n=== shared-wal: resolve external-state worktree forward-slash (#2952) ===');
|
|
95
|
+
{
|
|
96
|
+
const result = resolveProjectRootDbPath('/Users/dev/.gsd/projects/cafe0123/worktrees/M001');
|
|
97
|
+
assert.deepStrictEqual(result, join('/Users/dev/.gsd/projects/cafe0123', 'gsd.db'),
|
|
98
|
+
'external-state forward-slash worktree path resolves correctly (#2952)');
|
|
99
|
+
}
|
|
100
|
+
|
|
71
101
|
// ─── Test (e): Concurrent writes — 3 connections to same WAL DB ───────
|
|
72
102
|
console.log('\n=== shared-wal: concurrent writes via WAL ===');
|
|
73
103
|
{
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression test: S##-CONTEXT.md from slice discussion must be
|
|
3
|
+
* injected into all 5 downstream prompt builders (#3452).
|
|
4
|
+
*
|
|
5
|
+
* Scans auto-prompts.ts for the 5 builder functions and verifies
|
|
6
|
+
* each one resolves and inlines the slice-level CONTEXT file.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { describe, test } from "node:test";
|
|
10
|
+
import assert from "node:assert/strict";
|
|
11
|
+
import { readFileSync } from "node:fs";
|
|
12
|
+
import { join, dirname } from "node:path";
|
|
13
|
+
import { fileURLToPath } from "node:url";
|
|
14
|
+
|
|
15
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
16
|
+
const autoPromptsPath = join(__dirname, "..", "auto-prompts.ts");
|
|
17
|
+
const source = readFileSync(autoPromptsPath, "utf-8");
|
|
18
|
+
|
|
19
|
+
const BUILDERS = [
|
|
20
|
+
"buildResearchSlicePrompt",
|
|
21
|
+
"buildPlanSlicePrompt",
|
|
22
|
+
"buildCompleteSlicePrompt",
|
|
23
|
+
"buildReplanSlicePrompt",
|
|
24
|
+
"buildReassessRoadmapPrompt",
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
describe("slice CONTEXT.md injection into prompt builders (#3452)", () => {
|
|
28
|
+
for (const builder of BUILDERS) {
|
|
29
|
+
test(`${builder} resolves slice CONTEXT file`, () => {
|
|
30
|
+
// Find the function body
|
|
31
|
+
const fnStart = source.indexOf(`export async function ${builder}`);
|
|
32
|
+
assert.ok(fnStart !== -1, `${builder} should exist in auto-prompts.ts`);
|
|
33
|
+
|
|
34
|
+
// Get a reasonable chunk after the function start (enough to cover the inlining section)
|
|
35
|
+
const chunk = source.slice(fnStart, fnStart + 3000);
|
|
36
|
+
|
|
37
|
+
// Must resolve the slice CONTEXT path
|
|
38
|
+
assert.ok(
|
|
39
|
+
chunk.includes('resolveSliceFile(base, mid,') && chunk.includes('"CONTEXT"'),
|
|
40
|
+
`${builder} should call resolveSliceFile with "CONTEXT"`,
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
// Must inline it with inlineFileOptional
|
|
44
|
+
assert.ok(
|
|
45
|
+
chunk.includes('Slice Context'),
|
|
46
|
+
`${builder} should inline slice CONTEXT with a "Slice Context" label`,
|
|
47
|
+
);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
});
|