gsd-pi 2.49.0 → 2.50.0-dev.d210a87
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/cli.js +26 -0
- package/dist/headless-ui.js +12 -2
- package/dist/headless.js +29 -13
- package/dist/loader.js +4 -0
- package/dist/resource-loader.d.ts +4 -1
- package/dist/resource-loader.js +138 -3
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +3 -1
- package/dist/resources/extensions/bg-shell/interaction.js +3 -1
- package/dist/resources/extensions/bg-shell/process-manager.js +4 -1
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +5 -0
- package/dist/resources/extensions/gsd/auto/infra-errors.js +1 -0
- package/dist/resources/extensions/gsd/auto/phases.js +27 -12
- package/dist/resources/extensions/gsd/auto/resolve.js +2 -2
- package/dist/resources/extensions/gsd/auto/run-unit.js +2 -2
- package/dist/resources/extensions/gsd/auto/session.js +9 -0
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +8 -10
- package/dist/resources/extensions/gsd/auto-dashboard.js +28 -6
- package/dist/resources/extensions/gsd/auto-dispatch.js +113 -74
- package/dist/resources/extensions/gsd/auto-observability.js +54 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +53 -99
- package/dist/resources/extensions/gsd/auto-prompts.js +155 -17
- package/dist/resources/extensions/gsd/auto-recovery.js +79 -205
- package/dist/resources/extensions/gsd/auto-start.js +4 -31
- package/dist/resources/extensions/gsd/auto-timers.js +2 -2
- package/dist/resources/extensions/gsd/auto-utils.js +20 -0
- package/dist/resources/extensions/gsd/auto-verification.js +4 -7
- package/dist/resources/extensions/gsd/auto-worktree.js +257 -113
- package/dist/resources/extensions/gsd/auto.js +22 -10
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +89 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +24 -1
- package/dist/resources/extensions/gsd/branch-patterns.js +13 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +6 -2
- package/dist/resources/extensions/gsd/custom-execution-policy.js +3 -2
- package/dist/resources/extensions/gsd/custom-verification.js +3 -1
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +3 -2
- package/dist/resources/extensions/gsd/dashboard-overlay.js +4 -0
- package/dist/resources/extensions/gsd/detection.js +589 -3
- package/dist/resources/extensions/gsd/dispatch-guard.js +2 -1
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +15 -0
- package/dist/resources/extensions/gsd/doctor-checks.js +5 -1234
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +168 -0
- package/dist/resources/extensions/gsd/doctor-environment.js +28 -7
- package/dist/resources/extensions/gsd/doctor-git-checks.js +405 -0
- package/dist/resources/extensions/gsd/doctor-global-checks.js +74 -0
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +600 -0
- package/dist/resources/extensions/gsd/doctor.js +9 -1
- package/dist/resources/extensions/gsd/extension-manifest.json +1 -1
- package/dist/resources/extensions/gsd/files.js +5 -1
- package/dist/resources/extensions/gsd/git-service.js +9 -10
- package/dist/resources/extensions/gsd/gsd-db.js +124 -1
- package/dist/resources/extensions/gsd/guided-flow-queue.js +10 -11
- package/dist/resources/extensions/gsd/guided-flow.js +10 -0
- package/dist/resources/extensions/gsd/init-wizard.js +9 -1
- package/dist/resources/extensions/gsd/markdown-renderer.js +33 -5
- package/dist/resources/extensions/gsd/model-router.js +25 -0
- package/dist/resources/extensions/gsd/notifications.js +23 -0
- package/dist/resources/extensions/gsd/observability-validator.js +422 -0
- package/dist/resources/extensions/gsd/preferences-skills.js +11 -5
- package/dist/resources/extensions/gsd/preferences-types.js +3 -1
- package/dist/resources/extensions/gsd/preferences-validation.js +64 -0
- package/dist/resources/extensions/gsd/preferences.js +3 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +27 -8
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +9 -8
- package/dist/resources/extensions/gsd/prompts/execute-task.md +16 -13
- package/dist/resources/extensions/gsd/prompts/forensics.md +19 -8
- package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +32 -0
- package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +8 -3
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +3 -0
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +6 -1
- package/dist/resources/extensions/gsd/provider-error-pause.js +8 -0
- package/dist/resources/extensions/gsd/repo-identity.js +29 -0
- package/dist/resources/extensions/gsd/roadmap-mutations.js +110 -0
- package/dist/resources/extensions/gsd/roadmap-slices.js +2 -2
- package/dist/resources/extensions/gsd/rtk-status.js +43 -0
- package/dist/resources/extensions/gsd/rule-registry.js +10 -11
- package/dist/resources/extensions/gsd/session-forensics.js +13 -14
- package/dist/resources/extensions/gsd/session-lock.js +67 -56
- package/dist/resources/extensions/gsd/skill-catalog.js +1026 -0
- package/dist/resources/extensions/gsd/skill-discovery.js +3 -2
- package/dist/resources/extensions/gsd/skill-health.js +2 -2
- package/dist/resources/extensions/gsd/skill-telemetry.js +15 -5
- package/dist/resources/extensions/gsd/state.js +51 -12
- package/dist/resources/extensions/gsd/templates/milestone-summary.md +8 -0
- package/dist/resources/extensions/gsd/templates/milestone-validation.md +12 -0
- package/dist/resources/extensions/gsd/templates/plan.md +16 -0
- package/dist/resources/extensions/gsd/templates/preferences.md +2 -0
- package/dist/resources/extensions/gsd/templates/roadmap.md +13 -0
- package/dist/resources/extensions/gsd/templates/slice-summary.md +9 -0
- package/dist/resources/extensions/gsd/templates/task-plan.md +24 -0
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +28 -9
- package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -1
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +3 -3
- package/dist/resources/extensions/gsd/undo.js +8 -7
- package/dist/resources/extensions/gsd/unit-runtime.js +2 -1
- package/dist/resources/extensions/gsd/verdict-parser.js +84 -0
- package/dist/resources/extensions/gsd/verification-gate.js +3 -1
- package/dist/resources/extensions/gsd/worktree-resolver.js +24 -0
- package/dist/resources/extensions/gsd/worktree.js +3 -2
- package/dist/resources/extensions/remote-questions/config.js +3 -5
- package/dist/resources/extensions/search-the-web/native-search.js +8 -3
- package/dist/resources/extensions/search-the-web/tool-search.js +19 -2
- package/dist/resources/extensions/shared/rtk-session-stats.js +189 -0
- package/dist/resources/extensions/shared/rtk.js +100 -0
- package/dist/resources/skills/github-workflows/references/gh/SKILL.md +22 -1
- package/dist/rtk.d.ts +52 -0
- package/dist/rtk.js +332 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +20 -19
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/routes-manifest.json +6 -0
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +3 -0
- package/dist/web/standalone/.next/server/app/api/experimental/route.js.nft.json +1 -0
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -0
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -26
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +5 -5
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +20 -19
- package/dist/web/standalone/.next/server/chunks/2229.js +12 -0
- package/dist/web/standalone/.next/server/chunks/2331.js +25 -0
- package/dist/web/standalone/.next/server/chunks/{741.js → 4741.js} +1 -1
- package/dist/web/standalone/.next/server/chunks/5822.js +2 -0
- package/dist/web/standalone/.next/server/chunks/7471.js +13 -0
- package/dist/web/standalone/.next/server/functions-config-manifest.json +1 -0
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +3 -3
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/server/webpack-runtime.js +1 -1
- package/dist/web/standalone/.next/static/chunks/{485.243af25f0cdf50d6.js → 2008.817d0885545aaea9.js} +6 -6
- package/dist/web/standalone/.next/static/chunks/4024.9ad5def014d90ce4.js +9 -0
- package/dist/web/standalone/.next/static/chunks/app/_global-error/page-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/api/boot/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/experimental/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-b950e4e384cc62b3.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/webpack-cfc9a116e6450a6b.js +1 -0
- package/dist/web/standalone/.next/static/css/de141508b083f922.css +1 -0
- package/dist/web/standalone/.next/static/yJIyd5cXPNpmXTv18ZlyC/_buildManifest.js +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +4 -1
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.ts +4 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js +39 -10
- package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +1 -0
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/src/providers/openai-codex-responses.ts +39 -8
- package/packages/pi-ai/src/types.ts +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/bash-executor.d.ts +3 -1
- package/packages/pi-coding-agent/dist/core/bash-executor.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/bash-executor.js +10 -1
- package/packages/pi-coding-agent/dist/core/bash-executor.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/blob-store.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/blob-store.js +8 -3
- package/packages/pi-coding-agent/dist/core/blob-store.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/discovery-cache.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/discovery-cache.js +9 -2
- package/packages/pi-coding-agent/dist/core/discovery-cache.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +13 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +19 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/wrapper.js +8 -0
- package/packages/pi-coding-agent/dist/core/extensions/wrapper.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.js +8 -1
- package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts +11 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.js +30 -8
- package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -0
- package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +2 -2
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +3 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +13 -36
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts +5 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +12 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +2 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/jsonl.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/jsonl.js +5 -0
- package/packages/pi-coding-agent/dist/modes/rpc/jsonl.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js +0 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +2 -1
- package/packages/pi-coding-agent/src/core/bash-executor.ts +10 -2
- package/packages/pi-coding-agent/src/core/blob-store.ts +6 -3
- package/packages/pi-coding-agent/src/core/discovery-cache.ts +9 -2
- package/packages/pi-coding-agent/src/core/extensions/index.ts +2 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +18 -0
- package/packages/pi-coding-agent/src/core/extensions/types.ts +21 -0
- package/packages/pi-coding-agent/src/core/extensions/wrapper.ts +9 -0
- package/packages/pi-coding-agent/src/core/package-manager.ts +10 -1
- package/packages/pi-coding-agent/src/core/retry-handler.ts +1 -1
- package/packages/pi-coding-agent/src/core/skills.ts +35 -10
- package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
- package/packages/pi-coding-agent/src/index.ts +4 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +3 -2
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +13 -36
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +15 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +2 -1
- package/packages/pi-coding-agent/src/modes/rpc/jsonl.ts +6 -0
- package/packages/pi-coding-agent/src/modes/rpc/rpc-client.ts +0 -2
- package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -2
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +2 -1
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/pkg/package.json +1 -1
- package/scripts/postinstall.js +163 -6
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +3 -1
- package/src/resources/extensions/bg-shell/interaction.ts +3 -1
- package/src/resources/extensions/bg-shell/process-manager.ts +4 -1
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +5 -0
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +105 -0
- package/src/resources/extensions/gsd/auto/infra-errors.ts +1 -0
- package/src/resources/extensions/gsd/auto/phases.ts +25 -12
- package/src/resources/extensions/gsd/auto/resolve.ts +3 -3
- package/src/resources/extensions/gsd/auto/run-unit.ts +2 -2
- package/src/resources/extensions/gsd/auto/session.ts +11 -0
- package/src/resources/extensions/gsd/auto/types.ts +13 -0
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +19 -21
- package/src/resources/extensions/gsd/auto-dashboard.ts +36 -5
- package/src/resources/extensions/gsd/auto-dispatch.ts +122 -71
- package/src/resources/extensions/gsd/auto-loop.ts +1 -1
- package/src/resources/extensions/gsd/auto-observability.ts +72 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +73 -110
- package/src/resources/extensions/gsd/auto-prompts.ts +159 -17
- package/src/resources/extensions/gsd/auto-recovery.ts +80 -221
- package/src/resources/extensions/gsd/auto-start.ts +7 -27
- package/src/resources/extensions/gsd/auto-timers.ts +2 -2
- package/src/resources/extensions/gsd/auto-utils.ts +25 -0
- package/src/resources/extensions/gsd/auto-verification.ts +4 -7
- package/src/resources/extensions/gsd/auto-worktree.ts +305 -108
- package/src/resources/extensions/gsd/auto.ts +26 -15
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +93 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +25 -0
- package/src/resources/extensions/gsd/branch-patterns.ts +16 -0
- package/src/resources/extensions/gsd/crash-recovery.ts +6 -2
- package/src/resources/extensions/gsd/custom-execution-policy.ts +3 -2
- package/src/resources/extensions/gsd/custom-verification.ts +3 -1
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +3 -2
- package/src/resources/extensions/gsd/dashboard-overlay.ts +7 -0
- package/src/resources/extensions/gsd/detection.ts +662 -3
- package/src/resources/extensions/gsd/dispatch-guard.ts +2 -1
- package/src/resources/extensions/gsd/docs/preferences-reference.md +15 -0
- package/src/resources/extensions/gsd/doctor-checks.ts +5 -1291
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +182 -0
- package/src/resources/extensions/gsd/doctor-environment.ts +30 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +415 -0
- package/src/resources/extensions/gsd/doctor-global-checks.ts +84 -0
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +626 -0
- package/src/resources/extensions/gsd/doctor.ts +9 -1
- package/src/resources/extensions/gsd/extension-manifest.json +1 -1
- package/src/resources/extensions/gsd/files.ts +6 -1
- package/src/resources/extensions/gsd/git-service.ts +7 -15
- package/src/resources/extensions/gsd/gsd-db.ts +150 -2
- package/src/resources/extensions/gsd/guided-flow-queue.ts +11 -12
- package/src/resources/extensions/gsd/guided-flow.ts +11 -0
- package/src/resources/extensions/gsd/init-wizard.ts +9 -1
- package/src/resources/extensions/gsd/markdown-renderer.ts +37 -4
- package/src/resources/extensions/gsd/model-router.ts +25 -0
- package/src/resources/extensions/gsd/notifications.ts +23 -0
- package/src/resources/extensions/gsd/observability-validator.ts +456 -0
- package/src/resources/extensions/gsd/preferences-skills.ts +11 -5
- package/src/resources/extensions/gsd/preferences-types.ts +25 -1
- package/src/resources/extensions/gsd/preferences-validation.ts +63 -0
- package/src/resources/extensions/gsd/preferences.ts +3 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +27 -8
- package/src/resources/extensions/gsd/prompts/complete-slice.md +9 -8
- package/src/resources/extensions/gsd/prompts/execute-task.md +16 -13
- package/src/resources/extensions/gsd/prompts/forensics.md +19 -8
- package/src/resources/extensions/gsd/prompts/gate-evaluate.md +32 -0
- package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +8 -3
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +3 -0
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +6 -1
- package/src/resources/extensions/gsd/provider-error-pause.ts +9 -0
- package/src/resources/extensions/gsd/repo-identity.ts +28 -0
- package/src/resources/extensions/gsd/roadmap-mutations.ts +134 -0
- package/src/resources/extensions/gsd/roadmap-slices.ts +2 -2
- package/src/resources/extensions/gsd/rtk-status.ts +53 -0
- package/src/resources/extensions/gsd/rule-registry.ts +10 -11
- package/src/resources/extensions/gsd/session-forensics.ts +13 -14
- package/src/resources/extensions/gsd/session-lock.ts +92 -64
- package/src/resources/extensions/gsd/skill-catalog.ts +1085 -0
- package/src/resources/extensions/gsd/skill-discovery.ts +3 -2
- package/src/resources/extensions/gsd/skill-health.ts +2 -2
- package/src/resources/extensions/gsd/skill-telemetry.ts +15 -5
- package/src/resources/extensions/gsd/state.ts +54 -10
- package/src/resources/extensions/gsd/templates/milestone-summary.md +8 -0
- package/src/resources/extensions/gsd/templates/milestone-validation.md +12 -0
- package/src/resources/extensions/gsd/templates/plan.md +16 -0
- package/src/resources/extensions/gsd/templates/preferences.md +2 -0
- package/src/resources/extensions/gsd/templates/roadmap.md +13 -0
- package/src/resources/extensions/gsd/templates/slice-summary.md +9 -0
- package/src/resources/extensions/gsd/templates/task-plan.md +24 -0
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +1 -81
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +9 -12
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/custom-verification.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/detection.test.ts +838 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +28 -9
- package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +115 -1
- package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +65 -1
- package/src/resources/extensions/gsd/tests/doctor-git.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/gate-dispatch.test.ts +189 -0
- package/src/resources/extensions/gsd/tests/gate-storage.test.ts +156 -0
- package/src/resources/extensions/gsd/tests/git-service.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/infra-error.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/model-router.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/notifications.test.ts +28 -6
- package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +474 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/quality-gates.test.ts +347 -0
- package/src/resources/extensions/gsd/tests/queue-completed-milestone-perf.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/replan-slice.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/retry-diagnostic-reasoning.test.ts +161 -0
- package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +4 -5
- package/src/resources/extensions/gsd/tests/rewrite-count-persist.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +166 -16
- package/src/resources/extensions/gsd/tests/session-lock-transient-read.test.ts +223 -0
- package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +12 -12
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +44 -4
- package/src/resources/extensions/gsd/tests/skill-catalog.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +0 -16
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +204 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +16 -0
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +3 -3
- package/src/resources/extensions/gsd/types.ts +32 -0
- package/src/resources/extensions/gsd/undo.ts +8 -7
- package/src/resources/extensions/gsd/unit-runtime.ts +2 -1
- package/src/resources/extensions/gsd/verdict-parser.ts +95 -0
- package/src/resources/extensions/gsd/verification-gate.ts +3 -3
- package/src/resources/extensions/gsd/worktree-resolver.ts +31 -0
- package/src/resources/extensions/gsd/worktree.ts +3 -2
- package/src/resources/extensions/remote-questions/config.ts +3 -5
- package/src/resources/extensions/search-the-web/native-search.ts +8 -3
- package/src/resources/extensions/search-the-web/tool-search.ts +22 -2
- package/src/resources/extensions/shared/rtk-session-stats.ts +249 -0
- package/src/resources/extensions/shared/rtk.ts +120 -0
- package/src/resources/skills/github-workflows/references/gh/SKILL.md +22 -1
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +0 -191
- package/dist/resources/extensions/gsd/resource-version.js +0 -97
- package/dist/web/standalone/.next/server/chunks/229.js +0 -12
- package/dist/web/standalone/.next/server/chunks/441.js +0 -2
- package/dist/web/standalone/.next/server/chunks/471.js +0 -13
- package/dist/web/standalone/.next/static/chunks/4024.11ca5c01938e5948.js +0 -9
- package/dist/web/standalone/.next/static/chunks/app/_global-error/page-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/boot/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-12dd5ece0df4badc.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/webpack-0a4cd455ec4197d2.js +0 -1
- package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +0 -1
- package/dist/web/standalone/.next/static/gj-y5hikmhS--NT8Web6M/_buildManifest.js +0 -1
- package/packages/pi-ai/pnpm-lock.yaml +0 -2022
- package/packages/pi-coding-agent/pnpm-lock.yaml +0 -454
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +0 -234
- package/src/resources/extensions/gsd/resource-version.ts +0 -101
- /package/dist/web/standalone/.next/static/{gj-y5hikmhS--NT8Web6M → yJIyd5cXPNpmXTv18ZlyC}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
import { loadFile } from "./files.js";
|
|
2
|
+
import { resolveSliceFile, resolveTaskFile, resolveTasksDir, resolveTaskFiles } from "./paths.js";
|
|
3
|
+
function getSection(content, heading, level = 2) {
|
|
4
|
+
const prefix = "#".repeat(level) + " ";
|
|
5
|
+
const escaped = heading.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
6
|
+
const regex = new RegExp(`^${prefix}${escaped}\\s*$`, "m");
|
|
7
|
+
const match = regex.exec(content);
|
|
8
|
+
if (!match)
|
|
9
|
+
return null;
|
|
10
|
+
const start = match.index + match[0].length;
|
|
11
|
+
const rest = content.slice(start);
|
|
12
|
+
const nextHeading = rest.match(new RegExp(`^#{1,${level}} `, "m"));
|
|
13
|
+
const end = nextHeading ? nextHeading.index : rest.length;
|
|
14
|
+
return rest.slice(0, end).trim();
|
|
15
|
+
}
|
|
16
|
+
function getFrontmatter(content) {
|
|
17
|
+
const trimmed = content.trimStart();
|
|
18
|
+
if (!trimmed.startsWith("---"))
|
|
19
|
+
return null;
|
|
20
|
+
const afterFirst = trimmed.indexOf("\n");
|
|
21
|
+
if (afterFirst === -1)
|
|
22
|
+
return null;
|
|
23
|
+
const rest = trimmed.slice(afterFirst + 1);
|
|
24
|
+
const endIdx = rest.indexOf("\n---");
|
|
25
|
+
if (endIdx === -1)
|
|
26
|
+
return null;
|
|
27
|
+
return rest.slice(0, endIdx);
|
|
28
|
+
}
|
|
29
|
+
function hasFrontmatterKey(content, key) {
|
|
30
|
+
const fm = getFrontmatter(content);
|
|
31
|
+
if (!fm)
|
|
32
|
+
return false;
|
|
33
|
+
return new RegExp(`^${key}:`, "m").test(fm);
|
|
34
|
+
}
|
|
35
|
+
function normalizeMeaningfulLines(text) {
|
|
36
|
+
return text
|
|
37
|
+
.split("\n")
|
|
38
|
+
.map(line => line.trim())
|
|
39
|
+
.filter(line => line.length > 0)
|
|
40
|
+
.filter(line => !line.startsWith("<!--"))
|
|
41
|
+
.filter(line => !line.endsWith("-->"))
|
|
42
|
+
.filter(line => !/^[-*]\s*\{\{.+\}\}$/.test(line))
|
|
43
|
+
.filter(line => !/^\{\{.+\}\}$/.test(line));
|
|
44
|
+
}
|
|
45
|
+
function sectionLooksPlaceholderOnly(text) {
|
|
46
|
+
if (!text)
|
|
47
|
+
return true;
|
|
48
|
+
const lines = normalizeMeaningfulLines(text)
|
|
49
|
+
.map(line => line.replace(/^[-*]\s+/, "").trim())
|
|
50
|
+
.filter(line => line.length > 0);
|
|
51
|
+
if (lines.length === 0)
|
|
52
|
+
return true;
|
|
53
|
+
return lines.every(line => {
|
|
54
|
+
const lower = line.toLowerCase();
|
|
55
|
+
return lower === "none" ||
|
|
56
|
+
lower.endsWith(": none") ||
|
|
57
|
+
lower.includes("{{") ||
|
|
58
|
+
lower.includes("}}") ||
|
|
59
|
+
lower.startsWith("required for non-trivial") ||
|
|
60
|
+
lower.startsWith("describe how a future agent") ||
|
|
61
|
+
lower.startsWith("prefer:") ||
|
|
62
|
+
lower.startsWith("keep this section concise");
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
function textSuggestsObservabilityRelevant(content) {
|
|
66
|
+
const lower = content.toLowerCase();
|
|
67
|
+
const needles = [
|
|
68
|
+
" api", "route", "server", "worker", "queue", "job", "sync", "import",
|
|
69
|
+
"webhook", "auth", "db", "database", "migration", "cache", "background",
|
|
70
|
+
"polling", "realtime", "socket", "stateful", "integration", "ui", "form",
|
|
71
|
+
"submit", "status", "service", "pipeline", "health endpoint", "error path"
|
|
72
|
+
];
|
|
73
|
+
return needles.some(needle => lower.includes(needle));
|
|
74
|
+
}
|
|
75
|
+
function verificationMentionsDiagnostics(section) {
|
|
76
|
+
if (!section)
|
|
77
|
+
return false;
|
|
78
|
+
const lower = section.toLowerCase();
|
|
79
|
+
const needles = [
|
|
80
|
+
"error", "failure", "diagnostic", "status", "health", "inspect", "log",
|
|
81
|
+
"network", "console", "retry", "last error", "correlation", "readiness"
|
|
82
|
+
];
|
|
83
|
+
return needles.some(needle => lower.includes(needle));
|
|
84
|
+
}
|
|
85
|
+
export function validateSlicePlanContent(file, content) {
|
|
86
|
+
const issues = [];
|
|
87
|
+
// ── Plan quality rules (always run, not gated by runtime relevance) ──
|
|
88
|
+
const tasksSection = getSection(content, "Tasks", 2);
|
|
89
|
+
if (tasksSection) {
|
|
90
|
+
const lines = tasksSection.split("\n");
|
|
91
|
+
const taskLinePattern = /^- \[[ x]\] \*\*T\d+:/;
|
|
92
|
+
const taskLineIndices = [];
|
|
93
|
+
for (let i = 0; i < lines.length; i++) {
|
|
94
|
+
if (taskLinePattern.test(lines[i]))
|
|
95
|
+
taskLineIndices.push(i);
|
|
96
|
+
}
|
|
97
|
+
for (let t = 0; t < taskLineIndices.length; t++) {
|
|
98
|
+
const start = taskLineIndices[t];
|
|
99
|
+
const end = t + 1 < taskLineIndices.length ? taskLineIndices[t + 1] : lines.length;
|
|
100
|
+
// Check lines between this task header and the next (or section end)
|
|
101
|
+
const bodyLines = lines.slice(start + 1, end);
|
|
102
|
+
const meaningful = bodyLines.filter(l => l.trim().length > 0);
|
|
103
|
+
if (meaningful.length === 0) {
|
|
104
|
+
issues.push({
|
|
105
|
+
severity: "warning",
|
|
106
|
+
scope: "slice-plan",
|
|
107
|
+
file,
|
|
108
|
+
ruleId: "empty_task_entry",
|
|
109
|
+
message: "Inline task entry has no description content beneath the checkbox line.",
|
|
110
|
+
suggestion: "Add at least a Why/Files/Do/Verify summary so the task is self-describing.",
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// ── Observability rules (gated by runtime relevance) ──
|
|
116
|
+
const relevant = textSuggestsObservabilityRelevant(content);
|
|
117
|
+
if (!relevant)
|
|
118
|
+
return issues;
|
|
119
|
+
const obs = getSection(content, "Observability / Diagnostics", 2);
|
|
120
|
+
const verification = getSection(content, "Verification", 2);
|
|
121
|
+
if (!obs) {
|
|
122
|
+
issues.push({
|
|
123
|
+
severity: "warning",
|
|
124
|
+
scope: "slice-plan",
|
|
125
|
+
file,
|
|
126
|
+
ruleId: "missing_observability_section",
|
|
127
|
+
message: "Slice plan appears non-trivial but is missing `## Observability / Diagnostics`.",
|
|
128
|
+
suggestion: "Add runtime signals, inspection surfaces, failure visibility, and redaction constraints.",
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
else if (sectionLooksPlaceholderOnly(obs)) {
|
|
132
|
+
issues.push({
|
|
133
|
+
severity: "warning",
|
|
134
|
+
scope: "slice-plan",
|
|
135
|
+
file,
|
|
136
|
+
ruleId: "observability_section_placeholder_only",
|
|
137
|
+
message: "Slice plan has `## Observability / Diagnostics` but it still looks like placeholder text.",
|
|
138
|
+
suggestion: "Replace placeholders with concrete signals and inspection surfaces a future agent should trust.",
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
if (!verificationMentionsDiagnostics(verification)) {
|
|
142
|
+
issues.push({
|
|
143
|
+
severity: "warning",
|
|
144
|
+
scope: "slice-plan",
|
|
145
|
+
file,
|
|
146
|
+
ruleId: "verification_missing_diagnostic_check",
|
|
147
|
+
message: "Slice verification does not appear to include any diagnostic or failure-path check.",
|
|
148
|
+
suggestion: "Add at least one verification step for inspectable failure state, structured error output, status surface, or equivalent.",
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
return issues;
|
|
152
|
+
}
|
|
153
|
+
export function validateTaskPlanContent(file, content) {
|
|
154
|
+
const issues = [];
|
|
155
|
+
// ── Plan quality rules (always run, not gated by runtime relevance) ──
|
|
156
|
+
// Rule: empty or missing Steps section
|
|
157
|
+
const stepsSection = getSection(content, "Steps", 2);
|
|
158
|
+
if (stepsSection === null || sectionLooksPlaceholderOnly(stepsSection)) {
|
|
159
|
+
issues.push({
|
|
160
|
+
severity: "warning",
|
|
161
|
+
scope: "task-plan",
|
|
162
|
+
file,
|
|
163
|
+
ruleId: "empty_steps_section",
|
|
164
|
+
message: "Task plan has an empty or missing `## Steps` section.",
|
|
165
|
+
suggestion: "Add concrete numbered implementation steps so execution has a clear sequence.",
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
// Rule: placeholder-only Verification section
|
|
169
|
+
const verificationSection = getSection(content, "Verification", 2);
|
|
170
|
+
if (verificationSection !== null && sectionLooksPlaceholderOnly(verificationSection)) {
|
|
171
|
+
issues.push({
|
|
172
|
+
severity: "warning",
|
|
173
|
+
scope: "task-plan",
|
|
174
|
+
file,
|
|
175
|
+
ruleId: "placeholder_verification",
|
|
176
|
+
message: "Task plan has `## Verification` but it still looks like placeholder text.",
|
|
177
|
+
suggestion: "Replace placeholders with concrete verification commands, test runs, or observable checks.",
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
// Rule: scope estimate thresholds
|
|
181
|
+
const fm = getFrontmatter(content);
|
|
182
|
+
if (fm) {
|
|
183
|
+
const stepsMatch = fm.match(/^estimated_steps:\s*(\d+)/m);
|
|
184
|
+
const filesMatch = fm.match(/^estimated_files:\s*(\d+)/m);
|
|
185
|
+
if (stepsMatch) {
|
|
186
|
+
const estimatedSteps = parseInt(stepsMatch[1], 10);
|
|
187
|
+
if (estimatedSteps >= 10) {
|
|
188
|
+
issues.push({
|
|
189
|
+
severity: "warning",
|
|
190
|
+
scope: "task-plan",
|
|
191
|
+
file,
|
|
192
|
+
ruleId: "scope_estimate_steps_high",
|
|
193
|
+
message: `Task plan estimates ${estimatedSteps} steps (threshold: 10). Consider splitting into smaller tasks.`,
|
|
194
|
+
suggestion: "Break the task into sub-tasks or reduce scope so each task stays focused and completable in one pass.",
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (filesMatch) {
|
|
199
|
+
const estimatedFiles = parseInt(filesMatch[1], 10);
|
|
200
|
+
if (estimatedFiles >= 12) {
|
|
201
|
+
issues.push({
|
|
202
|
+
severity: "warning",
|
|
203
|
+
scope: "task-plan",
|
|
204
|
+
file,
|
|
205
|
+
ruleId: "scope_estimate_files_high",
|
|
206
|
+
message: `Task plan estimates ${estimatedFiles} files (threshold: 12). Consider splitting into smaller tasks.`,
|
|
207
|
+
suggestion: "Break the task into sub-tasks or reduce scope to keep the change footprint manageable.",
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// Rule: Inputs and Expected Output should contain backtick-wrapped file paths
|
|
213
|
+
const inputsSection = getSection(content, "Inputs", 2);
|
|
214
|
+
const outputSection = getSection(content, "Expected Output", 2);
|
|
215
|
+
const backtickPathPattern = /`[^`]*[./][^`]*`/;
|
|
216
|
+
if (outputSection === null || !backtickPathPattern.test(outputSection)) {
|
|
217
|
+
issues.push({
|
|
218
|
+
severity: "warning",
|
|
219
|
+
scope: "task-plan",
|
|
220
|
+
file,
|
|
221
|
+
ruleId: "missing_output_file_paths",
|
|
222
|
+
message: "Task plan `## Expected Output` is missing or has no backtick-wrapped file paths.",
|
|
223
|
+
suggestion: "List concrete output file paths in backticks (e.g. `src/types.ts`). These are machine-parsed to derive task dependencies.",
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
if (inputsSection !== null && inputsSection.trim().length > 0 && !backtickPathPattern.test(inputsSection)) {
|
|
227
|
+
issues.push({
|
|
228
|
+
severity: "info",
|
|
229
|
+
scope: "task-plan",
|
|
230
|
+
file,
|
|
231
|
+
ruleId: "missing_input_file_paths",
|
|
232
|
+
message: "Task plan `## Inputs` has content but no backtick-wrapped file paths.",
|
|
233
|
+
suggestion: "List input file paths in backticks (e.g. `src/config.json`). These are machine-parsed to derive task dependencies.",
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
// ── Observability rules (gated by runtime relevance) ──
|
|
237
|
+
const relevant = textSuggestsObservabilityRelevant(content);
|
|
238
|
+
if (!relevant)
|
|
239
|
+
return issues;
|
|
240
|
+
const obs = getSection(content, "Observability Impact", 2);
|
|
241
|
+
if (!obs) {
|
|
242
|
+
issues.push({
|
|
243
|
+
severity: "warning",
|
|
244
|
+
scope: "task-plan",
|
|
245
|
+
file,
|
|
246
|
+
ruleId: "missing_observability_impact",
|
|
247
|
+
message: "Task plan appears runtime-relevant but is missing `## Observability Impact`.",
|
|
248
|
+
suggestion: "Explain what signals change, how a future agent inspects this task, and what failure state becomes visible.",
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
else if (sectionLooksPlaceholderOnly(obs)) {
|
|
252
|
+
issues.push({
|
|
253
|
+
severity: "warning",
|
|
254
|
+
scope: "task-plan",
|
|
255
|
+
file,
|
|
256
|
+
ruleId: "observability_impact_placeholder_only",
|
|
257
|
+
message: "Task plan has `## Observability Impact` but it still looks empty or placeholder-only.",
|
|
258
|
+
suggestion: "Fill in concrete inspection surfaces or explicitly justify why observability is not applicable.",
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
return issues;
|
|
262
|
+
}
|
|
263
|
+
export function validateTaskSummaryContent(file, content) {
|
|
264
|
+
const issues = [];
|
|
265
|
+
if (!hasFrontmatterKey(content, "observability_surfaces")) {
|
|
266
|
+
issues.push({
|
|
267
|
+
severity: "warning",
|
|
268
|
+
scope: "task-summary",
|
|
269
|
+
file,
|
|
270
|
+
ruleId: "missing_observability_frontmatter",
|
|
271
|
+
message: "Task summary is missing `observability_surfaces` in frontmatter.",
|
|
272
|
+
suggestion: "List the durable status/log/error surfaces a future agent should use.",
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
const diagnostics = getSection(content, "Diagnostics", 2);
|
|
276
|
+
if (!diagnostics) {
|
|
277
|
+
issues.push({
|
|
278
|
+
severity: "warning",
|
|
279
|
+
scope: "task-summary",
|
|
280
|
+
file,
|
|
281
|
+
ruleId: "missing_diagnostics_section",
|
|
282
|
+
message: "Task summary is missing `## Diagnostics`.",
|
|
283
|
+
suggestion: "Document how to inspect what this task built later.",
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
else if (sectionLooksPlaceholderOnly(diagnostics)) {
|
|
287
|
+
issues.push({
|
|
288
|
+
severity: "warning",
|
|
289
|
+
scope: "task-summary",
|
|
290
|
+
file,
|
|
291
|
+
ruleId: "diagnostics_placeholder_only",
|
|
292
|
+
message: "Task summary diagnostics section still looks like placeholder text.",
|
|
293
|
+
suggestion: "Replace placeholders with concrete commands, endpoints, logs, error shapes, or failure artifacts.",
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
const evidence = getSection(content, "Verification Evidence", 2);
|
|
297
|
+
if (!evidence) {
|
|
298
|
+
issues.push({
|
|
299
|
+
severity: "warning",
|
|
300
|
+
scope: "task-summary",
|
|
301
|
+
file,
|
|
302
|
+
ruleId: "evidence_block_missing",
|
|
303
|
+
message: "Task summary is missing `## Verification Evidence`.",
|
|
304
|
+
suggestion: "Add a verification evidence table showing gate check results (command, exit code, verdict, duration).",
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
else if (sectionLooksPlaceholderOnly(evidence)) {
|
|
308
|
+
issues.push({
|
|
309
|
+
severity: "warning",
|
|
310
|
+
scope: "task-summary",
|
|
311
|
+
file,
|
|
312
|
+
ruleId: "evidence_block_placeholder",
|
|
313
|
+
message: "Task summary verification evidence section still looks like placeholder text.",
|
|
314
|
+
suggestion: "Replace placeholders with actual gate results or note that no verification commands were discovered.",
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
return issues;
|
|
318
|
+
}
|
|
319
|
+
export function validateSliceSummaryContent(file, content) {
|
|
320
|
+
const issues = [];
|
|
321
|
+
if (!hasFrontmatterKey(content, "observability_surfaces")) {
|
|
322
|
+
issues.push({
|
|
323
|
+
severity: "warning",
|
|
324
|
+
scope: "slice-summary",
|
|
325
|
+
file,
|
|
326
|
+
ruleId: "missing_observability_frontmatter",
|
|
327
|
+
message: "Slice summary is missing `observability_surfaces` in frontmatter.",
|
|
328
|
+
suggestion: "List the authoritative diagnostics and durable inspection surfaces for this slice.",
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
const diagnostics = getSection(content, "Authoritative diagnostics", 3);
|
|
332
|
+
if (!diagnostics) {
|
|
333
|
+
issues.push({
|
|
334
|
+
severity: "warning",
|
|
335
|
+
scope: "slice-summary",
|
|
336
|
+
file,
|
|
337
|
+
ruleId: "missing_authoritative_diagnostics",
|
|
338
|
+
message: "Slice summary is missing `### Authoritative diagnostics` in Forward Intelligence.",
|
|
339
|
+
suggestion: "Tell future agents where to look first and why that signal is trustworthy.",
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
else if (sectionLooksPlaceholderOnly(diagnostics)) {
|
|
343
|
+
issues.push({
|
|
344
|
+
severity: "warning",
|
|
345
|
+
scope: "slice-summary",
|
|
346
|
+
file,
|
|
347
|
+
ruleId: "authoritative_diagnostics_placeholder_only",
|
|
348
|
+
message: "Slice summary includes authoritative diagnostics but it still looks like placeholder text.",
|
|
349
|
+
suggestion: "Replace placeholders with the real first-stop diagnostic surface for this slice.",
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
return issues;
|
|
353
|
+
}
|
|
354
|
+
export async function validatePlanBoundary(basePath, milestoneId, sliceId) {
|
|
355
|
+
const issues = [];
|
|
356
|
+
const slicePlan = resolveSliceFile(basePath, milestoneId, sliceId, "PLAN");
|
|
357
|
+
if (slicePlan) {
|
|
358
|
+
const content = await loadFile(slicePlan);
|
|
359
|
+
if (content)
|
|
360
|
+
issues.push(...validateSlicePlanContent(slicePlan, content));
|
|
361
|
+
}
|
|
362
|
+
const tasksDir = resolveTasksDir(basePath, milestoneId, sliceId);
|
|
363
|
+
const taskPlans = tasksDir ? resolveTaskFiles(tasksDir, "PLAN") : [];
|
|
364
|
+
for (const file of taskPlans) {
|
|
365
|
+
const taskId = file.split("-")[0];
|
|
366
|
+
const taskPlan = resolveTaskFile(basePath, milestoneId, sliceId, taskId, "PLAN");
|
|
367
|
+
if (!taskPlan)
|
|
368
|
+
continue;
|
|
369
|
+
const content = await loadFile(taskPlan);
|
|
370
|
+
if (content)
|
|
371
|
+
issues.push(...validateTaskPlanContent(taskPlan, content));
|
|
372
|
+
}
|
|
373
|
+
return issues;
|
|
374
|
+
}
|
|
375
|
+
export async function validateExecuteBoundary(basePath, milestoneId, sliceId, taskId) {
|
|
376
|
+
const issues = [];
|
|
377
|
+
const slicePlan = resolveSliceFile(basePath, milestoneId, sliceId, "PLAN");
|
|
378
|
+
if (slicePlan) {
|
|
379
|
+
const content = await loadFile(slicePlan);
|
|
380
|
+
if (content)
|
|
381
|
+
issues.push(...validateSlicePlanContent(slicePlan, content));
|
|
382
|
+
}
|
|
383
|
+
const taskPlan = resolveTaskFile(basePath, milestoneId, sliceId, taskId, "PLAN");
|
|
384
|
+
if (taskPlan) {
|
|
385
|
+
const content = await loadFile(taskPlan);
|
|
386
|
+
if (content)
|
|
387
|
+
issues.push(...validateTaskPlanContent(taskPlan, content));
|
|
388
|
+
}
|
|
389
|
+
return issues;
|
|
390
|
+
}
|
|
391
|
+
export async function validateCompleteBoundary(basePath, milestoneId, sliceId) {
|
|
392
|
+
const issues = [];
|
|
393
|
+
const tasksDir = resolveTasksDir(basePath, milestoneId, sliceId);
|
|
394
|
+
const taskSummaries = tasksDir ? resolveTaskFiles(tasksDir, "SUMMARY") : [];
|
|
395
|
+
for (const file of taskSummaries) {
|
|
396
|
+
const taskId = file.split("-")[0];
|
|
397
|
+
const taskSummary = resolveTaskFile(basePath, milestoneId, sliceId, taskId, "SUMMARY");
|
|
398
|
+
if (!taskSummary)
|
|
399
|
+
continue;
|
|
400
|
+
const content = await loadFile(taskSummary);
|
|
401
|
+
if (content)
|
|
402
|
+
issues.push(...validateTaskSummaryContent(taskSummary, content));
|
|
403
|
+
}
|
|
404
|
+
const sliceSummary = resolveSliceFile(basePath, milestoneId, sliceId, "SUMMARY");
|
|
405
|
+
if (sliceSummary) {
|
|
406
|
+
const content = await loadFile(sliceSummary);
|
|
407
|
+
if (content)
|
|
408
|
+
issues.push(...validateSliceSummaryContent(sliceSummary, content));
|
|
409
|
+
}
|
|
410
|
+
return issues;
|
|
411
|
+
}
|
|
412
|
+
export function formatValidationIssues(issues, limit = 4) {
|
|
413
|
+
if (issues.length === 0)
|
|
414
|
+
return "";
|
|
415
|
+
const lines = issues.slice(0, limit).map(issue => {
|
|
416
|
+
const fileName = issue.file.split("/").pop() || issue.file;
|
|
417
|
+
return `- ${fileName}: ${issue.message}`;
|
|
418
|
+
});
|
|
419
|
+
if (issues.length > limit)
|
|
420
|
+
lines.push(`- ...and ${issues.length - limit} more`);
|
|
421
|
+
return lines.join("\n");
|
|
422
|
+
}
|
|
@@ -7,19 +7,25 @@
|
|
|
7
7
|
import { existsSync, readdirSync } from "node:fs";
|
|
8
8
|
import { homedir } from "node:os";
|
|
9
9
|
import { isAbsolute, join } from "node:path";
|
|
10
|
-
import { getAgentDir } from "@gsd/pi-coding-agent";
|
|
11
10
|
import { statSync } from "node:fs";
|
|
12
11
|
import { validatePreferences } from "./preferences-validation.js";
|
|
13
12
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
14
13
|
/**
|
|
15
14
|
* Known skill directories, in priority order.
|
|
16
|
-
*
|
|
15
|
+
* Global skills (~/.agents/skills/) take precedence over project skills.
|
|
16
|
+
* Legacy ~/.gsd/agent/skills/ is included as a fallback for pre-migration installs.
|
|
17
17
|
*/
|
|
18
18
|
export function getSkillSearchDirs(cwd) {
|
|
19
|
-
|
|
20
|
-
{ dir: join(
|
|
21
|
-
{ dir: join(cwd, ".
|
|
19
|
+
const dirs = [
|
|
20
|
+
{ dir: join(homedir(), ".agents", "skills"), method: "user-skill" },
|
|
21
|
+
{ dir: join(cwd, ".agents", "skills"), method: "project-skill" },
|
|
22
22
|
];
|
|
23
|
+
// Legacy fallback — read skills from old GSD directory only if migration hasn't completed
|
|
24
|
+
const legacyDir = join(homedir(), ".gsd", "agent", "skills");
|
|
25
|
+
if (existsSync(legacyDir) && !existsSync(join(legacyDir, ".migrated-to-agents"))) {
|
|
26
|
+
dirs.push({ dir: legacyDir, method: "user-skill" });
|
|
27
|
+
}
|
|
28
|
+
return dirs;
|
|
23
29
|
}
|
|
24
30
|
/**
|
|
25
31
|
* Resolve a single skill reference to an absolute path.
|
|
@@ -65,15 +65,17 @@ export const KNOWN_PREFERENCE_KEYS = new Set([
|
|
|
65
65
|
"context_selection",
|
|
66
66
|
"widget_mode",
|
|
67
67
|
"reactive_execution",
|
|
68
|
+
"gate_evaluation",
|
|
68
69
|
"github",
|
|
69
70
|
"service_tier",
|
|
70
71
|
"forensics_dedup",
|
|
71
72
|
"show_token_cost",
|
|
73
|
+
"experimental",
|
|
72
74
|
]);
|
|
73
75
|
/** Canonical list of all dispatch unit types. */
|
|
74
76
|
export const KNOWN_UNIT_TYPES = [
|
|
75
77
|
"research-milestone", "plan-milestone", "research-slice", "plan-slice",
|
|
76
|
-
"execute-task", "reactive-execute", "complete-slice", "replan-slice", "reassess-roadmap",
|
|
78
|
+
"execute-task", "reactive-execute", "gate-evaluate", "complete-slice", "replan-slice", "reassess-roadmap",
|
|
77
79
|
"run-uat", "complete-milestone",
|
|
78
80
|
];
|
|
79
81
|
export const SKILL_ACTIONS = new Set(["use", "prefer", "avoid"]);
|
|
@@ -542,6 +542,45 @@ export function validatePreferences(preferences) {
|
|
|
542
542
|
errors.push("reactive_execution must be an object");
|
|
543
543
|
}
|
|
544
544
|
}
|
|
545
|
+
// ─── Gate Evaluation ─────────────────────────────────────────────────────
|
|
546
|
+
if (preferences.gate_evaluation !== undefined) {
|
|
547
|
+
if (typeof preferences.gate_evaluation === "object" && preferences.gate_evaluation !== null) {
|
|
548
|
+
const ge = preferences.gate_evaluation;
|
|
549
|
+
const validGe = {};
|
|
550
|
+
if (ge.enabled !== undefined) {
|
|
551
|
+
if (typeof ge.enabled === "boolean")
|
|
552
|
+
validGe.enabled = ge.enabled;
|
|
553
|
+
else
|
|
554
|
+
errors.push("gate_evaluation.enabled must be a boolean");
|
|
555
|
+
}
|
|
556
|
+
if (ge.slice_gates !== undefined) {
|
|
557
|
+
if (Array.isArray(ge.slice_gates) && ge.slice_gates.every((g) => typeof g === "string")) {
|
|
558
|
+
validGe.slice_gates = ge.slice_gates;
|
|
559
|
+
}
|
|
560
|
+
else {
|
|
561
|
+
errors.push("gate_evaluation.slice_gates must be an array of strings");
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
if (ge.task_gates !== undefined) {
|
|
565
|
+
if (typeof ge.task_gates === "boolean")
|
|
566
|
+
validGe.task_gates = ge.task_gates;
|
|
567
|
+
else
|
|
568
|
+
errors.push("gate_evaluation.task_gates must be a boolean");
|
|
569
|
+
}
|
|
570
|
+
const knownGeKeys = new Set(["enabled", "slice_gates", "task_gates"]);
|
|
571
|
+
for (const key of Object.keys(ge)) {
|
|
572
|
+
if (!knownGeKeys.has(key)) {
|
|
573
|
+
warnings.push(`unknown gate_evaluation key "${key}" — ignored`);
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
if (Object.keys(validGe).length > 0) {
|
|
577
|
+
validated.gate_evaluation = validGe;
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
else {
|
|
581
|
+
errors.push("gate_evaluation must be an object");
|
|
582
|
+
}
|
|
583
|
+
}
|
|
545
584
|
// ─── Verification Preferences ───────────────────────────────────────────
|
|
546
585
|
if (preferences.verification_commands !== undefined) {
|
|
547
586
|
if (Array.isArray(preferences.verification_commands)) {
|
|
@@ -784,5 +823,30 @@ export function validatePreferences(preferences) {
|
|
|
784
823
|
errors.push("show_token_cost must be a boolean");
|
|
785
824
|
}
|
|
786
825
|
}
|
|
826
|
+
// ─── Experimental Features ────────────────────────────────────────
|
|
827
|
+
if (preferences.experimental !== undefined) {
|
|
828
|
+
if (typeof preferences.experimental === "object" && preferences.experimental !== null) {
|
|
829
|
+
const exp = preferences.experimental;
|
|
830
|
+
const validExp = {};
|
|
831
|
+
if (exp.rtk !== undefined) {
|
|
832
|
+
if (typeof exp.rtk === "boolean")
|
|
833
|
+
validExp.rtk = exp.rtk;
|
|
834
|
+
else
|
|
835
|
+
errors.push("experimental.rtk must be a boolean");
|
|
836
|
+
}
|
|
837
|
+
const knownExpKeys = new Set(["rtk"]);
|
|
838
|
+
for (const key of Object.keys(exp)) {
|
|
839
|
+
if (!knownExpKeys.has(key)) {
|
|
840
|
+
warnings.push(`unknown experimental key "${key}" — ignored`);
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
if (Object.keys(validExp).length > 0) {
|
|
844
|
+
validated.experimental = validExp;
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
else {
|
|
848
|
+
errors.push("experimental must be an object");
|
|
849
|
+
}
|
|
850
|
+
}
|
|
787
851
|
return { preferences: validated, errors, warnings };
|
|
788
852
|
}
|
|
@@ -275,6 +275,9 @@ function mergePreferences(base, override) {
|
|
|
275
275
|
service_tier: override.service_tier ?? base.service_tier,
|
|
276
276
|
forensics_dedup: override.forensics_dedup ?? base.forensics_dedup,
|
|
277
277
|
show_token_cost: override.show_token_cost ?? base.show_token_cost,
|
|
278
|
+
experimental: (base.experimental || override.experimental)
|
|
279
|
+
? { ...(base.experimental ?? {}), ...(override.experimental ?? {}) }
|
|
280
|
+
: undefined,
|
|
278
281
|
};
|
|
279
282
|
}
|
|
280
283
|
function mergeStringLists(base, override) {
|
|
@@ -20,11 +20,13 @@ Then:
|
|
|
20
20
|
3. **Verify code changes exist.** Run `git diff --stat HEAD $(git merge-base HEAD main) -- ':!.gsd/'` (or the equivalent for the integration branch). If no non-`.gsd/` files appear in the diff, the milestone produced only planning artifacts and no actual code. Record this as a **verification failure**.
|
|
21
21
|
4. Verify each **success criterion** from the milestone definition in `{{roadmapPath}}`. For each criterion, confirm it was met with specific evidence from slice summaries, test results, or observable behavior. Record any criterion that was NOT met as a **verification failure**.
|
|
22
22
|
5. Verify the milestone's **definition of done** — all slices are `[x]`, all slice summaries exist, and any cross-slice integration points work correctly. Record any unmet items as a **verification failure**.
|
|
23
|
-
6.
|
|
23
|
+
6. If the roadmap includes a **Horizontal Checklist**, verify each item was addressed during the milestone. Note unchecked items in the milestone summary.
|
|
24
|
+
7. Fill the **Decision Re-evaluation** table in the milestone summary. For each key decision from `.gsd/DECISIONS.md` made during this milestone, evaluate whether it is still valid given what was actually built. Flag decisions that should be revisited next milestone.
|
|
25
|
+
8. Validate **requirement status transitions**. For each requirement that changed status during this milestone, confirm the transition is supported by evidence. Requirements can move between Active, Validated, Deferred, Blocked, or Out of Scope — but only with proof.
|
|
24
26
|
|
|
25
27
|
### Verification Gate — STOP if verification failed
|
|
26
28
|
|
|
27
|
-
**If ANY verification failure was recorded in steps 3, 4, or 5, you MUST follow the failure path below. Do NOT proceed to step
|
|
29
|
+
**If ANY verification failure was recorded in steps 3, 4, or 5, you MUST follow the failure path below. Do NOT proceed to step 9.**
|
|
28
30
|
|
|
29
31
|
**Failure path** (verification failed):
|
|
30
32
|
- Do NOT call `gsd_complete_milestone` — the milestone must not be marked as complete.
|
|
@@ -33,13 +35,30 @@ Then:
|
|
|
33
35
|
- Write a clear summary of what failed and why to help the next attempt.
|
|
34
36
|
- Say: "Milestone {{milestoneId}} verification FAILED — not complete." and stop.
|
|
35
37
|
|
|
36
|
-
**Success path** (all verifications passed — continue with steps
|
|
38
|
+
**Success path** (all verifications passed — continue with steps 9–13):
|
|
37
39
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
9. **Persist completion through `gsd_complete_milestone`.** Call it with the parameters below. The tool updates the milestone status in the DB, renders `{{milestoneSummaryPath}}`, and validates all slices are complete before proceeding.
|
|
41
|
+
|
|
42
|
+
**Required parameters:**
|
|
43
|
+
- `milestoneId` (string) — Milestone ID (e.g. M001)
|
|
44
|
+
- `title` (string) — Milestone title
|
|
45
|
+
- `oneLiner` (string) — One-sentence summary of what the milestone achieved
|
|
46
|
+
- `narrative` (string) — Detailed narrative of what happened during the milestone
|
|
47
|
+
- `successCriteriaResults` (string) — Markdown detailing how each success criterion was met or not met
|
|
48
|
+
- `definitionOfDoneResults` (string) — Markdown detailing how each definition-of-done item was met
|
|
49
|
+
- `requirementOutcomes` (string) — Markdown detailing requirement status transitions with evidence
|
|
50
|
+
- `keyDecisions` (array of strings) — Key architectural/pattern decisions made during the milestone
|
|
51
|
+
- `keyFiles` (array of strings) — Key files created or modified during the milestone
|
|
52
|
+
- `lessonsLearned` (array of strings) — Lessons learned during the milestone
|
|
53
|
+
- `verificationPassed` (boolean) — Must be `true` — confirms that code change verification, success criteria, and definition of done checks all passed before completion
|
|
54
|
+
|
|
55
|
+
**Optional parameters:**
|
|
56
|
+
- `followUps` (string) — Follow-up items for future milestones
|
|
57
|
+
- `deviations` (string) — Deviations from the original plan
|
|
58
|
+
10. For each requirement whose status changed in step 8, call `gsd_requirement_update` with the requirement ID and updated `status` and `validation` fields — the tool regenerates `.gsd/REQUIREMENTS.md` automatically.
|
|
59
|
+
11. Update `.gsd/PROJECT.md` to reflect milestone completion and current project state.
|
|
60
|
+
12. Review all slice summaries for cross-cutting lessons, patterns, or gotchas that emerged during this milestone. Append any non-obvious, reusable insights to `.gsd/KNOWLEDGE.md`.
|
|
61
|
+
13. Do not commit manually — the system auto-commits your changes after this unit completes.
|
|
43
62
|
- Say: "Milestone {{milestoneId}} complete."
|
|
44
63
|
|
|
45
64
|
**Important:** Do NOT skip the code change verification, success criteria, or definition of done verification (steps 3-5). The milestone summary must reflect actual verified outcomes, not assumed success. Verification failures BLOCK completion — there is no override. The milestone stays in its current state until issues are resolved and verification is re-run.
|
|
@@ -23,14 +23,15 @@ Then:
|
|
|
23
23
|
2. {{skillActivation}}
|
|
24
24
|
3. Run all slice-level verification checks defined in the slice plan. All must pass before marking the slice done. If any fail, fix them first.
|
|
25
25
|
4. If the slice plan includes observability/diagnostic surfaces, confirm they work. Skip this for simple slices that don't have observability sections.
|
|
26
|
-
5. If
|
|
27
|
-
6.
|
|
28
|
-
7. Write `{{
|
|
29
|
-
8.
|
|
30
|
-
9. Review task summaries for
|
|
31
|
-
10.
|
|
32
|
-
11. Do
|
|
33
|
-
12.
|
|
26
|
+
5. If the slice involved runtime behavior, fill the **Operational Readiness** section (Q8) in the slice summary: health signal, failure signal, recovery procedure, and monitoring gaps. Omit entirely for simple slices with no runtime concerns.
|
|
27
|
+
6. If this slice produced evidence that a requirement changed status (Active → Validated, Active → Deferred, etc.), call `gsd_save_decision` with scope="requirement", decision="{requirement-id}", choice="{new-status}", rationale="{evidence}". Do NOT write `.gsd/REQUIREMENTS.md` directly — the engine renders it from the database.
|
|
28
|
+
7. Write `{{sliceSummaryPath}}` (compress all task summaries).
|
|
29
|
+
8. Write `{{sliceUatPath}}` — a concrete UAT script with real test cases derived from the slice plan and task summaries. Include preconditions, numbered steps with expected outcomes, and edge cases. This must NOT be a placeholder or generic template — tailor every test case to what this slice actually built.
|
|
30
|
+
9. Review task summaries for `key_decisions`. Append any significant decisions to `.gsd/DECISIONS.md` if missing.
|
|
31
|
+
10. Review task summaries for patterns, gotchas, or non-obvious lessons learned. If any would save future agents from repeating investigation or hitting the same issues, append them to `.gsd/KNOWLEDGE.md`. Only add entries that are genuinely useful — don't pad with obvious observations.
|
|
32
|
+
11. Call `gsd_complete_slice` with milestone_id, slice_id, the slice summary, and the UAT result. Do NOT manually mark the roadmap checkbox — the tool writes to the DB and renders the ROADMAP.md projection automatically.
|
|
33
|
+
12. Do not run git commands — the system commits your changes and handles any merge after this unit succeeds.
|
|
34
|
+
13. Update `.gsd/PROJECT.md` if it exists — refresh current state if needed.
|
|
34
35
|
|
|
35
36
|
**You MUST call `gsd_complete_slice` with the slice summary and UAT content before finishing. The tool persists to both DB and disk and renders `{{sliceSummaryPath}}` and `{{sliceUatPath}}` automatically.**
|
|
36
37
|
|