gsd-pi 2.79.0 → 2.80.0-dev.96f4d89d5
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 +94 -47
- package/dist/loader.js +0 -0
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/github-sync/templates.js +90 -74
- package/dist/resources/extensions/gsd/auto/contracts.js +1 -0
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +53 -0
- package/dist/resources/extensions/gsd/auto/loop.js +365 -522
- package/dist/resources/extensions/gsd/auto/orchestrator.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +61 -7
- package/dist/resources/extensions/gsd/auto/run-unit.js +19 -15
- package/dist/resources/extensions/gsd/auto/session.js +8 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.js +12 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-iteration.js +24 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.js +33 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.js +26 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-retry.js +49 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.js +25 -0
- package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +48 -0
- package/dist/resources/extensions/gsd/auto/workflow-dispatch-ledger.js +26 -0
- package/dist/resources/extensions/gsd/auto/workflow-iteration-completion.js +10 -0
- package/dist/resources/extensions/gsd/auto/workflow-journal-reporter.js +16 -0
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +263 -0
- package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +36 -0
- package/dist/resources/extensions/gsd/auto/workflow-phase-reporter.js +9 -0
- package/dist/resources/extensions/gsd/auto/workflow-session-lock.js +35 -0
- package/dist/resources/extensions/gsd/auto/workflow-sidecar-iteration.js +24 -0
- package/dist/resources/extensions/gsd/auto/workflow-sidecar-queue.js +26 -0
- package/dist/resources/extensions/gsd/auto/workflow-turn-reporter.js +36 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +44 -0
- package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +15 -0
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +2 -2
- package/dist/resources/extensions/gsd/auto-dashboard.js +54 -15
- package/dist/resources/extensions/gsd/auto-dispatch.js +2 -0
- package/dist/resources/extensions/gsd/auto-prompts.js +220 -32
- package/dist/resources/extensions/gsd/auto-recovery.js +63 -55
- package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -0
- package/dist/resources/extensions/gsd/auto-start.js +3 -2
- package/dist/resources/extensions/gsd/auto-verification.js +2 -11
- package/dist/resources/extensions/gsd/auto-worktree.js +87 -38
- package/dist/resources/extensions/gsd/auto.js +159 -2
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +24 -2
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -0
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +52 -50
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +8 -8
- package/dist/resources/extensions/gsd/commands/context.js +1 -1
- package/dist/resources/extensions/gsd/commands-ship.js +23 -46
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +12 -7
- package/dist/resources/extensions/gsd/component-loader.js +5 -11
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +25 -1
- package/dist/resources/extensions/gsd/db-adapter.js +47 -0
- package/dist/resources/extensions/gsd/db-base-schema.js +337 -0
- package/dist/resources/extensions/gsd/db-connection-cache.js +31 -0
- package/dist/resources/extensions/gsd/db-coordination-schema.js +104 -0
- package/dist/resources/extensions/gsd/db-decision-requirement-rows.js +71 -0
- package/dist/resources/extensions/gsd/db-gate-rows.js +16 -0
- package/dist/resources/extensions/gsd/db-lightweight-query-rows.js +29 -0
- package/dist/resources/extensions/gsd/db-memory-fts-schema.js +56 -0
- package/dist/resources/extensions/gsd/db-migration-backup.js +22 -0
- package/dist/resources/extensions/gsd/db-migration-steps.js +394 -0
- package/dist/resources/extensions/gsd/db-milestone-artifact-rows.js +35 -0
- package/dist/resources/extensions/gsd/db-open-state.js +32 -0
- package/dist/resources/extensions/gsd/db-provider.js +108 -0
- package/dist/resources/extensions/gsd/db-runtime-kv-schema.js +27 -0
- package/dist/resources/extensions/gsd/db-schema-metadata.js +23 -0
- package/dist/resources/extensions/gsd/db-task-slice-rows.js +86 -0
- package/dist/resources/extensions/gsd/db-transaction.js +63 -0
- package/dist/resources/extensions/gsd/db-verification-evidence-rows.js +3 -0
- package/dist/resources/extensions/gsd/db-verification-evidence-schema.js +19 -0
- package/dist/resources/extensions/gsd/escalation.js +2 -0
- package/dist/resources/extensions/gsd/graph.js +9 -3
- package/dist/resources/extensions/gsd/gsd-db.js +215 -1519
- package/dist/resources/extensions/gsd/guided-flow.js +40 -0
- package/dist/resources/extensions/gsd/legacy-telemetry.js +70 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +2 -0
- package/dist/resources/extensions/gsd/model-router.js +9 -6
- package/dist/resources/extensions/gsd/notification-widget.js +21 -3
- package/dist/resources/extensions/gsd/paths.js +5 -1
- package/dist/resources/extensions/gsd/post-execution-checks.js +27 -6
- package/dist/resources/extensions/gsd/pr-evidence.js +117 -0
- package/dist/resources/extensions/gsd/pre-execution-checks.js +2 -0
- package/dist/resources/extensions/gsd/preferences-types.js +20 -2
- package/dist/resources/extensions/gsd/preferences-validation.js +3 -3
- package/dist/resources/extensions/gsd/process-task-path.js +61 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +9 -5
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +23 -34
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
- package/dist/resources/extensions/gsd/prompts/discuss.md +81 -181
- package/dist/resources/extensions/gsd/prompts/execute-task.md +40 -67
- package/dist/resources/extensions/gsd/prompts/forensics.md +41 -84
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
- package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
- package/dist/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +25 -87
- package/dist/resources/extensions/gsd/prompts/queue.md +46 -53
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +23 -23
- package/dist/resources/extensions/gsd/prompts/research-slice.md +23 -23
- package/dist/resources/extensions/gsd/prompts/rethink.md +10 -10
- package/dist/resources/extensions/gsd/prompts/system.md +65 -107
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +15 -15
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
- package/dist/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
- package/dist/resources/extensions/gsd/state.js +4 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +14 -9
- package/dist/resources/extensions/gsd/tools/complete-task.js +2 -0
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +88 -3
- package/dist/resources/extensions/gsd/unit-context-composer.js +32 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +21 -0
- package/dist/resources/extensions/gsd/uok/audit.js +23 -9
- package/dist/resources/extensions/gsd/uok/contracts.js +69 -1
- package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +3 -0
- package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
- package/dist/resources/extensions/gsd/uok/loop-adapter.js +48 -33
- package/dist/resources/extensions/gsd/uok/plan-v2.js +2 -0
- package/dist/resources/extensions/gsd/uok/timeline.js +125 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +13 -13
- package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
- package/dist/resources/extensions/gsd/workflow-projections.js +2 -0
- package/dist/resources/extensions/gsd/workflow-templates.js +9 -0
- package/dist/resources/extensions/gsd/working-output-messages.js +64 -0
- package/dist/resources/extensions/shared/gsd-phase-state.js +45 -3
- package/dist/resources/extensions/shared/interview-ui.js +15 -4
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
- 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 +1 -1
- package/dist/web/standalone/.next/required-server-files.json +4 -4
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- 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 +1 -1
- 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_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 +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- 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 +1 -1
- 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_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_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 +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- 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/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/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_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 -2
- 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_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 +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
- 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 +2 -2
- 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_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_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 +4 -4
- 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 +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
- package/dist/web/standalone/.next/server/chunks/167.js +2 -0
- package/dist/web/standalone/.next/server/chunks/63.js +3 -3
- package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
- 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 +2 -2
- 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 +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/{8336.6f6f30e410419aff.js → 8336.631939fb583761fa.js} +1 -1
- 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/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-fab3ebb85b006001.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/global-error-459824ffb8c323dd.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-d82dbee6356c1733.js → webpack-0481f1221120a7c6.js} +1 -1
- 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/package.json +1 -0
- package/dist/web/standalone/server.js +1 -1
- package/package.json +15 -6
- package/packages/contracts/dist/index.d.ts +3 -0
- package/packages/contracts/dist/index.d.ts.map +1 -0
- package/packages/contracts/dist/index.js +5 -0
- package/packages/contracts/dist/index.js.map +1 -0
- package/packages/contracts/dist/rpc.d.ts +549 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -0
- package/packages/contracts/dist/rpc.js +53 -0
- package/packages/contracts/dist/rpc.js.map +1 -0
- package/packages/contracts/dist/rpc.test.d.ts +2 -0
- package/packages/contracts/dist/rpc.test.d.ts.map +1 -0
- package/packages/contracts/dist/rpc.test.js +47 -0
- package/packages/contracts/dist/rpc.test.js.map +1 -0
- package/packages/contracts/dist/workflow.d.ts +180 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -0
- package/packages/contracts/dist/workflow.js +201 -0
- package/packages/contracts/dist/workflow.js.map +1 -0
- package/packages/contracts/package.json +39 -0
- package/packages/contracts/src/index.ts +5 -0
- package/packages/contracts/src/rpc.test.ts +72 -0
- package/packages/contracts/src/rpc.ts +286 -0
- package/packages/contracts/src/workflow.ts +213 -0
- package/packages/contracts/tsconfig.json +25 -0
- package/packages/daemon/package.json +3 -2
- package/packages/daemon/src/event-bridge.test.ts +2 -1
- package/packages/daemon/src/event-bridge.ts +1 -1
- package/packages/daemon/src/event-formatter.test.ts +1 -2
- package/packages/daemon/src/event-formatter.ts +1 -2
- package/packages/daemon/src/session-manager.ts +2 -2
- package/packages/daemon/src/types.ts +3 -18
- package/packages/mcp-server/dist/server.d.ts +13 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +77 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/session-manager.js +1 -1
- package/packages/mcp-server/dist/session-manager.js.map +1 -1
- package/packages/mcp-server/dist/types.d.ts +3 -11
- package/packages/mcp-server/dist/types.d.ts.map +1 -1
- package/packages/mcp-server/dist/types.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +52 -37
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -2
- package/packages/mcp-server/src/mcp-server.test.ts +138 -0
- package/packages/mcp-server/src/server.ts +99 -1
- package/packages/mcp-server/src/session-manager.ts +2 -2
- package/packages/mcp-server/src/types.ts +7 -18
- package/packages/mcp-server/src/workflow-tools.test.ts +129 -2
- package/packages/mcp-server/src/workflow-tools.ts +80 -37
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/models/fake-model.d.ts +12 -0
- package/packages/pi-ai/dist/models/fake-model.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/fake-model.js +27 -0
- package/packages/pi-ai/dist/models/fake-model.js.map +1 -0
- package/packages/pi-ai/dist/models/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/index.js +8 -0
- package/packages/pi-ai/dist/models/index.js.map +1 -1
- package/packages/pi-ai/dist/providers/fake.d.ts +42 -0
- package/packages/pi-ai/dist/providers/fake.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/fake.js +319 -0
- package/packages/pi-ai/dist/providers/fake.js.map +1 -0
- package/packages/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/register-builtins.js +24 -0
- package/packages/pi-ai/dist/providers/register-builtins.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/src/models/fake-model.ts +30 -0
- package/packages/pi-ai/src/models/index.ts +9 -0
- package/packages/pi-ai/src/providers/fake.ts +376 -0
- package/packages/pi-ai/src/providers/register-builtins.ts +23 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +5 -0
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +4 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +8 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.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/modes/interactive/components/__tests__/tool-execution.test.js +22 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +26 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +112 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +51 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +8 -8
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +3 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +20 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +4 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +48 -15
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +40 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +12 -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 +54 -10
- 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.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +20 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js +79 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +13 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +18 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js +18 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +27 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +1 -512
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js +3 -7
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
- package/packages/pi-coding-agent/package.json +2 -1
- package/packages/pi-coding-agent/src/core/model-registry.ts +4 -0
- package/packages/pi-coding-agent/src/core/settings-manager.ts +12 -0
- package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +37 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +59 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +160 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +8 -8
- package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +50 -15
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +43 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +75 -9
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.test.ts +95 -0
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +24 -1
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +13 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +32 -2
- package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +40 -0
- package/packages/pi-coding-agent/src/modes/interactive/tui-mode.ts +29 -0
- package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +3 -336
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/style.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/style.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/style.test.js +63 -0
- package/packages/pi-tui/dist/__tests__/style.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/tui.test.js +24 -3
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
- package/packages/pi-tui/dist/index.d.ts +1 -0
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +2 -0
- package/packages/pi-tui/dist/index.js.map +1 -1
- package/packages/pi-tui/dist/style.d.ts +41 -0
- package/packages/pi-tui/dist/style.d.ts.map +1 -0
- package/packages/pi-tui/dist/style.js +158 -0
- package/packages/pi-tui/dist/style.js.map +1 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +1 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/style.test.ts +76 -0
- package/packages/pi-tui/src/__tests__/tui.test.ts +29 -3
- package/packages/pi-tui/src/index.ts +9 -0
- package/packages/pi-tui/src/style.ts +225 -0
- package/packages/pi-tui/src/tui.ts +1 -0
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/README.md +3 -3
- package/packages/rpc-client/dist/index.d.ts +1 -1
- package/packages/rpc-client/dist/index.d.ts.map +1 -1
- package/packages/rpc-client/dist/index.js.map +1 -1
- package/packages/rpc-client/dist/rpc-client.d.ts +2 -6
- package/packages/rpc-client/dist/rpc-client.d.ts.map +1 -1
- package/packages/rpc-client/dist/rpc-client.js.map +1 -1
- package/packages/rpc-client/dist/rpc-types.d.ts +1 -565
- package/packages/rpc-client/dist/rpc-types.d.ts.map +1 -1
- package/packages/rpc-client/dist/rpc-types.js +3 -11
- package/packages/rpc-client/dist/rpc-types.js.map +1 -1
- package/packages/rpc-client/package.json +4 -1
- package/packages/rpc-client/src/index.ts +1 -1
- package/packages/rpc-client/src/rpc-client.ts +3 -6
- package/packages/rpc-client/src/rpc-types.ts +3 -398
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme-schema.js +13 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.js +18 -1
- package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/github-sync/templates.ts +93 -88
- package/src/resources/extensions/github-sync/tests/inline-code.test.ts +66 -0
- package/src/resources/extensions/github-sync/tests/templates.test.ts +10 -2
- package/src/resources/extensions/gsd/auto/contracts.ts +87 -0
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +72 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -3
- package/src/resources/extensions/gsd/auto/loop.ts +416 -596
- package/src/resources/extensions/gsd/auto/orchestrator.ts +161 -0
- package/src/resources/extensions/gsd/auto/phases.ts +88 -9
- package/src/resources/extensions/gsd/auto/run-unit.ts +24 -14
- package/src/resources/extensions/gsd/auto/session.ts +11 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.ts +28 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-iteration.ts +52 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.ts +58 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.ts +71 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-retry.ts +90 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.ts +50 -0
- package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +97 -0
- package/src/resources/extensions/gsd/auto/workflow-dispatch-ledger.ts +45 -0
- package/src/resources/extensions/gsd/auto/workflow-iteration-completion.ts +26 -0
- package/src/resources/extensions/gsd/auto/workflow-journal-reporter.ts +33 -0
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +520 -0
- package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +58 -0
- package/src/resources/extensions/gsd/auto/workflow-phase-reporter.ts +22 -0
- package/src/resources/extensions/gsd/auto/workflow-session-lock.ts +68 -0
- package/src/resources/extensions/gsd/auto/workflow-sidecar-iteration.ts +46 -0
- package/src/resources/extensions/gsd/auto/workflow-sidecar-queue.ts +46 -0
- package/src/resources/extensions/gsd/auto/workflow-turn-reporter.ts +68 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +89 -0
- package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +38 -0
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
- package/src/resources/extensions/gsd/auto-dashboard.ts +61 -8
- package/src/resources/extensions/gsd/auto-dispatch.ts +1 -0
- package/src/resources/extensions/gsd/auto-prompts.ts +276 -31
- package/src/resources/extensions/gsd/auto-recovery.ts +59 -53
- package/src/resources/extensions/gsd/auto-runtime-state.ts +7 -0
- package/src/resources/extensions/gsd/auto-start.ts +3 -2
- package/src/resources/extensions/gsd/auto-verification.ts +5 -1
- package/src/resources/extensions/gsd/auto-worktree.ts +85 -36
- package/src/resources/extensions/gsd/auto.ts +167 -1
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +30 -2
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +11 -0
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +62 -51
- package/src/resources/extensions/gsd/bootstrap/tests/write-gate-shouldblock-basepath.test.ts +97 -0
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +8 -4
- package/src/resources/extensions/gsd/commands/context.ts +1 -1
- package/src/resources/extensions/gsd/commands-ship.ts +24 -51
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +13 -0
- package/src/resources/extensions/gsd/component-loader.ts +5 -11
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +29 -0
- package/src/resources/extensions/gsd/db-adapter.ts +75 -0
- package/src/resources/extensions/gsd/db-base-schema.ts +368 -0
- package/src/resources/extensions/gsd/db-connection-cache.ts +45 -0
- package/src/resources/extensions/gsd/db-coordination-schema.ts +109 -0
- package/src/resources/extensions/gsd/db-decision-requirement-rows.ts +77 -0
- package/src/resources/extensions/gsd/db-gate-rows.ts +19 -0
- package/src/resources/extensions/gsd/db-lightweight-query-rows.ts +50 -0
- package/src/resources/extensions/gsd/db-memory-fts-schema.ts +66 -0
- package/src/resources/extensions/gsd/db-migration-backup.ts +34 -0
- package/src/resources/extensions/gsd/db-migration-steps.ts +434 -0
- package/src/resources/extensions/gsd/db-milestone-artifact-rows.ts +70 -0
- package/src/resources/extensions/gsd/db-open-state.ts +47 -0
- package/src/resources/extensions/gsd/db-provider.ts +148 -0
- package/src/resources/extensions/gsd/db-runtime-kv-schema.ts +30 -0
- package/src/resources/extensions/gsd/db-schema-metadata.ts +33 -0
- package/src/resources/extensions/gsd/db-task-slice-rows.ts +146 -0
- package/src/resources/extensions/gsd/db-transaction.ts +76 -0
- package/src/resources/extensions/gsd/db-verification-evidence-rows.ts +14 -0
- package/src/resources/extensions/gsd/db-verification-evidence-schema.ts +22 -0
- package/src/resources/extensions/gsd/escalation.ts +3 -1
- package/src/resources/extensions/gsd/graph.ts +12 -5
- package/src/resources/extensions/gsd/gsd-db.ts +260 -1659
- package/src/resources/extensions/gsd/guided-flow.ts +47 -0
- package/src/resources/extensions/gsd/interrupted-session.ts +1 -0
- package/src/resources/extensions/gsd/legacy-telemetry.ts +99 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +4 -1
- package/src/resources/extensions/gsd/model-router.ts +10 -6
- package/src/resources/extensions/gsd/notification-widget.ts +25 -4
- package/src/resources/extensions/gsd/paths.ts +6 -1
- package/src/resources/extensions/gsd/post-execution-checks.ts +35 -7
- package/src/resources/extensions/gsd/pr-evidence.ts +182 -0
- package/src/resources/extensions/gsd/pre-execution-checks.ts +4 -1
- package/src/resources/extensions/gsd/preferences-types.ts +23 -4
- package/src/resources/extensions/gsd/preferences-validation.ts +3 -3
- package/src/resources/extensions/gsd/process-task-path.ts +81 -0
- package/src/resources/extensions/gsd/prompt-loader.ts +9 -5
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
- package/src/resources/extensions/gsd/prompts/complete-slice.md +23 -34
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
- package/src/resources/extensions/gsd/prompts/discuss.md +81 -181
- package/src/resources/extensions/gsd/prompts/execute-task.md +40 -67
- package/src/resources/extensions/gsd/prompts/forensics.md +41 -84
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
- package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
- package/src/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
- package/src/resources/extensions/gsd/prompts/plan-slice.md +25 -87
- package/src/resources/extensions/gsd/prompts/queue.md +46 -53
- package/src/resources/extensions/gsd/prompts/refine-slice.md +23 -23
- package/src/resources/extensions/gsd/prompts/research-slice.md +23 -23
- package/src/resources/extensions/gsd/prompts/rethink.md +10 -10
- package/src/resources/extensions/gsd/prompts/system.md +65 -107
- package/src/resources/extensions/gsd/prompts/triage-captures.md +15 -15
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
- package/src/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
- package/src/resources/extensions/gsd/state.ts +6 -3
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +353 -0
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +108 -1
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/check-auto-start-pending-gate.test.ts +203 -0
- package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/commands-ship-eval-warn.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +19 -5
- package/src/resources/extensions/gsd/tests/component-loader.test.ts +2 -9
- package/src/resources/extensions/gsd/tests/current-directory-root-homedir-fallback.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/db-adapter.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/db-base-schema.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/db-connection-cache.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/db-coordination-schema.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/db-decision-requirement-rows.test.ts +135 -0
- package/src/resources/extensions/gsd/tests/db-gate-rows.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/db-lightweight-query-rows.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +86 -0
- package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/db-migration-steps.integration.test.ts +428 -0
- package/src/resources/extensions/gsd/tests/db-migration-steps.test.ts +159 -0
- package/src/resources/extensions/gsd/tests/db-milestone-artifact-rows.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/db-open-state.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/db-provider.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/db-runtime-kv-schema.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +115 -0
- package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +128 -0
- package/src/resources/extensions/gsd/tests/db-transaction.test.ts +110 -0
- package/src/resources/extensions/gsd/tests/db-verification-evidence-schema.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/discuss-headless-rendering.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +109 -0
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-basic.md +52 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-empty-optionals.md +42 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +55 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +60 -0
- package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-requirements-prompt-rendering.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/guided-flow-prompt-consolidation.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +134 -0
- package/src/resources/extensions/gsd/tests/legacy-component-format-telemetry.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/legacy-telemetry.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +40 -16
- package/src/resources/extensions/gsd/tests/model-router.test.ts +33 -12
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/notification-widget.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/paused-session-via-db.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-rendering.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +65 -16
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/pr-evidence-equivalence.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/pr-evidence-hardening.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/pr-evidence.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/pre-exec-gate-loop.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/process-task-path.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +16 -1
- package/src/resources/extensions/gsd/tests/queue-prompt-rendering.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +32 -9
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +42 -4
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +109 -1
- package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-dispatch-outcome.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-iteration.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile-outcome.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile.test.ts +146 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-retry.test.ts +136 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-verify-outcome.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +158 -0
- package/src/resources/extensions/gsd/tests/workflow-dispatch-ledger.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/workflow-iteration-completion.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/workflow-journal-reporter.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +607 -0
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +20 -4
- package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/workflow-phase-reporter.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/workflow-session-lock.test.ts +135 -0
- package/src/resources/extensions/gsd/tests/workflow-sidecar-iteration.test.ts +110 -0
- package/src/resources/extensions/gsd/tests/workflow-sidecar-queue.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +164 -3
- package/src/resources/extensions/gsd/tests/workflow-turn-reporter.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/workflow-unit-dispatch.test.ts +160 -0
- package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/working-output-messages.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +17 -33
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +15 -9
- package/src/resources/extensions/gsd/tools/complete-task.ts +4 -1
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +90 -2
- package/src/resources/extensions/gsd/unit-context-composer.ts +49 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +34 -0
- package/src/resources/extensions/gsd/uok/audit.ts +25 -9
- package/src/resources/extensions/gsd/uok/contracts.ts +105 -0
- package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +4 -0
- package/src/resources/extensions/gsd/uok/kernel.ts +10 -3
- package/src/resources/extensions/gsd/uok/loop-adapter.ts +60 -45
- package/src/resources/extensions/gsd/uok/plan-v2.ts +5 -1
- package/src/resources/extensions/gsd/uok/timeline.ts +158 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +13 -13
- package/src/resources/extensions/gsd/workflow-manifest.ts +6 -15
- package/src/resources/extensions/gsd/workflow-projections.ts +5 -1
- package/src/resources/extensions/gsd/workflow-templates.ts +11 -0
- package/src/resources/extensions/gsd/working-output-messages.ts +120 -0
- package/src/resources/extensions/shared/gsd-phase-state.ts +56 -3
- package/src/resources/extensions/shared/interview-ui.ts +18 -5
- package/src/resources/extensions/shared/tests/gsd-phase-state.test.ts +43 -1
- package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +41 -0
- package/dist/web/standalone/.next/server/chunks/6336.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-ff639266d978f2a0.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/global-error-ab5a8926e07ec673.js +0 -1
- /package/dist/web/standalone/.next/static/{J-CU-p_sp45CJHT3R9TJS → y7d--cnc6Cibuva-Lzzw_}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{J-CU-p_sp45CJHT3R9TJS → y7d--cnc6Cibuva-Lzzw_}/_ssgManifest.js +0 -0
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
// GSD-2 + src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts - Handles provider and agent-end recovery for GSD auto-mode.
|
|
1
2
|
import { logWarning } from "../workflow-logger.js";
|
|
2
3
|
import { checkDeepProjectSetupAfterTurn, checkAutoStartAfterDiscuss, maybeHandleReadyPhraseWithoutFiles, maybeHandleEmptyIntentTurn, resetEmptyTurnCounter, } from "../guided-flow.js";
|
|
3
4
|
import { clearPathCache } from "../paths.js";
|
|
4
5
|
import { getAutoDashboardData, getAutoModeStartModel, isAutoActive, pauseAuto, setCurrentDispatchedModelId } from "../auto.js";
|
|
5
6
|
import { getNextFallbackModel, resolveModelWithFallbacksForUnit } from "../preferences.js";
|
|
6
7
|
import { pauseAutoForProviderError } from "../provider-error-pause.js";
|
|
7
|
-
import { isSessionSwitchInFlight, resolveAgentEnd } from "../auto/resolve.js";
|
|
8
|
+
import { isSessionSwitchInFlight, resolveAgentEnd, resolveAgentEndCancelled } from "../auto/resolve.js";
|
|
8
9
|
import { resolveModelId } from "../auto-model-selection.js";
|
|
9
10
|
import { resolveProjectRoot } from "../worktree.js";
|
|
10
11
|
import { clearDiscussionFlowState } from "./write-gate.js";
|
|
@@ -39,6 +40,19 @@ function resolveAgentEndBasePath() {
|
|
|
39
40
|
return undefined;
|
|
40
41
|
}
|
|
41
42
|
}
|
|
43
|
+
export function _buildAbortedPauseContext(lastMsg) {
|
|
44
|
+
const hasErrorMessage = Object.prototype.hasOwnProperty.call(lastMsg, "errorMessage") && !!lastMsg.errorMessage;
|
|
45
|
+
return {
|
|
46
|
+
message: hasErrorMessage ? String(lastMsg.errorMessage) : "Operation aborted",
|
|
47
|
+
category: "aborted",
|
|
48
|
+
isTransient: true,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export function isUserInitiatedAbortMessage(message) {
|
|
52
|
+
if (!message)
|
|
53
|
+
return false;
|
|
54
|
+
return /\b(?:claude code process aborted by user|request aborted by user|process aborted by user)\b/i.test(message);
|
|
55
|
+
}
|
|
42
56
|
async function pauseTransientWithBackoff(cls, pi, ctx, errorDetail, isRateLimit) {
|
|
43
57
|
retryState.consecutiveTransientCount += 1;
|
|
44
58
|
const baseRetryAfterMs = "retryAfterMs" in cls ? cls.retryAfterMs : 15_000;
|
|
@@ -134,7 +148,7 @@ export async function handleAgentEnd(pi, event, ctx) {
|
|
|
134
148
|
}
|
|
135
149
|
return;
|
|
136
150
|
}
|
|
137
|
-
await pauseAuto(ctx, pi);
|
|
151
|
+
await pauseAuto(ctx, pi, _buildAbortedPauseContext(lastMsg));
|
|
138
152
|
return;
|
|
139
153
|
}
|
|
140
154
|
if (lastMsg && "stopReason" in lastMsg && lastMsg.stopReason === "error") {
|
|
@@ -142,6 +156,14 @@ export async function handleAgentEnd(pi, event, ctx) {
|
|
|
142
156
|
// is in the assistant message text content. Fall back to content when
|
|
143
157
|
// errorMessage looks uninformative.
|
|
144
158
|
const rawErrorMsg = ("errorMessage" in lastMsg && lastMsg.errorMessage) ? String(lastMsg.errorMessage) : "";
|
|
159
|
+
if (isUserInitiatedAbortMessage(rawErrorMsg)) {
|
|
160
|
+
resolveAgentEndCancelled({
|
|
161
|
+
message: rawErrorMsg,
|
|
162
|
+
category: "aborted",
|
|
163
|
+
isTransient: false,
|
|
164
|
+
});
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
145
167
|
const isUseless = !rawErrorMsg || /^(success|ok|true|error|unknown)$/i.test(rawErrorMsg.trim());
|
|
146
168
|
// #3588: When errorMessage is uninformative, extract the real error from
|
|
147
169
|
// the assistant message text content for display purposes only.
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Registers DB-backed GSD workflow tools and compatibility aliases.
|
|
1
3
|
import { Type } from "@sinclair/typebox";
|
|
2
4
|
import { Text } from "@gsd/pi-tui";
|
|
3
5
|
import { loadEffectiveGSDPreferences } from "../preferences.js";
|
|
@@ -5,6 +7,7 @@ import { ensureDbOpen } from "./dynamic-tools.js";
|
|
|
5
7
|
import { loadWriteGateSnapshot, shouldBlockRootArtifactSaveInSnapshot } from "./write-gate.js";
|
|
6
8
|
import { StringEnum } from "@gsd/pi-ai";
|
|
7
9
|
import { logError } from "../workflow-logger.js";
|
|
10
|
+
import { incrementLegacyTelemetry } from "../legacy-telemetry.js";
|
|
8
11
|
async function loadWorkflowExecutors() {
|
|
9
12
|
return import("../tools/workflow-tool-executors.js");
|
|
10
13
|
}
|
|
@@ -14,11 +17,18 @@ async function loadWorkflowExecutors() {
|
|
|
14
17
|
*/
|
|
15
18
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- toolDef shape matches ToolDefinition but typing it fully requires generics
|
|
16
19
|
function registerAlias(pi, toolDef, aliasName, canonicalName) {
|
|
20
|
+
const execute = typeof toolDef.execute === "function"
|
|
21
|
+
? async (...args) => {
|
|
22
|
+
incrementLegacyTelemetry("legacy.mcpAliasUsed");
|
|
23
|
+
return toolDef.execute(...args);
|
|
24
|
+
}
|
|
25
|
+
: toolDef.execute;
|
|
17
26
|
pi.registerTool({
|
|
18
27
|
...toolDef,
|
|
19
28
|
name: aliasName,
|
|
20
29
|
description: toolDef.description + ` (alias for ${canonicalName} — prefer the canonical name)`,
|
|
21
30
|
promptGuidelines: [`Alias for ${canonicalName} — prefer the canonical name.`],
|
|
31
|
+
execute,
|
|
22
32
|
});
|
|
23
33
|
}
|
|
24
34
|
function requirementRootWriteGuard(operation) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// GSD2 — Exec (context-mode) tool registration.
|
|
2
2
|
//
|
|
3
|
-
// Exposes the
|
|
4
|
-
// `context_mode.enabled:
|
|
3
|
+
// Exposes the Context Mode runtime tools in-process. Default-on; opt out with
|
|
4
|
+
// `context_mode.enabled: false` in preferences.
|
|
5
5
|
import { Type } from "@sinclair/typebox";
|
|
6
6
|
export function registerExecTools(pi) {
|
|
7
7
|
pi.registerTool({
|
|
@@ -16,6 +16,7 @@ import { logWarning as safetyLogWarning } from "../workflow-logger.js";
|
|
|
16
16
|
import { installNotifyInterceptor } from "./notify-interceptor.js";
|
|
17
17
|
import { initNotificationStore } from "../notification-store.js";
|
|
18
18
|
import { initNotificationWidget } from "../notification-widget.js";
|
|
19
|
+
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
19
20
|
import { extractSubagentAgentClasses } from "./subagent-input.js";
|
|
20
21
|
import { approvalGateIdForUnit, isExplicitApprovalResponse, shouldPauseForUserApprovalQuestion } from "../user-input-boundary.js";
|
|
21
22
|
// Skip the welcome screen on the very first session_start — cli.ts already
|
|
@@ -51,11 +52,45 @@ async function applyDisabledModelProviderPolicy(ctx) {
|
|
|
51
52
|
// Non-fatal: keep default provider visibility if preferences cannot be loaded.
|
|
52
53
|
}
|
|
53
54
|
}
|
|
55
|
+
export function resolveNotificationStoreBasePath(cwd = process.cwd()) {
|
|
56
|
+
return resolveWorktreeProjectRoot(cwd);
|
|
57
|
+
}
|
|
58
|
+
function initSessionNotifications(ctx) {
|
|
59
|
+
initNotificationStore(resolveNotificationStoreBasePath());
|
|
60
|
+
installNotifyInterceptor(ctx);
|
|
61
|
+
initNotificationWidget(ctx);
|
|
62
|
+
}
|
|
63
|
+
async function writeContextModeCompactionSnapshot(basePath) {
|
|
64
|
+
try {
|
|
65
|
+
const { loadEffectiveGSDPreferences } = await import("../preferences.js");
|
|
66
|
+
const { isContextModeEnabled } = await import("../preferences-types.js");
|
|
67
|
+
const prefs = loadEffectiveGSDPreferences(basePath);
|
|
68
|
+
if (!isContextModeEnabled(prefs?.preferences))
|
|
69
|
+
return;
|
|
70
|
+
const { writeCompactionSnapshot } = await import("../compaction-snapshot.js");
|
|
71
|
+
const { ensureDbOpen } = await import("./dynamic-tools.js");
|
|
72
|
+
await ensureDbOpen(basePath);
|
|
73
|
+
let activeContext = null;
|
|
74
|
+
try {
|
|
75
|
+
const state = await deriveGsdState(basePath);
|
|
76
|
+
if (state.activeMilestone && state.activeSlice && state.activeTask) {
|
|
77
|
+
activeContext =
|
|
78
|
+
`Active: ${state.activeMilestone.id} / ${state.activeSlice.id} / ${state.activeTask.id}` +
|
|
79
|
+
(state.activeTask.title ? ` - ${state.activeTask.title}` : "");
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
/* non-fatal */
|
|
84
|
+
}
|
|
85
|
+
writeCompactionSnapshot(basePath, { activeContext });
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
safetyLogWarning("context-mode", `failed to write compaction snapshot: ${err instanceof Error ? err.message : String(err)}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
54
91
|
export function registerHooks(pi, ecosystemHandlers) {
|
|
55
92
|
pi.on("session_start", async (_event, ctx) => {
|
|
56
|
-
|
|
57
|
-
installNotifyInterceptor(ctx);
|
|
58
|
-
initNotificationWidget(ctx);
|
|
93
|
+
initSessionNotifications(ctx);
|
|
59
94
|
if (!isAutoActive()) {
|
|
60
95
|
const { initHealthWidget } = await import("../health-widget.js");
|
|
61
96
|
initHealthWidget(ctx);
|
|
@@ -107,8 +142,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
107
142
|
}
|
|
108
143
|
});
|
|
109
144
|
pi.on("session_switch", async (_event, ctx) => {
|
|
110
|
-
|
|
111
|
-
installNotifyInterceptor(ctx);
|
|
145
|
+
initSessionNotifications(ctx);
|
|
112
146
|
resetWriteGateState(process.cwd());
|
|
113
147
|
resetToolCallLoopGuard();
|
|
114
148
|
await resetAskUserQuestionsTurnCache();
|
|
@@ -138,7 +172,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
138
172
|
const { getEcosystemReadyPromise } = await import("../ecosystem/loader.js");
|
|
139
173
|
await getEcosystemReadyPromise();
|
|
140
174
|
const beforeAgentBasePath = process.cwd();
|
|
141
|
-
const pendingApprovalGate = getPendingGate();
|
|
175
|
+
const pendingApprovalGate = getPendingGate(beforeAgentBasePath);
|
|
142
176
|
if (pendingApprovalGate && isExplicitApprovalResponse(event.prompt, pendingApprovalGate)) {
|
|
143
177
|
markApprovalGateVerified(pendingApprovalGate, beforeAgentBasePath);
|
|
144
178
|
const milestoneId = extractDepthVerificationMilestoneId(pendingApprovalGate);
|
|
@@ -204,15 +238,18 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
204
238
|
}
|
|
205
239
|
});
|
|
206
240
|
pi.on("session_before_compact", async () => {
|
|
241
|
+
const basePath = process.cwd();
|
|
242
|
+
// Context Mode is default-on. Write the resumable snapshot before any
|
|
243
|
+
// active-auto cancel return so auto sessions still leave re-entry context.
|
|
244
|
+
await writeContextModeCompactionSnapshot(basePath);
|
|
207
245
|
// Only cancel compaction while auto-mode is actively running.
|
|
208
246
|
// Paused auto-mode should allow compaction — the user may be doing
|
|
209
247
|
// interactive work (#3165).
|
|
210
248
|
if (isAutoActive()) {
|
|
211
249
|
return { cancel: true };
|
|
212
250
|
}
|
|
213
|
-
const basePath = process.cwd();
|
|
214
251
|
const { ensureDbOpen } = await import("./dynamic-tools.js");
|
|
215
|
-
await ensureDbOpen();
|
|
252
|
+
await ensureDbOpen(basePath);
|
|
216
253
|
const state = await deriveGsdState(basePath);
|
|
217
254
|
if (!state.activeMilestone || !state.activeSlice)
|
|
218
255
|
return;
|
|
@@ -256,41 +293,6 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
256
293
|
: `Resume ${phaseLabel} work for slice ${state.activeSlice.id}.`,
|
|
257
294
|
}));
|
|
258
295
|
});
|
|
259
|
-
// Context-mode snapshot: write .gsd/last-snapshot.md before compaction so
|
|
260
|
-
// agents can call gsd_resume (or Read the file) to re-orient. Opt-in via
|
|
261
|
-
// preferences.context_mode.enabled. Runs after the auto-cancel handler
|
|
262
|
-
// above — if that one returned cancel:true, pi still fires us but the
|
|
263
|
-
// compaction won't actually happen; the snapshot is still useful then,
|
|
264
|
-
// since auto may pause and resume later.
|
|
265
|
-
pi.on("session_before_compact", async () => {
|
|
266
|
-
try {
|
|
267
|
-
const { loadEffectiveGSDPreferences } = await import("../preferences.js");
|
|
268
|
-
const { isContextModeEnabled } = await import("../preferences-types.js");
|
|
269
|
-
const prefs = loadEffectiveGSDPreferences();
|
|
270
|
-
if (!isContextModeEnabled(prefs?.preferences))
|
|
271
|
-
return;
|
|
272
|
-
const { writeCompactionSnapshot } = await import("../compaction-snapshot.js");
|
|
273
|
-
const { ensureDbOpen } = await import("./dynamic-tools.js");
|
|
274
|
-
await ensureDbOpen();
|
|
275
|
-
const basePath = process.cwd();
|
|
276
|
-
let activeContext = null;
|
|
277
|
-
try {
|
|
278
|
-
const state = await deriveGsdState(basePath);
|
|
279
|
-
if (state.activeMilestone && state.activeSlice && state.activeTask) {
|
|
280
|
-
activeContext =
|
|
281
|
-
`Active: ${state.activeMilestone.id} / ${state.activeSlice.id} / ${state.activeTask.id}` +
|
|
282
|
-
(state.activeTask.title ? ` — ${state.activeTask.title}` : "");
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
catch {
|
|
286
|
-
/* non-fatal */
|
|
287
|
-
}
|
|
288
|
-
writeCompactionSnapshot(basePath, { activeContext });
|
|
289
|
-
}
|
|
290
|
-
catch (err) {
|
|
291
|
-
safetyLogWarning("context-mode", `failed to write compaction snapshot: ${err instanceof Error ? err.message : String(err)}`);
|
|
292
|
-
}
|
|
293
|
-
});
|
|
294
296
|
pi.on("message_update", async (event, ctx) => {
|
|
295
297
|
if (approvalQuestionAbortInFlight)
|
|
296
298
|
return;
|
|
@@ -367,15 +369,15 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
367
369
|
// ── Discussion gate enforcement: block tool calls while gate is pending ──
|
|
368
370
|
// If ask_user_questions was called with a gate ID but hasn't been confirmed,
|
|
369
371
|
// block all non-read-only tool calls to prevent the model from skipping gates.
|
|
370
|
-
if (getPendingGate()) {
|
|
372
|
+
if (getPendingGate(discussionBasePath)) {
|
|
371
373
|
const milestoneId = await getDiscussionMilestoneIdFor(discussionBasePath);
|
|
372
374
|
if (isToolCallEventType("bash", event)) {
|
|
373
|
-
const bashGuard = shouldBlockPendingGateBash(event.input.command, milestoneId, isQueuePhaseActive());
|
|
375
|
+
const bashGuard = shouldBlockPendingGateBash(event.input.command, milestoneId, isQueuePhaseActive(discussionBasePath), discussionBasePath);
|
|
374
376
|
if (bashGuard.block)
|
|
375
377
|
return bashGuard;
|
|
376
378
|
}
|
|
377
379
|
else {
|
|
378
|
-
const gateGuard = shouldBlockPendingGate(toolName, milestoneId, isQueuePhaseActive());
|
|
380
|
+
const gateGuard = shouldBlockPendingGate(toolName, milestoneId, isQueuePhaseActive(discussionBasePath), discussionBasePath);
|
|
379
381
|
if (gateGuard.block)
|
|
380
382
|
return gateGuard;
|
|
381
383
|
}
|
|
@@ -384,7 +386,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
384
386
|
// When /gsd queue is active, the agent should only create milestones,
|
|
385
387
|
// not execute work. Block write/edit to non-.gsd/ paths and bash commands
|
|
386
388
|
// that would modify files.
|
|
387
|
-
if (isQueuePhaseActive()) {
|
|
389
|
+
if (isQueuePhaseActive(discussionBasePath)) {
|
|
388
390
|
let queueInput = "";
|
|
389
391
|
if (isToolCallEventType("write", event)) {
|
|
390
392
|
queueInput = event.input.path;
|
|
@@ -449,7 +451,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
449
451
|
}
|
|
450
452
|
if (!isToolCallEventType("write", event))
|
|
451
453
|
return;
|
|
452
|
-
const result = shouldBlockContextWrite(event.toolName, event.input.path, await getDiscussionMilestoneIdFor(discussionBasePath), isQueuePhaseActive());
|
|
454
|
+
const result = shouldBlockContextWrite(event.toolName, event.input.path, await getDiscussionMilestoneIdFor(discussionBasePath), isQueuePhaseActive(discussionBasePath), discussionBasePath);
|
|
453
455
|
if (result.block)
|
|
454
456
|
return result;
|
|
455
457
|
});
|
|
@@ -504,7 +506,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
504
506
|
return;
|
|
505
507
|
const basePath = process.cwd();
|
|
506
508
|
const milestoneId = await getDiscussionMilestoneIdFor(basePath);
|
|
507
|
-
const queueActive = isQueuePhaseActive();
|
|
509
|
+
const queueActive = isQueuePhaseActive(basePath);
|
|
508
510
|
const details = event.details;
|
|
509
511
|
// ── Discussion gate enforcement: handle gate question responses ──
|
|
510
512
|
// If the result is cancelled or has no response, the pending gate stays active
|
|
@@ -512,7 +514,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
512
514
|
// If the user responded at all (even "needs adjustment"), clear the pending gate
|
|
513
515
|
// because the user engaged — the prompt handles the re-ask-after-adjustment flow.
|
|
514
516
|
const questions = event.input?.questions ?? [];
|
|
515
|
-
const currentPendingGate = getPendingGate();
|
|
517
|
+
const currentPendingGate = getPendingGate(basePath);
|
|
516
518
|
if (currentPendingGate) {
|
|
517
519
|
if (details?.cancelled || !details?.response) {
|
|
518
520
|
// Gate stays pending. Direct the agent to the most reliable recovery
|
|
@@ -298,8 +298,8 @@ export function getPendingGate(basePath = process.cwd()) {
|
|
|
298
298
|
* Returns { block: true, reason } if the tool should be blocked.
|
|
299
299
|
* ask_user_questions itself is allowed so the model can re-ask the gate.
|
|
300
300
|
*/
|
|
301
|
-
export function shouldBlockPendingGate(toolName, milestoneId, queuePhaseActive) {
|
|
302
|
-
return shouldBlockPendingGateInSnapshot(currentWriteGateSnapshot(), toolName, milestoneId, queuePhaseActive);
|
|
301
|
+
export function shouldBlockPendingGate(toolName, milestoneId, queuePhaseActive, basePath = process.cwd()) {
|
|
302
|
+
return shouldBlockPendingGateInSnapshot(currentWriteGateSnapshot(basePath), toolName, milestoneId, queuePhaseActive);
|
|
303
303
|
}
|
|
304
304
|
export function shouldBlockPendingGateInSnapshot(snapshot, toolName, _milestoneId, _queuePhaseActive) {
|
|
305
305
|
if (!snapshot.pendingGateId)
|
|
@@ -322,8 +322,8 @@ export function shouldBlockPendingGateInSnapshot(snapshot, toolName, _milestoneI
|
|
|
322
322
|
* Check whether a bash command should be blocked because a discussion gate is pending.
|
|
323
323
|
* All bash is blocked while waiting for confirmation so the question stays visible.
|
|
324
324
|
*/
|
|
325
|
-
export function shouldBlockPendingGateBash(command, milestoneId, queuePhaseActive) {
|
|
326
|
-
return shouldBlockPendingGateBashInSnapshot(currentWriteGateSnapshot(), command, milestoneId, queuePhaseActive);
|
|
325
|
+
export function shouldBlockPendingGateBash(command, milestoneId, queuePhaseActive, basePath = process.cwd()) {
|
|
326
|
+
return shouldBlockPendingGateBashInSnapshot(currentWriteGateSnapshot(basePath), command, milestoneId, queuePhaseActive);
|
|
327
327
|
}
|
|
328
328
|
export function shouldBlockPendingGateBashInSnapshot(snapshot, command, _milestoneId, _queuePhaseActive) {
|
|
329
329
|
if (!snapshot.pendingGateId)
|
|
@@ -363,7 +363,7 @@ export function isDepthConfirmationAnswer(selected, options) {
|
|
|
363
363
|
// Returning false prevents any free-form string from unlocking the gate.
|
|
364
364
|
return false;
|
|
365
365
|
}
|
|
366
|
-
export function shouldBlockContextWrite(toolName, inputPath, milestoneId, _queuePhaseActive) {
|
|
366
|
+
export function shouldBlockContextWrite(toolName, inputPath, milestoneId, _queuePhaseActive, basePath = process.cwd()) {
|
|
367
367
|
if (toolName !== "write")
|
|
368
368
|
return { block: false };
|
|
369
369
|
if (!MILESTONE_CONTEXT_RE.test(inputPath))
|
|
@@ -379,7 +379,7 @@ export function shouldBlockContextWrite(toolName, inputPath, milestoneId, _queue
|
|
|
379
379
|
].join(" "),
|
|
380
380
|
};
|
|
381
381
|
}
|
|
382
|
-
if (isMilestoneDepthVerified(targetMilestoneId))
|
|
382
|
+
if (isMilestoneDepthVerified(targetMilestoneId, basePath))
|
|
383
383
|
return { block: false };
|
|
384
384
|
return {
|
|
385
385
|
block: true,
|
|
@@ -397,8 +397,8 @@ export function shouldBlockContextWrite(toolName, inputPath, milestoneId, _queue
|
|
|
397
397
|
* Slice-level CONTEXT artifacts are allowed; milestone-level CONTEXT writes
|
|
398
398
|
* require the milestone to be depth-verified first.
|
|
399
399
|
*/
|
|
400
|
-
export function shouldBlockContextArtifactSave(artifactType, milestoneId, sliceId) {
|
|
401
|
-
return shouldBlockContextArtifactSaveInSnapshot(currentWriteGateSnapshot(), artifactType, milestoneId, sliceId);
|
|
400
|
+
export function shouldBlockContextArtifactSave(artifactType, milestoneId, sliceId, basePath = process.cwd()) {
|
|
401
|
+
return shouldBlockContextArtifactSaveInSnapshot(currentWriteGateSnapshot(basePath), artifactType, milestoneId, sliceId);
|
|
402
402
|
}
|
|
403
403
|
export function shouldBlockContextArtifactSaveInSnapshot(snapshot, artifactType, milestoneId, sliceId) {
|
|
404
404
|
if (artifactType !== "CONTEXT")
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* Creates a PR from milestone artifacts: generates title + body from
|
|
5
|
-
* roadmap, slice summaries, and metrics, then opens via `gh pr create`.
|
|
6
|
-
*/
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Ship command for creating pull requests from GSD milestone evidence.
|
|
7
3
|
import { execFileSync } from "node:child_process";
|
|
8
4
|
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
9
5
|
import { readFile } from "node:fs/promises";
|
|
@@ -14,6 +10,7 @@ import { nativeGetCurrentBranch, nativeDetectMainBranch } from "./native-git-bri
|
|
|
14
10
|
import { formatDuration } from "../shared/format-utils.js";
|
|
15
11
|
import { parseEvalReviewFrontmatter } from "./eval-review-schema.js";
|
|
16
12
|
import { currentDirectoryRoot } from "./commands/context.js";
|
|
13
|
+
import { buildPrEvidence } from "./pr-evidence.js";
|
|
17
14
|
function git(basePath, args) {
|
|
18
15
|
return execFileSync("git", args, { cwd: basePath, encoding: "utf-8" }).trim();
|
|
19
16
|
}
|
|
@@ -114,66 +111,46 @@ export async function checkSliceEvalReview(basePath, milestoneId, sliceId) {
|
|
|
114
111
|
};
|
|
115
112
|
}
|
|
116
113
|
function generatePRContent(basePath, milestoneId, milestoneTitle) {
|
|
117
|
-
const title = `feat: ${milestoneTitle || milestoneId}`;
|
|
118
|
-
const sections = [];
|
|
119
|
-
// TL;DR
|
|
120
|
-
sections.push("## TL;DR\n");
|
|
121
|
-
sections.push(`**What:** Ship milestone ${milestoneId} — ${milestoneTitle || "(untitled)"}`);
|
|
122
|
-
sections.push(`**Why:** Milestone work complete, ready for review.`);
|
|
123
|
-
sections.push(`**How:** See slice summaries below.\n`);
|
|
124
|
-
// What — slice summaries
|
|
125
114
|
const summaries = collectSliceSummaries(basePath, milestoneId);
|
|
126
|
-
|
|
127
|
-
sections.push("## What\n");
|
|
128
|
-
sections.push(summaries.join("\n\n"));
|
|
129
|
-
sections.push("");
|
|
130
|
-
}
|
|
131
|
-
// Roadmap status
|
|
115
|
+
const roadmapItems = [];
|
|
132
116
|
const roadmapPath = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
|
|
133
117
|
if (roadmapPath && existsSync(roadmapPath)) {
|
|
134
118
|
try {
|
|
135
119
|
const roadmap = readFileSync(roadmapPath, "utf-8");
|
|
136
120
|
const checkboxLines = roadmap.split("\n").filter((l) => /^\s*-\s*\[[ x]\]/.test(l));
|
|
137
|
-
|
|
138
|
-
sections.push("## Roadmap\n");
|
|
139
|
-
sections.push(checkboxLines.join("\n"));
|
|
140
|
-
sections.push("");
|
|
141
|
-
}
|
|
121
|
+
roadmapItems.push(...checkboxLines);
|
|
142
122
|
}
|
|
143
123
|
catch {
|
|
144
124
|
// non-fatal
|
|
145
125
|
}
|
|
146
126
|
}
|
|
147
|
-
|
|
127
|
+
const metrics = [];
|
|
148
128
|
const ledger = getLedger();
|
|
149
129
|
const units = ledger?.units ?? loadLedgerFromDisk(basePath)?.units ?? [];
|
|
150
130
|
if (units.length > 0) {
|
|
151
131
|
const totals = getProjectTotals(units);
|
|
152
132
|
const byModel = aggregateByModel(units);
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
sections.push(`- **Tokens:** ${formatTokenCount(totals.tokens.input)} input / ${formatTokenCount(totals.tokens.output)} output`);
|
|
133
|
+
metrics.push(`**Units executed:** ${units.length}`);
|
|
134
|
+
metrics.push(`**Total cost:** ${formatCost(totals.cost)}`);
|
|
135
|
+
metrics.push(`**Tokens:** ${formatTokenCount(totals.tokens.input)} input / ${formatTokenCount(totals.tokens.output)} output`);
|
|
157
136
|
if (totals.duration > 0) {
|
|
158
|
-
|
|
137
|
+
metrics.push(`**Duration:** ${formatDuration(totals.duration)}`);
|
|
159
138
|
}
|
|
160
139
|
if (byModel.length > 0) {
|
|
161
|
-
|
|
140
|
+
metrics.push(`**Models:** ${byModel.map((m) => `${m.model} (${m.units} units)`).join(", ")}`);
|
|
162
141
|
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
sections.push("*This PR was prepared with AI assistance (GSD auto-mode).*");
|
|
176
|
-
return { title, body: sections.join("\n") };
|
|
142
|
+
}
|
|
143
|
+
return buildPrEvidence({
|
|
144
|
+
milestoneId,
|
|
145
|
+
milestoneTitle,
|
|
146
|
+
changeType: "feat",
|
|
147
|
+
summaries,
|
|
148
|
+
roadmapItems,
|
|
149
|
+
metrics,
|
|
150
|
+
testsRun: ["Run `npm run verify:pr` before marking this PR ready."],
|
|
151
|
+
rollbackNotes: ["Revert the merge commit or close the PR before merge if review finds a regression."],
|
|
152
|
+
how: "Generated from GSD milestone slice summaries, roadmap status, and local metrics.",
|
|
153
|
+
});
|
|
177
154
|
}
|
|
178
155
|
export async function handleShip(args, ctx, _pi) {
|
|
179
156
|
const basePath = currentDirectoryRoot();
|
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* Handles the `/gsd start [template] [description]` and `/gsd templates` commands.
|
|
5
|
-
* Resolves templates by name or auto-detection, then dispatches the workflow prompt.
|
|
6
|
-
*/
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Workflow template commands for starting, listing, and dispatching workflows.
|
|
7
3
|
import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
8
4
|
import { join } from "node:path";
|
|
9
|
-
import { resolveByName, autoDetect, listTemplates, getTemplateInfo, loadWorkflowTemplate, loadRegistry, } from "./workflow-templates.js";
|
|
5
|
+
import { resolveByName, autoDetect, listTemplates, getTemplateInfo, loadWorkflowTemplate, loadRegistry, isLegacyWorkflowMode, } from "./workflow-templates.js";
|
|
10
6
|
import { loadPrompt } from "./prompt-loader.js";
|
|
11
7
|
import { gsdRoot } from "./paths.js";
|
|
12
8
|
import { createGitService, runGit } from "./git-service.js";
|
|
@@ -14,6 +10,8 @@ import { isAutoActive, isAutoPaused } from "./auto.js";
|
|
|
14
10
|
import { getErrorMessage } from "./error-utils.js";
|
|
15
11
|
import { resolvePlugin } from "./workflow-plugins.js";
|
|
16
12
|
import { currentDirectoryRoot } from "./commands/context.js";
|
|
13
|
+
import { formatRecommendedProcessPaths } from "./process-task-path.js";
|
|
14
|
+
import { incrementLegacyTelemetry } from "./legacy-telemetry.js";
|
|
17
15
|
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
18
16
|
/**
|
|
19
17
|
* Generate a URL-friendly slug from text.
|
|
@@ -244,6 +242,9 @@ export async function handleStart(args, ctx, pi) {
|
|
|
244
242
|
" /gsd start bugfix fix login button not responding\n" +
|
|
245
243
|
" /gsd start spike evaluate auth libraries\n" +
|
|
246
244
|
" /gsd start hotfix critical: API returns 500\n\n" +
|
|
245
|
+
"Recommended task paths:\n" +
|
|
246
|
+
formatRecommendedProcessPaths() +
|
|
247
|
+
"\n\n" +
|
|
247
248
|
"Flags:\n" +
|
|
248
249
|
" --dry-run Preview what would happen without executing\n" +
|
|
249
250
|
" --issue <ref> Link to a GitHub issue\n\n" +
|
|
@@ -364,6 +365,9 @@ export async function handleStart(args, ctx, pi) {
|
|
|
364
365
|
infoLines.push(`Artifacts: ${artifactDir}`);
|
|
365
366
|
infoLines.push(`Branch: ${actualBranch}`);
|
|
366
367
|
ctx.ui.notify(infoLines.join("\n"), "info");
|
|
368
|
+
if (isLegacyWorkflowMode(template.mode)) {
|
|
369
|
+
incrementLegacyTelemetry("legacy.workflowEngineUsed");
|
|
370
|
+
}
|
|
367
371
|
const prompt = loadPrompt("workflow-start", {
|
|
368
372
|
templateId,
|
|
369
373
|
templateName: template.name,
|
|
@@ -491,6 +495,7 @@ export function dispatchMarkdownPhasePlugin(plugin, description, ctx, pi) {
|
|
|
491
495
|
infoLines.push(`Artifacts: ${artifactDir}`);
|
|
492
496
|
infoLines.push(`Branch: ${actualBranch}`);
|
|
493
497
|
ctx.ui.notify(infoLines.join("\n"), "info");
|
|
498
|
+
incrementLegacyTelemetry("legacy.workflowEngineUsed");
|
|
494
499
|
const prompt = loadPrompt("workflow-start", {
|
|
495
500
|
templateId,
|
|
496
501
|
templateName: plugin.meta.displayName,
|
|
@@ -1,18 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* Multi-format loader that handles:
|
|
5
|
-
* 1. New format: component.yaml + SKILL.md/AGENT.md
|
|
6
|
-
* 2. Legacy skill format: SKILL.md with YAML frontmatter
|
|
7
|
-
* 3. Legacy agent format: .md with YAML frontmatter (name, description, tools, model)
|
|
8
|
-
*
|
|
9
|
-
* Auto-detects format by checking for component.yaml first, then falling back
|
|
10
|
-
* to legacy formats based on file naming conventions.
|
|
11
|
-
*/
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Loads modern component.yaml definitions and legacy skill/agent formats.
|
|
12
3
|
import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
|
|
13
4
|
import { basename, dirname, join } from 'node:path';
|
|
14
5
|
import { parse as parseYaml } from 'yaml';
|
|
15
6
|
import { parseFrontmatter } from '@gsd/pi-coding-agent';
|
|
7
|
+
import { incrementLegacyTelemetry } from './legacy-telemetry.js';
|
|
16
8
|
import { validateComponentName, validateComponentDescription, computeComponentId, } from './component-types.js';
|
|
17
9
|
const SUPPORTED_COMPONENT_KINDS = ['skill', 'agent'];
|
|
18
10
|
const SUPPORTED_API_VERSIONS = ['gsd/v1'];
|
|
@@ -183,6 +175,7 @@ function loadFromLegacySkill(filePath, dir, source) {
|
|
|
183
175
|
format: 'skill-md',
|
|
184
176
|
enabled: true,
|
|
185
177
|
};
|
|
178
|
+
incrementLegacyTelemetry('legacy.componentFormatUsed');
|
|
186
179
|
return { component, diagnostics };
|
|
187
180
|
}
|
|
188
181
|
function loadFromLegacyAgent(filePath, source) {
|
|
@@ -235,6 +228,7 @@ function loadFromLegacyAgent(filePath, source) {
|
|
|
235
228
|
format: 'agent-md',
|
|
236
229
|
enabled: true,
|
|
237
230
|
};
|
|
231
|
+
incrementLegacyTelemetry('legacy.componentFormatUsed');
|
|
238
232
|
return { component, diagnostics };
|
|
239
233
|
}
|
|
240
234
|
// ============================================================================
|
|
@@ -13,13 +13,29 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import { readFileSync } from "node:fs";
|
|
15
15
|
import { join } from "node:path";
|
|
16
|
-
import { readGraph, writeGraph, getNextPendingStep, markStepActive, markStepComplete, expandIteration, } from "./graph.js";
|
|
16
|
+
import { readGraph, writeGraph, getNextPendingStep, markStepActive, markStepComplete, expandIteration, isTerminalStepStatus, } from "./graph.js";
|
|
17
17
|
import { injectContext } from "./context-injector.js";
|
|
18
18
|
import { readFrozenDefinition } from "./definition-io.js";
|
|
19
19
|
import { parseUnitId } from "./unit-id.js";
|
|
20
20
|
import { withFileLock } from "./file-lock.js";
|
|
21
21
|
// Re-export for downstream consumers
|
|
22
22
|
export { readFrozenDefinition } from "./definition-io.js";
|
|
23
|
+
function formatBlockedWorkflowReason(graph) {
|
|
24
|
+
const statusById = new Map(graph.steps.map((step) => [step.id, step.status]));
|
|
25
|
+
const blockedSteps = graph.steps
|
|
26
|
+
.filter((step) => step.status === "pending")
|
|
27
|
+
.map((step) => {
|
|
28
|
+
const blockers = step.dependsOn
|
|
29
|
+
.filter((depId) => !isTerminalStepStatus(statusById.get(depId)))
|
|
30
|
+
.map((depId) => `${depId} (${statusById.get(depId) ?? "missing"})`);
|
|
31
|
+
return blockers.length > 0
|
|
32
|
+
? `${step.id} waiting on ${blockers.join(", ")}`
|
|
33
|
+
: `${step.id} has no runnable dependency path`;
|
|
34
|
+
});
|
|
35
|
+
return blockedSteps.length > 0
|
|
36
|
+
? `Workflow blocked: no pending steps are ready. Blocked steps: ${blockedSteps.join("; ")}`
|
|
37
|
+
: "Workflow blocked: no pending steps are ready.";
|
|
38
|
+
}
|
|
23
39
|
export class CustomWorkflowEngine {
|
|
24
40
|
engineId = "custom";
|
|
25
41
|
runDir;
|
|
@@ -78,6 +94,14 @@ export class CustomWorkflowEngine {
|
|
|
78
94
|
}
|
|
79
95
|
let next = getNextPendingStep(graph);
|
|
80
96
|
if (!next) {
|
|
97
|
+
const allDone = graph.steps.every((step) => step.status === "complete" || step.status === "expanded");
|
|
98
|
+
if (!allDone) {
|
|
99
|
+
return {
|
|
100
|
+
action: "stop",
|
|
101
|
+
reason: formatBlockedWorkflowReason(graph),
|
|
102
|
+
level: "error",
|
|
103
|
+
};
|
|
104
|
+
}
|
|
81
105
|
return {
|
|
82
106
|
action: "stop",
|
|
83
107
|
reason: "All steps complete",
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Normalized SQLite adapter wrapper used by the GSD database facade.
|
|
3
|
+
export function normalizeDbRow(row) {
|
|
4
|
+
if (row == null)
|
|
5
|
+
return undefined;
|
|
6
|
+
if (Object.getPrototypeOf(row) === null) {
|
|
7
|
+
return { ...row };
|
|
8
|
+
}
|
|
9
|
+
return row;
|
|
10
|
+
}
|
|
11
|
+
export function normalizeDbRows(rows) {
|
|
12
|
+
return rows.map((row) => normalizeDbRow(row));
|
|
13
|
+
}
|
|
14
|
+
export function createDbAdapter(rawDb) {
|
|
15
|
+
const db = rawDb;
|
|
16
|
+
const stmtCache = new Map();
|
|
17
|
+
function wrapStmt(raw) {
|
|
18
|
+
return {
|
|
19
|
+
run(...params) {
|
|
20
|
+
return raw.run(...params);
|
|
21
|
+
},
|
|
22
|
+
get(...params) {
|
|
23
|
+
return normalizeDbRow(raw.get(...params));
|
|
24
|
+
},
|
|
25
|
+
all(...params) {
|
|
26
|
+
return normalizeDbRows(raw.all(...params));
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
exec(sql) {
|
|
32
|
+
db.exec(sql);
|
|
33
|
+
},
|
|
34
|
+
prepare(sql) {
|
|
35
|
+
let cached = stmtCache.get(sql);
|
|
36
|
+
if (cached)
|
|
37
|
+
return cached;
|
|
38
|
+
cached = wrapStmt(db.prepare(sql));
|
|
39
|
+
stmtCache.set(sql, cached);
|
|
40
|
+
return cached;
|
|
41
|
+
},
|
|
42
|
+
close() {
|
|
43
|
+
stmtCache.clear();
|
|
44
|
+
db.close();
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|