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,28 @@
|
|
|
1
|
+
// GSD Extension — Notify Interceptor
|
|
2
|
+
// Wraps ctx.ui.notify() in-place to persist every notification through the
|
|
3
|
+
// notification store. Uses a WeakSet to prevent double-wrapping and handle
|
|
4
|
+
// UI context replacement on /reload gracefully.
|
|
5
|
+
import { appendNotification } from "../notification-store.js";
|
|
6
|
+
// Track which ui context objects have been wrapped to prevent double-install.
|
|
7
|
+
// WeakSet allows GC to collect replaced uiContext instances after /reload.
|
|
8
|
+
const _wrappedContexts = new WeakSet();
|
|
9
|
+
/**
|
|
10
|
+
* Install the notify interceptor on a context's UI object.
|
|
11
|
+
* Mutates ctx.ui.notify in place — the original is called after persistence.
|
|
12
|
+
* Safe to call multiple times; no-ops if already installed on the same ui object.
|
|
13
|
+
*/
|
|
14
|
+
export function installNotifyInterceptor(ctx) {
|
|
15
|
+
if (_wrappedContexts.has(ctx.ui))
|
|
16
|
+
return;
|
|
17
|
+
const originalNotify = ctx.ui.notify.bind(ctx.ui);
|
|
18
|
+
ctx.ui.notify = (message, type) => {
|
|
19
|
+
try {
|
|
20
|
+
appendNotification(message, (type ?? "info"), "notify");
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// Non-fatal — never let persistence break the UI
|
|
24
|
+
}
|
|
25
|
+
originalNotify(message, type);
|
|
26
|
+
};
|
|
27
|
+
_wrappedContexts.add(ctx.ui);
|
|
28
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// GSD2 — Read-only query tools exposing DB state to the LLM via the WAL connection
|
|
2
|
+
import { Type } from "@sinclair/typebox";
|
|
3
|
+
import { logWarning } from "../workflow-logger.js";
|
|
4
|
+
export function registerQueryTools(pi) {
|
|
5
|
+
pi.registerTool({
|
|
6
|
+
name: "gsd_milestone_status",
|
|
7
|
+
label: "Milestone Status",
|
|
8
|
+
description: "Read the current status of a milestone and all its slices from the GSD database. " +
|
|
9
|
+
"Returns milestone metadata, per-slice status, and task counts per slice. " +
|
|
10
|
+
"Use this instead of querying .gsd/gsd.db directly via sqlite3 or better-sqlite3.",
|
|
11
|
+
promptSnippet: "Get milestone status, slice statuses, and task counts for a given milestoneId",
|
|
12
|
+
promptGuidelines: [
|
|
13
|
+
"Use this tool — not sqlite3 or better-sqlite3 — to inspect milestone or slice state from the DB.",
|
|
14
|
+
],
|
|
15
|
+
parameters: Type.Object({
|
|
16
|
+
milestoneId: Type.String({ description: "Milestone ID to query (e.g. M001)" }),
|
|
17
|
+
}),
|
|
18
|
+
async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
|
|
19
|
+
try {
|
|
20
|
+
// Strictly read-only: only use an already-open DB connection.
|
|
21
|
+
// Do NOT call ensureDbOpen() — it can create/migrate the DB as a side effect.
|
|
22
|
+
const { isDbAvailable, getMilestone, getSliceStatusSummary, getSliceTaskCounts, _getAdapter, } = await import("../gsd-db.js");
|
|
23
|
+
if (!isDbAvailable()) {
|
|
24
|
+
return {
|
|
25
|
+
content: [{ type: "text", text: "Error: GSD database is not available." }],
|
|
26
|
+
details: { operation: "milestone_status", error: "db_unavailable" },
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
// Wrap all reads in a single transaction for snapshot consistency.
|
|
30
|
+
// SQLite WAL mode guarantees reads within a transaction see a single
|
|
31
|
+
// consistent snapshot, preventing torn reads from concurrent writes.
|
|
32
|
+
const adapter = _getAdapter();
|
|
33
|
+
adapter.exec("BEGIN"); // eslint-disable-line -- SQLite exec, not child_process
|
|
34
|
+
try {
|
|
35
|
+
const milestone = getMilestone(params.milestoneId);
|
|
36
|
+
if (!milestone) {
|
|
37
|
+
adapter.exec("COMMIT"); // eslint-disable-line
|
|
38
|
+
return {
|
|
39
|
+
content: [{ type: "text", text: `Milestone ${params.milestoneId} not found in database.` }],
|
|
40
|
+
details: { operation: "milestone_status", milestoneId: params.milestoneId, found: false },
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const sliceStatuses = getSliceStatusSummary(params.milestoneId);
|
|
44
|
+
const slices = sliceStatuses.map((s) => {
|
|
45
|
+
const counts = getSliceTaskCounts(params.milestoneId, s.id);
|
|
46
|
+
return {
|
|
47
|
+
id: s.id,
|
|
48
|
+
status: s.status,
|
|
49
|
+
taskCounts: counts,
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
adapter.exec("COMMIT"); // eslint-disable-line
|
|
53
|
+
const result = {
|
|
54
|
+
milestoneId: milestone.id,
|
|
55
|
+
title: milestone.title,
|
|
56
|
+
status: milestone.status,
|
|
57
|
+
createdAt: milestone.created_at,
|
|
58
|
+
completedAt: milestone.completed_at,
|
|
59
|
+
sliceCount: slices.length,
|
|
60
|
+
slices,
|
|
61
|
+
};
|
|
62
|
+
return {
|
|
63
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
64
|
+
details: { operation: "milestone_status", milestoneId: milestone.id, sliceCount: slices.length },
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
catch (txErr) {
|
|
68
|
+
try {
|
|
69
|
+
adapter.exec("ROLLBACK");
|
|
70
|
+
}
|
|
71
|
+
catch { /* swallow */ } // eslint-disable-line
|
|
72
|
+
throw txErr;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
77
|
+
logWarning("tool", `gsd_milestone_status tool failed: ${msg}`);
|
|
78
|
+
return {
|
|
79
|
+
content: [{ type: "text", text: `Error querying milestone status: ${msg}` }],
|
|
80
|
+
details: { operation: "milestone_status", error: msg },
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
// GSD2 — Extension registration: wires all GSD tools, commands, and hooks into pi
|
|
1
2
|
import { registerGSDCommand } from "../commands.js";
|
|
2
3
|
import { registerExitCommand } from "../exit-command.js";
|
|
3
4
|
import { registerWorktreeCommand } from "../worktree-command.js";
|
|
4
5
|
import { registerDbTools } from "./db-tools.js";
|
|
5
6
|
import { registerDynamicTools } from "./dynamic-tools.js";
|
|
6
7
|
import { registerJournalTools } from "./journal-tools.js";
|
|
8
|
+
import { registerQueryTools } from "./query-tools.js";
|
|
7
9
|
import { registerHooks } from "./register-hooks.js";
|
|
8
10
|
import { registerShortcuts } from "./register-shortcuts.js";
|
|
9
11
|
export function handleRecoverableExtensionProcessError(err) {
|
|
@@ -48,6 +50,7 @@ export function registerGsdExtension(pi) {
|
|
|
48
50
|
registerDynamicTools(pi);
|
|
49
51
|
registerDbTools(pi);
|
|
50
52
|
registerJournalTools(pi);
|
|
53
|
+
registerQueryTools(pi);
|
|
51
54
|
registerShortcuts(pi);
|
|
52
55
|
registerHooks(pi);
|
|
53
56
|
}
|
|
@@ -10,11 +10,17 @@ import { getDiscussionMilestoneId } from "../guided-flow.js";
|
|
|
10
10
|
import { loadToolApiKeys } from "../commands-config.js";
|
|
11
11
|
import { loadFile, saveFile, formatContinue } from "../files.js";
|
|
12
12
|
import { deriveState } from "../state.js";
|
|
13
|
-
import { getAutoDashboardData, isAutoActive, isAutoPaused, markToolEnd, markToolStart } from "../auto.js";
|
|
13
|
+
import { getAutoDashboardData, isAutoActive, isAutoPaused, markToolEnd, markToolStart, recordToolInvocationError } from "../auto.js";
|
|
14
14
|
import { isParallelActive, shutdownParallel } from "../parallel-orchestrator.js";
|
|
15
15
|
import { checkToolCallLoop, resetToolCallLoopGuard } from "./tool-call-loop-guard.js";
|
|
16
16
|
import { saveActivityLog } from "../activity-log.js";
|
|
17
17
|
import { resetAskUserQuestionsCache } from "../../ask-user-questions.js";
|
|
18
|
+
import { recordToolCall as safetyRecordToolCall, recordToolResult as safetyRecordToolResult } from "../safety/evidence-collector.js";
|
|
19
|
+
import { classifyCommand } from "../safety/destructive-guard.js";
|
|
20
|
+
import { logWarning as safetyLogWarning } from "../workflow-logger.js";
|
|
21
|
+
import { installNotifyInterceptor } from "./notify-interceptor.js";
|
|
22
|
+
import { initNotificationStore } from "../notification-store.js";
|
|
23
|
+
import { initNotificationWidget } from "../notification-widget.js";
|
|
18
24
|
// Skip the welcome screen on the very first session_start — cli.ts already
|
|
19
25
|
// printed it before the TUI launched. Only re-print on /clear (subsequent sessions).
|
|
20
26
|
let isFirstSession = true;
|
|
@@ -24,6 +30,9 @@ async function syncServiceTierStatus(ctx) {
|
|
|
24
30
|
}
|
|
25
31
|
export function registerHooks(pi) {
|
|
26
32
|
pi.on("session_start", async (_event, ctx) => {
|
|
33
|
+
initNotificationStore(process.cwd());
|
|
34
|
+
installNotifyInterceptor(ctx);
|
|
35
|
+
initNotificationWidget(ctx);
|
|
27
36
|
resetWriteGateState();
|
|
28
37
|
resetToolCallLoopGuard();
|
|
29
38
|
resetAskUserQuestionsCache();
|
|
@@ -60,6 +69,8 @@ export function registerHooks(pi) {
|
|
|
60
69
|
loadToolApiKeys();
|
|
61
70
|
});
|
|
62
71
|
pi.on("session_switch", async (_event, ctx) => {
|
|
72
|
+
initNotificationStore(process.cwd());
|
|
73
|
+
installNotifyInterceptor(ctx);
|
|
63
74
|
resetWriteGateState();
|
|
64
75
|
resetToolCallLoopGuard();
|
|
65
76
|
resetAskUserQuestionsCache();
|
|
@@ -187,6 +198,22 @@ export function registerHooks(pi) {
|
|
|
187
198
|
if (result.block)
|
|
188
199
|
return result;
|
|
189
200
|
});
|
|
201
|
+
// ── Safety harness: evidence collection + destructive command warnings ──
|
|
202
|
+
pi.on("tool_call", async (event, ctx) => {
|
|
203
|
+
if (!isAutoActive())
|
|
204
|
+
return;
|
|
205
|
+
safetyRecordToolCall(event.toolName, event.input);
|
|
206
|
+
// Destructive command classification (warn only, never block)
|
|
207
|
+
if (isToolCallEventType("bash", event)) {
|
|
208
|
+
const classification = classifyCommand(event.input.command);
|
|
209
|
+
if (classification.destructive) {
|
|
210
|
+
safetyLogWarning("safety", `destructive command: ${classification.labels.join(", ")}`, {
|
|
211
|
+
command: String(event.input.command).slice(0, 200),
|
|
212
|
+
});
|
|
213
|
+
ctx.ui.notify(`Destructive command detected: ${classification.labels.join(", ")}`, "warning");
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
});
|
|
190
217
|
pi.on("tool_result", async (event) => {
|
|
191
218
|
if (event.toolName !== "ask_user_questions")
|
|
192
219
|
return;
|
|
@@ -243,6 +270,18 @@ export function registerHooks(pi) {
|
|
|
243
270
|
});
|
|
244
271
|
pi.on("tool_execution_end", async (event) => {
|
|
245
272
|
markToolEnd(event.toolCallId);
|
|
273
|
+
// #2883: Capture tool invocation errors (malformed/truncated JSON arguments)
|
|
274
|
+
// so postUnitPreVerification can break the retry loop instead of re-dispatching.
|
|
275
|
+
if (event.isError && event.toolName.startsWith("gsd_")) {
|
|
276
|
+
const errorText = typeof event.result === "string"
|
|
277
|
+
? event.result
|
|
278
|
+
: (typeof event.result?.content?.[0]?.text === "string" ? event.result.content[0].text : String(event.result));
|
|
279
|
+
recordToolInvocationError(event.toolName, errorText);
|
|
280
|
+
}
|
|
281
|
+
// Safety harness: record tool execution results for evidence cross-referencing
|
|
282
|
+
if (isAutoActive()) {
|
|
283
|
+
safetyRecordToolResult(event.toolCallId, event.toolName, event.result, event.isError);
|
|
284
|
+
}
|
|
246
285
|
});
|
|
247
286
|
pi.on("model_select", async (_event, ctx) => {
|
|
248
287
|
await syncServiceTierStatus(ctx);
|
|
@@ -2,6 +2,7 @@ import { existsSync } from "node:fs";
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { Key } from "@gsd/pi-tui";
|
|
4
4
|
import { GSDDashboardOverlay } from "../dashboard-overlay.js";
|
|
5
|
+
import { GSDNotificationOverlay } from "../notification-overlay.js";
|
|
5
6
|
import { ParallelMonitorOverlay } from "../parallel-monitor-overlay.js";
|
|
6
7
|
import { shortcutDesc } from "../../shared/mod.js";
|
|
7
8
|
export function registerShortcuts(pi) {
|
|
@@ -23,6 +24,20 @@ export function registerShortcuts(pi) {
|
|
|
23
24
|
});
|
|
24
25
|
},
|
|
25
26
|
});
|
|
27
|
+
pi.registerShortcut(Key.ctrlAlt("n"), {
|
|
28
|
+
description: shortcutDesc("Open notification history", "/gsd notifications"),
|
|
29
|
+
handler: async (ctx) => {
|
|
30
|
+
await ctx.ui.custom((tui, theme, _kb, done) => new GSDNotificationOverlay(tui, theme, () => done()), {
|
|
31
|
+
overlay: true,
|
|
32
|
+
overlayOptions: {
|
|
33
|
+
width: "80%",
|
|
34
|
+
minWidth: 60,
|
|
35
|
+
maxHeight: "88%",
|
|
36
|
+
anchor: "center",
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
},
|
|
40
|
+
});
|
|
26
41
|
pi.registerShortcut(Key.ctrlAlt("p"), {
|
|
27
42
|
description: shortcutDesc("Open parallel worker monitor", "/gsd parallel watch"),
|
|
28
43
|
handler: async (ctx) => {
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input sanitization for gsd_complete_milestone parameters.
|
|
3
|
+
*
|
|
4
|
+
* The Claude SDK deserializes tool-call JSON before the handler runs.
|
|
5
|
+
* When an LLM (especially smaller models like haiku) generates large markdown
|
|
6
|
+
* parameters, the JSON can arrive with subtly wrong types — numbers where
|
|
7
|
+
* strings are expected, null where arrays belong, string "true" instead of
|
|
8
|
+
* boolean true, etc. This sanitizer normalizes all fields so
|
|
9
|
+
* handleCompleteMilestone never crashes on type mismatches.
|
|
10
|
+
*
|
|
11
|
+
* See: https://github.com/gsd-build/gsd-2/issues/3013
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Coerce an unknown value to a trimmed string.
|
|
15
|
+
* Returns "" for null / undefined.
|
|
16
|
+
*/
|
|
17
|
+
function toStr(v) {
|
|
18
|
+
if (v == null)
|
|
19
|
+
return "";
|
|
20
|
+
return String(v).trim();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Coerce an unknown value to an array of trimmed, non-empty strings.
|
|
24
|
+
* - If already an array, filter/trim each element.
|
|
25
|
+
* - Otherwise return [].
|
|
26
|
+
*/
|
|
27
|
+
function toStrArray(v) {
|
|
28
|
+
if (!Array.isArray(v))
|
|
29
|
+
return [];
|
|
30
|
+
return v
|
|
31
|
+
.map((item) => (item == null ? "" : String(item).trim()))
|
|
32
|
+
.filter((s) => s.length > 0);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Sanitize raw params from the tool-call framework into well-typed
|
|
36
|
+
* CompleteMilestoneParams, tolerating type mismatches from LLM JSON quirks.
|
|
37
|
+
*/
|
|
38
|
+
export function sanitizeCompleteMilestoneParams(raw) {
|
|
39
|
+
return {
|
|
40
|
+
milestoneId: toStr(raw.milestoneId),
|
|
41
|
+
title: toStr(raw.title),
|
|
42
|
+
oneLiner: toStr(raw.oneLiner),
|
|
43
|
+
narrative: toStr(raw.narrative),
|
|
44
|
+
successCriteriaResults: toStr(raw.successCriteriaResults),
|
|
45
|
+
definitionOfDoneResults: toStr(raw.definitionOfDoneResults),
|
|
46
|
+
requirementOutcomes: toStr(raw.requirementOutcomes),
|
|
47
|
+
keyDecisions: toStrArray(raw.keyDecisions),
|
|
48
|
+
keyFiles: toStrArray(raw.keyFiles),
|
|
49
|
+
lessonsLearned: toStrArray(raw.lessonsLearned),
|
|
50
|
+
followUps: toStr(raw.followUps),
|
|
51
|
+
deviations: toStr(raw.deviations),
|
|
52
|
+
verificationPassed: raw.verificationPassed === true || raw.verificationPassed === "true",
|
|
53
|
+
};
|
|
54
|
+
}
|
|
@@ -3,9 +3,10 @@ import { homedir } from "node:os";
|
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { logWarning } from "../workflow-logger.js";
|
|
5
5
|
import { debugTime } from "../debug-logger.js";
|
|
6
|
-
import { loadPrompt } from "../prompt-loader.js";
|
|
6
|
+
import { loadPrompt, getTemplatesDir } from "../prompt-loader.js";
|
|
7
7
|
import { readForensicsMarker } from "../forensics.js";
|
|
8
8
|
import { resolveAllSkillReferences, renderPreferencesForSystemPrompt, loadEffectiveGSDPreferences } from "../preferences.js";
|
|
9
|
+
import { resolveSkillReference } from "../preferences-skills.js";
|
|
9
10
|
import { resolveGsdRootFile, resolveSliceFile, resolveSlicePath, resolveTaskFile, resolveTaskFiles, resolveTasksDir, relSliceFile, relSlicePath, relTaskFile } from "../paths.js";
|
|
10
11
|
import { hasSkillSnapshot, detectNewSkills, formatSkillsXml } from "../skill-discovery.js";
|
|
11
12
|
import { getActiveAutoWorktreeContext } from "../auto-worktree.js";
|
|
@@ -15,6 +16,30 @@ import { formatOverridesSection, loadActiveOverrides, loadFile, parseContinue, p
|
|
|
15
16
|
import { toPosixPath } from "../../shared/mod.js";
|
|
16
17
|
import { markCmuxPromptShown, shouldPromptToEnableCmux } from "../../cmux/index.js";
|
|
17
18
|
const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
|
|
19
|
+
/**
|
|
20
|
+
* Bundled skill triggers — resolved dynamically at runtime instead of
|
|
21
|
+
* hardcoding absolute paths in the system prompt template. Only skills
|
|
22
|
+
* that actually exist on disk are included in the table. (#3575)
|
|
23
|
+
*/
|
|
24
|
+
const BUNDLED_SKILL_TRIGGERS = [
|
|
25
|
+
{ trigger: "Frontend UI - web components, pages, landing pages, dashboards, React/HTML/CSS, styling", skill: "frontend-design" },
|
|
26
|
+
{ trigger: "macOS or iOS apps - SwiftUI, Xcode, App Store", skill: "swiftui" },
|
|
27
|
+
{ trigger: "Debugging - complex bugs, failing tests, root-cause investigation after standard approaches fail", skill: "debug-like-expert" },
|
|
28
|
+
];
|
|
29
|
+
function buildBundledSkillsTable() {
|
|
30
|
+
const cwd = process.cwd();
|
|
31
|
+
const rows = [];
|
|
32
|
+
for (const { trigger, skill } of BUNDLED_SKILL_TRIGGERS) {
|
|
33
|
+
const resolution = resolveSkillReference(skill, cwd);
|
|
34
|
+
if (resolution.method === "unresolved")
|
|
35
|
+
continue; // skill not installed — omit from prompt
|
|
36
|
+
rows.push(`| ${trigger} | \`${resolution.resolvedPath}\` |`);
|
|
37
|
+
}
|
|
38
|
+
if (rows.length === 0) {
|
|
39
|
+
return "*No bundled skills found. Install skills to `~/.agents/skills/` or `~/.claude/skills/`.*";
|
|
40
|
+
}
|
|
41
|
+
return `| Trigger | Skill to load |\n|---|---|\n${rows.join("\n")}`;
|
|
42
|
+
}
|
|
18
43
|
function warnDeprecatedAgentInstructions() {
|
|
19
44
|
const paths = [
|
|
20
45
|
join(gsdHome, "agent-instructions.md"),
|
|
@@ -32,7 +57,10 @@ export async function buildBeforeAgentStartResult(event, ctx) {
|
|
|
32
57
|
if (!existsSync(join(process.cwd(), ".gsd")))
|
|
33
58
|
return undefined;
|
|
34
59
|
const stopContextTimer = debugTime("context-inject");
|
|
35
|
-
const systemContent = loadPrompt("system"
|
|
60
|
+
const systemContent = loadPrompt("system", {
|
|
61
|
+
bundledSkillsTable: buildBundledSkillsTable(),
|
|
62
|
+
templatesDir: getTemplatesDir(),
|
|
63
|
+
});
|
|
36
64
|
const loadedPreferences = loadEffectiveGSDPreferences();
|
|
37
65
|
if (shouldPromptToEnableCmux(loadedPreferences?.preferences)) {
|
|
38
66
|
markCmuxPromptShown();
|
|
@@ -201,6 +229,12 @@ function buildWorktreeContextBlock() {
|
|
|
201
229
|
}
|
|
202
230
|
return "";
|
|
203
231
|
}
|
|
232
|
+
/**
|
|
233
|
+
* Low-entropy resume intent patterns — short phrases a user types to
|
|
234
|
+
* continue work after a pause, rate limit, or context reset (#3615).
|
|
235
|
+
* Tested against the trimmed, lowercased prompt with trailing punctuation stripped.
|
|
236
|
+
*/
|
|
237
|
+
const RESUME_INTENT_PATTERNS = /^(continue|resume|ok|go|go ahead|proceed|keep going|carry on|next|yes|yeah|yep|sure|do it|let's go|pick up where you left off)$/;
|
|
204
238
|
async function buildGuidedExecuteContextInjection(prompt, basePath) {
|
|
205
239
|
const executeMatch = prompt.match(/Execute the next task:\s+(T\d+)\s+\("([^"]+)"\)\s+in slice\s+(S\d+)\s+of milestone\s+(M\d+(?:-[a-z0-9]{6})?)/i);
|
|
206
240
|
if (executeMatch) {
|
|
@@ -215,6 +249,20 @@ async function buildGuidedExecuteContextInjection(prompt, basePath) {
|
|
|
215
249
|
return buildTaskExecutionContextInjection(basePath, milestoneId, sliceId, state.activeTask.id, state.activeTask.title);
|
|
216
250
|
}
|
|
217
251
|
}
|
|
252
|
+
// Fallback: low-entropy resume prompt (e.g., "continue", "ok", "go ahead")
|
|
253
|
+
// during an active executing task — inject task context so the agent
|
|
254
|
+
// doesn't rebuild from scratch (#3615).
|
|
255
|
+
// Intent-gated: only fire for short, resume-like prompts to avoid hijacking
|
|
256
|
+
// control/help/diagnostic prompts with unrelated execution context.
|
|
257
|
+
// Phase-gated: only fire during "executing" to avoid misrouting during
|
|
258
|
+
// replanning, gate evaluation, or other non-execution phases.
|
|
259
|
+
const trimmed = prompt.trim().toLowerCase().replace(/[.!?,]+$/g, "");
|
|
260
|
+
if (RESUME_INTENT_PATTERNS.test(trimmed)) {
|
|
261
|
+
const state = await deriveState(basePath);
|
|
262
|
+
if (state.phase === "executing" && state.activeTask && state.activeMilestone && state.activeSlice) {
|
|
263
|
+
return buildTaskExecutionContextInjection(basePath, state.activeMilestone.id, state.activeSlice.id, state.activeTask.id, state.activeTask.title);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
218
266
|
return null;
|
|
219
267
|
}
|
|
220
268
|
async function buildTaskExecutionContextInjection(basePath, milestoneId, sliceId, taskId, taskTitle) {
|
|
@@ -4,7 +4,7 @@ import { join } from "node:path";
|
|
|
4
4
|
import { loadRegistry } from "../workflow-templates.js";
|
|
5
5
|
import { resolveProjectRoot } from "../worktree.js";
|
|
6
6
|
const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
|
|
7
|
-
export const GSD_COMMAND_DESCRIPTION = "GSD — Get Shit Done: /gsd help|start|templates|next|auto|stop|pause|status|widget|visualize|queue|quick|discuss|capture|triage|dispatch|history|undo|undo-task|reset-slice|rate|skip|export|cleanup|mode|prefs|config|keys|hooks|run-hook|skill-health|doctor|logs|forensics|changelog|migrate|remote|steer|knowledge|new-milestone|parallel|cmux|park|unpark|init|setup|inspect|extensions|update|fast|mcp|rethink|codebase";
|
|
7
|
+
export const GSD_COMMAND_DESCRIPTION = "GSD — Get Shit Done: /gsd help|start|templates|next|auto|stop|pause|status|widget|visualize|queue|quick|discuss|capture|triage|dispatch|history|undo|undo-task|reset-slice|rate|skip|export|cleanup|mode|prefs|config|keys|hooks|run-hook|skill-health|doctor|logs|forensics|changelog|migrate|remote|steer|knowledge|new-milestone|parallel|cmux|park|unpark|init|setup|inspect|extensions|update|fast|mcp|rethink|codebase|notifications";
|
|
8
8
|
export const TOP_LEVEL_SUBCOMMANDS = [
|
|
9
9
|
{ cmd: "help", desc: "Categorized command reference with descriptions" },
|
|
10
10
|
{ cmd: "next", desc: "Explicit step mode (same as /gsd)" },
|
|
@@ -36,6 +36,7 @@ export const TOP_LEVEL_SUBCOMMANDS = [
|
|
|
36
36
|
{ cmd: "hooks", desc: "Show configured post-unit and pre-dispatch hooks" },
|
|
37
37
|
{ cmd: "run-hook", desc: "Manually trigger a specific hook" },
|
|
38
38
|
{ cmd: "skill-health", desc: "Skill lifecycle dashboard" },
|
|
39
|
+
{ cmd: "notifications", desc: "View, filter, and clear persistent notification history" },
|
|
39
40
|
{ cmd: "doctor", desc: "Runtime health checks with auto-fix" },
|
|
40
41
|
{ cmd: "logs", desc: "Browse activity logs, debug logs, and metrics" },
|
|
41
42
|
{ cmd: "forensics", desc: "Examine execution logs" },
|
|
@@ -97,6 +98,11 @@ const NESTED_COMPLETIONS = {
|
|
|
97
98
|
{ cmd: "keys", desc: "Manage API keys" },
|
|
98
99
|
{ cmd: "prefs", desc: "Configure global preferences" },
|
|
99
100
|
],
|
|
101
|
+
notifications: [
|
|
102
|
+
{ cmd: "clear", desc: "Clear all notifications" },
|
|
103
|
+
{ cmd: "tail", desc: "Show last N notifications (default: 20)" },
|
|
104
|
+
{ cmd: "filter", desc: "Filter by severity (error|warning|info|success)" },
|
|
105
|
+
],
|
|
100
106
|
logs: [
|
|
101
107
|
{ cmd: "debug", desc: "List or view debug log files" },
|
|
102
108
|
{ cmd: "tail", desc: "Show last N activity log summaries" },
|
|
@@ -25,6 +25,7 @@ export function showHelp(ctx) {
|
|
|
25
25
|
" /gsd queue Show queued/dispatched units and execution order",
|
|
26
26
|
" /gsd history View execution history [--cost] [--phase] [--model] [N]",
|
|
27
27
|
" /gsd changelog Show categorized release notes [version]",
|
|
28
|
+
" /gsd notifications View persistent notification history [clear|tail|filter] (Ctrl+Alt+N)",
|
|
28
29
|
"",
|
|
29
30
|
"COURSE CORRECTION",
|
|
30
31
|
" /gsd steer <desc> Apply user override to active work",
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// GSD Extension — /gsd notifications Command Handler
|
|
2
|
+
// View, filter, and clear the persistent notification history.
|
|
3
|
+
import { readNotifications, clearNotifications, getUnreadCount, suppressPersistence, unsuppressPersistence, } from "../../notification-store.js";
|
|
4
|
+
import { GSDNotificationOverlay } from "../../notification-overlay.js";
|
|
5
|
+
function severityIcon(severity) {
|
|
6
|
+
switch (severity) {
|
|
7
|
+
case "error": return "✗";
|
|
8
|
+
case "warning": return "⚠";
|
|
9
|
+
case "success": return "✓";
|
|
10
|
+
case "info":
|
|
11
|
+
default: return "●";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function formatTimestamp(ts) {
|
|
15
|
+
try {
|
|
16
|
+
const d = new Date(ts);
|
|
17
|
+
return d.toLocaleString("en-US", { hour12: false, month: "short", day: "numeric", hour: "2-digit", minute: "2-digit" });
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return ts.slice(0, 19);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export async function handleNotificationsCommand(args, ctx, pi) {
|
|
24
|
+
// /gsd notifications clear
|
|
25
|
+
if (args === "clear") {
|
|
26
|
+
clearNotifications();
|
|
27
|
+
// Suppress persistence so the confirmation toast doesn't re-populate the store
|
|
28
|
+
suppressPersistence();
|
|
29
|
+
try {
|
|
30
|
+
ctx.ui.notify("All notifications cleared.", "success");
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
unsuppressPersistence();
|
|
34
|
+
}
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
// /gsd notifications tail [N]
|
|
38
|
+
if (args === "tail" || args.startsWith("tail ")) {
|
|
39
|
+
const countStr = args.replace(/^tail\s*/, "").trim();
|
|
40
|
+
const count = countStr ? parseInt(countStr, 10) : 20;
|
|
41
|
+
const n = isNaN(count) || count < 1 ? 20 : Math.min(count, 100);
|
|
42
|
+
const entries = readNotifications().slice(0, n);
|
|
43
|
+
if (entries.length === 0) {
|
|
44
|
+
ctx.ui.notify("No notifications.", "info");
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
const lines = entries.map((e) => `${severityIcon(e.severity)} [${formatTimestamp(e.ts)}] ${e.message}`);
|
|
48
|
+
ctx.ui.notify(`Last ${entries.length} notification(s):\n${lines.join("\n")}`, "info");
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
// /gsd notifications filter <severity>
|
|
52
|
+
if (args.startsWith("filter ")) {
|
|
53
|
+
const severity = args.replace(/^filter\s+/, "").trim().toLowerCase();
|
|
54
|
+
if (!["error", "warning", "info", "success"].includes(severity)) {
|
|
55
|
+
ctx.ui.notify("Usage: /gsd notifications filter <error|warning|info|success>", "warning");
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
const entries = readNotifications().filter((e) => e.severity === severity);
|
|
59
|
+
if (entries.length === 0) {
|
|
60
|
+
ctx.ui.notify(`No ${severity} notifications.`, "info");
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
const lines = entries.slice(0, 20).map((e) => `${severityIcon(e.severity)} [${formatTimestamp(e.ts)}] ${e.message}`);
|
|
64
|
+
const suffix = entries.length > 20 ? `\n... and ${entries.length - 20} more` : "";
|
|
65
|
+
ctx.ui.notify(`${severity} notifications (${entries.length}):\n${lines.join("\n")}${suffix}`, "info");
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
// /gsd notifications (no args) — open overlay in TUI, or print summary
|
|
69
|
+
if (args === "" || args === "status") {
|
|
70
|
+
// Try overlay first (TUI mode)
|
|
71
|
+
if (ctx.hasUI) {
|
|
72
|
+
try {
|
|
73
|
+
await ctx.ui.custom((tui, theme, _kb, done) => new GSDNotificationOverlay(tui, theme, () => done()), {
|
|
74
|
+
overlay: true,
|
|
75
|
+
overlayOptions: {
|
|
76
|
+
width: "80%",
|
|
77
|
+
minWidth: 60,
|
|
78
|
+
maxHeight: "88%",
|
|
79
|
+
anchor: "center",
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Fall through to text output if overlay fails
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Text fallback (RPC/headless mode)
|
|
89
|
+
const unread = getUnreadCount();
|
|
90
|
+
const entries = readNotifications().slice(0, 10);
|
|
91
|
+
if (entries.length === 0) {
|
|
92
|
+
ctx.ui.notify("No notifications.", "info");
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
const lines = entries.map((e) => `${severityIcon(e.severity)} [${formatTimestamp(e.ts)}] ${e.message}`);
|
|
96
|
+
const header = unread > 0 ? `${unread} unread — ` : "";
|
|
97
|
+
ctx.ui.notify(`${header}Recent notifications:\n${lines.join("\n")}`, "info");
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
// Unknown subcommand
|
|
101
|
+
ctx.ui.notify("Usage: /gsd notifications [clear|tail [N]|filter <severity>]", "warning");
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
@@ -175,6 +175,11 @@ Examples:
|
|
|
175
175
|
await dispatchDirectPhase(ctx, pi, phase, projectRoot());
|
|
176
176
|
return true;
|
|
177
177
|
}
|
|
178
|
+
if (trimmed === "notifications" || trimmed.startsWith("notifications ")) {
|
|
179
|
+
const { handleNotificationsCommand } = await import("./notifications-handler.js");
|
|
180
|
+
await handleNotificationsCommand(trimmed.replace(/^notifications\s*/, "").trim(), ctx, pi);
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
178
183
|
if (trimmed === "inspect") {
|
|
179
184
|
await handleInspect(ctx);
|
|
180
185
|
return true;
|
|
@@ -27,21 +27,26 @@ export function dispatchDoctorHeal(pi, scope, reportText, structuredIssues) {
|
|
|
27
27
|
const content = `Read the following GSD workflow protocol and execute exactly.\n\n${workflow}\n\n## Your Task\n\n${prompt}`;
|
|
28
28
|
pi.sendMessage({ customType: "gsd-doctor-heal", content, display: false }, { triggerTurn: true });
|
|
29
29
|
}
|
|
30
|
-
|
|
30
|
+
/** Parse doctor command args into structured flags and positionals (pure, no I/O). */
|
|
31
|
+
export function parseDoctorArgs(args) {
|
|
31
32
|
const trimmed = args.trim();
|
|
32
|
-
// Extract flags before positional parsing
|
|
33
33
|
const jsonMode = trimmed.includes("--json");
|
|
34
34
|
const dryRun = trimmed.includes("--dry-run");
|
|
35
|
+
const fixFlag = trimmed.includes("--fix");
|
|
35
36
|
const includeBuild = trimmed.includes("--build");
|
|
36
37
|
const includeTests = trimmed.includes("--test");
|
|
37
|
-
const stripped = trimmed.replace(/--json|--dry-run|--build|--test/g, "").trim();
|
|
38
|
+
const stripped = trimmed.replace(/--json|--dry-run|--build|--test|--fix/g, "").trim();
|
|
38
39
|
const parts = stripped ? stripped.split(/\s+/) : [];
|
|
39
40
|
const mode = parts[0] === "fix" || parts[0] === "heal" || parts[0] === "audit" ? parts[0] : "doctor";
|
|
40
41
|
const requestedScope = mode === "doctor" ? parts[0] : parts[1];
|
|
42
|
+
return { jsonMode, dryRun, fixFlag, includeBuild, includeTests, mode, requestedScope };
|
|
43
|
+
}
|
|
44
|
+
export async function handleDoctor(args, ctx, pi) {
|
|
45
|
+
const { jsonMode, dryRun, fixFlag, includeBuild, includeTests, mode, requestedScope } = parseDoctorArgs(args);
|
|
41
46
|
const scope = await selectDoctorScope(projectRoot(), requestedScope);
|
|
42
47
|
const effectiveScope = mode === "audit" ? requestedScope : scope;
|
|
43
48
|
const report = await runGSDDoctor(projectRoot(), {
|
|
44
|
-
fix: mode === "fix" || mode === "heal" || dryRun,
|
|
49
|
+
fix: mode === "fix" || mode === "heal" || dryRun || fixFlag,
|
|
45
50
|
dryRun,
|
|
46
51
|
scope: effectiveScope,
|
|
47
52
|
includeBuild,
|
|
@@ -13,3 +13,45 @@ export const DEFAULT_BASH_TIMEOUT_SECS = 120;
|
|
|
13
13
|
export const DIR_CACHE_MAX = 200;
|
|
14
14
|
/** Max parse-cache entries before eviction. */
|
|
15
15
|
export const CACHE_MAX = 50;
|
|
16
|
+
// ─── Tool Scoping ─────────────────────────────────────────────────────────────
|
|
17
|
+
/**
|
|
18
|
+
* GSD tools allowed during discuss flows (#2949).
|
|
19
|
+
*
|
|
20
|
+
* xAI/Grok (and potentially other providers with grammar-based constrained
|
|
21
|
+
* decoding) return "Grammar is too complex" (HTTP 400) when the combined
|
|
22
|
+
* tool schemas exceed their internal grammar limit. The full GSD tool set
|
|
23
|
+
* registers ~33 tools with deeply nested schemas; discuss flows only need
|
|
24
|
+
* a small subset.
|
|
25
|
+
*
|
|
26
|
+
* By scoping tools to this allowlist during discuss dispatches, the grammar
|
|
27
|
+
* sent to the provider stays well under provider limits.
|
|
28
|
+
*
|
|
29
|
+
* Included tools and why:
|
|
30
|
+
* - gsd_summary_save: writes CONTEXT.md artifacts (all discuss prompts)
|
|
31
|
+
* - gsd_save_summary: alias for above
|
|
32
|
+
* - gsd_decision_save: records decisions (discuss.md output phase)
|
|
33
|
+
* - gsd_save_decision: alias for above
|
|
34
|
+
* - gsd_plan_milestone: writes roadmap (discuss.md single/multi milestone)
|
|
35
|
+
* - gsd_milestone_plan: alias for above
|
|
36
|
+
* - gsd_milestone_generate_id: generates milestone IDs (discuss.md multi-milestone)
|
|
37
|
+
* - gsd_generate_milestone_id: alias for above
|
|
38
|
+
* - gsd_requirement_update: updates requirements during discuss
|
|
39
|
+
* - gsd_update_requirement: alias for above
|
|
40
|
+
*/
|
|
41
|
+
export const DISCUSS_TOOLS_ALLOWLIST = [
|
|
42
|
+
// Context / summary writing
|
|
43
|
+
"gsd_summary_save",
|
|
44
|
+
"gsd_save_summary",
|
|
45
|
+
// Decision recording
|
|
46
|
+
"gsd_decision_save",
|
|
47
|
+
"gsd_save_decision",
|
|
48
|
+
// Milestone planning (needed for discuss.md output phase)
|
|
49
|
+
"gsd_plan_milestone",
|
|
50
|
+
"gsd_milestone_plan",
|
|
51
|
+
// Milestone ID generation (multi-milestone flow)
|
|
52
|
+
"gsd_milestone_generate_id",
|
|
53
|
+
"gsd_generate_milestone_id",
|
|
54
|
+
// Requirement updates
|
|
55
|
+
"gsd_requirement_update",
|
|
56
|
+
"gsd_update_requirement",
|
|
57
|
+
];
|