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
|
@@ -10,9 +10,10 @@
|
|
|
10
10
|
|
|
11
11
|
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
12
12
|
import { join } from "node:path";
|
|
13
|
-
import {
|
|
13
|
+
import { homedir } from "node:os";
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
/** Industry-standard skills.sh global skills directory */
|
|
16
|
+
const SKILLS_DIR = join(homedir(), ".agents", "skills");
|
|
16
17
|
|
|
17
18
|
export interface DiscoveredSkill {
|
|
18
19
|
name: string;
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
17
17
|
import { join } from "node:path";
|
|
18
|
-
import {
|
|
18
|
+
import { homedir } from "node:os";
|
|
19
19
|
import type { UnitMetrics, MetricsLedger } from "./metrics.js";
|
|
20
20
|
import { formatCost, formatTokenCount, loadLedgerFromDisk } from "./metrics.js";
|
|
21
21
|
import { getSkillLastUsed, detectStaleSkills } from "./skill-telemetry.js";
|
|
@@ -208,7 +208,7 @@ export function formatSkillDetail(basePath: string, skillName: string): string {
|
|
|
208
208
|
}
|
|
209
209
|
|
|
210
210
|
// Check for SKILL.md existence
|
|
211
|
-
const skillPath = join(
|
|
211
|
+
const skillPath = join(homedir(), ".agents", "skills", skillName, "SKILL.md");
|
|
212
212
|
if (existsSync(skillPath)) {
|
|
213
213
|
const stat = require("node:fs").statSync(skillPath);
|
|
214
214
|
lines.push("");
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
15
15
|
import { join } from "node:path";
|
|
16
|
-
import {
|
|
16
|
+
import { homedir } from "node:os";
|
|
17
17
|
|
|
18
18
|
// ─── In-memory state ──────────────────────────────────────────────────────────
|
|
19
19
|
|
|
@@ -30,8 +30,14 @@ const activelyLoadedSkills = new Set<string>();
|
|
|
30
30
|
* Called before each unit starts.
|
|
31
31
|
*/
|
|
32
32
|
export function captureAvailableSkills(): void {
|
|
33
|
-
const skillsDir = join(
|
|
34
|
-
|
|
33
|
+
const skillsDir = join(homedir(), ".agents", "skills");
|
|
34
|
+
const legacyDir = join(homedir(), ".gsd", "agent", "skills");
|
|
35
|
+
const names = listSkillNames(skillsDir);
|
|
36
|
+
// Include skills still in the legacy directory only if migration hasn't completed
|
|
37
|
+
const legacyMigrated = existsSync(join(legacyDir, ".migrated-to-agents"));
|
|
38
|
+
const legacyNames = legacyMigrated ? [] : listSkillNames(legacyDir);
|
|
39
|
+
const all = new Set([...names, ...legacyNames]);
|
|
40
|
+
availableSkills = [...all];
|
|
35
41
|
activelyLoadedSkills.clear();
|
|
36
42
|
}
|
|
37
43
|
|
|
@@ -99,8 +105,12 @@ export function detectStaleSkills(
|
|
|
99
105
|
const stale: string[] = [];
|
|
100
106
|
|
|
101
107
|
// Check all installed skills, not just those with usage data
|
|
102
|
-
const skillsDir = join(
|
|
103
|
-
const
|
|
108
|
+
const skillsDir = join(homedir(), ".agents", "skills");
|
|
109
|
+
const legacyDir = join(homedir(), ".gsd", "agent", "skills");
|
|
110
|
+
const legacyMigrated = existsSync(join(legacyDir, ".migrated-to-agents"));
|
|
111
|
+
const legacyNames = legacyMigrated ? [] : listSkillNames(legacyDir);
|
|
112
|
+
const installedSet = new Set([...listSkillNames(skillsDir), ...legacyNames]);
|
|
113
|
+
const installed = [...installedSet];
|
|
104
114
|
|
|
105
115
|
for (const skill of installed) {
|
|
106
116
|
const lastTs = lastUsed.get(skill);
|
|
@@ -34,12 +34,14 @@ import {
|
|
|
34
34
|
gsdRoot,
|
|
35
35
|
} from './paths.js';
|
|
36
36
|
|
|
37
|
-
import {
|
|
37
|
+
import { findMilestoneIds } from './milestone-ids.js';
|
|
38
|
+
import { loadQueueOrder, sortByQueueOrder } from './queue-order.js';
|
|
38
39
|
import { nativeBatchParseGsdFiles, type BatchParsedFile } from './native-parser-bridge.js';
|
|
39
40
|
|
|
40
41
|
import { join, resolve } from 'path';
|
|
41
42
|
import { existsSync, readdirSync } from 'node:fs';
|
|
42
43
|
import { debugCount, debugTime } from './debug-logger.js';
|
|
44
|
+
import { extractVerdict } from './verdict-parser.js';
|
|
43
45
|
|
|
44
46
|
import {
|
|
45
47
|
isDbAvailable,
|
|
@@ -50,6 +52,7 @@ import {
|
|
|
50
52
|
getSlice,
|
|
51
53
|
insertMilestone,
|
|
52
54
|
updateTaskStatus,
|
|
55
|
+
getPendingSliceGateCount,
|
|
53
56
|
type MilestoneRow,
|
|
54
57
|
type SliceRow,
|
|
55
58
|
type TaskRow,
|
|
@@ -91,11 +94,8 @@ export function isMilestoneComplete(roadmap: Roadmap): boolean {
|
|
|
91
94
|
* after remediation slices are executed.
|
|
92
95
|
*/
|
|
93
96
|
export function isValidationTerminal(validationContent: string): boolean {
|
|
94
|
-
const
|
|
95
|
-
if (!
|
|
96
|
-
const verdict = match[1].match(/verdict:\s*(\S+)/);
|
|
97
|
-
if (!verdict) return false;
|
|
98
|
-
const v = verdict[1] === 'passed' ? 'pass' : verdict[1];
|
|
97
|
+
const v = extractVerdict(validationContent);
|
|
98
|
+
if (!v) return false;
|
|
99
99
|
// 'pass' and 'needs-attention' are always terminal.
|
|
100
100
|
// 'needs-remediation' is treated as terminal to prevent infinite loops
|
|
101
101
|
// when no remediation slices exist in the roadmap (#832). The validation
|
|
@@ -150,8 +150,14 @@ export async function getActiveMilestoneId(basePath: string): Promise<string | n
|
|
|
150
150
|
if (isDbAvailable()) {
|
|
151
151
|
const allMilestones = getAllMilestones();
|
|
152
152
|
if (allMilestones.length > 0) {
|
|
153
|
-
|
|
154
|
-
|
|
153
|
+
// Respect queue-order.json so /gsd queue reordering is honored (#2556).
|
|
154
|
+
// Without this, the DB path uses lexicographic sort while the dispatch
|
|
155
|
+
// guard uses queue order — causing a deadlock.
|
|
156
|
+
const customOrder = loadQueueOrder(basePath);
|
|
157
|
+
const sortedIds = sortByQueueOrder(allMilestones.map(m => m.id), customOrder);
|
|
158
|
+
const byId = new Map(allMilestones.map(m => [m.id, m]));
|
|
159
|
+
for (const id of sortedIds) {
|
|
160
|
+
const m = byId.get(id)!;
|
|
155
161
|
if (m.status === "complete" || m.status === "done" || m.status === "parked") continue;
|
|
156
162
|
return m.id;
|
|
157
163
|
}
|
|
@@ -305,8 +311,12 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
|
|
|
305
311
|
} as MilestoneRow);
|
|
306
312
|
}
|
|
307
313
|
}
|
|
308
|
-
// Re-sort so milestones
|
|
309
|
-
|
|
314
|
+
// Re-sort so milestones follow queue order (same as dispatch guard) (#2556)
|
|
315
|
+
const customOrder = loadQueueOrder(basePath);
|
|
316
|
+
const sortedIds = sortByQueueOrder(allMilestones.map(m => m.id), customOrder);
|
|
317
|
+
const byId = new Map(allMilestones.map(m => [m.id, m]));
|
|
318
|
+
allMilestones.length = 0;
|
|
319
|
+
for (const id of sortedIds) allMilestones.push(byId.get(id)!);
|
|
310
320
|
|
|
311
321
|
// Parallel worker isolation: when locked, filter to just the locked milestone
|
|
312
322
|
const milestoneLock = process.env.GSD_MILESTONE_LOCK;
|
|
@@ -711,6 +721,22 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
|
|
|
711
721
|
}
|
|
712
722
|
}
|
|
713
723
|
|
|
724
|
+
// ── Quality gate evaluation check ──────────────────────────────────
|
|
725
|
+
// If slice-scoped gates (Q3/Q4) are still pending, pause before execution
|
|
726
|
+
// so the gate-evaluate dispatch rule can run parallel sub-agents.
|
|
727
|
+
// Slices with zero gate rows (pre-feature or simple) skip straight through.
|
|
728
|
+
const pendingGateCount = getPendingSliceGateCount(activeMilestone.id, activeSlice.id);
|
|
729
|
+
if (pendingGateCount > 0) {
|
|
730
|
+
return {
|
|
731
|
+
activeMilestone, activeSlice, activeTask: null,
|
|
732
|
+
phase: 'evaluating-gates',
|
|
733
|
+
recentDecisions: [], blockers: [],
|
|
734
|
+
nextAction: `Evaluate ${pendingGateCount} quality gate(s) for ${activeSlice.id} before execution.`,
|
|
735
|
+
registry, requirements,
|
|
736
|
+
progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
|
|
737
|
+
};
|
|
738
|
+
}
|
|
739
|
+
|
|
714
740
|
// ── Blocker detection: check completed tasks for blocker_discovered ──
|
|
715
741
|
const completedTasks = tasks.filter(t => isStatusDone(t.status));
|
|
716
742
|
let blockerTaskId: string | null = null;
|
|
@@ -1280,6 +1306,24 @@ export async function _deriveStateImpl(basePath: string): Promise<GSDState> {
|
|
|
1280
1306
|
}
|
|
1281
1307
|
|
|
1282
1308
|
const slicePlan = parsePlan(slicePlanContent);
|
|
1309
|
+
|
|
1310
|
+
// ── Reconcile stale task status for filesystem-based projects (#2514) ──
|
|
1311
|
+
// Heading-style tasks (### T01:) are always parsed as done=false by
|
|
1312
|
+
// parsePlan because the heading syntax has no checkbox. When the agent
|
|
1313
|
+
// writes a SUMMARY file but the plan's heading isn't converted to a
|
|
1314
|
+
// checkbox, the task appears incomplete forever — causing infinite
|
|
1315
|
+
// re-dispatch. Reconcile by checking SUMMARY files on disk.
|
|
1316
|
+
for (const t of slicePlan.tasks) {
|
|
1317
|
+
if (t.done) continue;
|
|
1318
|
+
const summaryPath = resolveTaskFile(basePath, activeMilestone.id, activeSlice.id, t.id, "SUMMARY");
|
|
1319
|
+
if (summaryPath && existsSync(summaryPath)) {
|
|
1320
|
+
t.done = true;
|
|
1321
|
+
process.stderr.write(
|
|
1322
|
+
`gsd-reconcile: task ${activeMilestone.id}/${activeSlice.id}/${t.id} has SUMMARY on disk but plan shows incomplete — marking done (#2514)\n`,
|
|
1323
|
+
);
|
|
1324
|
+
}
|
|
1325
|
+
}
|
|
1326
|
+
|
|
1283
1327
|
const taskProgress = {
|
|
1284
1328
|
done: slicePlan.tasks.filter(t => t.done).length,
|
|
1285
1329
|
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}}
|
|
@@ -116,7 +116,7 @@ test("auto-timers.ts idle watchdog catch calls resolveAgentEndCancelled", () =>
|
|
|
116
116
|
// Check that resolveAgentEndCancelled is called near this catch
|
|
117
117
|
const catchRegion = source.slice(Math.max(0, idleCatchIdx - 200), idleCatchIdx + 200);
|
|
118
118
|
assert.ok(
|
|
119
|
-
catchRegion.includes("resolveAgentEndCancelled(
|
|
119
|
+
catchRegion.includes("resolveAgentEndCancelled("),
|
|
120
120
|
"idle watchdog catch block must call resolveAgentEndCancelled",
|
|
121
121
|
);
|
|
122
122
|
});
|
|
@@ -129,7 +129,7 @@ test("auto-timers.ts hard timeout catch calls resolveAgentEndCancelled", () => {
|
|
|
129
129
|
assert.ok(hardCatchIdx > -1, "hard timeout catch block must exist");
|
|
130
130
|
const catchRegion = source.slice(Math.max(0, hardCatchIdx - 200), hardCatchIdx + 200);
|
|
131
131
|
assert.ok(
|
|
132
|
-
catchRegion.includes("resolveAgentEndCancelled(
|
|
132
|
+
catchRegion.includes("resolveAgentEndCancelled("),
|
|
133
133
|
"hard timeout catch block must call resolveAgentEndCancelled",
|
|
134
134
|
);
|
|
135
135
|
});
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import test from "node:test";
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
|
+
import { readFileSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
3
5
|
|
|
4
6
|
import {
|
|
5
7
|
unitVerb,
|
|
@@ -11,6 +13,9 @@ import {
|
|
|
11
13
|
extractUatSliceId,
|
|
12
14
|
} from "../auto-dashboard.ts";
|
|
13
15
|
|
|
16
|
+
const autoSource = readFileSync(join(process.cwd(), "src", "resources", "extensions", "gsd", "auto.ts"), "utf-8");
|
|
17
|
+
const dashboardSource = readFileSync(join(process.cwd(), "src", "resources", "extensions", "gsd", "auto-dashboard.ts"), "utf-8");
|
|
18
|
+
|
|
14
19
|
// ─── unitVerb ─────────────────────────────────────────────────────────────
|
|
15
20
|
|
|
16
21
|
test("unitVerb maps known unit types to verbs", () => {
|
|
@@ -180,6 +185,17 @@ test("formatAutoElapsed returns empty string for negative autoStartTime", () =>
|
|
|
180
185
|
assert.equal(formatAutoElapsed(NaN), "");
|
|
181
186
|
});
|
|
182
187
|
|
|
188
|
+
test("getAutoDashboardData returns RTK savings in the dashboard payload", () => {
|
|
189
|
+
assert.match(autoSource, /const rtkSavings = sessionId && s\.basePath/);
|
|
190
|
+
assert.match(autoSource, /rtkSavings,/);
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
test("auto progress widget renders RTK savings under the footer stats line", () => {
|
|
194
|
+
assert.match(dashboardSource, /formatRtkSavingsLabel/);
|
|
195
|
+
assert.match(dashboardSource, /getRtkSessionSavings\(accessors\.getBasePath\(\), sessionId\)/);
|
|
196
|
+
assert.match(dashboardSource, /lines\.push\(rightAlign\("", theme\.fg\("dim", cachedRtkLabel\), width\)\);/);
|
|
197
|
+
});
|
|
198
|
+
|
|
183
199
|
// ─── extractUatSliceId ───────────────────────────────────────────────────
|
|
184
200
|
|
|
185
201
|
test("extractUatSliceId extracts slice ID from M001/S01 format", () => {
|
|
@@ -140,7 +140,7 @@ test("isLockProcessAlive returns false for dead PID", () => {
|
|
|
140
140
|
assert.equal(isLockProcessAlive(lock), false, "dead PID should return false");
|
|
141
141
|
});
|
|
142
142
|
|
|
143
|
-
test("isLockProcessAlive returns
|
|
143
|
+
test("#2470: isLockProcessAlive returns true for own PID (we hold the lock)", () => {
|
|
144
144
|
const lock = {
|
|
145
145
|
pid: process.pid,
|
|
146
146
|
startedAt: new Date().toISOString(),
|
|
@@ -148,7 +148,7 @@ test("isLockProcessAlive returns false for own PID (recycled)", () => {
|
|
|
148
148
|
unitId: "M001/S01/T01",
|
|
149
149
|
unitStartedAt: new Date().toISOString(),
|
|
150
150
|
};
|
|
151
|
-
assert.equal(isLockProcessAlive(lock),
|
|
151
|
+
assert.equal(isLockProcessAlive(lock), true, "own PID means we are alive — not stale (#2470)");
|
|
152
152
|
});
|
|
153
153
|
|
|
154
154
|
test("isLockProcessAlive returns false for invalid PID", () => {
|
|
@@ -882,6 +882,74 @@ test("autoLoop handles dispatch stop action", async (t) => {
|
|
|
882
882
|
);
|
|
883
883
|
});
|
|
884
884
|
|
|
885
|
+
// #2474: warning-level dispatch stop should pause (resumable), not hard-stop
|
|
886
|
+
test("autoLoop pauses instead of stopping for warning-level dispatch stop", async (t) => {
|
|
887
|
+
_resetPendingResolve();
|
|
888
|
+
|
|
889
|
+
const ctx = makeMockCtx();
|
|
890
|
+
ctx.ui.setStatus = () => {};
|
|
891
|
+
const pi = makeMockPi();
|
|
892
|
+
const s = makeLoopSession();
|
|
893
|
+
|
|
894
|
+
const deps = makeMockDeps({
|
|
895
|
+
resolveDispatch: async () => {
|
|
896
|
+
deps.callLog.push("resolveDispatch");
|
|
897
|
+
return {
|
|
898
|
+
action: "stop" as const,
|
|
899
|
+
reason: 'UAT verdict for S01 is "partial" — blocking progression.',
|
|
900
|
+
level: "warning" as const,
|
|
901
|
+
};
|
|
902
|
+
},
|
|
903
|
+
});
|
|
904
|
+
|
|
905
|
+
await autoLoop(ctx, pi, s, deps);
|
|
906
|
+
|
|
907
|
+
assert.ok(
|
|
908
|
+
deps.callLog.includes("resolveDispatch"),
|
|
909
|
+
"should have called resolveDispatch",
|
|
910
|
+
);
|
|
911
|
+
assert.ok(
|
|
912
|
+
deps.callLog.includes("pauseAuto"),
|
|
913
|
+
"warning-level stop should call pauseAuto (resumable)",
|
|
914
|
+
);
|
|
915
|
+
assert.ok(
|
|
916
|
+
!deps.callLog.includes("stopAuto"),
|
|
917
|
+
"warning-level stop should NOT call stopAuto (hard stop)",
|
|
918
|
+
);
|
|
919
|
+
});
|
|
920
|
+
|
|
921
|
+
// #2474: error-level dispatch stop should still hard-stop
|
|
922
|
+
test("autoLoop hard-stops for error-level dispatch stop", async (t) => {
|
|
923
|
+
_resetPendingResolve();
|
|
924
|
+
|
|
925
|
+
const ctx = makeMockCtx();
|
|
926
|
+
ctx.ui.setStatus = () => {};
|
|
927
|
+
const pi = makeMockPi();
|
|
928
|
+
const s = makeLoopSession();
|
|
929
|
+
|
|
930
|
+
const deps = makeMockDeps({
|
|
931
|
+
resolveDispatch: async () => {
|
|
932
|
+
deps.callLog.push("resolveDispatch");
|
|
933
|
+
return {
|
|
934
|
+
action: "stop" as const,
|
|
935
|
+
reason: "Cannot complete milestone: missing SUMMARY files.",
|
|
936
|
+
level: "error" as const,
|
|
937
|
+
};
|
|
938
|
+
},
|
|
939
|
+
});
|
|
940
|
+
|
|
941
|
+
await autoLoop(ctx, pi, s, deps);
|
|
942
|
+
|
|
943
|
+
assert.ok(
|
|
944
|
+
deps.callLog.includes("stopAuto"),
|
|
945
|
+
"error-level stop should call stopAuto (hard stop)",
|
|
946
|
+
);
|
|
947
|
+
assert.ok(
|
|
948
|
+
!deps.callLog.includes("pauseAuto"),
|
|
949
|
+
"error-level stop should NOT call pauseAuto",
|
|
950
|
+
);
|
|
951
|
+
});
|
|
952
|
+
|
|
885
953
|
test("autoLoop handles dispatch skip action by continuing", async (t) => {
|
|
886
954
|
_resetPendingResolve();
|
|
887
955
|
|
|
@@ -1745,6 +1813,41 @@ test("resolveAgentEndCancelled prevents orphaned promise after abort path", asyn
|
|
|
1745
1813
|
assert.equal(result.status, "cancelled");
|
|
1746
1814
|
});
|
|
1747
1815
|
|
|
1816
|
+
test("resolveAgentEndCancelled with errorContext passes it through to resolved promise", async () => {
|
|
1817
|
+
_resetPendingResolve();
|
|
1818
|
+
|
|
1819
|
+
const { _setCurrentResolve } = await import("../auto/resolve.js");
|
|
1820
|
+
|
|
1821
|
+
const p = new Promise<UnitResult>((r) => {
|
|
1822
|
+
_setCurrentResolve(r);
|
|
1823
|
+
});
|
|
1824
|
+
|
|
1825
|
+
resolveAgentEndCancelled({ message: "test timeout", category: "timeout", isTransient: true });
|
|
1826
|
+
|
|
1827
|
+
const resolved = await p;
|
|
1828
|
+
assert.equal(resolved.status, "cancelled");
|
|
1829
|
+
assert.ok(resolved.errorContext, "errorContext must be present");
|
|
1830
|
+
assert.equal(resolved.errorContext!.category, "timeout");
|
|
1831
|
+
assert.equal(resolved.errorContext!.message, "test timeout");
|
|
1832
|
+
assert.equal(resolved.errorContext!.isTransient, true);
|
|
1833
|
+
});
|
|
1834
|
+
|
|
1835
|
+
test("resolveAgentEndCancelled without args produces no errorContext field", async () => {
|
|
1836
|
+
_resetPendingResolve();
|
|
1837
|
+
|
|
1838
|
+
const { _setCurrentResolve } = await import("../auto/resolve.js");
|
|
1839
|
+
|
|
1840
|
+
const p = new Promise<UnitResult>((r) => {
|
|
1841
|
+
_setCurrentResolve(r);
|
|
1842
|
+
});
|
|
1843
|
+
|
|
1844
|
+
resolveAgentEndCancelled();
|
|
1845
|
+
|
|
1846
|
+
const resolved = await p;
|
|
1847
|
+
assert.equal(resolved.status, "cancelled");
|
|
1848
|
+
assert.equal(resolved.errorContext, undefined, "errorContext must not be present when no args passed");
|
|
1849
|
+
});
|
|
1850
|
+
|
|
1748
1851
|
// ─── #1571: artifact verification retry ──────────────────────────────────────
|
|
1749
1852
|
|
|
1750
1853
|
test("autoLoop re-iterates when postUnitPreVerification returns retry (#1571)", async () => {
|
|
@@ -10,7 +10,6 @@ import {
|
|
|
10
10
|
verifyExpectedArtifact,
|
|
11
11
|
diagnoseExpectedArtifact,
|
|
12
12
|
buildLoopRemediationSteps,
|
|
13
|
-
selfHealRuntimeRecords,
|
|
14
13
|
hasImplementationArtifacts,
|
|
15
14
|
} from "../auto-recovery.ts";
|
|
16
15
|
import { parseRoadmap, parsePlan } from "../parsers-legacy.ts";
|
|
@@ -112,7 +111,7 @@ test("resolveExpectedArtifactPath returns correct path for all slice-level types
|
|
|
112
111
|
|
|
113
112
|
const uatResult = resolveExpectedArtifactPath("run-uat", "M001/S01", base);
|
|
114
113
|
assert.ok(uatResult);
|
|
115
|
-
assert.ok(uatResult!.includes("UAT
|
|
114
|
+
assert.ok(uatResult!.includes("UAT"));
|
|
116
115
|
});
|
|
117
116
|
|
|
118
117
|
// ─── diagnoseExpectedArtifact ─────────────────────────────────────────────
|
|
@@ -572,85 +571,6 @@ test("verifyExpectedArtifact plan-slice fails after deleting a rendered task pla
|
|
|
572
571
|
}
|
|
573
572
|
});
|
|
574
573
|
|
|
575
|
-
// ─── selfHealRuntimeRecords — worktree base path (#769) ──────────────────
|
|
576
|
-
|
|
577
|
-
test("selfHealRuntimeRecords clears stale dispatched records (#769)", async (t) => {
|
|
578
|
-
// selfHealRuntimeRecords now only clears stale dispatched records (>1h).
|
|
579
|
-
// No completedKeySet parameter — deriveState is sole authority.
|
|
580
|
-
const worktreeBase = makeTmpBase();
|
|
581
|
-
const mainBase = makeTmpBase();
|
|
582
|
-
t.after(() => {
|
|
583
|
-
cleanup(worktreeBase);
|
|
584
|
-
cleanup(mainBase);
|
|
585
|
-
});
|
|
586
|
-
|
|
587
|
-
const { writeUnitRuntimeRecord, readUnitRuntimeRecord } = await import("../unit-runtime.ts");
|
|
588
|
-
|
|
589
|
-
// Write a stale runtime record in the worktree .gsd/runtime/units/
|
|
590
|
-
writeUnitRuntimeRecord(worktreeBase, "run-uat", "M001/S01", Date.now() - 7200_000, {
|
|
591
|
-
phase: "dispatched",
|
|
592
|
-
});
|
|
593
|
-
|
|
594
|
-
// Verify the runtime record exists before heal
|
|
595
|
-
const before = readUnitRuntimeRecord(worktreeBase, "run-uat", "M001/S01");
|
|
596
|
-
assert.ok(before, "runtime record should exist before heal");
|
|
597
|
-
|
|
598
|
-
// Mock ExtensionContext with minimal notify
|
|
599
|
-
const notifications: string[] = [];
|
|
600
|
-
const mockCtx = {
|
|
601
|
-
ui: { notify: (msg: string) => { notifications.push(msg); } },
|
|
602
|
-
} as any;
|
|
603
|
-
|
|
604
|
-
// Call selfHeal with worktreeBase — should clear the stale record
|
|
605
|
-
await selfHealRuntimeRecords(worktreeBase, mockCtx);
|
|
606
|
-
|
|
607
|
-
// The stale record should be cleared
|
|
608
|
-
const after = readUnitRuntimeRecord(worktreeBase, "run-uat", "M001/S01");
|
|
609
|
-
assert.equal(after, null, "runtime record should be cleared after heal");
|
|
610
|
-
assert.ok(notifications.some(n => n.includes("Self-heal")), "should emit self-heal notification");
|
|
611
|
-
|
|
612
|
-
// Write a stale record at mainBase
|
|
613
|
-
writeUnitRuntimeRecord(mainBase, "run-uat", "M001/S01", Date.now() - 7200_000, {
|
|
614
|
-
phase: "dispatched",
|
|
615
|
-
});
|
|
616
|
-
await selfHealRuntimeRecords(mainBase, mockCtx);
|
|
617
|
-
|
|
618
|
-
// The record at mainBase should also be cleared by the stale timeout (>1h)
|
|
619
|
-
const afterMain = readUnitRuntimeRecord(mainBase, "run-uat", "M001/S01");
|
|
620
|
-
assert.equal(afterMain, null, "stale record at main base should be cleared by timeout");
|
|
621
|
-
});
|
|
622
|
-
|
|
623
|
-
// ─── #1625: selfHealRuntimeRecords on resume clears paused-session leftovers ──
|
|
624
|
-
|
|
625
|
-
test("selfHealRuntimeRecords clears recently-paused dispatched records on resume (#1625)", async (t) => {
|
|
626
|
-
// When pauseAuto closes out a unit but clearUnitRuntimeRecord silently fails
|
|
627
|
-
// (e.g. permission error), selfHealRuntimeRecords on resume should still
|
|
628
|
-
// clean up stale dispatched records that are >1h old.
|
|
629
|
-
const base = makeTmpBase();
|
|
630
|
-
t.after(() => cleanup(base));
|
|
631
|
-
|
|
632
|
-
const { writeUnitRuntimeRecord, readUnitRuntimeRecord } = await import("../unit-runtime.ts");
|
|
633
|
-
|
|
634
|
-
// Simulate a record left behind after a pause — aged >1h to be considered stale
|
|
635
|
-
writeUnitRuntimeRecord(base, "execute-task", "M001/S01/T01", Date.now() - 3700_000, {
|
|
636
|
-
phase: "dispatched",
|
|
637
|
-
});
|
|
638
|
-
|
|
639
|
-
const before = readUnitRuntimeRecord(base, "execute-task", "M001/S01/T01");
|
|
640
|
-
assert.ok(before, "dispatched record should exist before resume heal");
|
|
641
|
-
assert.equal(before!.phase, "dispatched");
|
|
642
|
-
|
|
643
|
-
const notifications: string[] = [];
|
|
644
|
-
const mockCtx = {
|
|
645
|
-
ui: { notify: (msg: string) => { notifications.push(msg); } },
|
|
646
|
-
} as any;
|
|
647
|
-
|
|
648
|
-
await selfHealRuntimeRecords(base, mockCtx);
|
|
649
|
-
|
|
650
|
-
const after = readUnitRuntimeRecord(base, "execute-task", "M001/S01/T01");
|
|
651
|
-
assert.equal(after, null, "stale dispatched record should be cleared on resume (#1625)");
|
|
652
|
-
});
|
|
653
|
-
|
|
654
574
|
// ─── #793: invalidateAllCaches unblocks skip-loop ─────────────────────────
|
|
655
575
|
// When the skip-loop breaker fires, it must call invalidateAllCaches() (not
|
|
656
576
|
// just invalidateStateCache()) to clear path/parse caches that deriveState
|
|
@@ -5,6 +5,7 @@ import { join, dirname } from "node:path";
|
|
|
5
5
|
import { tmpdir } from "node:os";
|
|
6
6
|
import { fileURLToPath } from "node:url";
|
|
7
7
|
import { invalidateAllCaches } from '../cache.ts';
|
|
8
|
+
import { parseUnitId } from "../unit-id.ts";
|
|
8
9
|
|
|
9
10
|
// loadPrompt reads from ~/.gsd/agent/extensions/gsd/prompts/ (main checkout).
|
|
10
11
|
// In a worktree the file may not exist there yet, so we resolve prompts
|
|
@@ -222,8 +223,7 @@ describe("complete-milestone", () => {
|
|
|
222
223
|
|
|
223
224
|
const unitType = "complete-milestone";
|
|
224
225
|
const unitId = "M001";
|
|
225
|
-
const
|
|
226
|
-
const mid = parts[0]!;
|
|
226
|
+
const { milestone: mid } = parseUnitId(unitId);
|
|
227
227
|
|
|
228
228
|
// This is the exact logic from diagnoseExpectedArtifact for "complete-milestone"
|
|
229
229
|
const result = `${relMilestoneFile(base, mid, "SUMMARY")} (milestone summary)`;
|
|
@@ -125,9 +125,9 @@ console.log('\n=== complete-slice: schema v6 migration ===');
|
|
|
125
125
|
|
|
126
126
|
const adapter = _getAdapter()!;
|
|
127
127
|
|
|
128
|
-
// Verify schema version is current (
|
|
128
|
+
// Verify schema version is current (v12 after quality gates table)
|
|
129
129
|
const versionRow = adapter.prepare('SELECT MAX(version) as v FROM schema_version').get();
|
|
130
|
-
assertEq(versionRow?.['v'],
|
|
130
|
+
assertEq(versionRow?.['v'], 12, 'schema version should be 12');
|
|
131
131
|
|
|
132
132
|
// Verify slices table has full_summary_md and full_uat_md columns
|
|
133
133
|
const cols = adapter.prepare("PRAGMA table_info(slices)").all();
|