gsd-pi 2.43.0 → 2.44.0-dev.0b97ffd
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 +30 -12
- package/dist/cli.js +13 -1
- package/dist/help-text.js +24 -0
- package/dist/resources/extensions/bg-shell/overlay.js +3 -0
- package/dist/resources/extensions/github-sync/sync.js +2 -1
- package/dist/resources/extensions/gsd/auto/loop.js +0 -2
- package/dist/resources/extensions/gsd/auto/phases.js +7 -12
- package/dist/resources/extensions/gsd/auto-dashboard.js +19 -18
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +34 -19
- package/dist/resources/extensions/gsd/auto-dispatch.js +36 -21
- package/dist/resources/extensions/gsd/auto-post-unit.js +128 -14
- package/dist/resources/extensions/gsd/auto-prompts.js +202 -92
- package/dist/resources/extensions/gsd/auto-recovery.js +83 -135
- package/dist/resources/extensions/gsd/auto-start.js +10 -0
- package/dist/resources/extensions/gsd/auto-supervisor.js +14 -0
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +4 -7
- package/dist/resources/extensions/gsd/auto-verification.js +5 -10
- package/dist/resources/extensions/gsd/auto-worktree.js +123 -30
- package/dist/resources/extensions/gsd/auto.js +1 -4
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +611 -0
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +28 -3
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -0
- package/dist/resources/extensions/gsd/commands/catalog.js +3 -1
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +15 -1
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
- package/dist/resources/extensions/gsd/commands-maintenance.js +78 -3
- package/dist/resources/extensions/gsd/dashboard-overlay.js +32 -31
- package/dist/resources/extensions/gsd/db-writer.js +95 -4
- package/dist/resources/extensions/gsd/dispatch-guard.js +35 -30
- package/dist/resources/extensions/gsd/doctor-checks.js +28 -11
- package/dist/resources/extensions/gsd/doctor-environment.js +28 -0
- package/dist/resources/extensions/gsd/doctor-types.js +0 -15
- package/dist/resources/extensions/gsd/doctor.js +46 -282
- package/dist/resources/extensions/gsd/file-watcher.js +5 -1
- package/dist/resources/extensions/gsd/files.js +14 -198
- package/dist/resources/extensions/gsd/git-service.js +4 -0
- package/dist/resources/extensions/gsd/gitignore.js +4 -0
- package/dist/resources/extensions/gsd/gsd-db.js +819 -197
- package/dist/resources/extensions/gsd/guided-flow.js +18 -8
- package/dist/resources/extensions/gsd/markdown-renderer.js +862 -0
- package/dist/resources/extensions/gsd/md-importer.js +182 -4
- package/dist/resources/extensions/gsd/native-git-bridge.js +10 -1
- package/dist/resources/extensions/gsd/parallel-eligibility.js +14 -19
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +38 -0
- package/dist/resources/extensions/gsd/parsers-legacy.js +239 -0
- package/dist/resources/extensions/gsd/preferences-types.js +1 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +9 -0
- package/dist/resources/extensions/gsd/preferences.js +1 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +22 -9
- package/dist/resources/extensions/gsd/prompts/discuss.md +2 -2
- package/dist/resources/extensions/gsd/prompts/execute-task.md +15 -5
- package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -7
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +6 -6
- package/dist/resources/extensions/gsd/reactive-graph.js +33 -3
- package/dist/resources/extensions/gsd/skill-health.js +3 -1
- package/dist/resources/extensions/gsd/state.js +484 -30
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +128 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +244 -0
- package/dist/resources/extensions/gsd/tools/complete-task.js +204 -0
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +205 -0
- package/dist/resources/extensions/gsd/tools/plan-slice.js +155 -0
- package/dist/resources/extensions/gsd/tools/plan-task.js +94 -0
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +152 -0
- package/dist/resources/extensions/gsd/tools/replan-slice.js +146 -0
- package/dist/resources/extensions/gsd/triage-resolution.js +17 -1
- package/dist/resources/extensions/gsd/undo.js +197 -3
- package/dist/resources/extensions/gsd/visualizer-data.js +53 -16
- package/dist/resources/extensions/gsd/workspace-index.js +63 -39
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +18 -17
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- package/dist/web/standalone/.next/required-server-files.json +4 -4
- package/dist/web/standalone/.next/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 +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -0
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -0
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -0
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +5 -5
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +18 -17
- package/dist/web/standalone/.next/server/chunks/229.js +3 -3
- package/dist/web/standalone/.next/server/chunks/471.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-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +2 -2
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/alS4hoANx0TK4UVZY27da/_buildManifest.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{4024.c195dc1fdd2adbea.js → 4024.0de81b543b28b9fe.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/app/_global-error/{page-d07a2c023f1aef1e.js → page-d83ba70a25a85472.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-f2a7482d42a5614b.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/boot/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{main-app-2f2ee7b85712c2bd.js → main-app-fdab67f7802d7832.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d83ba70a25a85472.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-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-fa307370fcf9fb2c.js → webpack-9014b5adb127a98a.js} +1 -1
- package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/package.json +4 -4
- package/packages/pi-ai/dist/models.custom.d.ts +173 -0
- package/packages/pi-ai/dist/models.custom.d.ts.map +1 -0
- package/packages/pi-ai/dist/models.custom.js +170 -0
- package/packages/pi-ai/dist/models.custom.js.map +1 -0
- package/packages/pi-ai/dist/models.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.js +16 -1
- package/packages/pi-ai/dist/models.js.map +1 -1
- package/packages/pi-ai/dist/models.test.d.ts +2 -0
- package/packages/pi-ai/dist/models.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/models.test.js +67 -0
- package/packages/pi-ai/dist/models.test.js.map +1 -0
- package/packages/pi-ai/src/models.custom.ts +172 -0
- package/packages/pi-ai/src/models.test.ts +85 -0
- package/packages/pi-ai/src/models.ts +17 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +10 -3
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +21 -34
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +4 -4
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +6 -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 +80 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.test.js +63 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +37 -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/fallback-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/fallback-resolver.js +2 -3
- package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +12 -2
- package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
- package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +38 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +192 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +5 -0
- package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/client.js +69 -21
- package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +255 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +15 -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 +40 -3
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-commands.d.ts +25 -0
- package/packages/pi-coding-agent/dist/core/package-commands.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/package-commands.js +253 -0
- package/packages/pi-coding-agent/dist/core/package-commands.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.js +225 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.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 +4 -0
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
- package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +3 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -0
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +11 -199
- package/packages/pi-coding-agent/dist/main.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts +6 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +21 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +8 -15
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/print-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/print-mode.js +45 -34
- package/packages/pi-coding-agent/dist/modes/print-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js +7 -2
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +2 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +26 -37
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
- package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +2 -2
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +3 -3
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +4 -4
- package/packages/pi-coding-agent/src/core/extensions/index.ts +5 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.test.ts +96 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +89 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
- package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -0
- package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +15 -2
- package/packages/pi-coding-agent/src/core/fallback-resolver.ts +2 -3
- package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
- package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +274 -0
- package/packages/pi-coding-agent/src/core/lsp/client.ts +83 -21
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +288 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +39 -3
- package/packages/pi-coding-agent/src/core/package-commands.test.ts +240 -0
- package/packages/pi-coding-agent/src/core/package-commands.ts +310 -0
- package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
- package/packages/pi-coding-agent/src/core/sdk.ts +4 -0
- package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
- package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
- package/packages/pi-coding-agent/src/index.ts +7 -0
- package/packages/pi-coding-agent/src/main.ts +11 -232
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +20 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +9 -16
- package/packages/pi-coding-agent/src/modes/print-mode.ts +42 -32
- package/packages/pi-coding-agent/src/modes/rpc/rpc-client.ts +8 -2
- package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -1
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
- package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.js +8 -15
- package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/bg-shell/overlay.ts +4 -0
- package/src/resources/extensions/github-sync/sync.ts +2 -1
- package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -8
- package/src/resources/extensions/gsd/auto/loop.ts +0 -2
- package/src/resources/extensions/gsd/auto/phases.ts +7 -20
- package/src/resources/extensions/gsd/auto/types.ts +0 -1
- package/src/resources/extensions/gsd/auto-dashboard.ts +20 -16
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +34 -19
- package/src/resources/extensions/gsd/auto-dispatch.ts +38 -21
- package/src/resources/extensions/gsd/auto-post-unit.ts +150 -15
- package/src/resources/extensions/gsd/auto-prompts.ts +186 -103
- package/src/resources/extensions/gsd/auto-recovery.ts +77 -142
- package/src/resources/extensions/gsd/auto-start.ts +14 -0
- package/src/resources/extensions/gsd/auto-supervisor.ts +14 -0
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +6 -7
- package/src/resources/extensions/gsd/auto-verification.ts +4 -9
- package/src/resources/extensions/gsd/auto-worktree.ts +126 -30
- package/src/resources/extensions/gsd/auto.ts +0 -9
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +675 -4
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +31 -3
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -0
- package/src/resources/extensions/gsd/commands/catalog.ts +3 -1
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +15 -1
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
- package/src/resources/extensions/gsd/commands-maintenance.ts +86 -3
- package/src/resources/extensions/gsd/dashboard-overlay.ts +17 -13
- package/src/resources/extensions/gsd/db-writer.ts +105 -4
- package/src/resources/extensions/gsd/dispatch-guard.ts +32 -30
- package/src/resources/extensions/gsd/doctor-checks.ts +25 -11
- package/src/resources/extensions/gsd/doctor-environment.ts +31 -0
- package/src/resources/extensions/gsd/doctor-types.ts +0 -23
- package/src/resources/extensions/gsd/doctor.ts +45 -295
- package/src/resources/extensions/gsd/file-watcher.ts +4 -1
- package/src/resources/extensions/gsd/files.ts +16 -220
- package/src/resources/extensions/gsd/git-service.ts +4 -0
- package/src/resources/extensions/gsd/gitignore.ts +4 -0
- package/src/resources/extensions/gsd/gsd-db.ts +1157 -370
- package/src/resources/extensions/gsd/guided-flow.ts +20 -8
- package/src/resources/extensions/gsd/markdown-renderer.ts +1098 -0
- package/src/resources/extensions/gsd/md-importer.ts +211 -2
- package/src/resources/extensions/gsd/native-git-bridge.ts +12 -1
- package/src/resources/extensions/gsd/parallel-eligibility.ts +14 -18
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +43 -0
- package/src/resources/extensions/gsd/parsers-legacy.ts +271 -0
- package/src/resources/extensions/gsd/preferences-types.ts +3 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +9 -0
- package/src/resources/extensions/gsd/preferences.ts +1 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +22 -9
- package/src/resources/extensions/gsd/prompts/discuss.md +2 -2
- package/src/resources/extensions/gsd/prompts/execute-task.md +15 -5
- package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
- package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -7
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
- package/src/resources/extensions/gsd/prompts/replan-slice.md +6 -6
- package/src/resources/extensions/gsd/reactive-graph.ts +33 -3
- package/src/resources/extensions/gsd/skill-health.ts +2 -1
- package/src/resources/extensions/gsd/state.ts +547 -29
- package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
- package/src/resources/extensions/gsd/tests/atomic-task-closeout.test.ts +8 -120
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +14 -16
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +20 -11
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
- package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +600 -513
- package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
- package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
- package/src/resources/extensions/gsd/tests/auto-stash-merge.test.ts +121 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +540 -668
- package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
- package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
- package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
- package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
- package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
- package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
- package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +39 -60
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +375 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +387 -0
- package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
- package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
- package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +27 -35
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -2
- package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +390 -420
- package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +512 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +644 -84
- package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
- package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
- package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +192 -161
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
- package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
- package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +30 -90
- package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
- package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +57 -80
- package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +164 -0
- package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
- package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +55 -153
- package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
- package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
- package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +53 -97
- package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
- package/src/resources/extensions/gsd/tests/doctor.test.ts +109 -149
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
- package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
- package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
- package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +278 -0
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +232 -0
- package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
- package/src/resources/extensions/gsd/tests/git-service.test.ts +291 -390
- package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
- package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +440 -0
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +81 -270
- package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
- package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
- package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
- package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
- package/src/resources/extensions/gsd/tests/integration-proof.test.ts +643 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1161 -0
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +81 -94
- package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
- package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +429 -0
- package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +89 -97
- package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +127 -164
- package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +35 -36
- package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +40 -47
- package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +25 -28
- package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
- package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
- package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
- package/src/resources/extensions/gsd/tests/parsers.test.ts +548 -612
- package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +176 -113
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +145 -0
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +305 -0
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
- package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
- package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
- package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +325 -0
- package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
- package/src/resources/extensions/gsd/tests/replan-handler.test.ts +410 -0
- package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
- package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
- package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +296 -0
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
- package/src/resources/extensions/gsd/tests/schema-v9-sequence.test.ts +176 -0
- package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -44
- package/src/resources/extensions/gsd/tests/shared-wal.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
- package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
- package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +118 -0
- package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +19 -13
- package/src/resources/extensions/gsd/tests/undo.test.ts +321 -1
- package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -142
- package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
- package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
- package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
- package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
- package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +12 -5
- package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
- package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
- package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +176 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +300 -0
- package/src/resources/extensions/gsd/tools/complete-task.ts +245 -0
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +249 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +194 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +116 -0
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +203 -0
- package/src/resources/extensions/gsd/tools/replan-slice.ts +192 -0
- package/src/resources/extensions/gsd/triage-resolution.ts +20 -1
- package/src/resources/extensions/gsd/types.ts +50 -0
- package/src/resources/extensions/gsd/undo.ts +247 -3
- package/src/resources/extensions/gsd/visualizer-data.ts +54 -17
- package/src/resources/extensions/gsd/workspace-index.ts +64 -46
- package/dist/resources/extensions/gsd/auto-observability.js +0 -56
- package/dist/resources/extensions/gsd/observability-validator.js +0 -422
- package/dist/resources/extensions/gsd/roadmap-mutations.js +0 -110
- package/dist/web/standalone/.next/static/VvclDCW6TAWjEyLU-EYL1/_buildManifest.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/css/123c0bb039697968.css +0 -1
- package/src/resources/extensions/gsd/auto-observability.ts +0 -74
- package/src/resources/extensions/gsd/observability-validator.ts +0 -456
- package/src/resources/extensions/gsd/roadmap-mutations.ts +0 -134
- package/src/resources/extensions/gsd/tests/doctor-task-done-missing-summary-slice-loop.test.ts +0 -174
- package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -474
- /package/dist/web/standalone/.next/static/{VvclDCW6TAWjEyLU-EYL1 → alS4hoANx0TK4UVZY27da}/_ssgManifest.js +0 -0
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import { describe, test } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
1
3
|
// gsd-tools — Structured LLM tool tests
|
|
2
4
|
//
|
|
3
5
|
// Tests the three registered tools: gsd_decision_save, gsd_requirement_update, gsd_summary_save.
|
|
4
6
|
// Each tool is tested via direct function invocation against an in-memory DB.
|
|
5
7
|
|
|
6
|
-
import { createTestContext } from './test-helpers.ts';
|
|
7
8
|
import * as path from 'node:path';
|
|
8
9
|
import * as os from 'node:os';
|
|
9
10
|
import * as fs from 'node:fs';
|
|
@@ -25,8 +26,6 @@ import {
|
|
|
25
26
|
} from '../db-writer.ts';
|
|
26
27
|
import type { Requirement } from '../types.ts';
|
|
27
28
|
|
|
28
|
-
const { assertEq, assertTrue, assertMatch, report } = createTestContext();
|
|
29
|
-
|
|
30
29
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
31
30
|
// Helpers
|
|
32
31
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
@@ -46,281 +45,249 @@ function cleanupDir(dir: string): void {
|
|
|
46
45
|
/**
|
|
47
46
|
* Simulate tool execute by calling the underlying DB functions directly.
|
|
48
47
|
* The actual tool registration happens in index.ts; here we test the
|
|
49
|
-
* execute logic pattern: check DB
|
|
48
|
+
* execute logic pattern: check DB -> call writer -> return result.
|
|
50
49
|
*/
|
|
51
50
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
revisable: 'Yes',
|
|
73
|
-
when_context: 'M001',
|
|
74
|
-
},
|
|
75
|
-
tmpDir,
|
|
76
|
-
);
|
|
77
|
-
|
|
78
|
-
assertEq(result.id, 'D001', 'First decision should be D001');
|
|
79
|
-
|
|
80
|
-
// Verify DB row exists
|
|
81
|
-
const row = getDecisionById('D001');
|
|
82
|
-
assertTrue(row !== null, 'Decision D001 should exist in DB');
|
|
83
|
-
assertEq(row!.scope, 'architecture', 'Decision scope should match');
|
|
84
|
-
assertEq(row!.decision, 'Use SQLite for metadata', 'Decision text should match');
|
|
85
|
-
assertEq(row!.choice, 'SQLite', 'Decision choice should match');
|
|
86
|
-
|
|
87
|
-
// Verify DECISIONS.md was generated
|
|
88
|
-
const mdPath = path.join(tmpDir, '.gsd', 'DECISIONS.md');
|
|
89
|
-
assertTrue(fs.existsSync(mdPath), 'DECISIONS.md should be created');
|
|
90
|
-
const mdContent = fs.readFileSync(mdPath, 'utf-8');
|
|
91
|
-
assertTrue(mdContent.includes('D001'), 'DECISIONS.md should contain D001');
|
|
92
|
-
assertTrue(mdContent.includes('SQLite'), 'DECISIONS.md should contain choice');
|
|
93
|
-
|
|
94
|
-
// (e) Decision tool auto-assigns correct next ID
|
|
95
|
-
const result2 = await saveDecisionToDb(
|
|
96
|
-
{
|
|
97
|
-
scope: 'testing',
|
|
98
|
-
decision: 'Test runner',
|
|
99
|
-
choice: 'vitest',
|
|
100
|
-
rationale: 'Fast and ESM-native',
|
|
101
|
-
},
|
|
102
|
-
tmpDir,
|
|
103
|
-
);
|
|
104
|
-
assertEq(result2.id, 'D002', 'Second decision should be D002');
|
|
105
|
-
|
|
106
|
-
const result3 = await saveDecisionToDb(
|
|
107
|
-
{
|
|
108
|
-
scope: 'CI',
|
|
109
|
-
decision: 'CI platform',
|
|
110
|
-
choice: 'GitHub Actions',
|
|
111
|
-
rationale: 'Integrated with repo',
|
|
112
|
-
},
|
|
113
|
-
tmpDir,
|
|
114
|
-
);
|
|
115
|
-
assertEq(result3.id, 'D003', 'Third decision should be D003');
|
|
116
|
-
|
|
117
|
-
closeDatabase();
|
|
118
|
-
} finally {
|
|
119
|
-
cleanupDir(tmpDir);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
51
|
+
describe('gsd-tools', () => {
|
|
52
|
+
test('gsd_decision_save', async () => {
|
|
53
|
+
const tmpDir = makeTmpDir();
|
|
54
|
+
try {
|
|
55
|
+
const dbPath = path.join(tmpDir, '.gsd', 'gsd.db');
|
|
56
|
+
openDatabase(dbPath);
|
|
57
|
+
assert.ok(isDbAvailable(), 'DB should be available after open');
|
|
58
|
+
|
|
59
|
+
// (a) Decision tool creates DB row + returns new ID
|
|
60
|
+
const result = await saveDecisionToDb(
|
|
61
|
+
{
|
|
62
|
+
scope: 'architecture',
|
|
63
|
+
decision: 'Use SQLite for metadata',
|
|
64
|
+
choice: 'SQLite',
|
|
65
|
+
rationale: 'Sync API fits the CLI model',
|
|
66
|
+
revisable: 'Yes',
|
|
67
|
+
when_context: 'M001',
|
|
68
|
+
},
|
|
69
|
+
tmpDir,
|
|
70
|
+
);
|
|
122
71
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
//
|
|
72
|
+
assert.deepStrictEqual(result.id, 'D001', 'First decision should be D001');
|
|
73
|
+
|
|
74
|
+
// Verify DB row exists
|
|
75
|
+
const row = getDecisionById('D001');
|
|
76
|
+
assert.ok(row !== null, 'Decision D001 should exist in DB');
|
|
77
|
+
assert.deepStrictEqual(row!.scope, 'architecture', 'Decision scope should match');
|
|
78
|
+
assert.deepStrictEqual(row!.decision, 'Use SQLite for metadata', 'Decision text should match');
|
|
79
|
+
assert.deepStrictEqual(row!.choice, 'SQLite', 'Decision choice should match');
|
|
80
|
+
|
|
81
|
+
// Verify DECISIONS.md was generated
|
|
82
|
+
const mdPath = path.join(tmpDir, '.gsd', 'DECISIONS.md');
|
|
83
|
+
assert.ok(fs.existsSync(mdPath), 'DECISIONS.md should be created');
|
|
84
|
+
const mdContent = fs.readFileSync(mdPath, 'utf-8');
|
|
85
|
+
assert.ok(mdContent.includes('D001'), 'DECISIONS.md should contain D001');
|
|
86
|
+
assert.ok(mdContent.includes('SQLite'), 'DECISIONS.md should contain choice');
|
|
87
|
+
|
|
88
|
+
// (e) Decision tool auto-assigns correct next ID
|
|
89
|
+
const result2 = await saveDecisionToDb(
|
|
90
|
+
{
|
|
91
|
+
scope: 'testing',
|
|
92
|
+
decision: 'Test runner',
|
|
93
|
+
choice: 'vitest',
|
|
94
|
+
rationale: 'Fast and ESM-native',
|
|
95
|
+
},
|
|
96
|
+
tmpDir,
|
|
97
|
+
);
|
|
98
|
+
assert.deepStrictEqual(result2.id, 'D002', 'Second decision should be D002');
|
|
99
|
+
|
|
100
|
+
const result3 = await saveDecisionToDb(
|
|
101
|
+
{
|
|
102
|
+
scope: 'CI',
|
|
103
|
+
decision: 'CI platform',
|
|
104
|
+
choice: 'GitHub Actions',
|
|
105
|
+
rationale: 'Integrated with repo',
|
|
106
|
+
},
|
|
107
|
+
tmpDir,
|
|
108
|
+
);
|
|
109
|
+
assert.deepStrictEqual(result3.id, 'D003', 'Third decision should be D003');
|
|
126
110
|
|
|
127
|
-
|
|
111
|
+
closeDatabase();
|
|
112
|
+
} finally {
|
|
113
|
+
cleanupDir(tmpDir);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
128
116
|
|
|
129
|
-
{
|
|
130
|
-
|
|
131
|
-
try {
|
|
132
|
-
const dbPath = path.join(tmpDir, '.gsd', 'gsd.db');
|
|
133
|
-
openDatabase(dbPath);
|
|
134
|
-
|
|
135
|
-
// Seed a requirement
|
|
136
|
-
const seedReq: Requirement = {
|
|
137
|
-
id: 'R001',
|
|
138
|
-
class: 'functional',
|
|
139
|
-
status: 'active',
|
|
140
|
-
description: 'Must support SQLite storage',
|
|
141
|
-
why: 'Structured data needs',
|
|
142
|
-
source: 'design',
|
|
143
|
-
primary_owner: 'S03',
|
|
144
|
-
supporting_slices: '',
|
|
145
|
-
validation: '',
|
|
146
|
-
notes: '',
|
|
147
|
-
full_content: '',
|
|
148
|
-
superseded_by: null,
|
|
149
|
-
};
|
|
150
|
-
upsertRequirement(seedReq);
|
|
151
|
-
|
|
152
|
-
// (b) Requirement update tool modifies existing requirement
|
|
153
|
-
await updateRequirementInDb(
|
|
154
|
-
'R001',
|
|
155
|
-
{ status: 'validated', validation: 'Unit tests pass', notes: 'Verified in S06' },
|
|
156
|
-
tmpDir,
|
|
157
|
-
);
|
|
158
|
-
|
|
159
|
-
const updated = getRequirementById('R001');
|
|
160
|
-
assertTrue(updated !== null, 'R001 should still exist');
|
|
161
|
-
assertEq(updated!.status, 'validated', 'Status should be updated');
|
|
162
|
-
assertEq(updated!.validation, 'Unit tests pass', 'Validation should be updated');
|
|
163
|
-
assertEq(updated!.notes, 'Verified in S06', 'Notes should be updated');
|
|
164
|
-
// Original fields preserved
|
|
165
|
-
assertEq(updated!.description, 'Must support SQLite storage', 'Description should be preserved');
|
|
166
|
-
assertEq(updated!.primary_owner, 'S03', 'Primary owner should be preserved');
|
|
167
|
-
|
|
168
|
-
// Verify REQUIREMENTS.md was generated
|
|
169
|
-
const mdPath = path.join(tmpDir, '.gsd', 'REQUIREMENTS.md');
|
|
170
|
-
assertTrue(fs.existsSync(mdPath), 'REQUIREMENTS.md should be created');
|
|
171
|
-
const mdContent = fs.readFileSync(mdPath, 'utf-8');
|
|
172
|
-
assertTrue(mdContent.includes('R001'), 'REQUIREMENTS.md should contain R001');
|
|
173
|
-
assertTrue(mdContent.includes('validated'), 'REQUIREMENTS.md should reflect updated status');
|
|
174
|
-
|
|
175
|
-
// Updating non-existent requirement throws
|
|
176
|
-
let threwForMissing = false;
|
|
117
|
+
test('gsd_requirement_update', async () => {
|
|
118
|
+
const tmpDir = makeTmpDir();
|
|
177
119
|
try {
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
120
|
+
const dbPath = path.join(tmpDir, '.gsd', 'gsd.db');
|
|
121
|
+
openDatabase(dbPath);
|
|
122
|
+
|
|
123
|
+
// Seed a requirement
|
|
124
|
+
const seedReq: Requirement = {
|
|
125
|
+
id: 'R001',
|
|
126
|
+
class: 'functional',
|
|
127
|
+
status: 'active',
|
|
128
|
+
description: 'Must support SQLite storage',
|
|
129
|
+
why: 'Structured data needs',
|
|
130
|
+
source: 'design',
|
|
131
|
+
primary_owner: 'S03',
|
|
132
|
+
supporting_slices: '',
|
|
133
|
+
validation: '',
|
|
134
|
+
notes: '',
|
|
135
|
+
full_content: '',
|
|
136
|
+
superseded_by: null,
|
|
137
|
+
};
|
|
138
|
+
upsertRequirement(seedReq);
|
|
139
|
+
|
|
140
|
+
// (b) Requirement update tool modifies existing requirement
|
|
141
|
+
await updateRequirementInDb(
|
|
142
|
+
'R001',
|
|
143
|
+
{ status: 'validated', validation: 'Unit tests pass', notes: 'Verified in S06' },
|
|
144
|
+
tmpDir,
|
|
184
145
|
);
|
|
185
|
-
}
|
|
186
|
-
assertTrue(threwForMissing, 'Should throw for non-existent requirement');
|
|
187
|
-
|
|
188
|
-
closeDatabase();
|
|
189
|
-
} finally {
|
|
190
|
-
cleanupDir(tmpDir);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
195
|
-
// gsd_summary_save tool tests
|
|
196
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
197
146
|
|
|
198
|
-
|
|
147
|
+
const updated = getRequirementById('R001');
|
|
148
|
+
assert.ok(updated !== null, 'R001 should still exist');
|
|
149
|
+
assert.deepStrictEqual(updated!.status, 'validated', 'Status should be updated');
|
|
150
|
+
assert.deepStrictEqual(updated!.validation, 'Unit tests pass', 'Validation should be updated');
|
|
151
|
+
assert.deepStrictEqual(updated!.notes, 'Verified in S06', 'Notes should be updated');
|
|
152
|
+
// Original fields preserved
|
|
153
|
+
assert.deepStrictEqual(updated!.description, 'Must support SQLite storage', 'Description should be preserved');
|
|
154
|
+
assert.deepStrictEqual(updated!.primary_owner, 'S03', 'Primary owner should be preserved');
|
|
155
|
+
|
|
156
|
+
// Verify REQUIREMENTS.md was generated
|
|
157
|
+
const mdPath = path.join(tmpDir, '.gsd', 'REQUIREMENTS.md');
|
|
158
|
+
assert.ok(fs.existsSync(mdPath), 'REQUIREMENTS.md should be created');
|
|
159
|
+
const mdContent = fs.readFileSync(mdPath, 'utf-8');
|
|
160
|
+
assert.ok(mdContent.includes('R001'), 'REQUIREMENTS.md should contain R001');
|
|
161
|
+
assert.ok(mdContent.includes('validated'), 'REQUIREMENTS.md should reflect updated status');
|
|
162
|
+
|
|
163
|
+
// Updating non-existent requirement throws
|
|
164
|
+
let threwForMissing = false;
|
|
165
|
+
try {
|
|
166
|
+
await updateRequirementInDb('R999', { status: 'deferred' }, tmpDir);
|
|
167
|
+
} catch (err) {
|
|
168
|
+
threwForMissing = true;
|
|
169
|
+
assert.ok(
|
|
170
|
+
(err as Error).message.includes('R999'),
|
|
171
|
+
'Error should mention the missing requirement ID',
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
assert.ok(threwForMissing, 'Should throw for non-existent requirement');
|
|
175
|
+
|
|
176
|
+
closeDatabase();
|
|
177
|
+
} finally {
|
|
178
|
+
cleanupDir(tmpDir);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
199
181
|
|
|
200
|
-
{
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
// Verify artifact in DB
|
|
219
|
-
const adapter = _getAdapter();
|
|
220
|
-
assertTrue(adapter !== null, 'Adapter should be available');
|
|
221
|
-
const rows = adapter!.prepare(
|
|
222
|
-
"SELECT * FROM artifacts WHERE path = 'milestones/M001/slices/S01/S01-SUMMARY.md'",
|
|
223
|
-
).all();
|
|
224
|
-
assertEq(rows.length, 1, 'Should have 1 artifact row');
|
|
225
|
-
assertEq(rows[0]['artifact_type'] as string, 'SUMMARY', 'Artifact type should be SUMMARY');
|
|
226
|
-
assertEq(rows[0]['milestone_id'] as string, 'M001', 'Milestone ID should match');
|
|
227
|
-
assertEq(rows[0]['slice_id'] as string, 'S01', 'Slice ID should match');
|
|
228
|
-
|
|
229
|
-
// Verify file was written to disk
|
|
230
|
-
const filePath = path.join(tmpDir, '.gsd', 'milestones', 'M001', 'slices', 'S01', 'S01-SUMMARY.md');
|
|
231
|
-
assertTrue(fs.existsSync(filePath), 'Summary file should be written to disk');
|
|
232
|
-
const fileContent = fs.readFileSync(filePath, 'utf-8');
|
|
233
|
-
assertTrue(fileContent.includes('S01 Summary'), 'File should contain summary content');
|
|
234
|
-
|
|
235
|
-
// Test milestone-level artifact (no slice_id)
|
|
236
|
-
await saveArtifactToDb(
|
|
237
|
-
{
|
|
238
|
-
path: 'milestones/M001/M001-CONTEXT.md',
|
|
239
|
-
artifact_type: 'CONTEXT',
|
|
240
|
-
content: '# M001 Context\n\nContext notes.',
|
|
241
|
-
milestone_id: 'M001',
|
|
242
|
-
},
|
|
243
|
-
tmpDir,
|
|
244
|
-
);
|
|
245
|
-
|
|
246
|
-
const mFilePath = path.join(tmpDir, '.gsd', 'milestones', 'M001', 'M001-CONTEXT.md');
|
|
247
|
-
assertTrue(fs.existsSync(mFilePath), 'Milestone-level artifact file should be created');
|
|
248
|
-
|
|
249
|
-
// Test task-level artifact
|
|
250
|
-
await saveArtifactToDb(
|
|
251
|
-
{
|
|
252
|
-
path: 'milestones/M001/slices/S01/tasks/T01-SUMMARY.md',
|
|
253
|
-
artifact_type: 'SUMMARY',
|
|
254
|
-
content: '# T01 Summary\n\nTask summary.',
|
|
255
|
-
milestone_id: 'M001',
|
|
256
|
-
slice_id: 'S01',
|
|
257
|
-
task_id: 'T01',
|
|
258
|
-
},
|
|
259
|
-
tmpDir,
|
|
260
|
-
);
|
|
261
|
-
|
|
262
|
-
const tFilePath = path.join(tmpDir, '.gsd', 'milestones', 'M001', 'slices', 'S01', 'tasks', 'T01-SUMMARY.md');
|
|
263
|
-
assertTrue(fs.existsSync(tFilePath), 'Task-level artifact file should be created');
|
|
264
|
-
|
|
265
|
-
closeDatabase();
|
|
266
|
-
} finally {
|
|
267
|
-
cleanupDir(tmpDir);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
182
|
+
test('gsd_summary_save', async () => {
|
|
183
|
+
const tmpDir = makeTmpDir();
|
|
184
|
+
try {
|
|
185
|
+
const dbPath = path.join(tmpDir, '.gsd', 'gsd.db');
|
|
186
|
+
openDatabase(dbPath);
|
|
187
|
+
|
|
188
|
+
// (c) Summary tool creates artifact row
|
|
189
|
+
await saveArtifactToDb(
|
|
190
|
+
{
|
|
191
|
+
path: 'milestones/M001/slices/S01/S01-SUMMARY.md',
|
|
192
|
+
artifact_type: 'SUMMARY',
|
|
193
|
+
content: '# S01 Summary\n\nThis is a test summary.',
|
|
194
|
+
milestone_id: 'M001',
|
|
195
|
+
slice_id: 'S01',
|
|
196
|
+
},
|
|
197
|
+
tmpDir,
|
|
198
|
+
);
|
|
270
199
|
|
|
271
|
-
//
|
|
272
|
-
|
|
273
|
-
|
|
200
|
+
// Verify artifact in DB
|
|
201
|
+
const adapter = _getAdapter();
|
|
202
|
+
assert.ok(adapter !== null, 'Adapter should be available');
|
|
203
|
+
const rows = adapter!.prepare(
|
|
204
|
+
"SELECT * FROM artifacts WHERE path = 'milestones/M001/slices/S01/S01-SUMMARY.md'",
|
|
205
|
+
).all();
|
|
206
|
+
assert.deepStrictEqual(rows.length, 1, 'Should have 1 artifact row');
|
|
207
|
+
assert.deepStrictEqual(rows[0]['artifact_type'] as string, 'SUMMARY', 'Artifact type should be SUMMARY');
|
|
208
|
+
assert.deepStrictEqual(rows[0]['milestone_id'] as string, 'M001', 'Milestone ID should match');
|
|
209
|
+
assert.deepStrictEqual(rows[0]['slice_id'] as string, 'S01', 'Slice ID should match');
|
|
210
|
+
|
|
211
|
+
// Verify file was written to disk
|
|
212
|
+
const filePath = path.join(tmpDir, '.gsd', 'milestones', 'M001', 'slices', 'S01', 'S01-SUMMARY.md');
|
|
213
|
+
assert.ok(fs.existsSync(filePath), 'Summary file should be written to disk');
|
|
214
|
+
const fileContent = fs.readFileSync(filePath, 'utf-8');
|
|
215
|
+
assert.ok(fileContent.includes('S01 Summary'), 'File should contain summary content');
|
|
216
|
+
|
|
217
|
+
// Test milestone-level artifact (no slice_id)
|
|
218
|
+
await saveArtifactToDb(
|
|
219
|
+
{
|
|
220
|
+
path: 'milestones/M001/M001-CONTEXT.md',
|
|
221
|
+
artifact_type: 'CONTEXT',
|
|
222
|
+
content: '# M001 Context\n\nContext notes.',
|
|
223
|
+
milestone_id: 'M001',
|
|
224
|
+
},
|
|
225
|
+
tmpDir,
|
|
226
|
+
);
|
|
274
227
|
|
|
275
|
-
|
|
228
|
+
const mFilePath = path.join(tmpDir, '.gsd', 'milestones', 'M001', 'M001-CONTEXT.md');
|
|
229
|
+
assert.ok(fs.existsSync(mFilePath), 'Milestone-level artifact file should be created');
|
|
230
|
+
|
|
231
|
+
// Test task-level artifact
|
|
232
|
+
await saveArtifactToDb(
|
|
233
|
+
{
|
|
234
|
+
path: 'milestones/M001/slices/S01/tasks/T01-SUMMARY.md',
|
|
235
|
+
artifact_type: 'SUMMARY',
|
|
236
|
+
content: '# T01 Summary\n\nTask summary.',
|
|
237
|
+
milestone_id: 'M001',
|
|
238
|
+
slice_id: 'S01',
|
|
239
|
+
task_id: 'T01',
|
|
240
|
+
},
|
|
241
|
+
tmpDir,
|
|
242
|
+
);
|
|
276
243
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
// Close any open DB and don't open a new one
|
|
280
|
-
try { closeDatabase(); } catch { /* already closed */ }
|
|
244
|
+
const tFilePath = path.join(tmpDir, '.gsd', 'milestones', 'M001', 'slices', 'S01', 'tasks', 'T01-SUMMARY.md');
|
|
245
|
+
assert.ok(fs.existsSync(tFilePath), 'Task-level artifact file should be created');
|
|
281
246
|
|
|
282
|
-
|
|
283
|
-
|
|
247
|
+
closeDatabase();
|
|
248
|
+
} finally {
|
|
249
|
+
cleanupDir(tmpDir);
|
|
250
|
+
}
|
|
251
|
+
});
|
|
284
252
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
}
|
|
253
|
+
test('DB unavailable error paths', async () => {
|
|
254
|
+
// (d) All tools return isError when DB unavailable
|
|
255
|
+
// Close any open DB and don't open a new one
|
|
256
|
+
try { closeDatabase(); } catch { /* already closed */ }
|
|
289
257
|
|
|
290
|
-
//
|
|
291
|
-
|
|
292
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
258
|
+
// isDbAvailable() should return false
|
|
259
|
+
assert.ok(!isDbAvailable(), 'DB should be unavailable after close');
|
|
293
260
|
|
|
294
|
-
|
|
261
|
+
// nextDecisionId degrades gracefully
|
|
262
|
+
const fallbackId = await nextDecisionId();
|
|
263
|
+
assert.deepStrictEqual(fallbackId, 'D001', 'nextDecisionId should return D001 when DB unavailable');
|
|
264
|
+
});
|
|
295
265
|
|
|
296
|
-
{
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
// The saveDecisionToDb returns {id} — the tool wrapping adds the AgentToolResult shape.
|
|
314
|
-
// Verify the raw function returns the expected shape.
|
|
315
|
-
assertTrue(typeof result.id === 'string', 'saveDecisionToDb should return {id: string}');
|
|
316
|
-
assertMatch(result.id, /^D\d{3}$/, 'ID should match DXXX pattern');
|
|
317
|
-
|
|
318
|
-
closeDatabase();
|
|
319
|
-
} finally {
|
|
320
|
-
cleanupDir(tmpDir);
|
|
321
|
-
}
|
|
322
|
-
}
|
|
266
|
+
test('Tool result format', async () => {
|
|
267
|
+
const tmpDir = makeTmpDir();
|
|
268
|
+
try {
|
|
269
|
+
const dbPath = path.join(tmpDir, '.gsd', 'gsd.db');
|
|
270
|
+
openDatabase(dbPath);
|
|
271
|
+
|
|
272
|
+
// Verify result follows AgentToolResult interface: {content: [{type: "text", text}], details}
|
|
273
|
+
const result = await saveDecisionToDb(
|
|
274
|
+
{
|
|
275
|
+
scope: 'format-test',
|
|
276
|
+
decision: 'Test format',
|
|
277
|
+
choice: 'TypeBox',
|
|
278
|
+
rationale: 'Schema validation',
|
|
279
|
+
},
|
|
280
|
+
tmpDir,
|
|
281
|
+
);
|
|
323
282
|
|
|
324
|
-
//
|
|
283
|
+
// The saveDecisionToDb returns {id} - the tool wrapping adds the AgentToolResult shape.
|
|
284
|
+
// Verify the raw function returns the expected shape.
|
|
285
|
+
assert.ok(typeof result.id === 'string', 'saveDecisionToDb should return {id: string}');
|
|
286
|
+
assert.match(result.id, /^D\d{3}$/, 'ID should match DXXX pattern');
|
|
325
287
|
|
|
326
|
-
|
|
288
|
+
closeDatabase();
|
|
289
|
+
} finally {
|
|
290
|
+
cleanupDir(tmpDir);
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
});
|
|
@@ -23,7 +23,7 @@ function makeTempDir(prefix: string): string {
|
|
|
23
23
|
// loadAndValidateAnswerFile
|
|
24
24
|
// ---------------------------------------------------------------------------
|
|
25
25
|
|
|
26
|
-
test('loadAndValidateAnswerFile — valid file', () => {
|
|
26
|
+
test('loadAndValidateAnswerFile — valid file', (t) => {
|
|
27
27
|
const tmp = makeTempDir('answers-valid');
|
|
28
28
|
try {
|
|
29
29
|
const data = {
|
|
@@ -43,7 +43,7 @@ test('loadAndValidateAnswerFile — valid file', () => {
|
|
|
43
43
|
}
|
|
44
44
|
});
|
|
45
45
|
|
|
46
|
-
test('loadAndValidateAnswerFile — invalid JSON', () => {
|
|
46
|
+
test('loadAndValidateAnswerFile — invalid JSON', (t) => {
|
|
47
47
|
const tmp = makeTempDir('answers-bad-json');
|
|
48
48
|
try {
|
|
49
49
|
const filePath = join(tmp, 'answers.json');
|
|
@@ -58,7 +58,7 @@ test('loadAndValidateAnswerFile — invalid JSON', () => {
|
|
|
58
58
|
}
|
|
59
59
|
});
|
|
60
60
|
|
|
61
|
-
test('loadAndValidateAnswerFile — wrong types (non-string question value)', () => {
|
|
61
|
+
test('loadAndValidateAnswerFile — wrong types (non-string question value)', (t) => {
|
|
62
62
|
const tmp = makeTempDir('answers-bad-q');
|
|
63
63
|
try {
|
|
64
64
|
const filePath = join(tmp, 'answers.json');
|
|
@@ -73,7 +73,7 @@ test('loadAndValidateAnswerFile — wrong types (non-string question value)', ()
|
|
|
73
73
|
}
|
|
74
74
|
});
|
|
75
75
|
|
|
76
|
-
test('loadAndValidateAnswerFile — wrong types (non-string secret value)', () => {
|
|
76
|
+
test('loadAndValidateAnswerFile — wrong types (non-string secret value)', (t) => {
|
|
77
77
|
const tmp = makeTempDir('answers-bad-secret');
|
|
78
78
|
try {
|
|
79
79
|
const filePath = join(tmp, 'answers.json');
|
|
@@ -116,7 +116,7 @@ function makeSelectEvent(
|
|
|
116
116
|
};
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
-
test('observeEvent stores metadata', () => {
|
|
119
|
+
test('observeEvent stores metadata', (t) => {
|
|
120
120
|
const injector = new AnswerInjector({});
|
|
121
121
|
|
|
122
122
|
injector.observeEvent(makeToolExecutionStart([{
|
|
@@ -140,7 +140,7 @@ test('observeEvent stores metadata', () => {
|
|
|
140
140
|
assert.strictEqual(injector.getStats().questionsDefaulted, 1);
|
|
141
141
|
});
|
|
142
142
|
|
|
143
|
-
test('tryHandle matches by question ID — single select', () => {
|
|
143
|
+
test('tryHandle matches by question ID — single select', (t) => {
|
|
144
144
|
const injector = new AnswerInjector({ questions: { deploy_target: 'GCP' } });
|
|
145
145
|
|
|
146
146
|
injector.observeEvent(makeToolExecutionStart([{
|
|
@@ -164,7 +164,7 @@ test('tryHandle matches by question ID — single select', () => {
|
|
|
164
164
|
assert.strictEqual(injector.getStats().questionsAnswered, 1);
|
|
165
165
|
});
|
|
166
166
|
|
|
167
|
-
test('tryHandle unknown question deferred — first_option timeout', async () => {
|
|
167
|
+
test('tryHandle unknown question deferred — first_option timeout', async (t) => {
|
|
168
168
|
const injector = new AnswerInjector({ defaults: { strategy: 'first_option' } });
|
|
169
169
|
|
|
170
170
|
const captured: string[] = [];
|
|
@@ -188,7 +188,7 @@ test('tryHandle unknown question deferred — first_option timeout', async () =>
|
|
|
188
188
|
assert.strictEqual(injector.getStats().questionsDefaulted, 1);
|
|
189
189
|
});
|
|
190
190
|
|
|
191
|
-
test('tryHandle multi-select', () => {
|
|
191
|
+
test('tryHandle multi-select', (t) => {
|
|
192
192
|
const injector = new AnswerInjector({ questions: { features: ['auth', 'payments'] } });
|
|
193
193
|
|
|
194
194
|
injector.observeEvent(makeToolExecutionStart([{
|
|
@@ -218,7 +218,7 @@ test('tryHandle multi-select', () => {
|
|
|
218
218
|
assert.strictEqual(injector.getStats().questionsAnswered, 1);
|
|
219
219
|
});
|
|
220
220
|
|
|
221
|
-
test('tryHandle answer not in options — first_option strategy returns false', () => {
|
|
221
|
+
test('tryHandle answer not in options — first_option strategy returns false', (t) => {
|
|
222
222
|
const injector = new AnswerInjector({ questions: { deploy_target: 'Azure' } });
|
|
223
223
|
|
|
224
224
|
injector.observeEvent(makeToolExecutionStart([{
|
|
@@ -240,7 +240,7 @@ test('tryHandle answer not in options — first_option strategy returns false',
|
|
|
240
240
|
assert.strictEqual(injector.getStats().questionsAnswered, 0);
|
|
241
241
|
});
|
|
242
242
|
|
|
243
|
-
test('tryHandle deferred resolution — observeEvent after tryHandle', async () => {
|
|
243
|
+
test('tryHandle deferred resolution — observeEvent after tryHandle', async (t) => {
|
|
244
244
|
const injector = new AnswerInjector({ questions: { deploy_target: 'GCP' } });
|
|
245
245
|
|
|
246
246
|
const captured: string[] = [];
|
|
@@ -272,7 +272,7 @@ test('tryHandle deferred resolution — observeEvent after tryHandle', async ()
|
|
|
272
272
|
// AnswerInjector — getSecretEnvVars
|
|
273
273
|
// ---------------------------------------------------------------------------
|
|
274
274
|
|
|
275
|
-
test('getSecretEnvVars returns secrets map', () => {
|
|
275
|
+
test('getSecretEnvVars returns secrets map', (t) => {
|
|
276
276
|
const secrets = { API_KEY: 'sk-123', DB_URL: 'postgres://localhost/db' };
|
|
277
277
|
const injector = new AnswerInjector({ secrets });
|
|
278
278
|
|
|
@@ -283,7 +283,7 @@ test('getSecretEnvVars returns secrets map', () => {
|
|
|
283
283
|
// AnswerInjector — getUnusedWarnings
|
|
284
284
|
// ---------------------------------------------------------------------------
|
|
285
285
|
|
|
286
|
-
test('getUnusedWarnings reports unused question IDs and secret keys', () => {
|
|
286
|
+
test('getUnusedWarnings reports unused question IDs and secret keys', (t) => {
|
|
287
287
|
const injector = new AnswerInjector({
|
|
288
288
|
questions: { q1: 'val1', q2: 'val2' },
|
|
289
289
|
secrets: { KEY1: 'v1' },
|
|
@@ -314,7 +314,7 @@ test('getUnusedWarnings reports unused question IDs and secret keys', () => {
|
|
|
314
314
|
// AnswerInjector — defaults.strategy cancel
|
|
315
315
|
// ---------------------------------------------------------------------------
|
|
316
316
|
|
|
317
|
-
test('defaults.strategy cancel — sends cancelled response', () => {
|
|
317
|
+
test('defaults.strategy cancel — sends cancelled response', (t) => {
|
|
318
318
|
const injector = new AnswerInjector({ defaults: { strategy: 'cancel' } });
|
|
319
319
|
|
|
320
320
|
injector.observeEvent(makeToolExecutionStart([{
|