gsd-pi 2.49.0 → 2.50.0-dev.d210a87
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 +2 -0
- package/dist/cli.js +26 -0
- package/dist/headless-ui.js +12 -2
- package/dist/headless.js +29 -13
- package/dist/loader.js +4 -0
- package/dist/resource-loader.d.ts +4 -1
- package/dist/resource-loader.js +138 -3
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +3 -1
- package/dist/resources/extensions/bg-shell/interaction.js +3 -1
- package/dist/resources/extensions/bg-shell/process-manager.js +4 -1
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +5 -0
- package/dist/resources/extensions/gsd/auto/infra-errors.js +1 -0
- package/dist/resources/extensions/gsd/auto/phases.js +27 -12
- package/dist/resources/extensions/gsd/auto/resolve.js +2 -2
- package/dist/resources/extensions/gsd/auto/run-unit.js +2 -2
- package/dist/resources/extensions/gsd/auto/session.js +9 -0
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +8 -10
- package/dist/resources/extensions/gsd/auto-dashboard.js +28 -6
- package/dist/resources/extensions/gsd/auto-dispatch.js +113 -74
- package/dist/resources/extensions/gsd/auto-observability.js +54 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +53 -99
- package/dist/resources/extensions/gsd/auto-prompts.js +155 -17
- package/dist/resources/extensions/gsd/auto-recovery.js +79 -205
- package/dist/resources/extensions/gsd/auto-start.js +4 -31
- package/dist/resources/extensions/gsd/auto-timers.js +2 -2
- package/dist/resources/extensions/gsd/auto-utils.js +20 -0
- package/dist/resources/extensions/gsd/auto-verification.js +4 -7
- package/dist/resources/extensions/gsd/auto-worktree.js +257 -113
- package/dist/resources/extensions/gsd/auto.js +22 -10
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +89 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +24 -1
- package/dist/resources/extensions/gsd/branch-patterns.js +13 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +6 -2
- package/dist/resources/extensions/gsd/custom-execution-policy.js +3 -2
- package/dist/resources/extensions/gsd/custom-verification.js +3 -1
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +3 -2
- package/dist/resources/extensions/gsd/dashboard-overlay.js +4 -0
- package/dist/resources/extensions/gsd/detection.js +589 -3
- package/dist/resources/extensions/gsd/dispatch-guard.js +2 -1
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +15 -0
- package/dist/resources/extensions/gsd/doctor-checks.js +5 -1234
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +168 -0
- package/dist/resources/extensions/gsd/doctor-environment.js +28 -7
- package/dist/resources/extensions/gsd/doctor-git-checks.js +405 -0
- package/dist/resources/extensions/gsd/doctor-global-checks.js +74 -0
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +600 -0
- package/dist/resources/extensions/gsd/doctor.js +9 -1
- package/dist/resources/extensions/gsd/extension-manifest.json +1 -1
- package/dist/resources/extensions/gsd/files.js +5 -1
- package/dist/resources/extensions/gsd/git-service.js +9 -10
- package/dist/resources/extensions/gsd/gsd-db.js +124 -1
- package/dist/resources/extensions/gsd/guided-flow-queue.js +10 -11
- package/dist/resources/extensions/gsd/guided-flow.js +10 -0
- package/dist/resources/extensions/gsd/init-wizard.js +9 -1
- package/dist/resources/extensions/gsd/markdown-renderer.js +33 -5
- package/dist/resources/extensions/gsd/model-router.js +25 -0
- package/dist/resources/extensions/gsd/notifications.js +23 -0
- package/dist/resources/extensions/gsd/observability-validator.js +422 -0
- package/dist/resources/extensions/gsd/preferences-skills.js +11 -5
- package/dist/resources/extensions/gsd/preferences-types.js +3 -1
- package/dist/resources/extensions/gsd/preferences-validation.js +64 -0
- package/dist/resources/extensions/gsd/preferences.js +3 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +27 -8
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +9 -8
- package/dist/resources/extensions/gsd/prompts/execute-task.md +16 -13
- package/dist/resources/extensions/gsd/prompts/forensics.md +19 -8
- package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +32 -0
- 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/guided-plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +8 -3
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +3 -0
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +6 -1
- package/dist/resources/extensions/gsd/provider-error-pause.js +8 -0
- package/dist/resources/extensions/gsd/repo-identity.js +29 -0
- package/dist/resources/extensions/gsd/roadmap-mutations.js +110 -0
- package/dist/resources/extensions/gsd/roadmap-slices.js +2 -2
- package/dist/resources/extensions/gsd/rtk-status.js +43 -0
- package/dist/resources/extensions/gsd/rule-registry.js +10 -11
- package/dist/resources/extensions/gsd/session-forensics.js +13 -14
- package/dist/resources/extensions/gsd/session-lock.js +67 -56
- package/dist/resources/extensions/gsd/skill-catalog.js +1026 -0
- package/dist/resources/extensions/gsd/skill-discovery.js +3 -2
- package/dist/resources/extensions/gsd/skill-health.js +2 -2
- package/dist/resources/extensions/gsd/skill-telemetry.js +15 -5
- package/dist/resources/extensions/gsd/state.js +51 -12
- package/dist/resources/extensions/gsd/templates/milestone-summary.md +8 -0
- package/dist/resources/extensions/gsd/templates/milestone-validation.md +12 -0
- package/dist/resources/extensions/gsd/templates/plan.md +16 -0
- package/dist/resources/extensions/gsd/templates/preferences.md +2 -0
- package/dist/resources/extensions/gsd/templates/roadmap.md +13 -0
- package/dist/resources/extensions/gsd/templates/slice-summary.md +9 -0
- package/dist/resources/extensions/gsd/templates/task-plan.md +24 -0
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +28 -9
- package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -1
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +3 -3
- package/dist/resources/extensions/gsd/undo.js +8 -7
- package/dist/resources/extensions/gsd/unit-runtime.js +2 -1
- package/dist/resources/extensions/gsd/verdict-parser.js +84 -0
- package/dist/resources/extensions/gsd/verification-gate.js +3 -1
- package/dist/resources/extensions/gsd/worktree-resolver.js +24 -0
- package/dist/resources/extensions/gsd/worktree.js +3 -2
- package/dist/resources/extensions/remote-questions/config.js +3 -5
- package/dist/resources/extensions/search-the-web/native-search.js +8 -3
- package/dist/resources/extensions/search-the-web/tool-search.js +19 -2
- package/dist/resources/extensions/shared/rtk-session-stats.js +189 -0
- package/dist/resources/extensions/shared/rtk.js +100 -0
- package/dist/resources/skills/github-workflows/references/gh/SKILL.md +22 -1
- package/dist/rtk.d.ts +52 -0
- package/dist/rtk.js +332 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +20 -19
- 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 +2 -2
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- 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.js.nft.json +1 -1
- 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.js.nft.json +1 -1
- 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.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.js.nft.json +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.js.nft.json +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 +3 -0
- package/dist/web/standalone/.next/server/app/api/experimental/route.js.nft.json +1 -0
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -0
- 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/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.js.nft.json +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 -26
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js.nft.json +1 -1
- 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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- 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.js.nft.json +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.js.nft.json +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 +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +20 -19
- package/dist/web/standalone/.next/server/chunks/2229.js +12 -0
- package/dist/web/standalone/.next/server/chunks/2331.js +25 -0
- package/dist/web/standalone/.next/server/chunks/{741.js → 4741.js} +1 -1
- package/dist/web/standalone/.next/server/chunks/5822.js +2 -0
- package/dist/web/standalone/.next/server/chunks/7471.js +13 -0
- 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 +3 -3
- 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/server/webpack-runtime.js +1 -1
- package/dist/web/standalone/.next/static/chunks/{485.243af25f0cdf50d6.js → 2008.817d0885545aaea9.js} +6 -6
- package/dist/web/standalone/.next/static/chunks/4024.9ad5def014d90ce4.js +9 -0
- package/dist/web/standalone/.next/static/chunks/app/_global-error/page-c4cc189e7b117ea2.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-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/experimental/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-c4cc189e7b117ea2.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-b950e4e384cc62b3.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-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-c4cc189e7b117ea2.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-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/webpack-cfc9a116e6450a6b.js +1 -0
- package/dist/web/standalone/.next/static/css/de141508b083f922.css +1 -0
- package/dist/web/standalone/.next/static/yJIyd5cXPNpmXTv18ZlyC/_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/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +4 -1
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.ts +4 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js +39 -10
- package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +1 -0
- 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/providers/openai-codex-responses.ts +39 -8
- package/packages/pi-ai/src/types.ts +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +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 +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/bash-executor.d.ts +3 -1
- package/packages/pi-coding-agent/dist/core/bash-executor.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/bash-executor.js +10 -1
- package/packages/pi-coding-agent/dist/core/bash-executor.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/blob-store.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/blob-store.js +8 -3
- package/packages/pi-coding-agent/dist/core/blob-store.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/discovery-cache.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/discovery-cache.js +9 -2
- package/packages/pi-coding-agent/dist/core/discovery-cache.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/runner.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +13 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +19 -1
- 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/extensions/wrapper.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/wrapper.js +8 -0
- package/packages/pi-coding-agent/dist/core/extensions/wrapper.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.js +8 -1
- package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts +11 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.js +30 -8
- package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -0
- package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +2 -2
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +3 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +13 -36
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts +5 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +12 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +2 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/jsonl.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/jsonl.js +5 -0
- package/packages/pi-coding-agent/dist/modes/rpc/jsonl.js.map +1 -1
- 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 +0 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +2 -1
- package/packages/pi-coding-agent/src/core/bash-executor.ts +10 -2
- package/packages/pi-coding-agent/src/core/blob-store.ts +6 -3
- package/packages/pi-coding-agent/src/core/discovery-cache.ts +9 -2
- package/packages/pi-coding-agent/src/core/extensions/index.ts +2 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +18 -0
- package/packages/pi-coding-agent/src/core/extensions/types.ts +21 -0
- package/packages/pi-coding-agent/src/core/extensions/wrapper.ts +9 -0
- package/packages/pi-coding-agent/src/core/package-manager.ts +10 -1
- package/packages/pi-coding-agent/src/core/retry-handler.ts +1 -1
- package/packages/pi-coding-agent/src/core/skills.ts +35 -10
- package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
- package/packages/pi-coding-agent/src/index.ts +4 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +3 -2
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +13 -36
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +15 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +2 -1
- package/packages/pi-coding-agent/src/modes/rpc/jsonl.ts +6 -0
- package/packages/pi-coding-agent/src/modes/rpc/rpc-client.ts +0 -2
- package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -2
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +2 -1
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/pkg/package.json +1 -1
- package/scripts/postinstall.js +163 -6
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +3 -1
- package/src/resources/extensions/bg-shell/interaction.ts +3 -1
- package/src/resources/extensions/bg-shell/process-manager.ts +4 -1
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +5 -0
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +105 -0
- package/src/resources/extensions/gsd/auto/infra-errors.ts +1 -0
- package/src/resources/extensions/gsd/auto/phases.ts +25 -12
- package/src/resources/extensions/gsd/auto/resolve.ts +3 -3
- package/src/resources/extensions/gsd/auto/run-unit.ts +2 -2
- package/src/resources/extensions/gsd/auto/session.ts +11 -0
- package/src/resources/extensions/gsd/auto/types.ts +13 -0
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +19 -21
- package/src/resources/extensions/gsd/auto-dashboard.ts +36 -5
- package/src/resources/extensions/gsd/auto-dispatch.ts +122 -71
- package/src/resources/extensions/gsd/auto-loop.ts +1 -1
- package/src/resources/extensions/gsd/auto-observability.ts +72 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +73 -110
- package/src/resources/extensions/gsd/auto-prompts.ts +159 -17
- package/src/resources/extensions/gsd/auto-recovery.ts +80 -221
- package/src/resources/extensions/gsd/auto-start.ts +7 -27
- package/src/resources/extensions/gsd/auto-timers.ts +2 -2
- package/src/resources/extensions/gsd/auto-utils.ts +25 -0
- package/src/resources/extensions/gsd/auto-verification.ts +4 -7
- package/src/resources/extensions/gsd/auto-worktree.ts +305 -108
- package/src/resources/extensions/gsd/auto.ts +26 -15
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +93 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +25 -0
- package/src/resources/extensions/gsd/branch-patterns.ts +16 -0
- package/src/resources/extensions/gsd/crash-recovery.ts +6 -2
- package/src/resources/extensions/gsd/custom-execution-policy.ts +3 -2
- package/src/resources/extensions/gsd/custom-verification.ts +3 -1
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +3 -2
- package/src/resources/extensions/gsd/dashboard-overlay.ts +7 -0
- package/src/resources/extensions/gsd/detection.ts +662 -3
- package/src/resources/extensions/gsd/dispatch-guard.ts +2 -1
- package/src/resources/extensions/gsd/docs/preferences-reference.md +15 -0
- package/src/resources/extensions/gsd/doctor-checks.ts +5 -1291
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +182 -0
- package/src/resources/extensions/gsd/doctor-environment.ts +30 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +415 -0
- package/src/resources/extensions/gsd/doctor-global-checks.ts +84 -0
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +626 -0
- package/src/resources/extensions/gsd/doctor.ts +9 -1
- package/src/resources/extensions/gsd/extension-manifest.json +1 -1
- package/src/resources/extensions/gsd/files.ts +6 -1
- package/src/resources/extensions/gsd/git-service.ts +7 -15
- package/src/resources/extensions/gsd/gsd-db.ts +150 -2
- package/src/resources/extensions/gsd/guided-flow-queue.ts +11 -12
- package/src/resources/extensions/gsd/guided-flow.ts +11 -0
- package/src/resources/extensions/gsd/init-wizard.ts +9 -1
- package/src/resources/extensions/gsd/markdown-renderer.ts +37 -4
- package/src/resources/extensions/gsd/model-router.ts +25 -0
- package/src/resources/extensions/gsd/notifications.ts +23 -0
- package/src/resources/extensions/gsd/observability-validator.ts +456 -0
- package/src/resources/extensions/gsd/preferences-skills.ts +11 -5
- package/src/resources/extensions/gsd/preferences-types.ts +25 -1
- package/src/resources/extensions/gsd/preferences-validation.ts +63 -0
- package/src/resources/extensions/gsd/preferences.ts +3 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +27 -8
- package/src/resources/extensions/gsd/prompts/complete-slice.md +9 -8
- package/src/resources/extensions/gsd/prompts/execute-task.md +16 -13
- package/src/resources/extensions/gsd/prompts/forensics.md +19 -8
- package/src/resources/extensions/gsd/prompts/gate-evaluate.md +32 -0
- 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/guided-plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +8 -3
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +3 -0
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +6 -1
- package/src/resources/extensions/gsd/provider-error-pause.ts +9 -0
- package/src/resources/extensions/gsd/repo-identity.ts +28 -0
- package/src/resources/extensions/gsd/roadmap-mutations.ts +134 -0
- package/src/resources/extensions/gsd/roadmap-slices.ts +2 -2
- package/src/resources/extensions/gsd/rtk-status.ts +53 -0
- package/src/resources/extensions/gsd/rule-registry.ts +10 -11
- package/src/resources/extensions/gsd/session-forensics.ts +13 -14
- package/src/resources/extensions/gsd/session-lock.ts +92 -64
- package/src/resources/extensions/gsd/skill-catalog.ts +1085 -0
- package/src/resources/extensions/gsd/skill-discovery.ts +3 -2
- package/src/resources/extensions/gsd/skill-health.ts +2 -2
- package/src/resources/extensions/gsd/skill-telemetry.ts +15 -5
- package/src/resources/extensions/gsd/state.ts +54 -10
- package/src/resources/extensions/gsd/templates/milestone-summary.md +8 -0
- package/src/resources/extensions/gsd/templates/milestone-validation.md +12 -0
- package/src/resources/extensions/gsd/templates/plan.md +16 -0
- package/src/resources/extensions/gsd/templates/preferences.md +2 -0
- package/src/resources/extensions/gsd/templates/roadmap.md +13 -0
- package/src/resources/extensions/gsd/templates/slice-summary.md +9 -0
- package/src/resources/extensions/gsd/templates/task-plan.md +24 -0
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +1 -81
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +9 -12
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/custom-verification.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/detection.test.ts +838 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +28 -9
- package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +115 -1
- package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +65 -1
- package/src/resources/extensions/gsd/tests/doctor-git.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/gate-dispatch.test.ts +189 -0
- package/src/resources/extensions/gsd/tests/gate-storage.test.ts +156 -0
- package/src/resources/extensions/gsd/tests/git-service.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/infra-error.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/model-router.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/notifications.test.ts +28 -6
- package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +474 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/quality-gates.test.ts +347 -0
- package/src/resources/extensions/gsd/tests/queue-completed-milestone-perf.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/replan-slice.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/retry-diagnostic-reasoning.test.ts +161 -0
- package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +4 -5
- package/src/resources/extensions/gsd/tests/rewrite-count-persist.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +166 -16
- package/src/resources/extensions/gsd/tests/session-lock-transient-read.test.ts +223 -0
- package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +12 -12
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +44 -4
- package/src/resources/extensions/gsd/tests/skill-catalog.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +0 -16
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +204 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +16 -0
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +3 -3
- package/src/resources/extensions/gsd/types.ts +32 -0
- package/src/resources/extensions/gsd/undo.ts +8 -7
- package/src/resources/extensions/gsd/unit-runtime.ts +2 -1
- package/src/resources/extensions/gsd/verdict-parser.ts +95 -0
- package/src/resources/extensions/gsd/verification-gate.ts +3 -3
- package/src/resources/extensions/gsd/worktree-resolver.ts +31 -0
- package/src/resources/extensions/gsd/worktree.ts +3 -2
- package/src/resources/extensions/remote-questions/config.ts +3 -5
- package/src/resources/extensions/search-the-web/native-search.ts +8 -3
- package/src/resources/extensions/search-the-web/tool-search.ts +22 -2
- package/src/resources/extensions/shared/rtk-session-stats.ts +249 -0
- package/src/resources/extensions/shared/rtk.ts +120 -0
- package/src/resources/skills/github-workflows/references/gh/SKILL.md +22 -1
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +0 -191
- package/dist/resources/extensions/gsd/resource-version.js +0 -97
- package/dist/web/standalone/.next/server/chunks/229.js +0 -12
- package/dist/web/standalone/.next/server/chunks/441.js +0 -2
- package/dist/web/standalone/.next/server/chunks/471.js +0 -13
- package/dist/web/standalone/.next/static/chunks/4024.11ca5c01938e5948.js +0 -9
- package/dist/web/standalone/.next/static/chunks/app/_global-error/page-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/boot/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-12dd5ece0df4badc.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-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d83ba70a25a85472.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-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/webpack-0a4cd455ec4197d2.js +0 -1
- package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +0 -1
- package/dist/web/standalone/.next/static/gj-y5hikmhS--NT8Web6M/_buildManifest.js +0 -1
- package/packages/pi-ai/pnpm-lock.yaml +0 -2022
- package/packages/pi-coding-agent/pnpm-lock.yaml +0 -454
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +0 -234
- package/src/resources/extensions/gsd/resource-version.ts +0 -101
- /package/dist/web/standalone/.next/static/{gj-y5hikmhS--NT8Web6M → yJIyd5cXPNpmXTv18ZlyC}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-dispatch observability checks for auto-mode units.
|
|
3
|
+
* Validates plan/summary file quality and builds repair instructions
|
|
4
|
+
* for the agent to fix gaps before proceeding with the unit.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { ExtensionContext } from "@gsd/pi-coding-agent";
|
|
8
|
+
import {
|
|
9
|
+
validatePlanBoundary,
|
|
10
|
+
validateExecuteBoundary,
|
|
11
|
+
validateCompleteBoundary,
|
|
12
|
+
formatValidationIssues,
|
|
13
|
+
} from "./observability-validator.js";
|
|
14
|
+
import type { ValidationIssue } from "./observability-validator.js";
|
|
15
|
+
import { parseUnitId } from "./unit-id.js";
|
|
16
|
+
|
|
17
|
+
export async function collectObservabilityWarnings(
|
|
18
|
+
ctx: ExtensionContext,
|
|
19
|
+
basePath: string,
|
|
20
|
+
unitType: string,
|
|
21
|
+
unitId: string,
|
|
22
|
+
): Promise<ValidationIssue[]> {
|
|
23
|
+
// Hook units have custom artifacts — skip standard observability checks
|
|
24
|
+
if (unitType.startsWith("hook/")) return [];
|
|
25
|
+
|
|
26
|
+
const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
|
|
27
|
+
|
|
28
|
+
if (!mid || !sid) return [];
|
|
29
|
+
|
|
30
|
+
let issues = [] as Awaited<ReturnType<typeof validatePlanBoundary>>;
|
|
31
|
+
|
|
32
|
+
if (unitType === "plan-slice") {
|
|
33
|
+
issues = await validatePlanBoundary(basePath, mid, sid);
|
|
34
|
+
} else if (unitType === "execute-task" && tid) {
|
|
35
|
+
issues = await validateExecuteBoundary(basePath, mid, sid, tid);
|
|
36
|
+
} else if (unitType === "complete-slice") {
|
|
37
|
+
issues = await validateCompleteBoundary(basePath, mid, sid);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (issues.length > 0) {
|
|
41
|
+
ctx.ui.notify(
|
|
42
|
+
`Observability check (${unitType}) found ${issues.length} warning${issues.length === 1 ? "" : "s"}:\n${formatValidationIssues(issues)}`,
|
|
43
|
+
"warning",
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return issues;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function buildObservabilityRepairBlock(issues: ValidationIssue[]): string {
|
|
51
|
+
if (issues.length === 0) return "";
|
|
52
|
+
const items = issues.map(issue => {
|
|
53
|
+
const fileName = issue.file.split("/").pop() || issue.file;
|
|
54
|
+
let line = `- **${fileName}**: ${issue.message}`;
|
|
55
|
+
if (issue.suggestion) line += ` → ${issue.suggestion}`;
|
|
56
|
+
return line;
|
|
57
|
+
});
|
|
58
|
+
return [
|
|
59
|
+
"",
|
|
60
|
+
"---",
|
|
61
|
+
"",
|
|
62
|
+
"## Pre-flight: Observability gaps to fix FIRST",
|
|
63
|
+
"",
|
|
64
|
+
"The following issues were detected in plan/summary files for this unit.",
|
|
65
|
+
"**Read each flagged file, apply the fix described, then proceed with the unit.**",
|
|
66
|
+
"",
|
|
67
|
+
...items,
|
|
68
|
+
"",
|
|
69
|
+
"---",
|
|
70
|
+
"",
|
|
71
|
+
].join("\n");
|
|
72
|
+
}
|
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
buildTaskFileName,
|
|
24
24
|
} from "./paths.js";
|
|
25
25
|
import { invalidateAllCaches } from "./cache.js";
|
|
26
|
+
import { parseUnitId } from "./unit-id.js";
|
|
26
27
|
import { closeoutUnit, type CloseoutOptions } from "./auto-unit-closeout.js";
|
|
27
28
|
import {
|
|
28
29
|
autoCommitCurrentBranch,
|
|
@@ -33,7 +34,7 @@ import {
|
|
|
33
34
|
resolveExpectedArtifactPath,
|
|
34
35
|
} from "./auto-recovery.js";
|
|
35
36
|
import { regenerateIfMissing } from "./workflow-projections.js";
|
|
36
|
-
import { syncStateToProjectRoot } from "./auto-worktree
|
|
37
|
+
import { syncStateToProjectRoot } from "./auto-worktree.js";
|
|
37
38
|
import { isDbAvailable, getTask, getSlice, getMilestone, updateTaskStatus, _getAdapter } from "./gsd-db.js";
|
|
38
39
|
import { renderPlanCheckboxes } from "./markdown-renderer.js";
|
|
39
40
|
import { consumeSignal } from "./session-status-io.js";
|
|
@@ -46,8 +47,29 @@ import {
|
|
|
46
47
|
} from "./post-unit-hooks.js";
|
|
47
48
|
import { hasPendingCaptures, loadPendingCaptures } from "./captures.js";
|
|
48
49
|
import { debugLog } from "./debug-logger.js";
|
|
49
|
-
import
|
|
50
|
-
|
|
50
|
+
import { runSafely } from "./auto-utils.js";
|
|
51
|
+
import type { AutoSession, SidecarItem } from "./auto/session.js";
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
/** Enqueue a sidecar item (hook, triage, or quick-task) for the main loop to
|
|
55
|
+
* drain via runUnit. Logs the enqueue event and notifies the UI. */
|
|
56
|
+
function enqueueSidecar(
|
|
57
|
+
s: AutoSession,
|
|
58
|
+
ctx: ExtensionContext,
|
|
59
|
+
entry: SidecarItem,
|
|
60
|
+
debugExtra: Record<string, unknown>,
|
|
61
|
+
notification?: string,
|
|
62
|
+
): "continue" {
|
|
63
|
+
s.sidecarQueue.push(entry);
|
|
64
|
+
debugLog("postUnitPostVerification", {
|
|
65
|
+
phase: "sidecar-enqueue",
|
|
66
|
+
kind: entry.kind,
|
|
67
|
+
unitId: entry.unitId,
|
|
68
|
+
...debugExtra,
|
|
69
|
+
});
|
|
70
|
+
if (notification) ctx.ui.notify(notification, "info");
|
|
71
|
+
return "continue";
|
|
72
|
+
}
|
|
51
73
|
/** Unit types that only touch `.gsd/` internal state files (no code changes).
|
|
52
74
|
* Auto-commit is skipped for these — their state files are picked up by the
|
|
53
75
|
* next actual task commit via `smartStage()`. */
|
|
@@ -84,6 +106,15 @@ export interface RogueFileWrite {
|
|
|
84
106
|
* in postUnitPostVerification() eventually ingests rogue files, but explicit
|
|
85
107
|
* detection provides immediate diagnostics so operators know the prompt failed.
|
|
86
108
|
*/
|
|
109
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
110
|
+
function hasNonEmptyFields(row: Record<string, any> | null, fields: string[]): boolean {
|
|
111
|
+
if (!row) return false;
|
|
112
|
+
return fields.some(f => String(row[f] || "").trim().length > 0);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const MILESTONE_PLANNING_FIELDS = ["title", "vision", "requirement_coverage", "boundary_map_markdown"];
|
|
116
|
+
const SLICE_PLANNING_FIELDS = ["title", "demo", "risk", "depends"];
|
|
117
|
+
|
|
87
118
|
export function detectRogueFileWrites(
|
|
88
119
|
unitType: string,
|
|
89
120
|
unitId: string,
|
|
@@ -91,11 +122,10 @@ export function detectRogueFileWrites(
|
|
|
91
122
|
): RogueFileWrite[] {
|
|
92
123
|
if (!isDbAvailable()) return [];
|
|
93
124
|
|
|
94
|
-
const
|
|
125
|
+
const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
|
|
95
126
|
const rogues: RogueFileWrite[] = [];
|
|
96
127
|
|
|
97
128
|
if (unitType === "execute-task") {
|
|
98
|
-
const [mid, sid, tid] = parts;
|
|
99
129
|
if (!mid || !sid || !tid) return [];
|
|
100
130
|
|
|
101
131
|
const summaryPath = resolveTaskFile(basePath, mid, sid, tid, "SUMMARY");
|
|
@@ -106,7 +136,6 @@ export function detectRogueFileWrites(
|
|
|
106
136
|
rogues.push({ path: summaryPath, unitType, unitId });
|
|
107
137
|
}
|
|
108
138
|
} else if (unitType === "complete-slice") {
|
|
109
|
-
const [mid, sid] = parts;
|
|
110
139
|
if (!mid || !sid) return [];
|
|
111
140
|
|
|
112
141
|
const summaryPath = resolveSliceFile(basePath, mid, sid, "SUMMARY");
|
|
@@ -117,37 +146,25 @@ export function detectRogueFileWrites(
|
|
|
117
146
|
rogues.push({ path: summaryPath, unitType, unitId });
|
|
118
147
|
}
|
|
119
148
|
} else if (unitType === "plan-milestone") {
|
|
120
|
-
const [mid] = parts;
|
|
121
149
|
if (!mid) return [];
|
|
122
150
|
|
|
123
151
|
const roadmapPath = resolveMilestoneFile(basePath, mid, "ROADMAP");
|
|
124
152
|
if (!roadmapPath || !existsSync(roadmapPath)) return [];
|
|
125
153
|
|
|
126
154
|
const dbRow = getMilestone(mid);
|
|
127
|
-
const hasPlanningState =
|
|
128
|
-
String(dbRow.title || "").trim().length > 0 ||
|
|
129
|
-
String(dbRow.vision || "").trim().length > 0 ||
|
|
130
|
-
String(dbRow.requirement_coverage || "").trim().length > 0 ||
|
|
131
|
-
String(dbRow.boundary_map_markdown || "").trim().length > 0
|
|
132
|
-
);
|
|
155
|
+
const hasPlanningState = hasNonEmptyFields(dbRow, MILESTONE_PLANNING_FIELDS);
|
|
133
156
|
|
|
134
157
|
if (!hasPlanningState) {
|
|
135
158
|
rogues.push({ path: roadmapPath, unitType, unitId });
|
|
136
159
|
}
|
|
137
160
|
} else if (unitType === "plan-slice" || unitType === "replan-slice") {
|
|
138
|
-
const [mid, sid] = parts;
|
|
139
161
|
if (!mid || !sid) return [];
|
|
140
162
|
|
|
141
163
|
const planPath = resolveSliceFile(basePath, mid, sid, "PLAN");
|
|
142
164
|
if (!planPath || !existsSync(planPath)) return [];
|
|
143
165
|
|
|
144
166
|
const dbRow = getSlice(mid, sid);
|
|
145
|
-
const hasPlanningState =
|
|
146
|
-
String(dbRow.title || "").trim().length > 0 ||
|
|
147
|
-
String(dbRow.demo || "").trim().length > 0 ||
|
|
148
|
-
String(dbRow.risk || "").trim().length > 0 ||
|
|
149
|
-
String(dbRow.depends || "").trim().length > 0
|
|
150
|
-
);
|
|
167
|
+
const hasPlanningState = hasNonEmptyFields(dbRow, SLICE_PLANNING_FIELDS);
|
|
151
168
|
|
|
152
169
|
if (!hasPlanningState) {
|
|
153
170
|
rogues.push({ path: planPath, unitType, unitId });
|
|
@@ -159,7 +176,6 @@ export function detectRogueFileWrites(
|
|
|
159
176
|
rogues.push({ path: replanPath, unitType, unitId });
|
|
160
177
|
}
|
|
161
178
|
} else if (unitType === "reassess-roadmap") {
|
|
162
|
-
const [mid, sid] = parts;
|
|
163
179
|
if (!mid || !sid) return [];
|
|
164
180
|
|
|
165
181
|
const assessPath = resolveSliceFile(basePath, mid, sid, "ASSESSMENT");
|
|
@@ -176,7 +192,6 @@ export function detectRogueFileWrites(
|
|
|
176
192
|
}
|
|
177
193
|
}
|
|
178
194
|
} else if (unitType === "plan-task") {
|
|
179
|
-
const [mid, sid, tid] = parts;
|
|
180
195
|
if (!mid || !sid || !tid) return [];
|
|
181
196
|
|
|
182
197
|
const taskPlanPath = resolveTaskFile(basePath, mid, sid, tid, "PLAN");
|
|
@@ -245,12 +260,12 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
245
260
|
|
|
246
261
|
// Auto-commit
|
|
247
262
|
if (s.currentUnit) {
|
|
263
|
+
const unit = s.currentUnit;
|
|
248
264
|
try {
|
|
249
265
|
let taskContext: TaskCommitContext | undefined;
|
|
250
266
|
|
|
251
267
|
if (s.currentUnit.type === "execute-task") {
|
|
252
|
-
const
|
|
253
|
-
const [mid, sid, tid] = parts;
|
|
268
|
+
const { milestone: mid, slice: sid, task: tid } = parseUnitId(s.currentUnit.id);
|
|
254
269
|
if (mid && sid && tid) {
|
|
255
270
|
const summaryPath = resolveTaskFile(s.basePath, mid, sid, tid, "SUMMARY");
|
|
256
271
|
if (summaryPath) {
|
|
@@ -304,65 +319,56 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
304
319
|
}
|
|
305
320
|
|
|
306
321
|
// GitHub sync (non-blocking, opt-in)
|
|
307
|
-
|
|
322
|
+
await runSafely("postUnit", "github-sync", async () => {
|
|
308
323
|
const { runGitHubSync } = await import("../github-sync/sync.js");
|
|
309
|
-
await runGitHubSync(s.basePath,
|
|
310
|
-
}
|
|
311
|
-
debugLog("postUnit", { phase: "github-sync", error: String(e) });
|
|
312
|
-
}
|
|
324
|
+
await runGitHubSync(s.basePath, unit.type, unit.id);
|
|
325
|
+
});
|
|
313
326
|
|
|
314
327
|
// Prune dead bg-shell processes
|
|
315
|
-
|
|
328
|
+
await runSafely("postUnit", "prune-bg-shell", async () => {
|
|
316
329
|
const { pruneDeadProcesses } = await import("../bg-shell/process-manager.js");
|
|
317
330
|
pruneDeadProcesses();
|
|
318
|
-
}
|
|
319
|
-
debugLog("postUnit", { phase: "prune-bg-shell", error: String(e) });
|
|
320
|
-
}
|
|
331
|
+
});
|
|
321
332
|
|
|
322
333
|
// Tear down browser between units to prevent Chrome process accumulation (#1733)
|
|
323
|
-
|
|
334
|
+
await runSafely("postUnit", "browser-teardown", async () => {
|
|
324
335
|
const { getBrowser } = await import("../browser-tools/state.js");
|
|
325
336
|
if (getBrowser()) {
|
|
326
337
|
const { closeBrowser } = await import("../browser-tools/lifecycle.js");
|
|
327
338
|
await closeBrowser();
|
|
328
339
|
debugLog("postUnit", { phase: "browser-teardown", status: "closed" });
|
|
329
340
|
}
|
|
330
|
-
}
|
|
331
|
-
debugLog("postUnit", { phase: "browser-teardown", error: String(e) });
|
|
332
|
-
}
|
|
341
|
+
});
|
|
333
342
|
|
|
334
343
|
// Sync worktree state back to project root (skipped for lightweight sidecars)
|
|
335
344
|
if (!opts?.skipWorktreeSync && s.originalBasePath && s.originalBasePath !== s.basePath) {
|
|
336
|
-
|
|
337
|
-
syncStateToProjectRoot(s.basePath, s.originalBasePath
|
|
338
|
-
}
|
|
339
|
-
debugLog("postUnit", { phase: "worktree-sync", error: String(e) });
|
|
340
|
-
}
|
|
345
|
+
await runSafely("postUnit", "worktree-sync", () => {
|
|
346
|
+
syncStateToProjectRoot(s.basePath, s.originalBasePath!, s.currentMilestoneId);
|
|
347
|
+
});
|
|
341
348
|
}
|
|
342
349
|
|
|
343
350
|
// Rewrite-docs completion
|
|
344
351
|
if (s.currentUnit.type === "rewrite-docs") {
|
|
345
|
-
|
|
352
|
+
await runSafely("postUnit", "rewrite-docs-resolve", async () => {
|
|
346
353
|
await resolveAllOverrides(s.basePath);
|
|
354
|
+
// Reset both disk and in-memory counters. Disk counter is authoritative
|
|
355
|
+
// (survives restarts); in-memory is kept in sync for the current session.
|
|
356
|
+
const { setRewriteCount } = await import("./auto-dispatch.js");
|
|
357
|
+
setRewriteCount(s.basePath, 0);
|
|
347
358
|
s.rewriteAttemptCount = 0;
|
|
348
359
|
ctx.ui.notify("Override(s) resolved — rewrite-docs completed.", "info");
|
|
349
|
-
}
|
|
350
|
-
debugLog("postUnit", { phase: "rewrite-docs-resolve", error: String(e) });
|
|
351
|
-
}
|
|
360
|
+
});
|
|
352
361
|
}
|
|
353
362
|
|
|
354
363
|
// Reactive state cleanup on slice completion
|
|
355
364
|
if (s.currentUnit.type === "complete-slice") {
|
|
356
|
-
|
|
357
|
-
const
|
|
358
|
-
const [mid, sid] = parts;
|
|
365
|
+
await runSafely("postUnit", "reactive-state-cleanup", async () => {
|
|
366
|
+
const { milestone: mid, slice: sid } = parseUnitId(unit.id);
|
|
359
367
|
if (mid && sid) {
|
|
360
368
|
const { clearReactiveState } = await import("./reactive-graph.js");
|
|
361
369
|
clearReactiveState(s.basePath, mid, sid);
|
|
362
370
|
}
|
|
363
|
-
}
|
|
364
|
-
debugLog("postUnit", { phase: "reactive-state-cleanup", error: String(e) });
|
|
365
|
-
}
|
|
371
|
+
});
|
|
366
372
|
}
|
|
367
373
|
|
|
368
374
|
// Post-triage: execute actionable resolutions
|
|
@@ -440,8 +446,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
440
446
|
// from DB data before giving up (e.g. research-slice produces PLAN from engine).
|
|
441
447
|
if (!triggerArtifactVerified) {
|
|
442
448
|
try {
|
|
443
|
-
const
|
|
444
|
-
const [mid, sid] = parts;
|
|
449
|
+
const { milestone: mid, slice: sid } = parseUnitId(s.currentUnit.id);
|
|
445
450
|
if (mid && sid) {
|
|
446
451
|
const regenerated = regenerateIfMissing(s.basePath, mid, sid, "PLAN");
|
|
447
452
|
if (regenerated) {
|
|
@@ -511,23 +516,11 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
|
|
|
511
516
|
}
|
|
512
517
|
persistHookState(s.basePath);
|
|
513
518
|
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
unitType: hookUnit.unitType,
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
model: hookUnit.model,
|
|
520
|
-
});
|
|
521
|
-
|
|
522
|
-
debugLog("postUnitPostVerification", {
|
|
523
|
-
phase: "sidecar-enqueue",
|
|
524
|
-
kind: "hook",
|
|
525
|
-
unitType: hookUnit.unitType,
|
|
526
|
-
unitId: hookUnit.unitId,
|
|
527
|
-
hookName: hookUnit.hookName,
|
|
528
|
-
});
|
|
529
|
-
|
|
530
|
-
return "continue";
|
|
519
|
+
return enqueueSidecar(
|
|
520
|
+
s, ctx,
|
|
521
|
+
{ kind: "hook", unitType: hookUnit.unitType, unitId: hookUnit.unitId, prompt: hookUnit.prompt, model: hookUnit.model },
|
|
522
|
+
{ hookName: hookUnit.hookName },
|
|
523
|
+
);
|
|
531
524
|
}
|
|
532
525
|
|
|
533
526
|
// Check if a hook requested a retry of the trigger unit
|
|
@@ -541,8 +534,7 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
|
|
|
541
534
|
|
|
542
535
|
// ── State reset: undo the completion so deriveState re-derives the unit ──
|
|
543
536
|
try {
|
|
544
|
-
const
|
|
545
|
-
const [mid, sid, tid] = parts;
|
|
537
|
+
const { milestone: mid, slice: sid, task: tid } = parseUnitId(trigger.unitId);
|
|
546
538
|
|
|
547
539
|
// 1. Reset task status in DB and re-render plan checkboxes
|
|
548
540
|
if (mid && sid && tid) {
|
|
@@ -627,26 +619,12 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
|
|
|
627
619
|
}
|
|
628
620
|
|
|
629
621
|
const triageUnitId = `${mid}/${sid}/triage`;
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
unitType: "triage-captures",
|
|
633
|
-
|
|
634
|
-
prompt,
|
|
635
|
-
});
|
|
636
|
-
|
|
637
|
-
debugLog("postUnitPostVerification", {
|
|
638
|
-
phase: "sidecar-enqueue",
|
|
639
|
-
kind: "triage",
|
|
640
|
-
unitId: triageUnitId,
|
|
641
|
-
pendingCount: pending.length,
|
|
642
|
-
});
|
|
643
|
-
|
|
644
|
-
ctx.ui.notify(
|
|
622
|
+
return enqueueSidecar(
|
|
623
|
+
s, ctx,
|
|
624
|
+
{ kind: "triage", unitType: "triage-captures", unitId: triageUnitId, prompt },
|
|
625
|
+
{ pendingCount: pending.length },
|
|
645
626
|
`Triaging ${pending.length} pending capture${pending.length === 1 ? "" : "s"}...`,
|
|
646
|
-
"info",
|
|
647
627
|
);
|
|
648
|
-
|
|
649
|
-
return "continue";
|
|
650
628
|
}
|
|
651
629
|
}
|
|
652
630
|
}
|
|
@@ -675,27 +653,12 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
|
|
|
675
653
|
markCaptureExecuted(s.basePath, capture.id);
|
|
676
654
|
|
|
677
655
|
const qtUnitId = `${s.currentMilestoneId}/${capture.id}`;
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
unitType: "quick-task",
|
|
681
|
-
|
|
682
|
-
prompt,
|
|
683
|
-
captureId: capture.id,
|
|
684
|
-
});
|
|
685
|
-
|
|
686
|
-
debugLog("postUnitPostVerification", {
|
|
687
|
-
phase: "sidecar-enqueue",
|
|
688
|
-
kind: "quick-task",
|
|
689
|
-
unitId: qtUnitId,
|
|
690
|
-
captureId: capture.id,
|
|
691
|
-
});
|
|
692
|
-
|
|
693
|
-
ctx.ui.notify(
|
|
656
|
+
return enqueueSidecar(
|
|
657
|
+
s, ctx,
|
|
658
|
+
{ kind: "quick-task", unitType: "quick-task", unitId: qtUnitId, prompt, captureId: capture.id },
|
|
659
|
+
{ captureId: capture.id },
|
|
694
660
|
`Executing quick-task: ${capture.id} — "${capture.text}"`,
|
|
695
|
-
"info",
|
|
696
661
|
);
|
|
697
|
-
|
|
698
|
-
return "continue";
|
|
699
662
|
} catch (e) {
|
|
700
663
|
debugLog("postUnit", { phase: "quick-task-dispatch", error: String(e) });
|
|
701
664
|
}
|
|
@@ -6,8 +6,9 @@
|
|
|
6
6
|
* utility.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import { loadFile, parseContinue, parseSummary,
|
|
9
|
+
import { loadFile, parseContinue, parseSummary, loadActiveOverrides, formatOverridesSection, parseTaskPlanFile } from "./files.js";
|
|
10
10
|
import type { Override, UatType } from "./files.js";
|
|
11
|
+
import { hasVerdict, getUatType } from "./verdict-parser.js";
|
|
11
12
|
import { loadPrompt, inlineTemplate } from "./prompt-loader.js";
|
|
12
13
|
import {
|
|
13
14
|
resolveMilestoneFile, resolveSliceFile, resolveSlicePath,
|
|
@@ -23,6 +24,7 @@ import { getLoadedSkills, type Skill } from "@gsd/pi-coding-agent";
|
|
|
23
24
|
import { join, basename } from "node:path";
|
|
24
25
|
import { existsSync } from "node:fs";
|
|
25
26
|
import { computeBudgets, resolveExecutorContextWindow, truncateAtSectionBoundary } from "./context-budget.js";
|
|
27
|
+
import { getPendingGates } from "./gsd-db.js";
|
|
26
28
|
import { formatDecisionsCompact, formatRequirementsCompact } from "./structured-data-formatter.js";
|
|
27
29
|
|
|
28
30
|
// ─── Preamble Cap ─────────────────────────────────────────────────────────────
|
|
@@ -419,9 +421,17 @@ function resolvePreferredSkillNames(
|
|
|
419
421
|
.map(skill => normalizeSkillReference(skill.name));
|
|
420
422
|
}
|
|
421
423
|
|
|
424
|
+
/** Skill names must be lowercase alphanumeric with hyphens — reject anything else
|
|
425
|
+
* to prevent prompt injection via crafted directory names. */
|
|
426
|
+
const SAFE_SKILL_NAME = /^[a-z0-9][a-z0-9-]*$/;
|
|
427
|
+
|
|
422
428
|
function formatSkillActivationBlock(skillNames: string[]): string {
|
|
423
|
-
|
|
424
|
-
|
|
429
|
+
const safe = skillNames.filter(name => SAFE_SKILL_NAME.test(name));
|
|
430
|
+
if (safe.length === 0) return "";
|
|
431
|
+
// Use explicit parameter syntax so LLMs pass { skill: "..." } instead of { name: "..." }.
|
|
432
|
+
// The function-call-like syntax `Skill('name')` led LLMs to infer a positional
|
|
433
|
+
// parameter name, causing tool validation failures — see #2224.
|
|
434
|
+
const calls = safe.map(name => `Call Skill({ skill: '${name}' })`).join('. ');
|
|
425
435
|
return `<skill_activation>${calls}.</skill_activation>`;
|
|
426
436
|
}
|
|
427
437
|
|
|
@@ -772,12 +782,17 @@ export async function checkNeedsRunUat(
|
|
|
772
782
|
if (!uatFile) return null;
|
|
773
783
|
const uatContent = await loadFile(uatFile);
|
|
774
784
|
if (!uatContent) return null;
|
|
775
|
-
|
|
776
|
-
if (
|
|
777
|
-
|
|
778
|
-
|
|
785
|
+
// If the UAT file already contains a verdict, UAT has been run — skip
|
|
786
|
+
if (hasVerdict(uatContent)) return null;
|
|
787
|
+
// Also check the ASSESSMENT file — the run-uat prompt writes the verdict
|
|
788
|
+
// there (via gsd_summary_save artifact_type:"ASSESSMENT"), not into the
|
|
789
|
+
// UAT spec file. Without this check the unit re-dispatches indefinitely.
|
|
790
|
+
const assessmentFile = resolveSliceFile(base, mid, sid, "ASSESSMENT");
|
|
791
|
+
if (assessmentFile) {
|
|
792
|
+
const assessmentContent = await loadFile(assessmentFile);
|
|
793
|
+
if (assessmentContent && hasVerdict(assessmentContent)) return null;
|
|
779
794
|
}
|
|
780
|
-
const uatType =
|
|
795
|
+
const uatType = getUatType(uatContent);
|
|
781
796
|
return { sliceId: sid, uatType };
|
|
782
797
|
}
|
|
783
798
|
}
|
|
@@ -799,12 +814,16 @@ export async function checkNeedsRunUat(
|
|
|
799
814
|
if (!uatFileFb) return null;
|
|
800
815
|
const uatContentFb = await loadFile(uatFileFb);
|
|
801
816
|
if (!uatContentFb) return null;
|
|
802
|
-
|
|
803
|
-
if (
|
|
804
|
-
|
|
805
|
-
|
|
817
|
+
// If the UAT file already contains a verdict, UAT has been run — skip
|
|
818
|
+
if (hasVerdict(uatContentFb)) return null;
|
|
819
|
+
// Also check the ASSESSMENT file for the file-based fallback path (same
|
|
820
|
+
// reason as the DB path above — verdict lives in ASSESSMENT, not UAT).
|
|
821
|
+
const assessmentFileFb = resolveSliceFile(base, mid, uatSid, "ASSESSMENT");
|
|
822
|
+
if (assessmentFileFb) {
|
|
823
|
+
const assessmentContentFb = await loadFile(assessmentFileFb);
|
|
824
|
+
if (assessmentContentFb && hasVerdict(assessmentContentFb)) return null;
|
|
806
825
|
}
|
|
807
|
-
const uatTypeFb =
|
|
826
|
+
const uatTypeFb = getUatType(uatContentFb);
|
|
808
827
|
return { sliceId: uatSid, uatType: uatTypeFb };
|
|
809
828
|
}
|
|
810
829
|
|
|
@@ -1326,6 +1345,24 @@ export async function buildValidateMilestonePrompt(
|
|
|
1326
1345
|
const inlined: string[] = [];
|
|
1327
1346
|
inlined.push(await inlineFile(roadmapPath, roadmapRel, "Milestone Roadmap"));
|
|
1328
1347
|
|
|
1348
|
+
// Inline verification classes from planning (if available in DB)
|
|
1349
|
+
try {
|
|
1350
|
+
const { isDbAvailable, getMilestone } = await import("./gsd-db.js");
|
|
1351
|
+
if (isDbAvailable()) {
|
|
1352
|
+
const milestone = getMilestone(mid);
|
|
1353
|
+
if (milestone) {
|
|
1354
|
+
const classes: string[] = [];
|
|
1355
|
+
if (milestone.verification_contract) classes.push(`- **Contract:** ${milestone.verification_contract}`);
|
|
1356
|
+
if (milestone.verification_integration) classes.push(`- **Integration:** ${milestone.verification_integration}`);
|
|
1357
|
+
if (milestone.verification_operational) classes.push(`- **Operational:** ${milestone.verification_operational}`);
|
|
1358
|
+
if (milestone.verification_uat) classes.push(`- **UAT:** ${milestone.verification_uat}`);
|
|
1359
|
+
if (classes.length > 0) {
|
|
1360
|
+
inlined.push(`### Verification Classes (from planning)\n\nThese verification tiers were defined during milestone planning. Each non-empty class must be checked for evidence during validation.\n\n${classes.join("\n")}`);
|
|
1361
|
+
}
|
|
1362
|
+
}
|
|
1363
|
+
}
|
|
1364
|
+
} catch { /* fall through */ }
|
|
1365
|
+
|
|
1329
1366
|
// Inline all slice summaries and UAT results
|
|
1330
1367
|
let valSliceIds: string[] = [];
|
|
1331
1368
|
try {
|
|
@@ -1349,12 +1386,27 @@ export async function buildValidateMilestonePrompt(
|
|
|
1349
1386
|
const summaryRel = relSliceFile(base, mid, sid, "SUMMARY");
|
|
1350
1387
|
inlined.push(await inlineFile(summaryPath, summaryRel, `${sid} Summary`));
|
|
1351
1388
|
|
|
1352
|
-
const uatPath = resolveSliceFile(base, mid, sid, "UAT
|
|
1353
|
-
const uatRel = relSliceFile(base, mid, sid, "UAT
|
|
1389
|
+
const uatPath = resolveSliceFile(base, mid, sid, "UAT");
|
|
1390
|
+
const uatRel = relSliceFile(base, mid, sid, "UAT");
|
|
1354
1391
|
const uatInline = await inlineFileOptional(uatPath, uatRel, `${sid} UAT Result`);
|
|
1355
1392
|
if (uatInline) inlined.push(uatInline);
|
|
1356
1393
|
}
|
|
1357
1394
|
|
|
1395
|
+
// Aggregate unresolved follow-ups and known limitations across slices
|
|
1396
|
+
const outstandingItems: string[] = [];
|
|
1397
|
+
for (const sid of valSliceIds) {
|
|
1398
|
+
const summaryPath = resolveSliceFile(base, mid, sid, "SUMMARY");
|
|
1399
|
+
if (!summaryPath) continue;
|
|
1400
|
+
const content = await loadFile(summaryPath);
|
|
1401
|
+
if (!content) continue;
|
|
1402
|
+
const summary = parseSummary(content);
|
|
1403
|
+
if (summary.followUps) outstandingItems.push(`- **${sid} Follow-ups:** ${summary.followUps.trim()}`);
|
|
1404
|
+
if (summary.knownLimitations) outstandingItems.push(`- **${sid} Known Limitations:** ${summary.knownLimitations.trim()}`);
|
|
1405
|
+
}
|
|
1406
|
+
if (outstandingItems.length > 0) {
|
|
1407
|
+
inlined.push(`### Outstanding Items (aggregated from slice summaries)\n\nThese follow-ups and known limitations were documented during slice completion but have not been resolved.\n\n${outstandingItems.join('\n')}`);
|
|
1408
|
+
}
|
|
1409
|
+
|
|
1358
1410
|
// Inline existing VALIDATION file if this is a re-validation round
|
|
1359
1411
|
const validationPath = resolveMilestoneFile(base, mid, "VALIDATION");
|
|
1360
1412
|
const validationRel = relMilestoneFile(base, mid, "VALIDATION");
|
|
@@ -1501,8 +1553,8 @@ export async function buildRunUatPrompt(
|
|
|
1501
1553
|
|
|
1502
1554
|
const inlinedContext = capPreamble(`## Inlined Context (preloaded — do not re-read these files)\n\n${inlined.join("\n\n---\n\n")}`);
|
|
1503
1555
|
|
|
1504
|
-
const uatResultPath = join(base, relSliceFile(base, mid, sliceId, "UAT
|
|
1505
|
-
const uatType =
|
|
1556
|
+
const uatResultPath = join(base, relSliceFile(base, mid, sliceId, "UAT"));
|
|
1557
|
+
const uatType = getUatType(uatContent);
|
|
1506
1558
|
|
|
1507
1559
|
return loadPrompt("run-uat", {
|
|
1508
1560
|
workingDirectory: base,
|
|
@@ -1659,6 +1711,96 @@ export async function buildReactiveExecutePrompt(
|
|
|
1659
1711
|
});
|
|
1660
1712
|
}
|
|
1661
1713
|
|
|
1714
|
+
// ─── Gate Evaluation ──────────────────────────────────────────────────────
|
|
1715
|
+
|
|
1716
|
+
const GATE_QUESTIONS: Record<string, { question: string; guidance: string }> = {
|
|
1717
|
+
Q3: {
|
|
1718
|
+
question: "How can this be exploited?",
|
|
1719
|
+
guidance: [
|
|
1720
|
+
"Identify abuse scenarios: parameter tampering, replay attacks, privilege escalation.",
|
|
1721
|
+
"Map data exposure risks: PII, tokens, secrets accessible through this slice.",
|
|
1722
|
+
"Define input trust boundaries: untrusted user input reaching DB, API, or filesystem.",
|
|
1723
|
+
"If none apply, return verdict 'omitted' with rationale explaining why.",
|
|
1724
|
+
].join("\n"),
|
|
1725
|
+
},
|
|
1726
|
+
Q4: {
|
|
1727
|
+
question: "What existing promises does this break?",
|
|
1728
|
+
guidance: [
|
|
1729
|
+
"List which existing requirements (R001, R003, etc.) are touched by this slice.",
|
|
1730
|
+
"Identify what must be re-tested after shipping.",
|
|
1731
|
+
"Flag decisions that should be revisited given the new scope.",
|
|
1732
|
+
"If no existing requirements are affected, return verdict 'omitted'.",
|
|
1733
|
+
].join("\n"),
|
|
1734
|
+
},
|
|
1735
|
+
};
|
|
1736
|
+
|
|
1737
|
+
export async function buildGateEvaluatePrompt(
|
|
1738
|
+
mid: string, midTitle: string, sid: string, sTitle: string,
|
|
1739
|
+
base: string,
|
|
1740
|
+
): Promise<string> {
|
|
1741
|
+
const pending = getPendingGates(mid, sid, "slice");
|
|
1742
|
+
|
|
1743
|
+
// Load the slice plan for context
|
|
1744
|
+
const planFile = resolveSliceFile(base, mid, sid, "PLAN");
|
|
1745
|
+
const planContent = planFile ? (await loadFile(planFile)) ?? "(plan file empty)" : "(plan file not found)";
|
|
1746
|
+
|
|
1747
|
+
// Build per-gate subagent prompts
|
|
1748
|
+
const subagentSections: string[] = [];
|
|
1749
|
+
const gateListLines: string[] = [];
|
|
1750
|
+
|
|
1751
|
+
for (const gate of pending) {
|
|
1752
|
+
const meta = GATE_QUESTIONS[gate.gate_id];
|
|
1753
|
+
if (!meta) continue;
|
|
1754
|
+
|
|
1755
|
+
gateListLines.push(`- **${gate.gate_id}**: ${meta.question}`);
|
|
1756
|
+
|
|
1757
|
+
const subPrompt = [
|
|
1758
|
+
`You are evaluating quality gate **${gate.gate_id}** for slice ${sid} (${sTitle}).`,
|
|
1759
|
+
"",
|
|
1760
|
+
`## Question: ${meta.question}`,
|
|
1761
|
+
"",
|
|
1762
|
+
meta.guidance,
|
|
1763
|
+
"",
|
|
1764
|
+
"## Slice Plan",
|
|
1765
|
+
"",
|
|
1766
|
+
planContent,
|
|
1767
|
+
"",
|
|
1768
|
+
"## Instructions",
|
|
1769
|
+
"",
|
|
1770
|
+
"Analyze the slice plan above and answer the gate question.",
|
|
1771
|
+
`Call the \`gsd_save_gate_result\` tool with:`,
|
|
1772
|
+
`- \`milestoneId\`: "${mid}"`,
|
|
1773
|
+
`- \`sliceId\`: "${sid}"`,
|
|
1774
|
+
`- \`gateId\`: "${gate.gate_id}"`,
|
|
1775
|
+
"- `verdict`: \"pass\" (no concerns), \"flag\" (concerns found), or \"omitted\" (not applicable)",
|
|
1776
|
+
"- `rationale`: one-sentence justification",
|
|
1777
|
+
"- `findings`: detailed markdown findings (or empty if omitted)",
|
|
1778
|
+
].join("\n");
|
|
1779
|
+
|
|
1780
|
+
subagentSections.push([
|
|
1781
|
+
`### ${gate.gate_id}: ${meta.question}`,
|
|
1782
|
+
"",
|
|
1783
|
+
"Use this as the prompt for a `subagent` call:",
|
|
1784
|
+
"",
|
|
1785
|
+
"```",
|
|
1786
|
+
subPrompt,
|
|
1787
|
+
"```",
|
|
1788
|
+
].join("\n"));
|
|
1789
|
+
}
|
|
1790
|
+
|
|
1791
|
+
return loadPrompt("gate-evaluate", {
|
|
1792
|
+
workingDirectory: base,
|
|
1793
|
+
milestoneId: mid,
|
|
1794
|
+
milestoneTitle: midTitle,
|
|
1795
|
+
sliceId: sid,
|
|
1796
|
+
sliceTitle: sTitle,
|
|
1797
|
+
slicePlanContent: planContent,
|
|
1798
|
+
gateCount: String(pending.length),
|
|
1799
|
+
gateList: gateListLines.join("\n"),
|
|
1800
|
+
subagentPrompts: subagentSections.join("\n\n---\n\n"),
|
|
1801
|
+
});
|
|
1802
|
+
}
|
|
1803
|
+
|
|
1662
1804
|
export async function buildRewriteDocsPrompt(
|
|
1663
1805
|
mid: string, midTitle: string,
|
|
1664
1806
|
activeSlice: { id: string; title: string } | null,
|