gsd-pi 2.50.0 → 2.51.0-dev.ae8f7cb
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/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/phases.js +16 -1
- package/dist/resources/extensions/gsd/auto/session.js +5 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +22 -3
- package/dist/resources/extensions/gsd/auto-dispatch.js +81 -54
- package/dist/resources/extensions/gsd/auto-observability.js +54 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +37 -76
- package/dist/resources/extensions/gsd/auto-prompts.js +57 -0
- package/dist/resources/extensions/gsd/auto-recovery.js +21 -25
- package/dist/resources/extensions/gsd/auto-utils.js +20 -0
- package/dist/resources/extensions/gsd/auto.js +15 -5
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +16 -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/files.js +5 -1
- 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/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 +1 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +25 -0
- package/dist/resources/extensions/gsd/preferences.js +3 -0
- package/dist/resources/extensions/gsd/prompts/forensics.md +11 -7
- 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/roadmap-mutations.js +110 -0
- 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 +7 -3
- 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 +17 -5
- package/dist/resources/extensions/gsd/templates/milestone-validation.md +12 -0
- package/dist/resources/extensions/gsd/templates/preferences.md +2 -0
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +28 -9
- package/dist/resources/extensions/gsd/undo.js +8 -7
- package/dist/resources/extensions/gsd/unit-runtime.js +2 -1
- package/dist/resources/extensions/gsd/verification-gate.js +3 -1
- package/dist/resources/extensions/shared/rtk-session-stats.js +189 -0
- package/dist/resources/extensions/shared/rtk.js +100 -0
- 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 +12 -11
- 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 +12 -11
- 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/5_KeZz1X0tXJK-d_4OhjB/_buildManifest.js +1 -0
- 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/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-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/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/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/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 +6 -4
- 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/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/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/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 +6 -4
- 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/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/phases.ts +15 -1
- package/src/resources/extensions/gsd/auto/session.ts +6 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +31 -3
- package/src/resources/extensions/gsd/auto-dispatch.ts +84 -51
- package/src/resources/extensions/gsd/auto-observability.ts +72 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +56 -83
- package/src/resources/extensions/gsd/auto-prompts.ts +48 -0
- package/src/resources/extensions/gsd/auto-recovery.ts +19 -26
- package/src/resources/extensions/gsd/auto-utils.ts +25 -0
- package/src/resources/extensions/gsd/auto.ts +15 -5
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +17 -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/files.ts +6 -1
- 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/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 +20 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +26 -0
- package/src/resources/extensions/gsd/preferences.ts +3 -0
- package/src/resources/extensions/gsd/prompts/forensics.md +11 -7
- 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/roadmap-mutations.ts +134 -0
- 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 +7 -3
- 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 +16 -5
- package/src/resources/extensions/gsd/templates/milestone-validation.md +12 -0
- package/src/resources/extensions/gsd/templates/preferences.md +2 -0
- 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 +68 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +2 -2
- 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/double-merge-guard.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +63 -0
- 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/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/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/run-uat.test.ts +146 -0
- package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +12 -12
- 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/triage-dispatch.test.ts +2 -2
- package/src/resources/extensions/gsd/types.ts +2 -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/verification-gate.ts +3 -1
- package/src/resources/extensions/shared/rtk-session-stats.ts +249 -0
- package/src/resources/extensions/shared/rtk.ts +120 -0
- 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/MQOhBnkC_TLtNn_JvZWDj/_buildManifest.js +0 -1
- package/dist/web/standalone/.next/static/chunks/4024.7c75ac378de0f2b5.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-2473ce2c3879fff4.js +0 -1
- package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +0 -1
- package/packages/pi-ai/pnpm-lock.yaml +0 -2022
- package/packages/pi-coding-agent/pnpm-lock.yaml +0 -454
- /package/dist/web/standalone/.next/static/{MQOhBnkC_TLtNn_JvZWDj → 5_KeZz1X0tXJK-d_4OhjB}/_ssgManifest.js +0 -0
|
@@ -9,8 +9,9 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
11
11
|
import { join } from "node:path";
|
|
12
|
-
import {
|
|
13
|
-
|
|
12
|
+
import { homedir } from "node:os";
|
|
13
|
+
/** Industry-standard skills.sh global skills directory */
|
|
14
|
+
const SKILLS_DIR = join(homedir(), ".agents", "skills");
|
|
14
15
|
/** Snapshot of skill names at auto-mode start */
|
|
15
16
|
let baselineSkills = null;
|
|
16
17
|
/**
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import { existsSync } from "node:fs";
|
|
16
16
|
import { join } from "node:path";
|
|
17
|
-
import {
|
|
17
|
+
import { homedir } from "node:os";
|
|
18
18
|
import { formatCost, formatTokenCount, loadLedgerFromDisk } from "./metrics.js";
|
|
19
19
|
import { detectStaleSkills } from "./skill-telemetry.js";
|
|
20
20
|
// ─── Constants ────────────────────────────────────────────────────────────────
|
|
@@ -141,7 +141,7 @@ export function formatSkillDetail(basePath, skillName) {
|
|
|
141
141
|
lines.push(` ${date} ${u.id.padEnd(20)} ${formatTokenCount(u.tokens.total).padStart(8)} tokens ${formatCost(u.cost)}`);
|
|
142
142
|
}
|
|
143
143
|
// Check for SKILL.md existence
|
|
144
|
-
const skillPath = join(
|
|
144
|
+
const skillPath = join(homedir(), ".agents", "skills", skillName, "SKILL.md");
|
|
145
145
|
if (existsSync(skillPath)) {
|
|
146
146
|
const stat = require("node:fs").statSync(skillPath);
|
|
147
147
|
lines.push("");
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import { existsSync, readdirSync } from "node:fs";
|
|
14
14
|
import { join } from "node:path";
|
|
15
|
-
import {
|
|
15
|
+
import { homedir } from "node:os";
|
|
16
16
|
// ─── In-memory state ──────────────────────────────────────────────────────────
|
|
17
17
|
/** Skills available in the system prompt for the current unit */
|
|
18
18
|
let availableSkills = [];
|
|
@@ -24,8 +24,14 @@ const activelyLoadedSkills = new Set();
|
|
|
24
24
|
* Called before each unit starts.
|
|
25
25
|
*/
|
|
26
26
|
export function captureAvailableSkills() {
|
|
27
|
-
const skillsDir = join(
|
|
28
|
-
|
|
27
|
+
const skillsDir = join(homedir(), ".agents", "skills");
|
|
28
|
+
const legacyDir = join(homedir(), ".gsd", "agent", "skills");
|
|
29
|
+
const names = listSkillNames(skillsDir);
|
|
30
|
+
// Include skills still in the legacy directory only if migration hasn't completed
|
|
31
|
+
const legacyMigrated = existsSync(join(legacyDir, ".migrated-to-agents"));
|
|
32
|
+
const legacyNames = legacyMigrated ? [] : listSkillNames(legacyDir);
|
|
33
|
+
const all = new Set([...names, ...legacyNames]);
|
|
34
|
+
availableSkills = [...all];
|
|
29
35
|
activelyLoadedSkills.clear();
|
|
30
36
|
}
|
|
31
37
|
/**
|
|
@@ -85,8 +91,12 @@ export function detectStaleSkills(units, thresholdDays) {
|
|
|
85
91
|
const cutoff = Date.now() - (thresholdDays * 24 * 60 * 60 * 1000);
|
|
86
92
|
const stale = [];
|
|
87
93
|
// Check all installed skills, not just those with usage data
|
|
88
|
-
const skillsDir = join(
|
|
89
|
-
const
|
|
94
|
+
const skillsDir = join(homedir(), ".agents", "skills");
|
|
95
|
+
const legacyDir = join(homedir(), ".gsd", "agent", "skills");
|
|
96
|
+
const legacyMigrated = existsSync(join(legacyDir, ".migrated-to-agents"));
|
|
97
|
+
const legacyNames = legacyMigrated ? [] : listSkillNames(legacyDir);
|
|
98
|
+
const installedSet = new Set([...listSkillNames(skillsDir), ...legacyNames]);
|
|
99
|
+
const installed = [...installedSet];
|
|
90
100
|
for (const skill of installed) {
|
|
91
101
|
const lastTs = lastUsed.get(skill);
|
|
92
102
|
if (lastTs === undefined || lastTs < cutoff) {
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
import { parseRoadmap, parsePlan, } from './parsers-legacy.js';
|
|
5
5
|
import { parseSummary, loadFile, parseRequirementCounts, parseContextDependsOn, } from './files.js';
|
|
6
6
|
import { resolveMilestoneFile, resolveSlicePath, resolveSliceFile, resolveTaskFile, resolveTasksDir, resolveGsdRootFile, gsdRoot, } from './paths.js';
|
|
7
|
-
import {
|
|
7
|
+
import { findMilestoneIds } from './milestone-ids.js';
|
|
8
|
+
import { loadQueueOrder, sortByQueueOrder } from './queue-order.js';
|
|
8
9
|
import { nativeBatchParseGsdFiles } from './native-parser-bridge.js';
|
|
9
10
|
import { join, resolve } from 'path';
|
|
10
11
|
import { existsSync, readdirSync } from 'node:fs';
|
|
@@ -84,8 +85,14 @@ export async function getActiveMilestoneId(basePath) {
|
|
|
84
85
|
if (isDbAvailable()) {
|
|
85
86
|
const allMilestones = getAllMilestones();
|
|
86
87
|
if (allMilestones.length > 0) {
|
|
87
|
-
|
|
88
|
-
|
|
88
|
+
// Respect queue-order.json so /gsd queue reordering is honored (#2556).
|
|
89
|
+
// Without this, the DB path uses lexicographic sort while the dispatch
|
|
90
|
+
// guard uses queue order — causing a deadlock.
|
|
91
|
+
const customOrder = loadQueueOrder(basePath);
|
|
92
|
+
const sortedIds = sortByQueueOrder(allMilestones.map(m => m.id), customOrder);
|
|
93
|
+
const byId = new Map(allMilestones.map(m => [m.id, m]));
|
|
94
|
+
for (const id of sortedIds) {
|
|
95
|
+
const m = byId.get(id);
|
|
89
96
|
if (m.status === "complete" || m.status === "done" || m.status === "parked")
|
|
90
97
|
continue;
|
|
91
98
|
return m.id;
|
|
@@ -233,8 +240,13 @@ export async function deriveStateFromDb(basePath) {
|
|
|
233
240
|
});
|
|
234
241
|
}
|
|
235
242
|
}
|
|
236
|
-
// Re-sort so milestones
|
|
237
|
-
|
|
243
|
+
// Re-sort so milestones follow queue order (same as dispatch guard) (#2556)
|
|
244
|
+
const customOrder = loadQueueOrder(basePath);
|
|
245
|
+
const sortedIds = sortByQueueOrder(allMilestones.map(m => m.id), customOrder);
|
|
246
|
+
const byId = new Map(allMilestones.map(m => [m.id, m]));
|
|
247
|
+
allMilestones.length = 0;
|
|
248
|
+
for (const id of sortedIds)
|
|
249
|
+
allMilestones.push(byId.get(id));
|
|
238
250
|
// Parallel worker isolation: when locked, filter to just the locked milestone
|
|
239
251
|
const milestoneLock = process.env.GSD_MILESTONE_LOCK;
|
|
240
252
|
const milestones = milestoneLock
|
|
@@ -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.
|
|
@@ -7,17 +7,28 @@ const require = createRequire(import.meta.url);
|
|
|
7
7
|
const ROOT = new URL("../../../../../", import.meta.url);
|
|
8
8
|
|
|
9
9
|
export function resolve(specifier, context, nextResolve) {
|
|
10
|
-
// 1.
|
|
10
|
+
// 1. Redirect all workspace package bare imports to source.
|
|
11
|
+
// CI portability runs don't build any packages/ dist artifacts, so every
|
|
12
|
+
// @gsd/* specifier (including transitive ones pulled in by pi-coding-agent
|
|
13
|
+
// source itself) must resolve to the TypeScript source entrypoint.
|
|
11
14
|
if (specifier === "../../packages/pi-coding-agent/src/index.js") {
|
|
12
|
-
specifier = new URL("packages/pi-coding-agent/
|
|
15
|
+
specifier = new URL("packages/pi-coding-agent/src/index.ts", ROOT).href;
|
|
16
|
+
} else if (specifier === "@gsd/pi-coding-agent") {
|
|
17
|
+
specifier = new URL("packages/pi-coding-agent/src/index.ts", ROOT).href;
|
|
13
18
|
} else if (specifier === "@gsd/pi-ai/oauth") {
|
|
14
|
-
specifier = new URL("packages/pi-ai/
|
|
19
|
+
specifier = new URL("packages/pi-ai/src/utils/oauth/index.ts", ROOT).href;
|
|
15
20
|
} else if (specifier === "@gsd/pi-ai") {
|
|
16
|
-
specifier = new URL("packages/pi-ai/
|
|
21
|
+
specifier = new URL("packages/pi-ai/src/index.ts", ROOT).href;
|
|
17
22
|
} else if (specifier === "@gsd/pi-agent-core") {
|
|
18
|
-
specifier = new URL("packages/pi-agent-core/
|
|
23
|
+
specifier = new URL("packages/pi-agent-core/src/index.ts", ROOT).href;
|
|
19
24
|
} else if (specifier === "@gsd/pi-tui") {
|
|
20
|
-
specifier = new URL("packages/pi-tui/
|
|
25
|
+
specifier = new URL("packages/pi-tui/src/index.ts", ROOT).href;
|
|
26
|
+
} else if (specifier === "@gsd/native") {
|
|
27
|
+
specifier = new URL("packages/native/src/index.ts", ROOT).href;
|
|
28
|
+
} else if (specifier.startsWith("@gsd/native/")) {
|
|
29
|
+
// Sub-path imports like @gsd/native/fd, @gsd/native/text, etc.
|
|
30
|
+
const subpath = specifier.slice("@gsd/native/".length);
|
|
31
|
+
specifier = new URL(`packages/native/src/${subpath}/index.ts`, ROOT).href;
|
|
21
32
|
}
|
|
22
33
|
// 2. Redirect packages/*/dist/ → packages/*/src/ with .js→.ts for strip-types
|
|
23
34
|
// Also handles local imports — skip rewrite for dist/ paths that are real compiled artifacts.
|
|
@@ -54,9 +65,15 @@ export function resolve(specifier, context, nextResolve) {
|
|
|
54
65
|
}
|
|
55
66
|
|
|
56
67
|
export function load(url, context, nextLoad) {
|
|
57
|
-
// Node's --experimental-strip-types handles .ts but not .tsx
|
|
58
|
-
//
|
|
59
|
-
|
|
68
|
+
// Node's --experimental-strip-types handles plain .ts but not .tsx and not
|
|
69
|
+
// all TypeScript syntax used by workspace packages (parameter properties,
|
|
70
|
+
// decorators, etc.). Transpile all workspace package source files and .tsx
|
|
71
|
+
// files through TypeScript's transpileModule to avoid those crashes.
|
|
72
|
+
const shouldTranspileWithTypeScript =
|
|
73
|
+
url.endsWith('.tsx') ||
|
|
74
|
+
(url.endsWith('.ts') && url.includes('/packages/') && url.includes('/src/'));
|
|
75
|
+
|
|
76
|
+
if (shouldTranspileWithTypeScript) {
|
|
60
77
|
const ts = require('typescript');
|
|
61
78
|
const source = readFileSync(fileURLToPath(url), 'utf-8');
|
|
62
79
|
const { outputText } = ts.transpileModule(source, {
|
|
@@ -66,6 +83,8 @@ export function load(url, context, nextLoad) {
|
|
|
66
83
|
module: ts.ModuleKind.ESNext,
|
|
67
84
|
target: ts.ScriptTarget.ESNext,
|
|
68
85
|
esModuleInterop: true,
|
|
86
|
+
experimentalDecorators: true,
|
|
87
|
+
emitDecoratorMetadata: true,
|
|
69
88
|
},
|
|
70
89
|
});
|
|
71
90
|
return { format: 'module', source: outputText, shortCircuit: true };
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { existsSync, readFileSync, writeFileSync, unlinkSync, readdirSync } from "node:fs";
|
|
6
6
|
import { join } from "node:path";
|
|
7
7
|
import { nativeRevertCommit, nativeRevertAbort } from "./native-git-bridge.js";
|
|
8
|
+
import { parseUnitId } from "./unit-id.js";
|
|
8
9
|
import { deriveState } from "./state.js";
|
|
9
10
|
import { invalidateAllCaches } from "./cache.js";
|
|
10
11
|
import { gsdRoot, resolveTasksDir, resolveSlicePath, resolveTaskFile, buildTaskFileName, buildSliceFileName } from "./paths.js";
|
|
@@ -52,11 +53,11 @@ export async function handleUndo(args, ctx, _pi, basePath) {
|
|
|
52
53
|
return;
|
|
53
54
|
}
|
|
54
55
|
// 1. Delete summary artifact
|
|
55
|
-
const
|
|
56
|
+
const { milestone, slice, task } = parseUnitId(unitId);
|
|
56
57
|
let summaryRemoved = false;
|
|
57
|
-
if (
|
|
58
|
+
if (task !== undefined && slice !== undefined) {
|
|
58
59
|
// Task-level: M001/S01/T01
|
|
59
|
-
const [mid, sid, tid] =
|
|
60
|
+
const [mid, sid, tid] = [milestone, slice, task];
|
|
60
61
|
const tasksDir = resolveTasksDir(basePath, mid, sid);
|
|
61
62
|
if (tasksDir) {
|
|
62
63
|
const summaryFile = join(tasksDir, buildTaskFileName(tid, "SUMMARY"));
|
|
@@ -66,9 +67,9 @@ export async function handleUndo(args, ctx, _pi, basePath) {
|
|
|
66
67
|
}
|
|
67
68
|
}
|
|
68
69
|
}
|
|
69
|
-
else if (
|
|
70
|
+
else if (slice !== undefined) {
|
|
70
71
|
// Slice-level: M001/S01
|
|
71
|
-
const [mid, sid] =
|
|
72
|
+
const [mid, sid] = [milestone, slice];
|
|
72
73
|
const slicePath = resolveSlicePath(basePath, mid, sid);
|
|
73
74
|
if (slicePath) {
|
|
74
75
|
for (const suffix of ["SUMMARY", "COMPLETE"]) {
|
|
@@ -82,8 +83,8 @@ export async function handleUndo(args, ctx, _pi, basePath) {
|
|
|
82
83
|
}
|
|
83
84
|
// 2. Uncheck task in PLAN if execute-task
|
|
84
85
|
let planUpdated = false;
|
|
85
|
-
if (unitType === "execute-task" &&
|
|
86
|
-
const [mid, sid, tid] =
|
|
86
|
+
if (unitType === "execute-task" && task !== undefined && slice !== undefined) {
|
|
87
|
+
const [mid, sid, tid] = [milestone, slice, task];
|
|
87
88
|
planUpdated = uncheckTaskInPlan(basePath, mid, sid, tid);
|
|
88
89
|
}
|
|
89
90
|
// 3. Try to revert git commits from activity log
|
|
@@ -2,6 +2,7 @@ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, unlink
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { gsdRoot, relSliceFile, relTaskFile, resolveSliceFile, resolveTaskFile, } from "./paths.js";
|
|
4
4
|
import { loadFile, parseTaskPlanMustHaves, countMustHavesMentionedInSummary } from "./files.js";
|
|
5
|
+
import { parseUnitId } from "./unit-id.js";
|
|
5
6
|
function runtimeDir(basePath) {
|
|
6
7
|
return join(gsdRoot(basePath), "runtime", "units");
|
|
7
8
|
}
|
|
@@ -75,7 +76,7 @@ export function listUnitRuntimeRecords(basePath) {
|
|
|
75
76
|
return results;
|
|
76
77
|
}
|
|
77
78
|
export async function inspectExecuteTaskDurability(basePath, unitId) {
|
|
78
|
-
const
|
|
79
|
+
const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
|
|
79
80
|
if (!mid || !sid || !tid)
|
|
80
81
|
return null;
|
|
81
82
|
const planAbs = resolveSliceFile(basePath, mid, sid, "PLAN");
|
|
@@ -6,6 +6,7 @@ import { spawnSync } from "node:child_process";
|
|
|
6
6
|
import { existsSync, readFileSync } from "node:fs";
|
|
7
7
|
import { join, basename } from "node:path";
|
|
8
8
|
import { DEFAULT_COMMAND_TIMEOUT_MS } from "./constants.js";
|
|
9
|
+
import { rewriteCommandWithRtk } from "../shared/rtk.js";
|
|
9
10
|
/** Maximum bytes of stdout/stderr to retain per command (10 KB). */
|
|
10
11
|
const MAX_OUTPUT_BYTES = 10 * 1024;
|
|
11
12
|
/** Truncate a string to maxBytes, appending a marker if truncated. */
|
|
@@ -210,10 +211,11 @@ export function runVerificationGate(options) {
|
|
|
210
211
|
const checks = [];
|
|
211
212
|
for (const command of commands) {
|
|
212
213
|
const start = Date.now();
|
|
214
|
+
const rewrittenCommand = rewriteCommandWithRtk(command);
|
|
213
215
|
// Pass the command string as an argument to the shell explicitly
|
|
214
216
|
// to avoid Node.js DEP0190 (spawnSync with shell: true and no args).
|
|
215
217
|
const shellBin = process.platform === "win32" ? "cmd" : "sh";
|
|
216
|
-
const shellArgs = process.platform === "win32" ? ["/c",
|
|
218
|
+
const shellArgs = process.platform === "win32" ? ["/c", rewrittenCommand] : ["-c", rewrittenCommand];
|
|
217
219
|
const result = spawnSync(shellBin, shellArgs, {
|
|
218
220
|
cwd: options.cwd,
|
|
219
221
|
stdio: "pipe",
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { gsdRoot } from "../gsd/paths.js";
|
|
5
|
+
import { formatTokenCount } from "./format-utils.js";
|
|
6
|
+
import { buildRtkEnv, isRtkEnabled, resolveRtkBinaryPath } from "./rtk.js";
|
|
7
|
+
const SESSION_BASELINES_FILE = "rtk-session-baselines.json";
|
|
8
|
+
const CURRENT_SUMMARY_TTL_MS = 15_000;
|
|
9
|
+
const CURRENT_SUMMARY_TIMEOUT_MS = 5_000;
|
|
10
|
+
const MAX_BASELINE_SESSIONS = 200;
|
|
11
|
+
let cachedSummary = null;
|
|
12
|
+
function getRuntimeDir(basePath) {
|
|
13
|
+
return join(gsdRoot(basePath), "runtime");
|
|
14
|
+
}
|
|
15
|
+
function getBaselinesPath(basePath) {
|
|
16
|
+
return join(getRuntimeDir(basePath), SESSION_BASELINES_FILE);
|
|
17
|
+
}
|
|
18
|
+
function defaultStore() {
|
|
19
|
+
return { version: 1, sessions: {} };
|
|
20
|
+
}
|
|
21
|
+
function loadBaselineStore(basePath) {
|
|
22
|
+
const path = getBaselinesPath(basePath);
|
|
23
|
+
if (!existsSync(path))
|
|
24
|
+
return defaultStore();
|
|
25
|
+
try {
|
|
26
|
+
const parsed = JSON.parse(readFileSync(path, "utf-8"));
|
|
27
|
+
if (parsed.version !== 1 || typeof parsed.sessions !== "object" || parsed.sessions === null) {
|
|
28
|
+
return defaultStore();
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
version: 1,
|
|
32
|
+
sessions: parsed.sessions,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return defaultStore();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function saveBaselineStore(basePath, store) {
|
|
40
|
+
const runtimeDir = getRuntimeDir(basePath);
|
|
41
|
+
mkdirSync(runtimeDir, { recursive: true });
|
|
42
|
+
const entries = Object.entries(store.sessions)
|
|
43
|
+
.sort((left, right) => right[1].updatedAt.localeCompare(left[1].updatedAt))
|
|
44
|
+
.slice(0, MAX_BASELINE_SESSIONS);
|
|
45
|
+
const normalized = {
|
|
46
|
+
version: 1,
|
|
47
|
+
sessions: Object.fromEntries(entries),
|
|
48
|
+
};
|
|
49
|
+
writeFileSync(getBaselinesPath(basePath), JSON.stringify(normalized, null, 2), "utf-8");
|
|
50
|
+
}
|
|
51
|
+
function normalizeSummary(raw) {
|
|
52
|
+
if (!raw || typeof raw !== "object")
|
|
53
|
+
return null;
|
|
54
|
+
const summary = raw;
|
|
55
|
+
return {
|
|
56
|
+
totalCommands: Number(summary.total_commands ?? 0),
|
|
57
|
+
totalInput: Number(summary.total_input ?? 0),
|
|
58
|
+
totalOutput: Number(summary.total_output ?? 0),
|
|
59
|
+
totalSaved: Number(summary.total_saved ?? 0),
|
|
60
|
+
avgSavingsPct: Number(summary.avg_savings_pct ?? 0),
|
|
61
|
+
totalTimeMs: Number(summary.total_time_ms ?? 0),
|
|
62
|
+
avgTimeMs: Number(summary.avg_time_ms ?? 0),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export function readCurrentRtkGainSummary(env = process.env) {
|
|
66
|
+
if (!isRtkEnabled(env))
|
|
67
|
+
return null;
|
|
68
|
+
const binaryPath = resolveRtkBinaryPath({ env });
|
|
69
|
+
if (!binaryPath)
|
|
70
|
+
return null;
|
|
71
|
+
if (cachedSummary &&
|
|
72
|
+
cachedSummary.binaryPath === binaryPath &&
|
|
73
|
+
Date.now() - cachedSummary.at < CURRENT_SUMMARY_TTL_MS) {
|
|
74
|
+
return cachedSummary.summary;
|
|
75
|
+
}
|
|
76
|
+
const result = spawnSync(binaryPath, ["gain", "--all", "--format", "json"], {
|
|
77
|
+
encoding: "utf-8",
|
|
78
|
+
env: buildRtkEnv(env),
|
|
79
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
80
|
+
timeout: CURRENT_SUMMARY_TIMEOUT_MS,
|
|
81
|
+
// .cmd/.bat wrappers (used by fake-rtk in tests) require shell:true on Windows
|
|
82
|
+
shell: /\.(cmd|bat)$/i.test(binaryPath),
|
|
83
|
+
});
|
|
84
|
+
if (result.error || result.status !== 0) {
|
|
85
|
+
cachedSummary = { at: Date.now(), binaryPath, summary: null };
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
const parsed = JSON.parse(result.stdout ?? "{}");
|
|
90
|
+
const summary = normalizeSummary(parsed.summary ?? null);
|
|
91
|
+
cachedSummary = { at: Date.now(), binaryPath, summary };
|
|
92
|
+
return summary;
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
cachedSummary = { at: Date.now(), binaryPath, summary: null };
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function computeSavingsDelta(current, baseline) {
|
|
100
|
+
const commands = Math.max(0, current.totalCommands - baseline.totalCommands);
|
|
101
|
+
const inputTokens = Math.max(0, current.totalInput - baseline.totalInput);
|
|
102
|
+
const outputTokens = Math.max(0, current.totalOutput - baseline.totalOutput);
|
|
103
|
+
const savedTokens = Math.max(0, current.totalSaved - baseline.totalSaved);
|
|
104
|
+
const totalTimeMs = Math.max(0, current.totalTimeMs - baseline.totalTimeMs);
|
|
105
|
+
const avgTimeMs = commands > 0 ? Math.round(totalTimeMs / commands) : 0;
|
|
106
|
+
const savingsPct = inputTokens > 0 ? (savedTokens / inputTokens) * 100 : 0;
|
|
107
|
+
return {
|
|
108
|
+
commands,
|
|
109
|
+
inputTokens,
|
|
110
|
+
outputTokens,
|
|
111
|
+
savedTokens,
|
|
112
|
+
savingsPct,
|
|
113
|
+
totalTimeMs,
|
|
114
|
+
avgTimeMs,
|
|
115
|
+
updatedAt: new Date().toISOString(),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
export function ensureRtkSessionBaseline(basePath, sessionId, env = process.env) {
|
|
119
|
+
if (!sessionId)
|
|
120
|
+
return null;
|
|
121
|
+
const current = readCurrentRtkGainSummary(env);
|
|
122
|
+
if (!current)
|
|
123
|
+
return null;
|
|
124
|
+
const store = loadBaselineStore(basePath);
|
|
125
|
+
const existing = store.sessions[sessionId];
|
|
126
|
+
if (existing)
|
|
127
|
+
return existing.summary;
|
|
128
|
+
const now = new Date().toISOString();
|
|
129
|
+
store.sessions[sessionId] = {
|
|
130
|
+
summary: current,
|
|
131
|
+
createdAt: now,
|
|
132
|
+
updatedAt: now,
|
|
133
|
+
};
|
|
134
|
+
saveBaselineStore(basePath, store);
|
|
135
|
+
return current;
|
|
136
|
+
}
|
|
137
|
+
export function getRtkSessionSavings(basePath, sessionId, env = process.env) {
|
|
138
|
+
if (!sessionId)
|
|
139
|
+
return null;
|
|
140
|
+
const current = readCurrentRtkGainSummary(env);
|
|
141
|
+
if (!current)
|
|
142
|
+
return null;
|
|
143
|
+
const store = loadBaselineStore(basePath);
|
|
144
|
+
const existing = store.sessions[sessionId];
|
|
145
|
+
if (!existing) {
|
|
146
|
+
const now = new Date().toISOString();
|
|
147
|
+
store.sessions[sessionId] = {
|
|
148
|
+
summary: current,
|
|
149
|
+
createdAt: now,
|
|
150
|
+
updatedAt: now,
|
|
151
|
+
};
|
|
152
|
+
saveBaselineStore(basePath, store);
|
|
153
|
+
return computeSavingsDelta(current, current);
|
|
154
|
+
}
|
|
155
|
+
if (current.totalCommands < existing.summary.totalCommands ||
|
|
156
|
+
current.totalInput < existing.summary.totalInput ||
|
|
157
|
+
current.totalSaved < existing.summary.totalSaved) {
|
|
158
|
+
const now = new Date().toISOString();
|
|
159
|
+
store.sessions[sessionId] = {
|
|
160
|
+
summary: current,
|
|
161
|
+
createdAt: existing.createdAt,
|
|
162
|
+
updatedAt: now,
|
|
163
|
+
};
|
|
164
|
+
saveBaselineStore(basePath, store);
|
|
165
|
+
return computeSavingsDelta(current, current);
|
|
166
|
+
}
|
|
167
|
+
existing.updatedAt = new Date().toISOString();
|
|
168
|
+
saveBaselineStore(basePath, store);
|
|
169
|
+
return computeSavingsDelta(current, existing.summary);
|
|
170
|
+
}
|
|
171
|
+
export function clearRtkSessionBaseline(basePath, sessionId) {
|
|
172
|
+
if (!sessionId)
|
|
173
|
+
return;
|
|
174
|
+
const store = loadBaselineStore(basePath);
|
|
175
|
+
if (!(sessionId in store.sessions))
|
|
176
|
+
return;
|
|
177
|
+
delete store.sessions[sessionId];
|
|
178
|
+
saveBaselineStore(basePath, store);
|
|
179
|
+
}
|
|
180
|
+
export function formatRtkSavingsLabel(savings) {
|
|
181
|
+
if (!savings)
|
|
182
|
+
return null;
|
|
183
|
+
if (savings.commands <= 0)
|
|
184
|
+
return "rtk: waiting for shell usage";
|
|
185
|
+
if (savings.inputTokens <= 0 && savings.outputTokens <= 0) {
|
|
186
|
+
return `rtk: active (${savings.commands} cmd${savings.commands === 1 ? "" : "s"})`;
|
|
187
|
+
}
|
|
188
|
+
return `rtk: ${formatTokenCount(savings.savedTokens)} saved (${Math.round(savings.savingsPct)}%)`;
|
|
189
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { delimiter, join } from "node:path";
|
|
5
|
+
const GSD_RTK_PATH_ENV = "GSD_RTK_PATH";
|
|
6
|
+
const GSD_RTK_DISABLED_ENV = "GSD_RTK_DISABLED";
|
|
7
|
+
const RTK_TELEMETRY_DISABLED_ENV = "RTK_TELEMETRY_DISABLED";
|
|
8
|
+
const RTK_REWRITE_TIMEOUT_MS = 5_000;
|
|
9
|
+
function isTruthy(value) {
|
|
10
|
+
if (!value)
|
|
11
|
+
return false;
|
|
12
|
+
const normalized = value.trim().toLowerCase();
|
|
13
|
+
return normalized === "1" || normalized === "true" || normalized === "yes";
|
|
14
|
+
}
|
|
15
|
+
export function isRtkEnabled(env = process.env) {
|
|
16
|
+
return !isTruthy(env[GSD_RTK_DISABLED_ENV]);
|
|
17
|
+
}
|
|
18
|
+
export function buildRtkEnv(env = process.env) {
|
|
19
|
+
return {
|
|
20
|
+
...env,
|
|
21
|
+
[RTK_TELEMETRY_DISABLED_ENV]: "1",
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function getManagedRtkDir(env = process.env) {
|
|
25
|
+
return join(env.GSD_HOME || join(homedir(), ".gsd"), "agent", "bin");
|
|
26
|
+
}
|
|
27
|
+
function getRtkBinaryName(platform = process.platform) {
|
|
28
|
+
return platform === "win32" ? "rtk.exe" : "rtk";
|
|
29
|
+
}
|
|
30
|
+
function getPathValue(env) {
|
|
31
|
+
const pathKey = Object.keys(env).find((key) => key.toLowerCase() === "path");
|
|
32
|
+
return pathKey ? env[pathKey] : env.PATH;
|
|
33
|
+
}
|
|
34
|
+
function resolvePathCandidates(pathValue) {
|
|
35
|
+
if (!pathValue)
|
|
36
|
+
return [];
|
|
37
|
+
return pathValue
|
|
38
|
+
.split(delimiter)
|
|
39
|
+
.map((part) => part.trim())
|
|
40
|
+
.filter(Boolean);
|
|
41
|
+
}
|
|
42
|
+
function resolveSystemRtkPath(pathValue, platform = process.platform) {
|
|
43
|
+
const candidates = platform === "win32"
|
|
44
|
+
? ["rtk.exe", "rtk.cmd", "rtk.bat", "rtk"]
|
|
45
|
+
: ["rtk"];
|
|
46
|
+
for (const dir of resolvePathCandidates(pathValue)) {
|
|
47
|
+
for (const candidate of candidates) {
|
|
48
|
+
const fullPath = join(dir, candidate);
|
|
49
|
+
if (existsSync(fullPath)) {
|
|
50
|
+
return fullPath;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
export function resolveRtkBinaryPath(options = {}) {
|
|
57
|
+
const env = options.env ?? process.env;
|
|
58
|
+
const platform = options.platform ?? process.platform;
|
|
59
|
+
const explicitPath = options.binaryPath ?? env[GSD_RTK_PATH_ENV];
|
|
60
|
+
if (explicitPath && existsSync(explicitPath)) {
|
|
61
|
+
return explicitPath;
|
|
62
|
+
}
|
|
63
|
+
const managedDir = getManagedRtkDir(env);
|
|
64
|
+
const managedPath = join(managedDir, getRtkBinaryName(platform));
|
|
65
|
+
if (existsSync(managedPath)) {
|
|
66
|
+
return managedPath;
|
|
67
|
+
}
|
|
68
|
+
// On Windows, also check for rtk.cmd in the managed dir (used by test fake RTK
|
|
69
|
+
// and any wrapper-style installs where a .cmd launcher accompanies the binary).
|
|
70
|
+
if (platform === "win32") {
|
|
71
|
+
const managedCmd = join(managedDir, "rtk.cmd");
|
|
72
|
+
if (existsSync(managedCmd)) {
|
|
73
|
+
return managedCmd;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return resolveSystemRtkPath(options.pathValue ?? getPathValue(env), platform);
|
|
77
|
+
}
|
|
78
|
+
export function rewriteCommandWithRtk(command, env = process.env) {
|
|
79
|
+
if (!command.trim())
|
|
80
|
+
return command;
|
|
81
|
+
if (!isRtkEnabled(env))
|
|
82
|
+
return command;
|
|
83
|
+
const binaryPath = resolveRtkBinaryPath({ env });
|
|
84
|
+
if (!binaryPath)
|
|
85
|
+
return command;
|
|
86
|
+
const result = spawnSync(binaryPath, ["rewrite", command], {
|
|
87
|
+
encoding: "utf-8",
|
|
88
|
+
env: buildRtkEnv(env),
|
|
89
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
90
|
+
timeout: RTK_REWRITE_TIMEOUT_MS,
|
|
91
|
+
// .cmd/.bat wrappers (used by fake-rtk in tests) require shell:true on Windows
|
|
92
|
+
shell: /\.(cmd|bat)$/i.test(binaryPath),
|
|
93
|
+
});
|
|
94
|
+
if (result.error)
|
|
95
|
+
return command;
|
|
96
|
+
if (result.status !== 0 && result.status !== 3)
|
|
97
|
+
return command;
|
|
98
|
+
const rewritten = (result.stdout ?? "").trimEnd();
|
|
99
|
+
return rewritten || command;
|
|
100
|
+
}
|
package/dist/rtk.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
export declare const RTK_VERSION = "0.33.1";
|
|
3
|
+
export declare const GSD_RTK_DISABLED_ENV = "GSD_RTK_DISABLED";
|
|
4
|
+
export declare const GSD_SKIP_RTK_INSTALL_ENV = "GSD_SKIP_RTK_INSTALL";
|
|
5
|
+
export declare const GSD_RTK_PATH_ENV = "GSD_RTK_PATH";
|
|
6
|
+
export declare const RTK_TELEMETRY_DISABLED_ENV = "RTK_TELEMETRY_DISABLED";
|
|
7
|
+
export interface EnsureRtkOptions {
|
|
8
|
+
targetDir?: string;
|
|
9
|
+
allowDownload?: boolean;
|
|
10
|
+
env?: NodeJS.ProcessEnv;
|
|
11
|
+
pathValue?: string;
|
|
12
|
+
releaseVersion?: string;
|
|
13
|
+
log?: (message: string) => void;
|
|
14
|
+
}
|
|
15
|
+
export interface EnsureRtkResult {
|
|
16
|
+
enabled: boolean;
|
|
17
|
+
supported: boolean;
|
|
18
|
+
available: boolean;
|
|
19
|
+
source: "disabled" | "unsupported" | "managed" | "system" | "downloaded" | "missing";
|
|
20
|
+
binaryPath?: string;
|
|
21
|
+
reason?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function isRtkEnabled(env?: NodeJS.ProcessEnv): boolean;
|
|
24
|
+
export declare function getManagedRtkDir(env?: NodeJS.ProcessEnv): string;
|
|
25
|
+
export declare function getRtkBinaryName(platform?: NodeJS.Platform): string;
|
|
26
|
+
export declare function getManagedRtkPath(platform?: NodeJS.Platform, targetDir?: string): string;
|
|
27
|
+
export declare function prependPathEntry(env: NodeJS.ProcessEnv, entry: string): NodeJS.ProcessEnv;
|
|
28
|
+
export declare function applyRtkProcessEnv(env?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
|
|
29
|
+
export declare function buildRtkEnv(env?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
|
|
30
|
+
export declare function resolveRtkAssetName(platform: NodeJS.Platform, arch: string, version?: string): string | null;
|
|
31
|
+
export interface ResolveRtkBinaryPathOptions {
|
|
32
|
+
binaryPath?: string;
|
|
33
|
+
env?: NodeJS.ProcessEnv;
|
|
34
|
+
pathValue?: string;
|
|
35
|
+
platform?: NodeJS.Platform;
|
|
36
|
+
targetDir?: string;
|
|
37
|
+
}
|
|
38
|
+
export declare function resolveRtkBinaryPath(options?: ResolveRtkBinaryPathOptions): string | null;
|
|
39
|
+
export interface RewriteCommandOptions {
|
|
40
|
+
binaryPath?: string;
|
|
41
|
+
env?: NodeJS.ProcessEnv;
|
|
42
|
+
timeoutMs?: number;
|
|
43
|
+
spawnSyncImpl?: typeof spawnSync;
|
|
44
|
+
}
|
|
45
|
+
export declare function rewriteCommandWithRtk(command: string, options?: RewriteCommandOptions): string;
|
|
46
|
+
export interface ValidateRtkBinaryOptions {
|
|
47
|
+
spawnSyncImpl?: typeof spawnSync;
|
|
48
|
+
env?: NodeJS.ProcessEnv;
|
|
49
|
+
}
|
|
50
|
+
export declare function validateRtkBinary(binaryPath: string, options?: ValidateRtkBinaryOptions): boolean;
|
|
51
|
+
export declare function ensureRtkAvailable(options?: EnsureRtkOptions): Promise<EnsureRtkResult>;
|
|
52
|
+
export declare function bootstrapRtk(options?: EnsureRtkOptions): Promise<EnsureRtkResult>;
|