gsd-pi 2.81.0 → 2.82.0-dev.20138ae42
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 +64 -33
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +10 -1
- package/dist/resources/extensions/browser-tools/tools/screenshot.js +1 -0
- package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
- package/dist/resources/extensions/cmux/index.js +5 -0
- package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
- package/dist/resources/extensions/gsd/auto/loop.js +116 -13
- package/dist/resources/extensions/gsd/auto/orchestrator.js +124 -6
- package/dist/resources/extensions/gsd/auto/phases.js +220 -98
- package/dist/resources/extensions/gsd/auto/run-unit.js +66 -3
- package/dist/resources/extensions/gsd/auto/session.js +9 -0
- package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +43 -0
- package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +247 -178
- package/dist/resources/extensions/gsd/auto-dispatch.js +27 -17
- package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +240 -128
- package/dist/resources/extensions/gsd/auto-prompts.js +13 -5
- package/dist/resources/extensions/gsd/auto-recovery.js +34 -179
- package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -0
- package/dist/resources/extensions/gsd/auto-start.js +105 -35
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +33 -5
- package/dist/resources/extensions/gsd/auto-verification.js +38 -26
- package/dist/resources/extensions/gsd/auto-worktree.js +119 -1
- package/dist/resources/extensions/gsd/auto.js +400 -108
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +38 -12
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +9 -8
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +17 -4
- package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +4 -8
- package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +16 -2
- package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
- package/dist/resources/extensions/gsd/commands/catalog.js +4 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +38 -1
- package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +4 -10
- package/dist/resources/extensions/gsd/commands/handlers/parallel.js +9 -0
- package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +15 -2
- package/dist/resources/extensions/gsd/context-store.js +112 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +31 -5
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
- package/dist/resources/extensions/gsd/db-writer.js +150 -84
- package/dist/resources/extensions/gsd/dispatch-guard.js +2 -2
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
- package/dist/resources/extensions/gsd/doctor-git-checks.js +41 -6
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
- package/dist/resources/extensions/gsd/doctor.js +2 -28
- package/dist/resources/extensions/gsd/export-html.js +27 -425
- package/dist/resources/extensions/gsd/git-service.js +41 -2
- package/dist/resources/extensions/gsd/gsd-db.js +8 -23
- package/dist/resources/extensions/gsd/guided-flow.js +93 -111
- package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
- package/dist/resources/extensions/gsd/health-widget-core.js +1 -1
- package/dist/resources/extensions/gsd/health-widget.js +4 -10
- package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
- package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
- package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
- package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +6 -96
- package/dist/resources/extensions/gsd/md-importer.js +1 -1
- package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
- package/dist/resources/extensions/gsd/migrate/command.js +5 -0
- package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
- package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
- package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
- package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
- package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
- package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
- package/dist/resources/extensions/gsd/native-git-bridge.js +62 -26
- package/dist/resources/extensions/gsd/notification-overlay.js +35 -40
- package/dist/resources/extensions/gsd/parallel-merge.js +53 -30
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +25 -33
- package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
- package/dist/resources/extensions/gsd/post-execution-checks.js +73 -2
- package/dist/resources/extensions/gsd/pre-execution-checks.js +28 -1
- package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +14 -12
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +28 -10
- package/dist/resources/extensions/gsd/prompts/discuss.md +29 -11
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
- package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
- package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/system.md +2 -2
- package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
- package/dist/resources/extensions/gsd/recovery-classification.js +15 -1
- package/dist/resources/extensions/gsd/session-lock.js +40 -0
- package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +131 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +252 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +45 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +82 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.js +50 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +124 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-worker.js +32 -0
- package/dist/resources/extensions/gsd/state-reconciliation/errors.js +41 -0
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +99 -0
- package/dist/resources/extensions/gsd/state-reconciliation/registry.js +24 -0
- package/dist/resources/extensions/gsd/state-reconciliation/spawn-gate.js +43 -0
- package/dist/resources/extensions/gsd/state-reconciliation/types.js +3 -0
- package/dist/resources/extensions/gsd/state-reconciliation.js +5 -26
- package/dist/resources/extensions/gsd/status-guards.js +4 -0
- package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
- package/dist/resources/extensions/gsd/templates/plan.md +8 -5
- package/dist/resources/extensions/gsd/templates/task-plan.md +4 -2
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -8
- package/dist/resources/extensions/gsd/tools/complete-slice.js +6 -8
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
- package/dist/resources/extensions/gsd/tools/plan-slice.js +89 -14
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
- package/dist/resources/extensions/gsd/tui/render-kit.js +74 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +32 -10
- package/dist/resources/extensions/gsd/validation.js +23 -1
- package/dist/resources/extensions/gsd/verification-gate.js +68 -7
- package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
- package/dist/resources/extensions/gsd/watch/header-renderer.js +92 -69
- package/dist/resources/extensions/gsd/watch/splash-palette.js +10 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +2 -2
- package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +769 -319
- package/dist/resources/extensions/gsd/worktree-telemetry.js +3 -1
- package/dist/resources/extensions/shared/html-shell.js +388 -0
- package/dist/resources/extensions/subagent/index.js +448 -78
- package/dist/resources/extensions/subagent/launch.js +77 -0
- package/dist/resources/extensions/subagent/run-store.js +148 -0
- package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
- package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
- package/dist/resources/extensions/visual-brief/index.js +5 -0
- package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
- package/dist/resources/extensions/visual-brief/prompts.js +140 -0
- 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 +10 -10
- 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 +3 -3
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- 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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
- package/dist/web/standalone/.next/server/app/api/boot/route.js +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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +5 -8
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -8
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
- package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
- package/dist/web/standalone/.next/server/chunks/63.js +3 -3
- package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
- 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/2973.33f26573894b6153.js +2 -0
- package/dist/web/standalone/.next/static/chunks/{8359.e059d86b255fce1c.js → 8359.7eb3bb8f8ecf4c01.js} +2 -2
- 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-8c10ec293ae0f1d5.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.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-de742b64187e13fe.js → webpack-9a4db269f9ed63ad.js} +1 -1
- package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/dist/welcome-screen.d.ts +0 -7
- package/dist/welcome-screen.js +60 -69
- package/package.json +6 -5
- package/packages/contracts/dist/rpc.test.js +7 -0
- package/packages/contracts/dist/rpc.test.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +21 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +24 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/src/rpc.test.ts +8 -0
- package/packages/contracts/src/workflow.ts +24 -0
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/README.md +14 -3
- package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +80 -0
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
- package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
- package/packages/mcp-server/src/workflow-tools.ts +168 -0
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/native/tsconfig.json +2 -1
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/index.d.ts +2 -2
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +1 -1
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
- package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.js +5 -6
- package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
- package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
- package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
- package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/src/index.ts +7 -2
- package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
- package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
- package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
- package/packages/pi-ai/src/providers/simple-options.ts +5 -6
- package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js +47 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +76 -9
- 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/__tests__/user-message-design.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js +40 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +0 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +30 -29
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +10 -3
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +13 -13
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -3
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +58 -3
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts +2 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +12 -6
- package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +33 -42
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +0 -1
- 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 +86 -82
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts +35 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js +152 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts +16 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js +73 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +12 -8
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
- 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 +105 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +27 -26
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +9 -6
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
- package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/assistant-message-design.test.ts +56 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +113 -9
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/user-message-design.test.ts +48 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +10 -3
- package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +43 -42
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +14 -14
- package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +64 -3
- package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +13 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +33 -44
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +84 -104
- package/packages/pi-coding-agent/src/modes/interactive/components/transcript-design.ts +196 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tui-style-kit.ts +94 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +14 -9
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme-highlight.test.ts +23 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +106 -1
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +27 -26
- package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +9 -6
- package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +14 -1
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
- package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -1
- package/packages/pi-tui/dist/overlay-layout.js +9 -6
- package/packages/pi-tui/dist/overlay-layout.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +5 -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__/overlay-layout.test.ts +20 -1
- package/packages/pi-tui/src/overlay-layout.ts +10 -7
- package/packages/pi-tui/src/tui.ts +6 -0
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/package.json +1 -1
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
- package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
- package/pkg/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
- package/pkg/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
- package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.js +105 -1
- package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +27 -26
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +10 -1
- package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
- package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
- package/src/resources/extensions/cmux/index.ts +6 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +59 -16
- package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
- package/src/resources/extensions/gsd/auto/loop-deps.ts +9 -5
- package/src/resources/extensions/gsd/auto/loop.ts +121 -14
- package/src/resources/extensions/gsd/auto/orchestrator.ts +129 -6
- package/src/resources/extensions/gsd/auto/phases.ts +180 -20
- package/src/resources/extensions/gsd/auto/run-unit.ts +69 -4
- package/src/resources/extensions/gsd/auto/session.ts +10 -0
- package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +82 -0
- package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +301 -183
- package/src/resources/extensions/gsd/auto-dispatch.ts +29 -7
- package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +273 -140
- package/src/resources/extensions/gsd/auto-prompts.ts +13 -5
- package/src/resources/extensions/gsd/auto-recovery.ts +36 -209
- package/src/resources/extensions/gsd/auto-runtime-state.ts +5 -0
- package/src/resources/extensions/gsd/auto-start.ts +114 -31
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +51 -0
- package/src/resources/extensions/gsd/auto-verification.ts +46 -38
- package/src/resources/extensions/gsd/auto-worktree.ts +127 -1
- package/src/resources/extensions/gsd/auto.ts +441 -107
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +54 -12
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +9 -8
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +16 -4
- package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +5 -8
- package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +19 -3
- package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
- package/src/resources/extensions/gsd/commands/catalog.ts +4 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +41 -1
- package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +4 -10
- package/src/resources/extensions/gsd/commands/handlers/parallel.ts +12 -0
- package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
- package/src/resources/extensions/gsd/context-store.ts +120 -1
- package/src/resources/extensions/gsd/crash-recovery.ts +30 -4
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
- package/src/resources/extensions/gsd/db-writer.ts +167 -84
- package/src/resources/extensions/gsd/dispatch-guard.ts +2 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
- package/src/resources/extensions/gsd/doctor-git-checks.ts +44 -6
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
- package/src/resources/extensions/gsd/doctor-types.ts +2 -0
- package/src/resources/extensions/gsd/doctor.ts +2 -27
- package/src/resources/extensions/gsd/export-html.ts +27 -427
- package/src/resources/extensions/gsd/git-service.ts +47 -1
- package/src/resources/extensions/gsd/gsd-db.ts +10 -23
- package/src/resources/extensions/gsd/guided-flow.ts +126 -128
- package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
- package/src/resources/extensions/gsd/health-widget-core.ts +1 -1
- package/src/resources/extensions/gsd/health-widget.ts +6 -10
- package/src/resources/extensions/gsd/journal.ts +2 -0
- package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
- package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
- package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
- package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +10 -96
- package/src/resources/extensions/gsd/md-importer.ts +1 -1
- package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
- package/src/resources/extensions/gsd/migrate/command.ts +5 -0
- package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
- package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
- package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
- package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
- package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
- package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
- package/src/resources/extensions/gsd/native-git-bridge.ts +68 -25
- package/src/resources/extensions/gsd/notification-overlay.ts +50 -46
- package/src/resources/extensions/gsd/parallel-merge.ts +61 -34
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +33 -35
- package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
- package/src/resources/extensions/gsd/post-execution-checks.ts +87 -2
- package/src/resources/extensions/gsd/pre-execution-checks.ts +32 -1
- package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/complete-slice.md +14 -12
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +28 -10
- package/src/resources/extensions/gsd/prompts/discuss.md +29 -11
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
- package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
- package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
- package/src/resources/extensions/gsd/prompts/queue.md +4 -4
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/system.md +2 -2
- package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
- package/src/resources/extensions/gsd/recovery-classification.ts +18 -1
- package/src/resources/extensions/gsd/session-lock.ts +41 -0
- package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +172 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +344 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +66 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +101 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.ts +68 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +185 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/stale-worker.ts +46 -0
- package/src/resources/extensions/gsd/state-reconciliation/errors.ts +67 -0
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +142 -0
- package/src/resources/extensions/gsd/state-reconciliation/registry.ts +27 -0
- package/src/resources/extensions/gsd/state-reconciliation/spawn-gate.ts +60 -0
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +83 -0
- package/src/resources/extensions/gsd/state-reconciliation.ts +21 -53
- package/src/resources/extensions/gsd/status-guards.ts +5 -0
- package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
- package/src/resources/extensions/gsd/templates/plan.md +8 -5
- package/src/resources/extensions/gsd/templates/task-plan.md +4 -2
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +170 -0
- package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +783 -176
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +487 -4
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +292 -4
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
- package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +12 -1
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +15 -1
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +20 -5
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
- package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +11 -2
- package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +5 -9
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
- package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +43 -2
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +28 -1
- package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
- package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
- package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +79 -4
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +83 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
- package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
- package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/header-renderer.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +17 -7
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +14 -4
- package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +129 -1
- package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
- package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
- package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +116 -24
- package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -1
- package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
- package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
- package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +46 -11
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +78 -41
- package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +12 -217
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +38 -6
- package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
- package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
- package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +225 -1
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +81 -3
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +86 -0
- package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
- package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +46 -2
- package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +6 -3
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +53 -2
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +71 -58
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +1048 -0
- package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +121 -1
- package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +86 -7
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +110 -1
- package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +83 -0
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +211 -59
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +597 -118
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +59 -2
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +72 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +8 -10
- package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -8
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
- package/src/resources/extensions/gsd/tools/plan-slice.ts +98 -12
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
- package/src/resources/extensions/gsd/tui/render-kit.ts +109 -0
- package/src/resources/extensions/gsd/types.ts +1 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +47 -11
- package/src/resources/extensions/gsd/validation.ts +23 -1
- package/src/resources/extensions/gsd/verification-gate.ts +78 -6
- package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
- package/src/resources/extensions/gsd/watch/header-renderer.ts +121 -79
- package/src/resources/extensions/gsd/watch/splash-palette.ts +11 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +2 -2
- package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +1196 -518
- package/src/resources/extensions/gsd/worktree-telemetry.ts +7 -2
- package/src/resources/extensions/shared/html-shell.ts +412 -0
- package/src/resources/extensions/subagent/index.ts +567 -103
- package/src/resources/extensions/subagent/launch.ts +131 -0
- package/src/resources/extensions/subagent/run-store.ts +218 -0
- package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
- package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
- package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
- package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
- package/src/resources/extensions/visual-brief/index.ts +8 -0
- package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
- package/src/resources/extensions/visual-brief/prompts.ts +183 -0
- package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
- package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
- package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/layout-9ecfd95f343793f0.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.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/css/54ec2745c1da488b.css +0 -1
- package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
- package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +0 -1544
- /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → xRy4LqKSNKdT7y6ATYyEl}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → xRy4LqKSNKdT7y6ATYyEl}/_ssgManifest.js +0 -0
|
@@ -15,14 +15,14 @@ import { deriveState } from "./state.js";
|
|
|
15
15
|
import { parseUnitId } from "./unit-id.js";
|
|
16
16
|
import { assessInterruptedSession, readPausedSessionMetadata, PAUSED_SESSION_KV_KEY, } from "./interrupted-session.js";
|
|
17
17
|
import { setRuntimeKv, deleteRuntimeKv, } from "./db/runtime-kv.js";
|
|
18
|
-
import { getManifestStatus } from "./files.js";
|
|
18
|
+
import { extractSection, getManifestStatus, splitFrontmatter, parseFrontmatterMap } from "./files.js";
|
|
19
19
|
export { inlinePriorMilestoneSummary } from "./files.js";
|
|
20
20
|
import { collectSecretsFromManifest } from "../get-secrets-from-user.js";
|
|
21
21
|
import { gsdRoot, resolveMilestoneFile, resolveMilestonePath, resolveDir, milestonesDir, } from "./paths.js";
|
|
22
22
|
import { invalidateAllCaches } from "./cache.js";
|
|
23
23
|
import { clearActivityLogState } from "./activity-log.js";
|
|
24
24
|
import { synthesizeCrashRecovery, getDeepDiagnostic, readActiveMilestoneId, } from "./session-forensics.js";
|
|
25
|
-
import { writeLock, clearLock, readCrashLock, isLockProcessAlive, formatCrashInfo, emitCrashRecoveredUnitEnd, emitOpenUnitEndForUnit, } from "./crash-recovery.js";
|
|
25
|
+
import { writeLock, clearLock, clearStaleWorkerLock, readCrashLock, isLockProcessAlive, formatCrashInfo, emitCrashRecoveredUnitEnd, emitOpenUnitEndForUnit, } from "./crash-recovery.js";
|
|
26
26
|
import { acquireSessionLock, getSessionLockStatus, releaseSessionLock, updateSessionLock, } from "./session-lock.js";
|
|
27
27
|
import { resolveAutoSupervisorConfig, loadEffectiveGSDPreferences, getIsolationMode, } from "./preferences.js";
|
|
28
28
|
import { sendDesktopNotification } from "./notifications.js";
|
|
@@ -45,11 +45,10 @@ import { isAbsolute, join } from "node:path";
|
|
|
45
45
|
import { pathToFileURL } from "node:url";
|
|
46
46
|
import { readFileSync, existsSync, mkdirSync } from "node:fs";
|
|
47
47
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
48
|
-
import {
|
|
48
|
+
import { captureIntegrationBranch, detectWorktreeName, getCurrentBranch, getMainBranch, setActiveMilestoneId, resolveProjectRoot, } from "./worktree.js";
|
|
49
49
|
import { GitServiceImpl } from "./git-service.js";
|
|
50
|
-
import { nativeCheckoutBranch } from "./native-git-bridge.js";
|
|
51
50
|
import { getPriorSliceCompletionBlocker } from "./dispatch-guard.js";
|
|
52
|
-
import { createAutoWorktree,
|
|
51
|
+
import { createAutoWorktree, teardownAutoWorktree, isInAutoWorktree, getAutoWorktreePath, mergeMilestoneToMain, autoWorktreeBranch, checkResourcesStale, escapeStaleWorktree, } from "./auto-worktree.js";
|
|
53
52
|
import { pruneQueueOrder } from "./queue-order.js";
|
|
54
53
|
import { startCommandPolling as _startCommandPolling, isRemoteConfigured } from "../remote-questions/manager.js";
|
|
55
54
|
import { debugLog, isDebugEnabled, writeDebugSummary } from "./debug-logger.js";
|
|
@@ -61,9 +60,9 @@ import { recoverFailedMigration } from "./migrate-external.js";
|
|
|
61
60
|
import { initRegistry, convertDispatchRules } from "./rule-registry.js";
|
|
62
61
|
import { emitJournalEvent as _emitJournalEvent } from "./journal.js";
|
|
63
62
|
import { isClosedStatus } from "./status-guards.js";
|
|
64
|
-
import { updateProgressWidget as _updateProgressWidget, updateSliceProgressCache, clearSliceProgressCache, } from "./auto-dashboard.js";
|
|
63
|
+
import { updateProgressWidget as _updateProgressWidget, setCompletionProgressWidget, setAutoOutcomeWidget, updateSliceProgressCache, clearSliceProgressCache, unitVerb, } from "./auto-dashboard.js";
|
|
65
64
|
import { registerSigtermHandler as _registerSigtermHandler, deregisterSigtermHandler as _deregisterSigtermHandler, } from "./auto-supervisor.js";
|
|
66
|
-
import { isDbAvailable, getMilestone } from "./gsd-db.js";
|
|
65
|
+
import { isDbAvailable, getMilestone, getMilestoneSlices } from "./gsd-db.js";
|
|
67
66
|
import { markLatestActiveForWorkerCanceled } from "./db/unit-dispatches.js";
|
|
68
67
|
import { writeUnitRuntimeRecord } from "./unit-runtime.js";
|
|
69
68
|
import { countPendingCaptures } from "./captures.js";
|
|
@@ -93,6 +92,7 @@ import { compileUnitToolContract } from "./tool-contract.js";
|
|
|
93
92
|
import { createWorktreeSafetyModule } from "./worktree-safety.js";
|
|
94
93
|
import { resolveManifest } from "./unit-context-manifest.js";
|
|
95
94
|
import { classifyFailure } from "./recovery-classification.js";
|
|
95
|
+
import { supportsStructuredQuestions } from "./workflow-mcp.js";
|
|
96
96
|
import { WorktreeLifecycle, } from "./worktree-lifecycle.js";
|
|
97
97
|
import { WorktreeStateProjection } from "./worktree-state-projection.js";
|
|
98
98
|
import { reorderForCaching } from "./prompt-ordering.js";
|
|
@@ -253,11 +253,10 @@ function synthesizePausedSessionRecovery(basePath, unitType, unitId, sessionFile
|
|
|
253
253
|
export function _synthesizePausedSessionRecoveryForTest(basePath, unitType, unitId, sessionFile) {
|
|
254
254
|
return synthesizePausedSessionRecovery(basePath, unitType, unitId, sessionFile);
|
|
255
255
|
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
}
|
|
256
|
+
// `_resolvePausedResumeBasePathForTest` was retired in ADR-016 phase 2 / B3
|
|
257
|
+
// (#5621). Production callers go through
|
|
258
|
+
// `WorktreeLifecycle.resumeFromPausedSession`; the pure helper for tests is
|
|
259
|
+
// `resolvePausedResumeBasePath` exported from `worktree-lifecycle.ts`.
|
|
261
260
|
const DETACHED_AUTO_KEEPALIVE_INTERVAL_MS = 30_000;
|
|
262
261
|
function withDetachedAutoKeepalive(run) {
|
|
263
262
|
const keepAlive = setInterval(() => { }, DETACHED_AUTO_KEEPALIVE_INTERVAL_MS);
|
|
@@ -415,6 +414,9 @@ export function getAutoDashboardData() {
|
|
|
415
414
|
export function isAutoActive() {
|
|
416
415
|
return s.active;
|
|
417
416
|
}
|
|
417
|
+
export function isAutoCompletionStopInProgress() {
|
|
418
|
+
return s.completionStopInProgress;
|
|
419
|
+
}
|
|
418
420
|
/** Test-only seam for validating auto-mode guards (#4704). Do not use in production code. */
|
|
419
421
|
export function _setAutoActiveForTest(active) {
|
|
420
422
|
s.active = active;
|
|
@@ -611,6 +613,21 @@ function buildSnapshotOpts(_unitType, _unitId) {
|
|
|
611
613
|
...(s.currentUnitRouting ?? {}),
|
|
612
614
|
};
|
|
613
615
|
}
|
|
616
|
+
function currentUnitLabel() {
|
|
617
|
+
if (!s.currentUnit)
|
|
618
|
+
return null;
|
|
619
|
+
return `${unitVerb(s.currentUnit.type)} ${s.currentUnit.id}`;
|
|
620
|
+
}
|
|
621
|
+
function setLifecycleOutcome(ctx, input) {
|
|
622
|
+
if (!ctx?.hasUI)
|
|
623
|
+
return;
|
|
624
|
+
const { unitLabel: unitLabelOverride, ...rest } = input;
|
|
625
|
+
setAutoOutcomeWidget(ctx, {
|
|
626
|
+
...rest,
|
|
627
|
+
unitLabel: unitLabelOverride !== undefined ? unitLabelOverride : currentUnitLabel(),
|
|
628
|
+
startedAt: s.autoStartTime,
|
|
629
|
+
});
|
|
630
|
+
}
|
|
614
631
|
function handleLostSessionLock(ctx, lockStatus) {
|
|
615
632
|
debugLog("session-lock-lost", {
|
|
616
633
|
lockBase: lockBase(),
|
|
@@ -691,32 +708,76 @@ export async function cleanupAfterLoopExit(ctx) {
|
|
|
691
708
|
if (!s.paused) {
|
|
692
709
|
ctx.ui.setStatus("gsd-auto", undefined);
|
|
693
710
|
ctx.ui.setWidget("gsd-progress", undefined);
|
|
711
|
+
if (s.completionStopInProgress) {
|
|
712
|
+
s.completionStopInProgress = false;
|
|
713
|
+
}
|
|
694
714
|
initHealthWidget(ctx);
|
|
695
715
|
}
|
|
696
|
-
//
|
|
716
|
+
// ADR-016 phase 3 (#5693): the stop-path basePath restore + chdir routes
|
|
717
|
+
// through `Lifecycle.restoreToProjectRoot()`, the sole owner of both
|
|
718
|
+
// `s.basePath` mutation and the paired `process.chdir` for auto-loop
|
|
719
|
+
// transitions. The verb assigns `s.basePath` before any throwable work, so
|
|
720
|
+
// a thrown error still leaves basePath restored.
|
|
697
721
|
if (s.originalBasePath) {
|
|
698
|
-
s.basePath = s.originalBasePath;
|
|
699
722
|
try {
|
|
700
|
-
|
|
723
|
+
buildLifecycle().restoreToProjectRoot();
|
|
701
724
|
}
|
|
702
725
|
catch (err) {
|
|
703
|
-
|
|
704
|
-
logWarning("engine", `chdir failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
|
|
726
|
+
logWarning("engine", `restore project root failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
|
|
705
727
|
}
|
|
706
728
|
}
|
|
707
729
|
if (s.originalBasePath && s.cmdCtx) {
|
|
708
|
-
const result = await rerootCommandSession(s.cmdCtx, s.
|
|
730
|
+
const result = await rerootCommandSession(s.cmdCtx, s.originalBasePath);
|
|
709
731
|
if (result.status === "cancelled") {
|
|
710
|
-
logWarning("engine", "post-loop session re-root was cancelled", { file: "auto.ts", basePath: s.
|
|
732
|
+
logWarning("engine", "post-loop session re-root was cancelled", { file: "auto.ts", basePath: s.originalBasePath });
|
|
711
733
|
}
|
|
712
734
|
else if (result.status === "failed") {
|
|
713
|
-
logWarning("engine", `post-loop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.
|
|
735
|
+
logWarning("engine", `post-loop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.originalBasePath });
|
|
714
736
|
}
|
|
715
737
|
}
|
|
716
738
|
}
|
|
717
739
|
export function _cleanupAfterLoopExitForTest(ctx) {
|
|
718
740
|
return cleanupAfterLoopExit(ctx);
|
|
719
741
|
}
|
|
742
|
+
function normalizeFrontmatterList(value) {
|
|
743
|
+
if (!Array.isArray(value))
|
|
744
|
+
return [];
|
|
745
|
+
return value
|
|
746
|
+
.map(item => typeof item === "string" ? item.trim() : "")
|
|
747
|
+
.filter(item => item.length > 0 && item !== "(none)");
|
|
748
|
+
}
|
|
749
|
+
function firstBoldParagraph(body) {
|
|
750
|
+
const match = body.match(/\*\*([^*\n][\s\S]*?)\*\*/);
|
|
751
|
+
return match?.[1]?.replace(/\s+/g, " ").trim() || undefined;
|
|
752
|
+
}
|
|
753
|
+
function loadMilestoneCompletionRollup(basePath, milestoneId) {
|
|
754
|
+
if (!milestoneId)
|
|
755
|
+
return {};
|
|
756
|
+
const summaryPath = resolveMilestoneFile(basePath, milestoneId, "SUMMARY");
|
|
757
|
+
if (!summaryPath || !existsSync(summaryPath))
|
|
758
|
+
return {};
|
|
759
|
+
try {
|
|
760
|
+
const raw = readFileSync(summaryPath, "utf-8");
|
|
761
|
+
const [frontmatterLines, body] = splitFrontmatter(raw);
|
|
762
|
+
const frontmatter = frontmatterLines ? parseFrontmatterMap(frontmatterLines) : {};
|
|
763
|
+
return {
|
|
764
|
+
milestoneTitle: typeof frontmatter.title === "string" ? frontmatter.title : undefined,
|
|
765
|
+
oneLiner: firstBoldParagraph(body),
|
|
766
|
+
successCriteriaResults: extractSection(body, "Success Criteria Results") ?? undefined,
|
|
767
|
+
definitionOfDoneResults: extractSection(body, "Definition of Done Results") ?? undefined,
|
|
768
|
+
requirementOutcomes: extractSection(body, "Requirement Outcomes") ?? undefined,
|
|
769
|
+
deviations: extractSection(body, "Deviations") ?? undefined,
|
|
770
|
+
followUps: extractSection(body, "Follow-ups") ?? undefined,
|
|
771
|
+
keyDecisions: normalizeFrontmatterList(frontmatter.key_decisions),
|
|
772
|
+
keyFiles: normalizeFrontmatterList(frontmatter.key_files),
|
|
773
|
+
lessonsLearned: normalizeFrontmatterList(frontmatter.lessons_learned),
|
|
774
|
+
};
|
|
775
|
+
}
|
|
776
|
+
catch (err) {
|
|
777
|
+
logWarning("dashboard", `completion roll-up summary read failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
778
|
+
return {};
|
|
779
|
+
}
|
|
780
|
+
}
|
|
720
781
|
export function _resolveAutoWorktreeExitActionForTest(currentMilestoneId, milestoneMergedInPhases, milestoneComplete) {
|
|
721
782
|
const action = _selectStopAutoWorktreeExit({
|
|
722
783
|
currentMilestoneId: currentMilestoneId ?? null,
|
|
@@ -725,15 +786,16 @@ export function _resolveAutoWorktreeExitActionForTest(currentMilestoneId, milest
|
|
|
725
786
|
});
|
|
726
787
|
return action === "none" ? "skip" : action;
|
|
727
788
|
}
|
|
728
|
-
export async function stopAuto(ctx, pi, reason) {
|
|
789
|
+
export async function stopAuto(ctx, pi, reason, options = {}) {
|
|
729
790
|
if (!s.active && !s.paused)
|
|
730
791
|
return;
|
|
731
792
|
const loadedPreferences = loadEffectiveGSDPreferences(s.basePath || undefined)?.preferences;
|
|
732
793
|
const reasonSuffix = reason ? ` — ${reason}` : "";
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
//
|
|
736
|
-
//
|
|
794
|
+
const preserveCompletionSurface = Boolean(options.completionWidget);
|
|
795
|
+
s.completionStopInProgress = preserveCompletionSurface;
|
|
796
|
+
// #4764 — telemetry: record the exit reason, isolation mode, whether an auto
|
|
797
|
+
// worktree was active, and whether the current milestone was merged before
|
|
798
|
+
// stopAuto. The unmerged-work warning is only meaningful for real worktrees.
|
|
737
799
|
try {
|
|
738
800
|
const { emitAutoExit } = await import("./worktree-telemetry.js");
|
|
739
801
|
// Normalize the free-form reason to a closed set so the telemetry
|
|
@@ -755,10 +817,13 @@ export async function stopAuto(ctx, pi, reason) {
|
|
|
755
817
|
: rawReason === "stop" || rawReason === "pause"
|
|
756
818
|
? rawReason
|
|
757
819
|
: "other";
|
|
758
|
-
|
|
820
|
+
const telemetryBase = s.originalBasePath || s.basePath;
|
|
821
|
+
emitAutoExit(telemetryBase, {
|
|
759
822
|
reason: normalizedReason,
|
|
760
823
|
milestoneId: s.currentMilestoneId ?? undefined,
|
|
761
824
|
milestoneMerged: s.milestoneMergedInPhases === true,
|
|
825
|
+
isolationMode: getIsolationMode(telemetryBase),
|
|
826
|
+
worktreeActive: isInAutoWorktree(s.basePath),
|
|
762
827
|
});
|
|
763
828
|
}
|
|
764
829
|
catch (err) {
|
|
@@ -902,6 +967,21 @@ export async function stopAuto(ctx, pi, reason) {
|
|
|
902
967
|
});
|
|
903
968
|
}
|
|
904
969
|
}
|
|
970
|
+
// Pre-compute completion widget slice counts while the DB is still open.
|
|
971
|
+
// Step 8 runs after closeDatabase(), so DB-backed slice lookups must happen here.
|
|
972
|
+
const completionMilestoneId = options.completionWidget?.milestoneId ?? s.currentMilestoneId;
|
|
973
|
+
let completedSlices = null;
|
|
974
|
+
let totalSlices = null;
|
|
975
|
+
if (preserveCompletionSurface && options.completionWidget && completionMilestoneId && isDbAvailable()) {
|
|
976
|
+
try {
|
|
977
|
+
const slices = getMilestoneSlices(completionMilestoneId);
|
|
978
|
+
completedSlices = slices.filter(slice => isClosedStatus(slice.status)).length;
|
|
979
|
+
totalSlices = slices.length;
|
|
980
|
+
}
|
|
981
|
+
catch (err) {
|
|
982
|
+
logWarning("dashboard", `completion slice stats lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
983
|
+
}
|
|
984
|
+
}
|
|
905
985
|
// ── Step 6: DB cleanup ──
|
|
906
986
|
if (isDbAvailable()) {
|
|
907
987
|
try {
|
|
@@ -914,49 +994,105 @@ export async function stopAuto(ctx, pi, reason) {
|
|
|
914
994
|
});
|
|
915
995
|
}
|
|
916
996
|
}
|
|
917
|
-
// ── Step 7: Restore basePath and chdir ──
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
logWarning("engine", `chdir failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
|
|
927
|
-
}
|
|
997
|
+
// ── Step 7: Restore basePath and chdir (ADR-016 phase 3, #5693) ──
|
|
998
|
+
// `restoreToProjectRoot` owns both s.basePath restore and process.chdir;
|
|
999
|
+
// no paired chdir is needed at the call site.
|
|
1000
|
+
if (s.originalBasePath) {
|
|
1001
|
+
try {
|
|
1002
|
+
buildLifecycle().restoreToProjectRoot();
|
|
1003
|
+
}
|
|
1004
|
+
catch (e) {
|
|
1005
|
+
debugLog("stop-cleanup-basepath", { error: e instanceof Error ? e.message : String(e) });
|
|
928
1006
|
}
|
|
929
|
-
}
|
|
930
|
-
catch (e) {
|
|
931
|
-
debugLog("stop-cleanup-basepath", { error: e instanceof Error ? e.message : String(e) });
|
|
932
1007
|
}
|
|
933
1008
|
// Re-root the active command session/tool runtime after worktree teardown.
|
|
934
1009
|
// mergeAndExit restores process.cwd(), but AgentSession has already captured
|
|
935
1010
|
// its own cwd for tools and system prompt; refresh it before returning to the
|
|
936
1011
|
// user so follow-up commands do not target a removed milestone worktree.
|
|
937
1012
|
if (s.originalBasePath && ctx && s.cmdCtx) {
|
|
938
|
-
const result = await rerootCommandSession(s.cmdCtx, s.
|
|
1013
|
+
const result = await rerootCommandSession(s.cmdCtx, s.originalBasePath);
|
|
939
1014
|
if (result.status === "cancelled") {
|
|
940
|
-
logWarning("engine", "post-stop session re-root was cancelled", { file: "auto.ts", basePath: s.
|
|
1015
|
+
logWarning("engine", "post-stop session re-root was cancelled", { file: "auto.ts", basePath: s.originalBasePath });
|
|
941
1016
|
}
|
|
942
1017
|
else if (result.status === "failed") {
|
|
943
|
-
logWarning("engine", `post-stop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.
|
|
1018
|
+
logWarning("engine", `post-stop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.originalBasePath });
|
|
944
1019
|
}
|
|
945
1020
|
}
|
|
946
1021
|
// ── Step 8: Ledger notification ──
|
|
947
1022
|
try {
|
|
948
1023
|
const ledger = getLedger();
|
|
1024
|
+
const isAllComplete = reason === "All milestones complete";
|
|
1025
|
+
const isMilestoneComplete = /^Milestone\s+\S+\s+complete$/i.test(reason ?? "");
|
|
1026
|
+
const notificationPrefix = isAllComplete
|
|
1027
|
+
? "All milestones complete"
|
|
1028
|
+
: isMilestoneComplete
|
|
1029
|
+
? `${reason}. Auto-mode finished this milestone`
|
|
1030
|
+
: `Auto-mode stopped${reasonSuffix}`;
|
|
949
1031
|
if (ledger && ledger.units.length > 0) {
|
|
950
1032
|
const totals = getProjectTotals(ledger.units);
|
|
951
|
-
ctx?.ui.notify(
|
|
1033
|
+
ctx?.ui.notify(`${notificationPrefix}. Session: ${formatCost(totals.cost)} · ${formatTokenCount(totals.tokens.total)} tokens · ${ledger.units.length} units`, "info");
|
|
952
1034
|
}
|
|
953
1035
|
else {
|
|
954
|
-
ctx?.ui.notify(
|
|
1036
|
+
ctx?.ui.notify(`${notificationPrefix}.`, "info");
|
|
955
1037
|
}
|
|
956
1038
|
}
|
|
957
1039
|
catch (e) {
|
|
958
1040
|
debugLog("stop-cleanup-ledger", { error: e instanceof Error ? e.message : String(e) });
|
|
959
1041
|
}
|
|
1042
|
+
if (preserveCompletionSurface && ctx && options.completionWidget) {
|
|
1043
|
+
const ledger = getLedger();
|
|
1044
|
+
const units = ledger?.units ?? [];
|
|
1045
|
+
const totals = units.length > 0 ? getProjectTotals(units) : null;
|
|
1046
|
+
let totalInput = 0;
|
|
1047
|
+
let totalCacheRead = 0;
|
|
1048
|
+
try {
|
|
1049
|
+
for (const entry of s.cmdCtx?.sessionManager?.getEntries?.() ?? []) {
|
|
1050
|
+
if (entry.type === "message") {
|
|
1051
|
+
const msgEntry = entry;
|
|
1052
|
+
if (msgEntry.message?.role === "assistant") {
|
|
1053
|
+
const usage = msgEntry.message.usage;
|
|
1054
|
+
if (usage) {
|
|
1055
|
+
totalInput += usage.input || 0;
|
|
1056
|
+
totalCacheRead += usage.cacheRead || 0;
|
|
1057
|
+
}
|
|
1058
|
+
}
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
}
|
|
1062
|
+
catch (err) {
|
|
1063
|
+
logWarning("dashboard", `completion stats lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1064
|
+
}
|
|
1065
|
+
const contextUsage = s.cmdCtx?.getContextUsage?.();
|
|
1066
|
+
const milestoneId = completionMilestoneId;
|
|
1067
|
+
const rollup = loadMilestoneCompletionRollup(s.originalBasePath || s.basePath, milestoneId);
|
|
1068
|
+
setCompletionProgressWidget(ctx, {
|
|
1069
|
+
milestoneId,
|
|
1070
|
+
milestoneTitle: options.completionWidget.milestoneTitle ?? rollup.milestoneTitle,
|
|
1071
|
+
oneLiner: rollup.oneLiner,
|
|
1072
|
+
successCriteriaResults: rollup.successCriteriaResults,
|
|
1073
|
+
definitionOfDoneResults: rollup.definitionOfDoneResults,
|
|
1074
|
+
requirementOutcomes: rollup.requirementOutcomes,
|
|
1075
|
+
deviations: rollup.deviations,
|
|
1076
|
+
followUps: rollup.followUps,
|
|
1077
|
+
keyDecisions: rollup.keyDecisions,
|
|
1078
|
+
keyFiles: rollup.keyFiles,
|
|
1079
|
+
lessonsLearned: rollup.lessonsLearned,
|
|
1080
|
+
reason: reason ?? "Milestone complete",
|
|
1081
|
+
startedAt: s.autoStartTime,
|
|
1082
|
+
totalCost: totals?.cost ?? 0,
|
|
1083
|
+
totalTokens: totals?.tokens.total ?? 0,
|
|
1084
|
+
unitCount: units.length,
|
|
1085
|
+
cacheHitRate: totalCacheRead + totalInput > 0
|
|
1086
|
+
? (totalCacheRead / (totalCacheRead + totalInput)) * 100
|
|
1087
|
+
: null,
|
|
1088
|
+
contextPercent: contextUsage?.percent ?? null,
|
|
1089
|
+
contextWindow: contextUsage?.contextWindow ?? s.cmdCtx?.model?.contextWindow ?? null,
|
|
1090
|
+
completedSlices,
|
|
1091
|
+
totalSlices,
|
|
1092
|
+
allMilestonesComplete: options.completionWidget.allMilestonesComplete,
|
|
1093
|
+
basePath: s.originalBasePath || s.basePath || null,
|
|
1094
|
+
});
|
|
1095
|
+
}
|
|
960
1096
|
// ── Step 9: Cmux sidebar / event log ──
|
|
961
1097
|
try {
|
|
962
1098
|
pi?.events.emit(CMUX_CHANNELS.SIDEBAR, { action: "clear", preferences: loadedPreferences });
|
|
@@ -1047,9 +1183,21 @@ export async function stopAuto(ctx, pi, reason) {
|
|
|
1047
1183
|
resetProactiveHealing();
|
|
1048
1184
|
// UI cleanup
|
|
1049
1185
|
ctx?.ui.setStatus("gsd-auto", undefined);
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1186
|
+
if (!preserveCompletionSurface) {
|
|
1187
|
+
ctx?.ui.setWidget("gsd-progress", undefined);
|
|
1188
|
+
const status = reason?.startsWith("Blocked:") ? "blocked" : reason?.toLowerCase().includes("fail") ? "failed" : "stopped";
|
|
1189
|
+
setLifecycleOutcome(ctx, {
|
|
1190
|
+
status,
|
|
1191
|
+
title: status === "blocked" ? "Auto-mode blocked" : status === "failed" ? "Auto-mode stopped with an issue" : "Auto-mode stopped",
|
|
1192
|
+
detail: reason ?? "Auto-mode stopped.",
|
|
1193
|
+
nextAction: status === "blocked"
|
|
1194
|
+
? "Fix the blocker, then run /gsd auto to resume."
|
|
1195
|
+
: "Run /gsd status for the current project state, or /gsd auto to continue.",
|
|
1196
|
+
commands: ["/gsd status for overview", "/gsd auto to run", "/gsd visualize to inspect", "/gsd notifications for history"],
|
|
1197
|
+
});
|
|
1198
|
+
if (ctx)
|
|
1199
|
+
initHealthWidget(ctx);
|
|
1200
|
+
}
|
|
1053
1201
|
restoreProjectRootEnv();
|
|
1054
1202
|
restoreMilestoneLockEnv();
|
|
1055
1203
|
// Drop the active-tool baseline so a subsequent /gsd auto run on the
|
|
@@ -1065,7 +1213,7 @@ export async function stopAuto(ctx, pi, reason) {
|
|
|
1065
1213
|
debugLog("stop-orchestration-stop", { error: err instanceof Error ? err.message : String(err) });
|
|
1066
1214
|
}
|
|
1067
1215
|
// Reset all session state in one call
|
|
1068
|
-
s.
|
|
1216
|
+
s.resetAfterStop({ preserveCompletionSurface });
|
|
1069
1217
|
}
|
|
1070
1218
|
}
|
|
1071
1219
|
export function _selectStopAutoWorktreeExit(args) {
|
|
@@ -1126,6 +1274,7 @@ export async function pauseAuto(ctx, _pi, _errorContext) {
|
|
|
1126
1274
|
// Non-fatal — resume will still work via full bootstrap, just without worktree context
|
|
1127
1275
|
logWarning("engine", `paused-session DB write failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
|
|
1128
1276
|
}
|
|
1277
|
+
const pausedUnitLabel = currentUnitLabel();
|
|
1129
1278
|
// Close out the current unit so its runtime record doesn't stay at "dispatched"
|
|
1130
1279
|
if (s.currentUnit && ctx) {
|
|
1131
1280
|
try {
|
|
@@ -1173,9 +1322,17 @@ export async function pauseAuto(ctx, _pi, _errorContext) {
|
|
|
1173
1322
|
s.verificationRetryCount.clear();
|
|
1174
1323
|
ctx?.ui.setStatus("gsd-auto", "paused");
|
|
1175
1324
|
ctx?.ui.setWidget("gsd-progress", undefined);
|
|
1325
|
+
const resumeCmd = s.stepMode ? "/gsd next" : "/gsd auto";
|
|
1326
|
+
setLifecycleOutcome(ctx, {
|
|
1327
|
+
status: "paused",
|
|
1328
|
+
title: `${s.stepMode ? "Step" : "Auto"}-mode paused`,
|
|
1329
|
+
detail: _errorContext?.message ?? "Paused by user request.",
|
|
1330
|
+
nextAction: `Type to steer, or run ${resumeCmd} to resume.`,
|
|
1331
|
+
commands: [resumeCmd, "/gsd status for overview", "/gsd notifications for history"],
|
|
1332
|
+
unitLabel: pausedUnitLabel,
|
|
1333
|
+
});
|
|
1176
1334
|
if (ctx)
|
|
1177
1335
|
initHealthWidget(ctx);
|
|
1178
|
-
const resumeCmd = s.stepMode ? "/gsd next" : "/gsd auto";
|
|
1179
1336
|
ctx?.ui.notify(`${s.stepMode ? "Step" : "Auto"}-mode paused (Escape). Type to interact, or ${resumeCmd} to resume.`, "info");
|
|
1180
1337
|
}
|
|
1181
1338
|
/**
|
|
@@ -1186,28 +1343,101 @@ export async function pauseAuto(ctx, _pi, _errorContext) {
|
|
|
1186
1343
|
* deps bag is intentionally focused — Lifecycle does not see the wider auto-
|
|
1187
1344
|
* mode dependency graph.
|
|
1188
1345
|
*/
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1346
|
+
/**
|
|
1347
|
+
* Construct a `WorktreeLifecycleDeps` bag without binding to any session.
|
|
1348
|
+
*
|
|
1349
|
+
* Exported so session-less callers (currently `parallel-merge.ts`) can build
|
|
1350
|
+
* the same deps and call `mergeMilestoneStandalone` through the Worktree
|
|
1351
|
+
* Lifecycle Module instead of bypassing it (ADR-016 phase 2 / A2).
|
|
1352
|
+
*/
|
|
1353
|
+
export function buildWorktreeLifecycleDeps() {
|
|
1354
|
+
// ADR-016 phase 2 / C-track close-out:
|
|
1355
|
+
// C1 (#5624) — fs + git-CLI primitives inlined
|
|
1356
|
+
// C2 (#5625) — worktree-manager helpers inlined
|
|
1357
|
+
// C3 (#5626) — cache + preferences + paths inlined
|
|
1358
|
+
// C4 (#5627) — GitServiceImpl constructor → gitServiceFactory
|
|
1359
|
+
//
|
|
1360
|
+
// Final WorktreeLifecycleDeps shape: 3 fields (gitServiceFactory,
|
|
1361
|
+
// worktreeProjection, mergeMilestoneToMain). Down from 18 at slice-7
|
|
1362
|
+
// closure.
|
|
1363
|
+
return {
|
|
1364
|
+
gitServiceFactory: (basePath) => {
|
|
1365
|
+
const gitConfig = loadEffectiveGSDPreferences()?.preferences?.git ?? {};
|
|
1366
|
+
return new GitServiceImpl(basePath, gitConfig);
|
|
1367
|
+
},
|
|
1199
1368
|
worktreeProjection: new WorktreeStateProjection(),
|
|
1200
|
-
isInAutoWorktree,
|
|
1201
|
-
autoCommitCurrentBranch,
|
|
1202
|
-
autoWorktreeBranch,
|
|
1203
|
-
teardownAutoWorktree,
|
|
1204
1369
|
mergeMilestoneToMain,
|
|
1205
|
-
getCurrentBranch,
|
|
1206
|
-
checkoutBranch: nativeCheckoutBranch,
|
|
1207
|
-
resolveMilestoneFile,
|
|
1208
|
-
readFileSync: (path, encoding) => readFileSync(path, encoding),
|
|
1209
1370
|
};
|
|
1210
|
-
|
|
1371
|
+
}
|
|
1372
|
+
function buildLifecycle() {
|
|
1373
|
+
return new WorktreeLifecycle(s, buildWorktreeLifecycleDeps());
|
|
1374
|
+
}
|
|
1375
|
+
/**
|
|
1376
|
+
* Build the production `DispatchAdapter` used by `createWiredAutoOrchestrationModule`.
|
|
1377
|
+
*
|
|
1378
|
+
* Exported so tests can verify parity with `runDispatch`'s `resolveDispatch` call —
|
|
1379
|
+
* the wired adapter must derive `structuredQuestionsAvailable`, `sessionContextWindow`,
|
|
1380
|
+
* `sessionProvider`, and `modelRegistry` the same way phases.ts:runDispatch does.
|
|
1381
|
+
*/
|
|
1382
|
+
export function createWiredDispatchAdapter(ctx, pi, dispatchBasePath) {
|
|
1383
|
+
return {
|
|
1384
|
+
async decideNextUnit(input) {
|
|
1385
|
+
const state = input.stateSnapshot;
|
|
1386
|
+
const active = state.activeMilestone;
|
|
1387
|
+
if (!active)
|
|
1388
|
+
return null;
|
|
1389
|
+
const prefs = loadEffectiveGSDPreferences(dispatchBasePath)?.preferences;
|
|
1390
|
+
// Derive session-derived dispatch inputs the same way phases.ts:runDispatch does
|
|
1391
|
+
// (#5789). Prefer caller-supplied values when present so test harnesses and
|
|
1392
|
+
// alternative wirings can inject deterministic snapshots; otherwise pull from
|
|
1393
|
+
// the captured pi/ctx references.
|
|
1394
|
+
const sessionProvider = input.sessionProvider ?? ctx.model?.provider;
|
|
1395
|
+
const sessionContextWindow = input.sessionContextWindow ?? ctx.model?.contextWindow;
|
|
1396
|
+
const modelRegistry = input.modelRegistry ?? ctx.modelRegistry;
|
|
1397
|
+
const authMode = sessionProvider && typeof ctx.modelRegistry?.getProviderAuthMode === "function"
|
|
1398
|
+
? ctx.modelRegistry.getProviderAuthMode(sessionProvider)
|
|
1399
|
+
: undefined;
|
|
1400
|
+
const activeTools = typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [];
|
|
1401
|
+
// Mirrors runDispatch: deep-planning keeps approval gates in plain chat
|
|
1402
|
+
// because structured questions can be cancelled outside the chat turn on
|
|
1403
|
+
// some transports.
|
|
1404
|
+
const structuredQuestionsAvailable = input.structuredQuestionsAvailable ??
|
|
1405
|
+
(prefs?.planning_depth === "deep"
|
|
1406
|
+
? "false"
|
|
1407
|
+
: supportsStructuredQuestions(activeTools, {
|
|
1408
|
+
authMode,
|
|
1409
|
+
baseUrl: ctx.model?.baseUrl,
|
|
1410
|
+
})
|
|
1411
|
+
? "true"
|
|
1412
|
+
: "false");
|
|
1413
|
+
const action = await resolveDispatch({
|
|
1414
|
+
basePath: dispatchBasePath,
|
|
1415
|
+
mid: active.id,
|
|
1416
|
+
midTitle: active.title,
|
|
1417
|
+
state,
|
|
1418
|
+
prefs,
|
|
1419
|
+
structuredQuestionsAvailable,
|
|
1420
|
+
sessionContextWindow,
|
|
1421
|
+
sessionProvider,
|
|
1422
|
+
modelRegistry,
|
|
1423
|
+
});
|
|
1424
|
+
if (action.action === "stop") {
|
|
1425
|
+
return {
|
|
1426
|
+
kind: "blocked",
|
|
1427
|
+
reason: action.reason,
|
|
1428
|
+
action: action.level === "warning" ? "pause" : "stop",
|
|
1429
|
+
};
|
|
1430
|
+
}
|
|
1431
|
+
if (action.action !== "dispatch")
|
|
1432
|
+
return null;
|
|
1433
|
+
return {
|
|
1434
|
+
unitType: action.unitType,
|
|
1435
|
+
unitId: action.unitId,
|
|
1436
|
+
reason: action.matchedRule ?? "dispatch",
|
|
1437
|
+
preconditions: [],
|
|
1438
|
+
};
|
|
1439
|
+
},
|
|
1440
|
+
};
|
|
1211
1441
|
}
|
|
1212
1442
|
/**
|
|
1213
1443
|
* Thin entry glue for the new Auto Orchestration module.
|
|
@@ -1216,51 +1446,31 @@ function buildLifecycle() {
|
|
|
1216
1446
|
* no behavior changes to the existing auto loop. It provides a concrete seam
|
|
1217
1447
|
* the next refactor steps can adopt incrementally.
|
|
1218
1448
|
*/
|
|
1219
|
-
export function createWiredAutoOrchestrationModule(ctx,
|
|
1449
|
+
export function createWiredAutoOrchestrationModule(ctx, pi, dispatchBasePath, runtimeBasePath = resolveProjectRoot(dispatchBasePath)) {
|
|
1220
1450
|
const flowId = `auto-orchestrator-${Date.now()}`;
|
|
1221
1451
|
let seq = 0;
|
|
1222
1452
|
const deps = {
|
|
1223
1453
|
stateReconciliation: {
|
|
1224
1454
|
async reconcileBeforeDispatch() {
|
|
1225
1455
|
const result = await reconcileBeforeDispatch(dispatchBasePath);
|
|
1226
|
-
if (
|
|
1456
|
+
if (result.blockers.length > 0) {
|
|
1227
1457
|
return {
|
|
1228
1458
|
ok: false,
|
|
1229
|
-
reason: result.
|
|
1459
|
+
reason: result.blockers[0],
|
|
1230
1460
|
stateSnapshot: result.stateSnapshot,
|
|
1231
1461
|
};
|
|
1232
1462
|
}
|
|
1463
|
+
const repairedKinds = result.repaired.map((d) => d.kind);
|
|
1233
1464
|
return {
|
|
1234
1465
|
ok: true,
|
|
1235
|
-
reason:
|
|
1466
|
+
reason: repairedKinds.length > 0
|
|
1467
|
+
? `repaired: ${repairedKinds.join(", ")}`
|
|
1468
|
+
: "clean",
|
|
1236
1469
|
stateSnapshot: result.stateSnapshot,
|
|
1237
1470
|
};
|
|
1238
1471
|
},
|
|
1239
1472
|
},
|
|
1240
|
-
dispatch:
|
|
1241
|
-
async decideNextUnit(input) {
|
|
1242
|
-
const state = input.stateSnapshot;
|
|
1243
|
-
const active = state.activeMilestone;
|
|
1244
|
-
if (!active)
|
|
1245
|
-
return null;
|
|
1246
|
-
const prefs = loadEffectiveGSDPreferences(dispatchBasePath)?.preferences;
|
|
1247
|
-
const action = await resolveDispatch({
|
|
1248
|
-
basePath: dispatchBasePath,
|
|
1249
|
-
mid: active.id,
|
|
1250
|
-
midTitle: active.title,
|
|
1251
|
-
state,
|
|
1252
|
-
prefs,
|
|
1253
|
-
});
|
|
1254
|
-
if (action.action !== "dispatch")
|
|
1255
|
-
return null;
|
|
1256
|
-
return {
|
|
1257
|
-
unitType: action.unitType,
|
|
1258
|
-
unitId: action.unitId,
|
|
1259
|
-
reason: action.matchedRule ?? "dispatch",
|
|
1260
|
-
preconditions: [],
|
|
1261
|
-
};
|
|
1262
|
-
},
|
|
1263
|
-
},
|
|
1473
|
+
dispatch: createWiredDispatchAdapter(ctx, pi, dispatchBasePath),
|
|
1264
1474
|
recovery: {
|
|
1265
1475
|
async classifyAndRecover(input) {
|
|
1266
1476
|
const recovery = classifyFailure(input);
|
|
@@ -1309,12 +1519,26 @@ export function createWiredAutoOrchestrationModule(ctx, _pi, dispatchBasePath, r
|
|
|
1309
1519
|
async cleanupOnStop() { },
|
|
1310
1520
|
},
|
|
1311
1521
|
health: {
|
|
1522
|
+
checkResourcesStale() {
|
|
1523
|
+
return checkResourcesStale(s.resourceVersionOnStart);
|
|
1524
|
+
},
|
|
1312
1525
|
async preAdvanceGate() {
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1526
|
+
try {
|
|
1527
|
+
const gate = await preDispatchHealthGate(dispatchBasePath);
|
|
1528
|
+
if (gate.proceed) {
|
|
1529
|
+
return {
|
|
1530
|
+
kind: "pass",
|
|
1531
|
+
fixesApplied: gate.fixesApplied,
|
|
1532
|
+
};
|
|
1533
|
+
}
|
|
1534
|
+
return {
|
|
1535
|
+
kind: "fail",
|
|
1536
|
+
reason: gate.reason ?? "Pre-dispatch health check failed — run /gsd doctor for details.",
|
|
1537
|
+
};
|
|
1538
|
+
}
|
|
1539
|
+
catch (error) {
|
|
1540
|
+
return { kind: "threw", error };
|
|
1541
|
+
}
|
|
1318
1542
|
},
|
|
1319
1543
|
async postAdvanceRecord(result) {
|
|
1320
1544
|
if (result.kind === "error") {
|
|
@@ -1382,9 +1606,59 @@ export function createWiredAutoOrchestrationModule(ctx, _pi, dispatchBasePath, r
|
|
|
1382
1606
|
}
|
|
1383
1607
|
},
|
|
1384
1608
|
},
|
|
1609
|
+
uokGate: {
|
|
1610
|
+
async emit(input) {
|
|
1611
|
+
const prefs = loadEffectiveGSDPreferences(dispatchBasePath)?.preferences;
|
|
1612
|
+
const uokFlags = resolveUokFlags(prefs);
|
|
1613
|
+
if (!uokFlags.gates)
|
|
1614
|
+
return;
|
|
1615
|
+
const milestoneId = input.milestoneId ?? s.currentMilestoneId ?? undefined;
|
|
1616
|
+
try {
|
|
1617
|
+
const { UokGateRunner } = await import("./uok/gate-runner.js");
|
|
1618
|
+
const runner = new UokGateRunner();
|
|
1619
|
+
runner.register({
|
|
1620
|
+
id: input.gateId,
|
|
1621
|
+
type: input.gateType,
|
|
1622
|
+
execute: async () => ({
|
|
1623
|
+
outcome: input.outcome,
|
|
1624
|
+
failureClass: input.failureClass,
|
|
1625
|
+
rationale: input.rationale,
|
|
1626
|
+
findings: input.findings ?? "",
|
|
1627
|
+
}),
|
|
1628
|
+
});
|
|
1629
|
+
await runner.run(input.gateId, {
|
|
1630
|
+
basePath: dispatchBasePath,
|
|
1631
|
+
traceId: `pre-dispatch:${flowId}`,
|
|
1632
|
+
turnId: `orch-${seq}`,
|
|
1633
|
+
milestoneId,
|
|
1634
|
+
unitType: "pre-dispatch",
|
|
1635
|
+
unitId: `orch-${seq}`,
|
|
1636
|
+
});
|
|
1637
|
+
}
|
|
1638
|
+
catch (err) {
|
|
1639
|
+
logWarning("engine", `uok gate emit failed: ${getErrorMessage(err)}`, {
|
|
1640
|
+
file: "auto.ts",
|
|
1641
|
+
gateId: input.gateId,
|
|
1642
|
+
gateType: input.gateType,
|
|
1643
|
+
...(milestoneId ? { milestoneId } : {}),
|
|
1644
|
+
});
|
|
1645
|
+
}
|
|
1646
|
+
},
|
|
1647
|
+
},
|
|
1385
1648
|
};
|
|
1386
1649
|
return createAutoOrchestrator(deps);
|
|
1387
1650
|
}
|
|
1651
|
+
function notifyResumeBlocked(ctx, result) {
|
|
1652
|
+
const resumeCmd = s.stepMode ? "/gsd next" : "/gsd auto";
|
|
1653
|
+
ctx.ui.notify(`Auto-mode blocked: ${result.reason}. Fix and run ${resumeCmd} to resume.`, "warning");
|
|
1654
|
+
setLifecycleOutcome(ctx, {
|
|
1655
|
+
status: "blocked",
|
|
1656
|
+
title: "Auto-mode blocked",
|
|
1657
|
+
detail: result.reason,
|
|
1658
|
+
nextAction: `Fix the blocker, then run ${resumeCmd} to resume.`,
|
|
1659
|
+
commands: ["/gsd status for overview", `${resumeCmd} to resume`, "/gsd doctor to diagnose"],
|
|
1660
|
+
});
|
|
1661
|
+
}
|
|
1388
1662
|
function ensureOrchestrationModule(ctx, pi, basePath) {
|
|
1389
1663
|
s.orchestration = createWiredAutoOrchestrationModule(ctx, pi, basePath, lockBase());
|
|
1390
1664
|
}
|
|
@@ -1431,7 +1705,6 @@ function buildLoopDeps(pi) {
|
|
|
1431
1705
|
pruneQueueOrder,
|
|
1432
1706
|
isInAutoWorktree,
|
|
1433
1707
|
shouldUseWorktreeIsolation,
|
|
1434
|
-
mergeMilestoneToMain,
|
|
1435
1708
|
teardownAutoWorktree,
|
|
1436
1709
|
createAutoWorktree,
|
|
1437
1710
|
captureIntegrationBranch,
|
|
@@ -1670,7 +1943,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
1670
1943
|
// This closes the journal gap reported in #3348 where the worker wrote side
|
|
1671
1944
|
// effects (SUMMARY.md, DB updates) but died before emitting unit-end.
|
|
1672
1945
|
emitCrashRecoveredUnitEnd(base, freshStartAssessment.lock);
|
|
1673
|
-
|
|
1946
|
+
clearStaleWorkerLock(base);
|
|
1674
1947
|
}
|
|
1675
1948
|
if (!s.paused) {
|
|
1676
1949
|
s.pendingCrashRecovery =
|
|
@@ -1701,7 +1974,12 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
1701
1974
|
s.verbose = verboseMode;
|
|
1702
1975
|
s.stepMode = requestedStepMode;
|
|
1703
1976
|
s.cmdCtx = ctx;
|
|
1704
|
-
|
|
1977
|
+
// ADR-016 phase 2 / B2 (#5620): bootstrap basePath transition before
|
|
1978
|
+
// the resume path consults persisted worktree state. Defensive about
|
|
1979
|
+
// s.originalBasePath — the meta-restore above (line 2003 / 2055) may
|
|
1980
|
+
// have already populated it from paused metadata; the verb preserves
|
|
1981
|
+
// that value.
|
|
1982
|
+
buildLifecycle().adoptSessionRoot(base);
|
|
1705
1983
|
// ── Resume worktree: if the paused session was inside a milestone worktree,
|
|
1706
1984
|
// apply that path as the dispatch basePath immediately (#3723).
|
|
1707
1985
|
// This ensures the dispatch loop runs from the worktree directory even when
|
|
@@ -1713,7 +1991,8 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
1713
1991
|
if (resumeWorktreePath && !existsSync(resumeWorktreePath)) {
|
|
1714
1992
|
logWarning("session", `Worktree was expected at ${resumeWorktreePath} but is missing. Continuing in project-root mode. To restart with a fresh worktree, run /gsd-debug or recreate the milestone.`, { file: "auto.ts", milestoneId: s.currentMilestoneId ?? "" });
|
|
1715
1993
|
}
|
|
1716
|
-
|
|
1994
|
+
// ADR-016 phase 2 / B3 (#5621): paused-resume worktree-path adoption.
|
|
1995
|
+
buildLifecycle().resumeFromPausedSession(base, resumeWorktreePath);
|
|
1717
1996
|
// Rebuild scope now that s.basePath reflects the actual worktree (or project root).
|
|
1718
1997
|
rebuildScope(s.basePath, s.currentMilestoneId);
|
|
1719
1998
|
// Ensure the workflow-logger audit log is pinned to the project root
|
|
@@ -1727,6 +2006,8 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
1727
2006
|
initMetrics(base);
|
|
1728
2007
|
if (s.currentMilestoneId)
|
|
1729
2008
|
setActiveMilestoneId(base, s.currentMilestoneId);
|
|
2009
|
+
await openProjectDbIfPresent(base);
|
|
2010
|
+
registerAutoWorkerForSession(s, base);
|
|
1730
2011
|
// Re-register health level notification callback lost across process restart
|
|
1731
2012
|
setLevelChangeCallback((_from, to, summary) => {
|
|
1732
2013
|
const level = to === "red" ? "error" : to === "yellow" ? "warning" : "info";
|
|
@@ -1802,7 +2083,12 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
1802
2083
|
}
|
|
1803
2084
|
pi.events.emit(CMUX_CHANNELS.LOG, { preferences: loadEffectiveGSDPreferences(s.basePath || undefined)?.preferences, message: s.stepMode ? "Step-mode resumed." : "Auto-mode resumed.", level: "progress" });
|
|
1804
2085
|
try {
|
|
1805
|
-
await s.orchestration?.resume();
|
|
2086
|
+
const resumeResult = await s.orchestration?.resume();
|
|
2087
|
+
if (resumeResult?.kind === "blocked") {
|
|
2088
|
+
notifyResumeBlocked(ctx, resumeResult);
|
|
2089
|
+
await cleanupAfterLoopExit(ctx);
|
|
2090
|
+
return;
|
|
2091
|
+
}
|
|
1806
2092
|
}
|
|
1807
2093
|
catch (err) {
|
|
1808
2094
|
debugLog("resume-orchestration-resume", { error: err instanceof Error ? err.message : String(err) });
|
|
@@ -1823,6 +2109,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
1823
2109
|
const bootstrapDeps = {
|
|
1824
2110
|
shouldUseWorktreeIsolation,
|
|
1825
2111
|
registerSigtermHandler,
|
|
2112
|
+
registerAutoWorkerForSession: (projectRoot) => registerAutoWorkerForSession(s, projectRoot),
|
|
1826
2113
|
lockBase,
|
|
1827
2114
|
buildLifecycle,
|
|
1828
2115
|
};
|
|
@@ -1936,7 +2223,12 @@ export async function dispatchHookUnit(ctx, pi, hookName, triggerUnitType, trigg
|
|
|
1936
2223
|
s.currentUnit = null;
|
|
1937
2224
|
s.pendingQuickTasks = [];
|
|
1938
2225
|
}
|
|
1939
|
-
|
|
2226
|
+
// ADR-016 phase 2 / B2 (#5620): hook-trigger basePath transition. Treats
|
|
2227
|
+
// the trigger as a bootstrap variant — if the session is fresh,
|
|
2228
|
+
// `originalBasePath` gets set to `targetBasePath`; if the session was
|
|
2229
|
+
// already active with an established `originalBasePath`, the verb
|
|
2230
|
+
// preserves it.
|
|
2231
|
+
buildLifecycle().adoptSessionRoot(targetBasePath);
|
|
1940
2232
|
if (!s.orchestration) {
|
|
1941
2233
|
ensureOrchestrationModule(ctx, pi, s.basePath);
|
|
1942
2234
|
}
|