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
|
@@ -9,8 +9,9 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
11
11
|
import { join } from "node:path";
|
|
12
|
-
import {
|
|
13
|
-
|
|
12
|
+
import { homedir } from "node:os";
|
|
13
|
+
/** Industry-standard skills.sh global skills directory */
|
|
14
|
+
const SKILLS_DIR = join(homedir(), ".agents", "skills");
|
|
14
15
|
/** Snapshot of skill names at auto-mode start */
|
|
15
16
|
let baselineSkills = null;
|
|
16
17
|
/**
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import { existsSync } from "node:fs";
|
|
16
16
|
import { join } from "node:path";
|
|
17
|
-
import {
|
|
17
|
+
import { homedir } from "node:os";
|
|
18
18
|
import { formatCost, formatTokenCount, loadLedgerFromDisk } from "./metrics.js";
|
|
19
19
|
import { detectStaleSkills } from "./skill-telemetry.js";
|
|
20
20
|
// ─── Constants ────────────────────────────────────────────────────────────────
|
|
@@ -141,7 +141,7 @@ export function formatSkillDetail(basePath, skillName) {
|
|
|
141
141
|
lines.push(` ${date} ${u.id.padEnd(20)} ${formatTokenCount(u.tokens.total).padStart(8)} tokens ${formatCost(u.cost)}`);
|
|
142
142
|
}
|
|
143
143
|
// Check for SKILL.md existence
|
|
144
|
-
const skillPath = join(
|
|
144
|
+
const skillPath = join(homedir(), ".agents", "skills", skillName, "SKILL.md");
|
|
145
145
|
if (existsSync(skillPath)) {
|
|
146
146
|
const stat = require("node:fs").statSync(skillPath);
|
|
147
147
|
lines.push("");
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import { existsSync, readdirSync } from "node:fs";
|
|
14
14
|
import { join } from "node:path";
|
|
15
|
-
import {
|
|
15
|
+
import { homedir } from "node:os";
|
|
16
16
|
// ─── In-memory state ──────────────────────────────────────────────────────────
|
|
17
17
|
/** Skills available in the system prompt for the current unit */
|
|
18
18
|
let availableSkills = [];
|
|
@@ -24,8 +24,14 @@ const activelyLoadedSkills = new Set();
|
|
|
24
24
|
* Called before each unit starts.
|
|
25
25
|
*/
|
|
26
26
|
export function captureAvailableSkills() {
|
|
27
|
-
const skillsDir = join(
|
|
28
|
-
|
|
27
|
+
const skillsDir = join(homedir(), ".agents", "skills");
|
|
28
|
+
const legacyDir = join(homedir(), ".gsd", "agent", "skills");
|
|
29
|
+
const names = listSkillNames(skillsDir);
|
|
30
|
+
// Include skills still in the legacy directory only if migration hasn't completed
|
|
31
|
+
const legacyMigrated = existsSync(join(legacyDir, ".migrated-to-agents"));
|
|
32
|
+
const legacyNames = legacyMigrated ? [] : listSkillNames(legacyDir);
|
|
33
|
+
const all = new Set([...names, ...legacyNames]);
|
|
34
|
+
availableSkills = [...all];
|
|
29
35
|
activelyLoadedSkills.clear();
|
|
30
36
|
}
|
|
31
37
|
/**
|
|
@@ -85,8 +91,12 @@ export function detectStaleSkills(units, thresholdDays) {
|
|
|
85
91
|
const cutoff = Date.now() - (thresholdDays * 24 * 60 * 60 * 1000);
|
|
86
92
|
const stale = [];
|
|
87
93
|
// Check all installed skills, not just those with usage data
|
|
88
|
-
const skillsDir = join(
|
|
89
|
-
const
|
|
94
|
+
const skillsDir = join(homedir(), ".agents", "skills");
|
|
95
|
+
const legacyDir = join(homedir(), ".gsd", "agent", "skills");
|
|
96
|
+
const legacyMigrated = existsSync(join(legacyDir, ".migrated-to-agents"));
|
|
97
|
+
const legacyNames = legacyMigrated ? [] : listSkillNames(legacyDir);
|
|
98
|
+
const installedSet = new Set([...listSkillNames(skillsDir), ...legacyNames]);
|
|
99
|
+
const installed = [...installedSet];
|
|
90
100
|
for (const skill of installed) {
|
|
91
101
|
const lastTs = lastUsed.get(skill);
|
|
92
102
|
if (lastTs === undefined || lastTs < cutoff) {
|
|
@@ -4,12 +4,14 @@
|
|
|
4
4
|
import { parseRoadmap, parsePlan, } from './parsers-legacy.js';
|
|
5
5
|
import { parseSummary, loadFile, parseRequirementCounts, parseContextDependsOn, } from './files.js';
|
|
6
6
|
import { resolveMilestoneFile, resolveSlicePath, resolveSliceFile, resolveTaskFile, resolveTasksDir, resolveGsdRootFile, gsdRoot, } from './paths.js';
|
|
7
|
-
import {
|
|
7
|
+
import { findMilestoneIds } from './milestone-ids.js';
|
|
8
|
+
import { loadQueueOrder, sortByQueueOrder } from './queue-order.js';
|
|
8
9
|
import { nativeBatchParseGsdFiles } from './native-parser-bridge.js';
|
|
9
10
|
import { join, resolve } from 'path';
|
|
10
11
|
import { existsSync, readdirSync } from 'node:fs';
|
|
11
12
|
import { debugCount, debugTime } from './debug-logger.js';
|
|
12
|
-
import {
|
|
13
|
+
import { extractVerdict } from './verdict-parser.js';
|
|
14
|
+
import { isDbAvailable, getAllMilestones, getMilestoneSlices, getSliceTasks, getReplanHistory, getSlice, insertMilestone, updateTaskStatus, getPendingSliceGateCount, } from './gsd-db.js';
|
|
13
15
|
/**
|
|
14
16
|
* A "ghost" milestone directory contains only META.json (and no substantive
|
|
15
17
|
* files like CONTEXT, CONTEXT-DRAFT, ROADMAP, or SUMMARY). These appear when
|
|
@@ -42,13 +44,9 @@ export function isMilestoneComplete(roadmap) {
|
|
|
42
44
|
* after remediation slices are executed.
|
|
43
45
|
*/
|
|
44
46
|
export function isValidationTerminal(validationContent) {
|
|
45
|
-
const
|
|
46
|
-
if (!
|
|
47
|
+
const v = extractVerdict(validationContent);
|
|
48
|
+
if (!v)
|
|
47
49
|
return false;
|
|
48
|
-
const verdict = match[1].match(/verdict:\s*(\S+)/);
|
|
49
|
-
if (!verdict)
|
|
50
|
-
return false;
|
|
51
|
-
const v = verdict[1] === 'passed' ? 'pass' : verdict[1];
|
|
52
50
|
// 'pass' and 'needs-attention' are always terminal.
|
|
53
51
|
// 'needs-remediation' is treated as terminal to prevent infinite loops
|
|
54
52
|
// when no remediation slices exist in the roadmap (#832). The validation
|
|
@@ -87,8 +85,14 @@ export async function getActiveMilestoneId(basePath) {
|
|
|
87
85
|
if (isDbAvailable()) {
|
|
88
86
|
const allMilestones = getAllMilestones();
|
|
89
87
|
if (allMilestones.length > 0) {
|
|
90
|
-
|
|
91
|
-
|
|
88
|
+
// Respect queue-order.json so /gsd queue reordering is honored (#2556).
|
|
89
|
+
// Without this, the DB path uses lexicographic sort while the dispatch
|
|
90
|
+
// guard uses queue order — causing a deadlock.
|
|
91
|
+
const customOrder = loadQueueOrder(basePath);
|
|
92
|
+
const sortedIds = sortByQueueOrder(allMilestones.map(m => m.id), customOrder);
|
|
93
|
+
const byId = new Map(allMilestones.map(m => [m.id, m]));
|
|
94
|
+
for (const id of sortedIds) {
|
|
95
|
+
const m = byId.get(id);
|
|
92
96
|
if (m.status === "complete" || m.status === "done" || m.status === "parked")
|
|
93
97
|
continue;
|
|
94
98
|
return m.id;
|
|
@@ -236,8 +240,13 @@ export async function deriveStateFromDb(basePath) {
|
|
|
236
240
|
});
|
|
237
241
|
}
|
|
238
242
|
}
|
|
239
|
-
// Re-sort so milestones
|
|
240
|
-
|
|
243
|
+
// Re-sort so milestones follow queue order (same as dispatch guard) (#2556)
|
|
244
|
+
const customOrder = loadQueueOrder(basePath);
|
|
245
|
+
const sortedIds = sortByQueueOrder(allMilestones.map(m => m.id), customOrder);
|
|
246
|
+
const byId = new Map(allMilestones.map(m => [m.id, m]));
|
|
247
|
+
allMilestones.length = 0;
|
|
248
|
+
for (const id of sortedIds)
|
|
249
|
+
allMilestones.push(byId.get(id));
|
|
241
250
|
// Parallel worker isolation: when locked, filter to just the locked milestone
|
|
242
251
|
const milestoneLock = process.env.GSD_MILESTONE_LOCK;
|
|
243
252
|
const milestones = milestoneLock
|
|
@@ -595,6 +604,21 @@ export async function deriveStateFromDb(basePath) {
|
|
|
595
604
|
};
|
|
596
605
|
}
|
|
597
606
|
}
|
|
607
|
+
// ── Quality gate evaluation check ──────────────────────────────────
|
|
608
|
+
// If slice-scoped gates (Q3/Q4) are still pending, pause before execution
|
|
609
|
+
// so the gate-evaluate dispatch rule can run parallel sub-agents.
|
|
610
|
+
// Slices with zero gate rows (pre-feature or simple) skip straight through.
|
|
611
|
+
const pendingGateCount = getPendingSliceGateCount(activeMilestone.id, activeSlice.id);
|
|
612
|
+
if (pendingGateCount > 0) {
|
|
613
|
+
return {
|
|
614
|
+
activeMilestone, activeSlice, activeTask: null,
|
|
615
|
+
phase: 'evaluating-gates',
|
|
616
|
+
recentDecisions: [], blockers: [],
|
|
617
|
+
nextAction: `Evaluate ${pendingGateCount} quality gate(s) for ${activeSlice.id} before execution.`,
|
|
618
|
+
registry, requirements,
|
|
619
|
+
progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
|
|
620
|
+
};
|
|
621
|
+
}
|
|
598
622
|
// ── Blocker detection: check completed tasks for blocker_discovered ──
|
|
599
623
|
const completedTasks = tasks.filter(t => isStatusDone(t.status));
|
|
600
624
|
let blockerTaskId = null;
|
|
@@ -1143,6 +1167,21 @@ export async function _deriveStateImpl(basePath) {
|
|
|
1143
1167
|
};
|
|
1144
1168
|
}
|
|
1145
1169
|
const slicePlan = parsePlan(slicePlanContent);
|
|
1170
|
+
// ── Reconcile stale task status for filesystem-based projects (#2514) ──
|
|
1171
|
+
// Heading-style tasks (### T01:) are always parsed as done=false by
|
|
1172
|
+
// parsePlan because the heading syntax has no checkbox. When the agent
|
|
1173
|
+
// writes a SUMMARY file but the plan's heading isn't converted to a
|
|
1174
|
+
// checkbox, the task appears incomplete forever — causing infinite
|
|
1175
|
+
// re-dispatch. Reconcile by checking SUMMARY files on disk.
|
|
1176
|
+
for (const t of slicePlan.tasks) {
|
|
1177
|
+
if (t.done)
|
|
1178
|
+
continue;
|
|
1179
|
+
const summaryPath = resolveTaskFile(basePath, activeMilestone.id, activeSlice.id, t.id, "SUMMARY");
|
|
1180
|
+
if (summaryPath && existsSync(summaryPath)) {
|
|
1181
|
+
t.done = true;
|
|
1182
|
+
process.stderr.write(`gsd-reconcile: task ${activeMilestone.id}/${activeSlice.id}/${t.id} has SUMMARY on disk but plan shows incomplete — marking done (#2514)\n`);
|
|
1183
|
+
}
|
|
1184
|
+
}
|
|
1146
1185
|
const taskProgress = {
|
|
1147
1186
|
done: slicePlan.tasks.filter(t => t.done).length,
|
|
1148
1187
|
total: slicePlan.tasks.length,
|
|
@@ -49,6 +49,14 @@ completed_at: {{date}}
|
|
|
49
49
|
|
|
50
50
|
- {{requirementId}}: {{fromStatus}} → {{toStatus}} — {{evidence}}
|
|
51
51
|
|
|
52
|
+
## Decision Re-evaluation
|
|
53
|
+
|
|
54
|
+
<!-- Review decisions from this milestone. OMIT if no decisions need re-evaluation. -->
|
|
55
|
+
|
|
56
|
+
| Decision | Original Rationale | Still Valid? | Action |
|
|
57
|
+
|----------|-------------------|-------------|--------|
|
|
58
|
+
| {{decisionId}} | {{originalRationale}} | {{yes/no/partially}} | {{keep/revise/supersede}} |
|
|
59
|
+
|
|
52
60
|
## Forward Intelligence
|
|
53
61
|
|
|
54
62
|
<!-- Write what you wish you'd known at the start of this milestone.
|
|
@@ -35,6 +35,18 @@ validated_at: {{date}}
|
|
|
35
35
|
|
|
36
36
|
- **{{requirementId}}**: {{status}} — {{disposition: covered by remediation slice / acceptable gap / needs attention}}
|
|
37
37
|
|
|
38
|
+
## Verification Class Compliance
|
|
39
|
+
|
|
40
|
+
<!-- If verification classes were defined during planning, document whether each
|
|
41
|
+
was addressed. Use N/A for classes that were empty or "none" in planning. -->
|
|
42
|
+
|
|
43
|
+
| Class | Planned | Evidence | Status |
|
|
44
|
+
|-------|---------|----------|--------|
|
|
45
|
+
| Contract | {{planned_or_none}} | {{evidence_or_none}} | {{MET / NOT MET / N/A}} |
|
|
46
|
+
| Integration | {{planned_or_none}} | {{evidence_or_none}} | {{MET / NOT MET / N/A}} |
|
|
47
|
+
| Operational | {{planned_or_none}} | {{evidence_or_none}} | {{MET / NOT MET / N/A}} |
|
|
48
|
+
| UAT | {{planned_or_none}} | {{evidence_or_none}} | {{MET / NOT MET / N/A}} |
|
|
49
|
+
|
|
38
50
|
## Remediation Slices
|
|
39
51
|
|
|
40
52
|
<!-- New slices appended to the roadmap to address auto-remediable gaps.
|
|
@@ -8,6 +8,22 @@
|
|
|
8
8
|
- {{mustHave}}
|
|
9
9
|
- {{mustHave}}
|
|
10
10
|
|
|
11
|
+
## Threat Surface
|
|
12
|
+
|
|
13
|
+
<!-- Q3: How can this be exploited? OMIT ENTIRELY for simple slices with no auth, user input, or data exposure. -->
|
|
14
|
+
|
|
15
|
+
- **Abuse**: {{abuseScenarios — parameter tampering, replay, privilege escalation, or N/A}}
|
|
16
|
+
- **Data exposure**: {{sensitiveDataAccessible — PII, tokens, secrets, or none}}
|
|
17
|
+
- **Input trust**: {{untrustedInput — user input reaching DB/API/filesystem, or none}}
|
|
18
|
+
|
|
19
|
+
## Requirement Impact
|
|
20
|
+
|
|
21
|
+
<!-- Q4: What existing promises does this break? OMIT ENTIRELY if no existing requirements are affected. -->
|
|
22
|
+
|
|
23
|
+
- **Requirements touched**: {{requirementIds — e.g. R001, R003, or none}}
|
|
24
|
+
- **Re-verify**: {{whatMustBeRetested — e.g. login flow, API contract, or N/A}}
|
|
25
|
+
- **Decisions revisited**: {{decisionIds — e.g. D002, or none}}
|
|
26
|
+
|
|
11
27
|
## Proof Level
|
|
12
28
|
|
|
13
29
|
<!-- Omit this section entirely for simple slices where the answer is trivially obvious. -->
|
|
@@ -92,6 +92,19 @@ This milestone is complete only when all are true:
|
|
|
92
92
|
- Each "After this" line must be truthful about proof level: if only fixtures or tests prove it, say so; do not imply the user can already perform the live end-to-end behavior unless that has actually been exercised
|
|
93
93
|
-->
|
|
94
94
|
|
|
95
|
+
## Horizontal Checklist
|
|
96
|
+
|
|
97
|
+
<!-- Cross-cutting concerns across all slices. Check each that was considered.
|
|
98
|
+
OMIT ENTIRELY for trivial milestones. -->
|
|
99
|
+
|
|
100
|
+
- [ ] Every active R### re-read against new code — still fully satisfied?
|
|
101
|
+
- [ ] Every D### from prior milestones re-evaluated — still valid at new scope?
|
|
102
|
+
- [ ] Graceful shutdown / cleanup on termination verified
|
|
103
|
+
- [ ] Revenue / billing path impact assessed (or N/A)
|
|
104
|
+
- [ ] Auth boundary documented — what's protected vs public
|
|
105
|
+
- [ ] Shared resource budget confirmed — connection pools, caches, rate limits hold under peak
|
|
106
|
+
- [ ] Reconnection / retry strategy verified for every external dependency
|
|
107
|
+
|
|
95
108
|
## Boundary Map
|
|
96
109
|
|
|
97
110
|
<!-- Be specific. Name concrete outputs: API endpoints, event payloads, shared types/interfaces,
|
|
@@ -57,6 +57,15 @@ completed_at: {{date}}
|
|
|
57
57
|
|
|
58
58
|
- {{requirementIdOr_none}} — {{what changed}}
|
|
59
59
|
|
|
60
|
+
## Operational Readiness
|
|
61
|
+
|
|
62
|
+
<!-- Q8: How will ops know it's healthy/broken? OMIT ENTIRELY for simple slices with no runtime concerns. -->
|
|
63
|
+
|
|
64
|
+
- **Health signal**: {{howToConfirmHealthy — health endpoint, heartbeat log, metric, or N/A}}
|
|
65
|
+
- **Failure signal**: {{howToDetectBroken — error rate spike, alert, log pattern, or N/A}}
|
|
66
|
+
- **Recovery**: {{selfRecoverOrRestart — auto-reconnect, circuit breaker, manual restart, or N/A}}
|
|
67
|
+
- **Monitoring gaps**: {{silentFailureModes — background jobs, cache eviction, memory pressure, or none}}
|
|
68
|
+
|
|
60
69
|
## Deviations
|
|
61
70
|
|
|
62
71
|
<!-- Deviations are unplanned changes to the written plan, not ordinary debugging inside the plan's intended scope. -->
|
|
@@ -17,6 +17,30 @@ skills_used:
|
|
|
17
17
|
|
|
18
18
|
{{description}}
|
|
19
19
|
|
|
20
|
+
## Failure Modes
|
|
21
|
+
|
|
22
|
+
<!-- Q5: What breaks when dependencies fail? OMIT ENTIRELY for tasks with no external dependencies. -->
|
|
23
|
+
|
|
24
|
+
| Dependency | On error | On timeout | On malformed response |
|
|
25
|
+
|------------|----------|-----------|----------------------|
|
|
26
|
+
| {{dependency}} | {{errorStrategy}} | {{timeoutStrategy}} | {{malformedStrategy}} |
|
|
27
|
+
|
|
28
|
+
## Load Profile
|
|
29
|
+
|
|
30
|
+
<!-- Q6: What breaks at 10x load? OMIT ENTIRELY for tasks with no shared resources or scaling concerns. -->
|
|
31
|
+
|
|
32
|
+
- **Shared resources**: {{sharedResources — DB connections, caches, rate limiters, or none}}
|
|
33
|
+
- **Per-operation cost**: {{perOpCost — N API calls, M DB queries, K bytes, or trivial}}
|
|
34
|
+
- **10x breakpoint**: {{whatBreaksFirst — pool exhaustion, rate limit, memory, or N/A}}
|
|
35
|
+
|
|
36
|
+
## Negative Tests
|
|
37
|
+
|
|
38
|
+
<!-- Q7: What negative tests prove robustness? OMIT ENTIRELY for trivial tasks. -->
|
|
39
|
+
|
|
40
|
+
- **Malformed inputs**: {{malformedInputTests — empty string, null, oversized, wrong type}}
|
|
41
|
+
- **Error paths**: {{errorPathTests — network timeout, auth failure, 5xx, invalid JSON}}
|
|
42
|
+
- **Boundary conditions**: {{boundaryTests — empty list, max length, zero, off-by-one}}
|
|
43
|
+
|
|
20
44
|
## Steps
|
|
21
45
|
|
|
22
46
|
1. {{step}}
|
|
@@ -7,17 +7,28 @@ const require = createRequire(import.meta.url);
|
|
|
7
7
|
const ROOT = new URL("../../../../../", import.meta.url);
|
|
8
8
|
|
|
9
9
|
export function resolve(specifier, context, nextResolve) {
|
|
10
|
-
// 1.
|
|
10
|
+
// 1. Redirect all workspace package bare imports to source.
|
|
11
|
+
// CI portability runs don't build any packages/ dist artifacts, so every
|
|
12
|
+
// @gsd/* specifier (including transitive ones pulled in by pi-coding-agent
|
|
13
|
+
// source itself) must resolve to the TypeScript source entrypoint.
|
|
11
14
|
if (specifier === "../../packages/pi-coding-agent/src/index.js") {
|
|
12
|
-
specifier = new URL("packages/pi-coding-agent/
|
|
15
|
+
specifier = new URL("packages/pi-coding-agent/src/index.ts", ROOT).href;
|
|
16
|
+
} else if (specifier === "@gsd/pi-coding-agent") {
|
|
17
|
+
specifier = new URL("packages/pi-coding-agent/src/index.ts", ROOT).href;
|
|
13
18
|
} else if (specifier === "@gsd/pi-ai/oauth") {
|
|
14
|
-
specifier = new URL("packages/pi-ai/
|
|
19
|
+
specifier = new URL("packages/pi-ai/src/utils/oauth/index.ts", ROOT).href;
|
|
15
20
|
} else if (specifier === "@gsd/pi-ai") {
|
|
16
|
-
specifier = new URL("packages/pi-ai/
|
|
21
|
+
specifier = new URL("packages/pi-ai/src/index.ts", ROOT).href;
|
|
17
22
|
} else if (specifier === "@gsd/pi-agent-core") {
|
|
18
|
-
specifier = new URL("packages/pi-agent-core/
|
|
23
|
+
specifier = new URL("packages/pi-agent-core/src/index.ts", ROOT).href;
|
|
19
24
|
} else if (specifier === "@gsd/pi-tui") {
|
|
20
|
-
specifier = new URL("packages/pi-tui/
|
|
25
|
+
specifier = new URL("packages/pi-tui/src/index.ts", ROOT).href;
|
|
26
|
+
} else if (specifier === "@gsd/native") {
|
|
27
|
+
specifier = new URL("packages/native/src/index.ts", ROOT).href;
|
|
28
|
+
} else if (specifier.startsWith("@gsd/native/")) {
|
|
29
|
+
// Sub-path imports like @gsd/native/fd, @gsd/native/text, etc.
|
|
30
|
+
const subpath = specifier.slice("@gsd/native/".length);
|
|
31
|
+
specifier = new URL(`packages/native/src/${subpath}/index.ts`, ROOT).href;
|
|
21
32
|
}
|
|
22
33
|
// 2. Redirect packages/*/dist/ → packages/*/src/ with .js→.ts for strip-types
|
|
23
34
|
// Also handles local imports — skip rewrite for dist/ paths that are real compiled artifacts.
|
|
@@ -54,9 +65,15 @@ export function resolve(specifier, context, nextResolve) {
|
|
|
54
65
|
}
|
|
55
66
|
|
|
56
67
|
export function load(url, context, nextLoad) {
|
|
57
|
-
// Node's --experimental-strip-types handles .ts but not .tsx
|
|
58
|
-
//
|
|
59
|
-
|
|
68
|
+
// Node's --experimental-strip-types handles plain .ts but not .tsx and not
|
|
69
|
+
// all TypeScript syntax used by workspace packages (parameter properties,
|
|
70
|
+
// decorators, etc.). Transpile all workspace package source files and .tsx
|
|
71
|
+
// files through TypeScript's transpileModule to avoid those crashes.
|
|
72
|
+
const shouldTranspileWithTypeScript =
|
|
73
|
+
url.endsWith('.tsx') ||
|
|
74
|
+
(url.endsWith('.ts') && url.includes('/packages/') && url.includes('/src/'));
|
|
75
|
+
|
|
76
|
+
if (shouldTranspileWithTypeScript) {
|
|
60
77
|
const ts = require('typescript');
|
|
61
78
|
const source = readFileSync(fileURLToPath(url), 'utf-8');
|
|
62
79
|
const { outputText } = ts.transpileModule(source, {
|
|
@@ -66,6 +83,8 @@ export function load(url, context, nextLoad) {
|
|
|
66
83
|
module: ts.ModuleKind.ESNext,
|
|
67
84
|
target: ts.ScriptTarget.ESNext,
|
|
68
85
|
esModuleInterop: true,
|
|
86
|
+
experimentalDecorators: true,
|
|
87
|
+
emitDecoratorMetadata: true,
|
|
69
88
|
},
|
|
70
89
|
});
|
|
71
90
|
return { format: 'module', source: outputText, shortCircuit: true };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { clearParseCache } from "../files.js";
|
|
2
|
-
import { transaction, getMilestone, getSlice, insertTask, upsertSlicePlanning, upsertTaskPlanning, } from "../gsd-db.js";
|
|
2
|
+
import { transaction, getMilestone, getSlice, insertTask, upsertSlicePlanning, upsertTaskPlanning, insertGateRow, } from "../gsd-db.js";
|
|
3
3
|
import { invalidateStateCache } from "../state.js";
|
|
4
4
|
import { renderPlanFromDb } from "../markdown-renderer.js";
|
|
5
5
|
import { renderAllProjections } from "../workflow-projections.js";
|
|
@@ -145,6 +145,19 @@ export async function handlePlanSlice(rawParams, basePath) {
|
|
|
145
145
|
fullPlanMd: task.fullPlanMd,
|
|
146
146
|
});
|
|
147
147
|
}
|
|
148
|
+
// Seed quality gate rows inside the transaction — all-or-nothing with
|
|
149
|
+
// the plan data so a crash can't leave orphaned gates without tasks.
|
|
150
|
+
const sliceGates = ["Q3", "Q4"];
|
|
151
|
+
for (const gid of sliceGates) {
|
|
152
|
+
insertGateRow({ milestoneId: params.milestoneId, sliceId: params.sliceId, gateId: gid, scope: "slice" });
|
|
153
|
+
}
|
|
154
|
+
const taskGates = ["Q5", "Q6", "Q7"];
|
|
155
|
+
for (const task of params.tasks) {
|
|
156
|
+
for (const gid of taskGates) {
|
|
157
|
+
insertGateRow({ milestoneId: params.milestoneId, sliceId: params.sliceId, gateId: gid, scope: "task", taskId: task.taskId });
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
insertGateRow({ milestoneId: params.milestoneId, sliceId: params.sliceId, gateId: "Q8", scope: "slice" });
|
|
148
161
|
});
|
|
149
162
|
}
|
|
150
163
|
catch (err) {
|
|
@@ -9,6 +9,7 @@ import { transaction, _getAdapter, } from "../gsd-db.js";
|
|
|
9
9
|
import { resolveMilestonePath, clearPathCache } from "../paths.js";
|
|
10
10
|
import { saveFile, clearParseCache } from "../files.js";
|
|
11
11
|
import { invalidateStateCache } from "../state.js";
|
|
12
|
+
import { VALIDATION_VERDICTS, isValidMilestoneVerdict } from "../verdict-parser.js";
|
|
12
13
|
function renderValidationMarkdown(params) {
|
|
13
14
|
let md = `---
|
|
14
15
|
verdict: ${params.verdict}
|
|
@@ -41,9 +42,8 @@ export async function handleValidateMilestone(params, basePath) {
|
|
|
41
42
|
if (!params.milestoneId || typeof params.milestoneId !== "string" || params.milestoneId.trim() === "") {
|
|
42
43
|
return { error: "milestoneId is required and must be a non-empty string" };
|
|
43
44
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
return { error: `verdict must be one of: ${validVerdicts.join(", ")}` };
|
|
45
|
+
if (!isValidMilestoneVerdict(params.verdict)) {
|
|
46
|
+
return { error: `verdict must be one of: ${VALIDATION_VERDICTS.join(", ")}` };
|
|
47
47
|
}
|
|
48
48
|
// ── Filesystem render ──────────────────────────────────────────────────
|
|
49
49
|
const validationMd = renderValidationMarkdown(params);
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { existsSync, readFileSync, writeFileSync, unlinkSync, readdirSync } from "node:fs";
|
|
6
6
|
import { join } from "node:path";
|
|
7
7
|
import { nativeRevertCommit, nativeRevertAbort } from "./native-git-bridge.js";
|
|
8
|
+
import { parseUnitId } from "./unit-id.js";
|
|
8
9
|
import { deriveState } from "./state.js";
|
|
9
10
|
import { invalidateAllCaches } from "./cache.js";
|
|
10
11
|
import { gsdRoot, resolveTasksDir, resolveSlicePath, resolveTaskFile, buildTaskFileName, buildSliceFileName } from "./paths.js";
|
|
@@ -52,11 +53,11 @@ export async function handleUndo(args, ctx, _pi, basePath) {
|
|
|
52
53
|
return;
|
|
53
54
|
}
|
|
54
55
|
// 1. Delete summary artifact
|
|
55
|
-
const
|
|
56
|
+
const { milestone, slice, task } = parseUnitId(unitId);
|
|
56
57
|
let summaryRemoved = false;
|
|
57
|
-
if (
|
|
58
|
+
if (task !== undefined && slice !== undefined) {
|
|
58
59
|
// Task-level: M001/S01/T01
|
|
59
|
-
const [mid, sid, tid] =
|
|
60
|
+
const [mid, sid, tid] = [milestone, slice, task];
|
|
60
61
|
const tasksDir = resolveTasksDir(basePath, mid, sid);
|
|
61
62
|
if (tasksDir) {
|
|
62
63
|
const summaryFile = join(tasksDir, buildTaskFileName(tid, "SUMMARY"));
|
|
@@ -66,9 +67,9 @@ export async function handleUndo(args, ctx, _pi, basePath) {
|
|
|
66
67
|
}
|
|
67
68
|
}
|
|
68
69
|
}
|
|
69
|
-
else if (
|
|
70
|
+
else if (slice !== undefined) {
|
|
70
71
|
// Slice-level: M001/S01
|
|
71
|
-
const [mid, sid] =
|
|
72
|
+
const [mid, sid] = [milestone, slice];
|
|
72
73
|
const slicePath = resolveSlicePath(basePath, mid, sid);
|
|
73
74
|
if (slicePath) {
|
|
74
75
|
for (const suffix of ["SUMMARY", "COMPLETE"]) {
|
|
@@ -82,8 +83,8 @@ export async function handleUndo(args, ctx, _pi, basePath) {
|
|
|
82
83
|
}
|
|
83
84
|
// 2. Uncheck task in PLAN if execute-task
|
|
84
85
|
let planUpdated = false;
|
|
85
|
-
if (unitType === "execute-task" &&
|
|
86
|
-
const [mid, sid, tid] =
|
|
86
|
+
if (unitType === "execute-task" && task !== undefined && slice !== undefined) {
|
|
87
|
+
const [mid, sid, tid] = [milestone, slice, task];
|
|
87
88
|
planUpdated = uncheckTaskInPlan(basePath, mid, sid, tid);
|
|
88
89
|
}
|
|
89
90
|
// 3. Try to revert git commits from activity log
|
|
@@ -2,6 +2,7 @@ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, unlink
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { gsdRoot, relSliceFile, relTaskFile, resolveSliceFile, resolveTaskFile, } from "./paths.js";
|
|
4
4
|
import { loadFile, parseTaskPlanMustHaves, countMustHavesMentionedInSummary } from "./files.js";
|
|
5
|
+
import { parseUnitId } from "./unit-id.js";
|
|
5
6
|
function runtimeDir(basePath) {
|
|
6
7
|
return join(gsdRoot(basePath), "runtime", "units");
|
|
7
8
|
}
|
|
@@ -75,7 +76,7 @@ export function listUnitRuntimeRecords(basePath) {
|
|
|
75
76
|
return results;
|
|
76
77
|
}
|
|
77
78
|
export async function inspectExecuteTaskDurability(basePath, unitId) {
|
|
78
|
-
const
|
|
79
|
+
const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
|
|
79
80
|
if (!mid || !sid || !tid)
|
|
80
81
|
return null;
|
|
81
82
|
const planAbs = resolveSliceFile(basePath, mid, sid, "PLAN");
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized verdict extraction, normalization, and schema validation.
|
|
3
|
+
*
|
|
4
|
+
* All verdict-related logic lives here so that normalization rules
|
|
5
|
+
* (e.g. `passed` → `pass`) are applied consistently across the codebase.
|
|
6
|
+
*/
|
|
7
|
+
import { extractUatType } from "./files.js";
|
|
8
|
+
// ── Verdict extraction ──────────────────────────────────────────────────
|
|
9
|
+
/**
|
|
10
|
+
* Extract and normalize the `verdict` value from YAML frontmatter.
|
|
11
|
+
*
|
|
12
|
+
* Normalization:
|
|
13
|
+
* - lowercased
|
|
14
|
+
* - `passed` → `pass`
|
|
15
|
+
*
|
|
16
|
+
* Returns `undefined` when frontmatter is absent or has no `verdict` field.
|
|
17
|
+
*/
|
|
18
|
+
export function extractVerdict(content) {
|
|
19
|
+
const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
20
|
+
if (!fmMatch)
|
|
21
|
+
return undefined;
|
|
22
|
+
const verdictMatch = fmMatch[1].match(/verdict:\s*([\w-]+)/i);
|
|
23
|
+
if (!verdictMatch)
|
|
24
|
+
return undefined;
|
|
25
|
+
let v = verdictMatch[1].toLowerCase();
|
|
26
|
+
if (v === "passed")
|
|
27
|
+
v = "pass";
|
|
28
|
+
return v;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Returns `true` when the content's frontmatter contains a `verdict` field.
|
|
32
|
+
*/
|
|
33
|
+
export function hasVerdict(content) {
|
|
34
|
+
return /verdict:\s*[\w-]+/i.test(content);
|
|
35
|
+
}
|
|
36
|
+
// ── UAT verdict schema ──────────────────────────────────────────────────
|
|
37
|
+
/**
|
|
38
|
+
* Base verdicts that are always acceptable for UAT results.
|
|
39
|
+
*/
|
|
40
|
+
export const UAT_ACCEPTABLE_VERDICTS = ["pass", "passed"];
|
|
41
|
+
/**
|
|
42
|
+
* UAT types whose results may legitimately produce a `partial` verdict
|
|
43
|
+
* when all automatable checks pass but human-only checks remain.
|
|
44
|
+
*/
|
|
45
|
+
const PARTIAL_ELIGIBLE_UAT_TYPES = [
|
|
46
|
+
"mixed",
|
|
47
|
+
"human-experience",
|
|
48
|
+
"live-runtime",
|
|
49
|
+
];
|
|
50
|
+
/**
|
|
51
|
+
* Check whether a verdict is acceptable for a given UAT type.
|
|
52
|
+
*
|
|
53
|
+
* `pass` / `passed` are always acceptable. `partial` is acceptable only for
|
|
54
|
+
* UAT types that include non-automatable human checks.
|
|
55
|
+
*/
|
|
56
|
+
export function isAcceptableUatVerdict(verdict, uatType) {
|
|
57
|
+
if (UAT_ACCEPTABLE_VERDICTS.includes(verdict))
|
|
58
|
+
return true;
|
|
59
|
+
if (verdict === "partial" && uatType && PARTIAL_ELIGIBLE_UAT_TYPES.includes(uatType)) {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
// ── Milestone validation verdict schema ─────────────────────────────────
|
|
65
|
+
/**
|
|
66
|
+
* Valid verdicts for the `validate-milestone` tool.
|
|
67
|
+
*/
|
|
68
|
+
export const VALIDATION_VERDICTS = ["pass", "needs-attention", "needs-remediation"];
|
|
69
|
+
/**
|
|
70
|
+
* Check whether a string is a valid milestone validation verdict.
|
|
71
|
+
*/
|
|
72
|
+
export function isValidMilestoneVerdict(verdict) {
|
|
73
|
+
return VALIDATION_VERDICTS.includes(verdict);
|
|
74
|
+
}
|
|
75
|
+
// ── UAT type helper ─────────────────────────────────────────────────────
|
|
76
|
+
/**
|
|
77
|
+
* Extract the UAT type from content, defaulting to `"artifact-driven"`.
|
|
78
|
+
*
|
|
79
|
+
* The `"artifact-driven"` fallback is the original default used throughout
|
|
80
|
+
* the codebase when a UAT file lacks an explicit `## UAT Type` section.
|
|
81
|
+
*/
|
|
82
|
+
export function getUatType(content) {
|
|
83
|
+
return extractUatType(content) ?? "artifact-driven";
|
|
84
|
+
}
|
|
@@ -6,6 +6,7 @@ import { spawnSync } from "node:child_process";
|
|
|
6
6
|
import { existsSync, readFileSync } from "node:fs";
|
|
7
7
|
import { join, basename } from "node:path";
|
|
8
8
|
import { DEFAULT_COMMAND_TIMEOUT_MS } from "./constants.js";
|
|
9
|
+
import { rewriteCommandWithRtk } from "../shared/rtk.js";
|
|
9
10
|
/** Maximum bytes of stdout/stderr to retain per command (10 KB). */
|
|
10
11
|
const MAX_OUTPUT_BYTES = 10 * 1024;
|
|
11
12
|
/** Truncate a string to maxBytes, appending a marker if truncated. */
|
|
@@ -210,10 +211,11 @@ export function runVerificationGate(options) {
|
|
|
210
211
|
const checks = [];
|
|
211
212
|
for (const command of commands) {
|
|
212
213
|
const start = Date.now();
|
|
214
|
+
const rewrittenCommand = rewriteCommandWithRtk(command);
|
|
213
215
|
// Pass the command string as an argument to the shell explicitly
|
|
214
216
|
// to avoid Node.js DEP0190 (spawnSync with shell: true and no args).
|
|
215
217
|
const shellBin = process.platform === "win32" ? "cmd" : "sh";
|
|
216
|
-
const shellArgs = process.platform === "win32" ? ["/c",
|
|
218
|
+
const shellArgs = process.platform === "win32" ? ["/c", rewrittenCommand] : ["-c", rewrittenCommand];
|
|
217
219
|
const result = spawnSync(shellBin, shellArgs, {
|
|
218
220
|
cwd: options.cwd,
|
|
219
221
|
stdio: "pipe",
|
|
@@ -72,6 +72,16 @@ export class WorktreeResolver {
|
|
|
72
72
|
*/
|
|
73
73
|
enterMilestone(milestoneId, ctx) {
|
|
74
74
|
this.validateMilestoneId(milestoneId);
|
|
75
|
+
// If worktree creation failed earlier this session, skip all future attempts
|
|
76
|
+
if (this.s.isolationDegraded) {
|
|
77
|
+
debugLog("WorktreeResolver", {
|
|
78
|
+
action: "enterMilestone",
|
|
79
|
+
milestoneId,
|
|
80
|
+
skipped: true,
|
|
81
|
+
reason: "isolation-degraded",
|
|
82
|
+
});
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
75
85
|
if (!this.deps.shouldUseWorktreeIsolation()) {
|
|
76
86
|
debugLog("WorktreeResolver", {
|
|
77
87
|
action: "enterMilestone",
|
|
@@ -136,6 +146,9 @@ export class WorktreeResolver {
|
|
|
136
146
|
data: { milestoneId, error: msg, fallback: "project-root" },
|
|
137
147
|
});
|
|
138
148
|
ctx.notify(`Auto-worktree creation for ${milestoneId} failed: ${msg}. Continuing in project root.`, "warning");
|
|
149
|
+
// Degrade isolation for the rest of this session so mergeAndExit
|
|
150
|
+
// doesn't try to merge a nonexistent worktree branch (#2483)
|
|
151
|
+
this.s.isolationDegraded = true;
|
|
139
152
|
// Do NOT update s.basePath — stay in project root
|
|
140
153
|
}
|
|
141
154
|
}
|
|
@@ -210,6 +223,17 @@ export class WorktreeResolver {
|
|
|
210
223
|
*/
|
|
211
224
|
mergeAndExit(milestoneId, ctx) {
|
|
212
225
|
this.validateMilestoneId(milestoneId);
|
|
226
|
+
// If worktree creation failed earlier, skip merge — work is on current branch (#2483)
|
|
227
|
+
if (this.s.isolationDegraded) {
|
|
228
|
+
debugLog("WorktreeResolver", {
|
|
229
|
+
action: "mergeAndExit",
|
|
230
|
+
milestoneId,
|
|
231
|
+
skipped: true,
|
|
232
|
+
reason: "isolation-degraded",
|
|
233
|
+
});
|
|
234
|
+
ctx.notify(`Skipping worktree merge for ${milestoneId} — isolation was degraded (worktree creation failed earlier). Work is on the current branch.`, "info");
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
213
237
|
const mode = this.deps.getIsolationMode();
|
|
214
238
|
debugLog("WorktreeResolver", {
|
|
215
239
|
action: "mergeAndExit",
|