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
|
@@ -806,14 +806,22 @@ export async function inlineDecisionsFromDb(
|
|
|
806
806
|
try {
|
|
807
807
|
const { isDbAvailable } = await import("./gsd-db.js");
|
|
808
808
|
if (isDbAvailable()) {
|
|
809
|
-
|
|
809
|
+
// ADR-013 Phase 6 cutover (Stage 1): read decisions from the `memories`
|
|
810
|
+
// table. Both `queryDecisions` (legacy) and `queryDecisionsFromMemories`
|
|
811
|
+
// return identical Decision[] for active rows once Phase 5 dual-write is
|
|
812
|
+
// caught up. Switching the read here lets the destructive Phase 6 step
|
|
813
|
+
// (#5755) retire the legacy `decisions` table without changing prompt
|
|
814
|
+
// contents. Projection regen (`DECISIONS.md`) still sources from the
|
|
815
|
+
// legacy table — that switch lands separately to handle superseded
|
|
816
|
+
// history cleanly.
|
|
817
|
+
const { queryDecisionsFromMemories, formatDecisionsForPrompt } = await import("./context-store.js");
|
|
810
818
|
|
|
811
819
|
// First query: try with both milestoneId and scope (if scope provided)
|
|
812
|
-
let decisions =
|
|
820
|
+
let decisions = queryDecisionsFromMemories({ milestoneId, scope });
|
|
813
821
|
|
|
814
822
|
// Cascade: if empty AND scope was provided, retry without scope
|
|
815
823
|
if (decisions.length === 0 && scope) {
|
|
816
|
-
decisions =
|
|
824
|
+
decisions = queryDecisionsFromMemories({ milestoneId });
|
|
817
825
|
}
|
|
818
826
|
|
|
819
827
|
if (decisions.length > 0) {
|
|
@@ -3189,7 +3197,7 @@ export async function buildParallelResearchSlicesPrompt(
|
|
|
3189
3197
|
subagentSections.push([
|
|
3190
3198
|
`### ${slice.id}: ${slice.title}`,
|
|
3191
3199
|
"",
|
|
3192
|
-
`Use this as the prompt for a \`subagent\` call${modelSuffix} (agent: \`
|
|
3200
|
+
`Use this as the prompt for a \`subagent\` call${modelSuffix} (agent: \`scout\`):`,
|
|
3193
3201
|
"",
|
|
3194
3202
|
"```",
|
|
3195
3203
|
slicePrompt,
|
|
@@ -3271,7 +3279,7 @@ export async function buildGateEvaluatePrompt(
|
|
|
3271
3279
|
subagentSections.push([
|
|
3272
3280
|
`### ${def.id}: ${def.question}`,
|
|
3273
3281
|
"",
|
|
3274
|
-
`Use this as the prompt for a \`subagent\` call${modelSuffix}:`,
|
|
3282
|
+
`Use this as the prompt for a \`subagent\` call${modelSuffix} (agent: \`tester\`):`,
|
|
3275
3283
|
"",
|
|
3276
3284
|
"```",
|
|
3277
3285
|
subPrompt,
|
|
@@ -7,7 +7,6 @@
|
|
|
7
7
|
* globals or AutoContext dependency.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import type { ExtensionContext } from "@gsd/pi-coding-agent";
|
|
11
10
|
import { parseUnitId } from "./unit-id.js";
|
|
12
11
|
import { MILESTONE_ID_RE } from "./milestone-ids.js";
|
|
13
12
|
import { appendEvent } from "./workflow-events.js";
|
|
@@ -20,15 +19,6 @@ import { getErrorMessage } from "./error-utils.js";
|
|
|
20
19
|
import { logWarning, logError } from "./workflow-logger.js";
|
|
21
20
|
import { readIntegrationBranch } from "./git-service.js";
|
|
22
21
|
import { isClosedStatus } from "./status-guards.js";
|
|
23
|
-
import {
|
|
24
|
-
nativeConflictFiles,
|
|
25
|
-
nativeCommit,
|
|
26
|
-
nativeCheckoutTheirs,
|
|
27
|
-
nativeAddPaths,
|
|
28
|
-
nativeMergeAbort,
|
|
29
|
-
nativeRebaseAbort,
|
|
30
|
-
nativeResetHard,
|
|
31
|
-
} from "./native-git-bridge.js";
|
|
32
22
|
import {
|
|
33
23
|
resolveSlicePath,
|
|
34
24
|
resolveSliceFile,
|
|
@@ -46,7 +36,6 @@ import {
|
|
|
46
36
|
mkdirSync,
|
|
47
37
|
readFileSync,
|
|
48
38
|
writeFileSync,
|
|
49
|
-
unlinkSync,
|
|
50
39
|
} from "node:fs";
|
|
51
40
|
import { execFileSync } from "node:child_process";
|
|
52
41
|
import { dirname, join } from "node:path";
|
|
@@ -57,6 +46,7 @@ import {
|
|
|
57
46
|
import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
|
|
58
47
|
import { validateArtifact } from "./schemas/validate.js";
|
|
59
48
|
import { getProjectResearchStatus } from "./project-research-policy.js";
|
|
49
|
+
import { isGsdWorktreePath } from "./worktree-root.js";
|
|
60
50
|
|
|
61
51
|
// Re-export so existing consumers of auto-recovery.ts keep working.
|
|
62
52
|
export { resolveExpectedArtifactPath, diagnoseExpectedArtifact };
|
|
@@ -67,6 +57,29 @@ export {
|
|
|
67
57
|
|
|
68
58
|
// ─── Artifact Resolution & Verification ───────────────────────────────────────
|
|
69
59
|
|
|
60
|
+
export function diagnoseWorktreeIntegrityFailure(basePath: string): string | null {
|
|
61
|
+
if (!isGsdWorktreePath(basePath)) return null;
|
|
62
|
+
if (!existsSync(basePath)) {
|
|
63
|
+
return `Worktree integrity failure: ${basePath} does not exist. Repair or recreate the worktree before retrying.`;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const gitPath = join(basePath, ".git");
|
|
67
|
+
if (!existsSync(gitPath)) {
|
|
68
|
+
return `Worktree integrity failure: ${basePath} is not a valid git worktree (.git missing). Repair or recreate the worktree before retrying.`;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
try {
|
|
72
|
+
execFileSync("git", ["rev-parse", "--git-dir"], {
|
|
73
|
+
cwd: basePath,
|
|
74
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
75
|
+
encoding: "utf-8",
|
|
76
|
+
});
|
|
77
|
+
return null;
|
|
78
|
+
} catch (err) {
|
|
79
|
+
return `Worktree integrity failure: ${basePath} is not a valid git worktree (git rev-parse failed: ${getErrorMessage(err).split("\n")[0]}). Repair or recreate the worktree before retrying.`;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
70
83
|
export type ArtifactRecoveryDbRefreshResult =
|
|
71
84
|
| { ok: true }
|
|
72
85
|
| { ok: false; fatal: boolean; message: string; reason: string };
|
|
@@ -763,6 +776,11 @@ export function verifyExpectedArtifact(
|
|
|
763
776
|
return false;
|
|
764
777
|
}
|
|
765
778
|
if (!existsSync(absPath)) {
|
|
779
|
+
const worktreeFailure = diagnoseWorktreeIntegrityFailure(base);
|
|
780
|
+
if (worktreeFailure) {
|
|
781
|
+
logError("recovery", `${worktreeFailure} Unit: ${unitType} ${unitId}.`);
|
|
782
|
+
return false;
|
|
783
|
+
}
|
|
766
784
|
logWarning("recovery", `verify-fail ${unitType} ${unitId}: existsSync false for ${absPath}`);
|
|
767
785
|
return false;
|
|
768
786
|
}
|
|
@@ -1001,205 +1019,14 @@ export function writeBlockerPlaceholder(
|
|
|
1001
1019
|
}
|
|
1002
1020
|
|
|
1003
1021
|
// ─── Merge State Reconciliation ───────────────────────────────────────────────
|
|
1022
|
+
// Body relocated to state-reconciliation/drift/merge-state.ts (ADR-017 #5701).
|
|
1023
|
+
// Re-exported here for backward compatibility with existing call sites:
|
|
1024
|
+
// auto.ts, auto/loop-deps.ts, tests/integration/auto-recovery.test.ts.
|
|
1004
1025
|
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
function abortAndResetMerge(
|
|
1010
|
-
basePath: string,
|
|
1011
|
-
hasMergeHead: boolean,
|
|
1012
|
-
squashMsgPath: string,
|
|
1013
|
-
): void {
|
|
1014
|
-
if (hasMergeHead) {
|
|
1015
|
-
try {
|
|
1016
|
-
nativeMergeAbort(basePath);
|
|
1017
|
-
} catch (err) {
|
|
1018
|
-
/* best-effort */
|
|
1019
|
-
logWarning("recovery", `git merge-abort failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1020
|
-
}
|
|
1021
|
-
} else if (squashMsgPath) {
|
|
1022
|
-
try {
|
|
1023
|
-
unlinkSync(squashMsgPath);
|
|
1024
|
-
} catch (err) {
|
|
1025
|
-
/* best-effort */
|
|
1026
|
-
logWarning("recovery", `file unlink failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1027
|
-
}
|
|
1028
|
-
}
|
|
1029
|
-
try {
|
|
1030
|
-
nativeResetHard(basePath);
|
|
1031
|
-
} catch (err) {
|
|
1032
|
-
/* best-effort */
|
|
1033
|
-
logError("recovery", `git reset failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1034
|
-
}
|
|
1035
|
-
}
|
|
1036
|
-
|
|
1037
|
-
export type MergeReconcileResult = "clean" | "reconciled" | "blocked";
|
|
1038
|
-
|
|
1039
|
-
/**
|
|
1040
|
-
* Detect and abort other in-progress git operations left behind by a SIGKILL'd
|
|
1041
|
-
* worker (rebase, cherry-pick, revert). Without this, a killed worker mid-rebase
|
|
1042
|
-
* leaves `.git/rebase-merge/` or `.git/CHERRY_PICK_HEAD` and the worktree is
|
|
1043
|
-
* wedged until the user manually runs the matching `--abort`.
|
|
1044
|
-
*
|
|
1045
|
-
* Called before merge-state reconciliation because these states block any
|
|
1046
|
-
* subsequent merge/commit operation. (Issue #4980 HIGH-7)
|
|
1047
|
-
*/
|
|
1048
|
-
function reconcileOtherInProgressGitOps(
|
|
1049
|
-
basePath: string,
|
|
1050
|
-
ctx: ExtensionContext,
|
|
1051
|
-
): "clean" | "reconciled" | "blocked" {
|
|
1052
|
-
const gitDir = join(basePath, ".git");
|
|
1053
|
-
const states: Array<{
|
|
1054
|
-
label: string;
|
|
1055
|
-
indicators: string[];
|
|
1056
|
-
abort: () => void;
|
|
1057
|
-
}> = [
|
|
1058
|
-
{
|
|
1059
|
-
label: "rebase",
|
|
1060
|
-
indicators: [join(gitDir, "rebase-merge"), join(gitDir, "rebase-apply")],
|
|
1061
|
-
abort: () => nativeRebaseAbort(basePath),
|
|
1062
|
-
},
|
|
1063
|
-
{
|
|
1064
|
-
label: "cherry-pick",
|
|
1065
|
-
indicators: [join(gitDir, "CHERRY_PICK_HEAD")],
|
|
1066
|
-
abort: () => {
|
|
1067
|
-
// No native helper; fall back to git CLI.
|
|
1068
|
-
try {
|
|
1069
|
-
execFileSync("git", ["cherry-pick", "--abort"], {
|
|
1070
|
-
cwd: basePath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8",
|
|
1071
|
-
});
|
|
1072
|
-
} catch (err) { logWarning("recovery", `cherry-pick --abort failed: ${getErrorMessage(err)}`); }
|
|
1073
|
-
},
|
|
1074
|
-
},
|
|
1075
|
-
{
|
|
1076
|
-
label: "revert",
|
|
1077
|
-
indicators: [join(gitDir, "REVERT_HEAD")],
|
|
1078
|
-
abort: () => {
|
|
1079
|
-
try {
|
|
1080
|
-
execFileSync("git", ["revert", "--abort"], {
|
|
1081
|
-
cwd: basePath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8",
|
|
1082
|
-
});
|
|
1083
|
-
} catch (err) { logWarning("recovery", `revert --abort failed: ${getErrorMessage(err)}`); }
|
|
1084
|
-
},
|
|
1085
|
-
},
|
|
1086
|
-
];
|
|
1087
|
-
|
|
1088
|
-
let reconciled = false;
|
|
1089
|
-
for (const s of states) {
|
|
1090
|
-
const present = s.indicators.some((p) => existsSync(p));
|
|
1091
|
-
if (!present) continue;
|
|
1092
|
-
try {
|
|
1093
|
-
s.abort();
|
|
1094
|
-
ctx.ui.notify(
|
|
1095
|
-
`Detected leftover ${s.label} state from prior session — aborted.`,
|
|
1096
|
-
"warning",
|
|
1097
|
-
);
|
|
1098
|
-
reconciled = true;
|
|
1099
|
-
} catch (err) {
|
|
1100
|
-
logError("recovery", `${s.label} abort failed: ${getErrorMessage(err)}`);
|
|
1101
|
-
ctx.ui.notify(
|
|
1102
|
-
`Detected leftover ${s.label} state but auto-abort failed. ` +
|
|
1103
|
-
`Run \`git ${s.label} --abort\` manually before retrying.`,
|
|
1104
|
-
"error",
|
|
1105
|
-
);
|
|
1106
|
-
return "blocked";
|
|
1107
|
-
}
|
|
1108
|
-
}
|
|
1109
|
-
return reconciled ? "reconciled" : "clean";
|
|
1110
|
-
}
|
|
1111
|
-
|
|
1112
|
-
/**
|
|
1113
|
-
* Detect leftover merge state from a prior session and reconcile it.
|
|
1114
|
-
* If MERGE_HEAD or SQUASH_MSG exists, check whether conflicts are resolved.
|
|
1115
|
-
* If resolved: finalize the commit. If only .gsd conflicts remain: auto-resolve.
|
|
1116
|
-
* If code conflicts remain: fail safe without modifying the worktree.
|
|
1117
|
-
*/
|
|
1118
|
-
export function reconcileMergeState(
|
|
1119
|
-
basePath: string,
|
|
1120
|
-
ctx: ExtensionContext,
|
|
1121
|
-
): MergeReconcileResult {
|
|
1122
|
-
// First, abort any rebase/cherry-pick/revert left over from a SIGKILL'd
|
|
1123
|
-
// worker. Doing this before the merge-state check unblocks any merge that
|
|
1124
|
-
// would otherwise refuse with "you have unfinished operation". (HIGH-7)
|
|
1125
|
-
const otherOpsResult = reconcileOtherInProgressGitOps(basePath, ctx);
|
|
1126
|
-
if (otherOpsResult === "blocked") return "blocked";
|
|
1127
|
-
|
|
1128
|
-
const mergeHeadPath = join(basePath, ".git", "MERGE_HEAD");
|
|
1129
|
-
const squashMsgPath = join(basePath, ".git", "SQUASH_MSG");
|
|
1130
|
-
const hasMergeHead = existsSync(mergeHeadPath);
|
|
1131
|
-
const hasSquashMsg = existsSync(squashMsgPath);
|
|
1132
|
-
if (!hasMergeHead && !hasSquashMsg) {
|
|
1133
|
-
// If we cleaned up another op type, return "reconciled" so the caller
|
|
1134
|
-
// re-derives state from a known-good baseline.
|
|
1135
|
-
return otherOpsResult === "reconciled" ? "reconciled" : "clean";
|
|
1136
|
-
}
|
|
1137
|
-
|
|
1138
|
-
const conflictedFiles = nativeConflictFiles(basePath);
|
|
1139
|
-
if (conflictedFiles.length === 0) {
|
|
1140
|
-
// All conflicts resolved — finalize the merge/squash commit
|
|
1141
|
-
try {
|
|
1142
|
-
const commitSha = nativeCommit(basePath, "chore(gsd): reconcile merge state");
|
|
1143
|
-
if (commitSha) {
|
|
1144
|
-
const mode = hasMergeHead ? "merge" : "squash commit";
|
|
1145
|
-
ctx.ui.notify(`Finalized leftover ${mode} from prior session.`, "info");
|
|
1146
|
-
} else {
|
|
1147
|
-
ctx.ui.notify("No new commit needed for leftover merge/squash state — already committed.", "info");
|
|
1148
|
-
}
|
|
1149
|
-
} catch (err) {
|
|
1150
|
-
const errorMessage = getErrorMessage(err);
|
|
1151
|
-
ctx.ui.notify(`Failed to finalize leftover merge/squash commit: ${errorMessage}`, "error");
|
|
1152
|
-
return "blocked";
|
|
1153
|
-
}
|
|
1154
|
-
} else {
|
|
1155
|
-
// Still conflicted — try auto-resolving .gsd/ state file conflicts (#530)
|
|
1156
|
-
const gsdConflicts = conflictedFiles.filter((f) => f.startsWith(".gsd/"));
|
|
1157
|
-
const codeConflicts = conflictedFiles.filter((f) => !f.startsWith(".gsd/"));
|
|
1158
|
-
|
|
1159
|
-
if (gsdConflicts.length > 0 && codeConflicts.length === 0) {
|
|
1160
|
-
// All conflicts are in .gsd/ state files — auto-resolve by accepting theirs
|
|
1161
|
-
let resolved = true;
|
|
1162
|
-
try {
|
|
1163
|
-
nativeCheckoutTheirs(basePath, gsdConflicts);
|
|
1164
|
-
nativeAddPaths(basePath, gsdConflicts);
|
|
1165
|
-
} catch (e) {
|
|
1166
|
-
logError("recovery", `auto-resolve .gsd/ conflicts failed: ${(e as Error).message}`);
|
|
1167
|
-
resolved = false;
|
|
1168
|
-
}
|
|
1169
|
-
if (resolved) {
|
|
1170
|
-
try {
|
|
1171
|
-
nativeCommit(
|
|
1172
|
-
basePath,
|
|
1173
|
-
"chore: auto-resolve .gsd/ state file conflicts",
|
|
1174
|
-
);
|
|
1175
|
-
ctx.ui.notify(
|
|
1176
|
-
`Auto-resolved ${gsdConflicts.length} .gsd/ state file conflict(s) from prior merge.`,
|
|
1177
|
-
"info",
|
|
1178
|
-
);
|
|
1179
|
-
} catch (e) {
|
|
1180
|
-
logError("recovery", `auto-commit .gsd/ conflict resolution failed: ${(e as Error).message}`);
|
|
1181
|
-
resolved = false;
|
|
1182
|
-
}
|
|
1183
|
-
}
|
|
1184
|
-
if (!resolved) {
|
|
1185
|
-
abortAndResetMerge(basePath, hasMergeHead, squashMsgPath);
|
|
1186
|
-
ctx.ui.notify(
|
|
1187
|
-
"Detected leftover merge state — auto-resolve failed, cleaned up. Re-deriving state.",
|
|
1188
|
-
"warning",
|
|
1189
|
-
);
|
|
1190
|
-
}
|
|
1191
|
-
} else {
|
|
1192
|
-
// Code conflicts present — fail safe and preserve any manual resolution
|
|
1193
|
-
// work instead of discarding it with merge --abort/reset --hard.
|
|
1194
|
-
ctx.ui.notify(
|
|
1195
|
-
"Detected leftover merge state with unresolved code conflicts. Auto-mode will pause without modifying the worktree so manual conflict resolution is preserved.",
|
|
1196
|
-
"error",
|
|
1197
|
-
);
|
|
1198
|
-
return "blocked";
|
|
1199
|
-
}
|
|
1200
|
-
}
|
|
1201
|
-
return "reconciled";
|
|
1202
|
-
}
|
|
1026
|
+
export {
|
|
1027
|
+
reconcileMergeState,
|
|
1028
|
+
type MergeReconcileResult,
|
|
1029
|
+
} from "./state-reconciliation/drift/merge-state.js";
|
|
1203
1030
|
|
|
1204
1031
|
// ─── Loop Remediation ─────────────────────────────────────────────────────────
|
|
1205
1032
|
|
|
@@ -56,3 +56,8 @@ export function recordToolInvocationError(toolName: string, errorMsg: string): v
|
|
|
56
56
|
autoSession.lastToolInvocationError = `${toolName}: ${errorMsg}`;
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
|
+
|
|
60
|
+
export function clearToolInvocationError(): void {
|
|
61
|
+
if (!autoSession.active) return;
|
|
62
|
+
autoSession.lastToolInvocationError = null;
|
|
63
|
+
}
|
|
@@ -44,6 +44,7 @@ import {
|
|
|
44
44
|
nativeDetectMainBranch,
|
|
45
45
|
nativeCheckoutBranch,
|
|
46
46
|
nativeBranchList,
|
|
47
|
+
nativeBranchExists,
|
|
47
48
|
nativeBranchListMerged,
|
|
48
49
|
nativeBranchDelete,
|
|
49
50
|
nativeWorktreeRemove,
|
|
@@ -64,7 +65,7 @@ import { initRoutingHistory } from "./routing-history.js";
|
|
|
64
65
|
import { restoreHookState, resetHookState } from "./post-unit-hooks.js";
|
|
65
66
|
import { resetProactiveHealing, setLevelChangeCallback } from "./doctor-proactive.js";
|
|
66
67
|
import { snapshotSkills } from "./skill-discovery.js";
|
|
67
|
-
import { isDbAvailable, getMilestone, openDatabase, getDbStatus } from "./gsd-db.js";
|
|
68
|
+
import { isDbAvailable, getMilestone, getAllMilestones, openDatabase, getDbStatus } from "./gsd-db.js";
|
|
68
69
|
import { isClosedStatus } from "./status-guards.js";
|
|
69
70
|
import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
|
|
70
71
|
import { auditOrphanedPreflightStashes } from "./orphan-stash-audit.js";
|
|
@@ -101,6 +102,7 @@ import { getSessionModelOverride } from "./session-model-override.js";
|
|
|
101
102
|
export interface BootstrapDeps {
|
|
102
103
|
shouldUseWorktreeIsolation: (basePath?: string) => boolean;
|
|
103
104
|
registerSigtermHandler: (basePath: string) => void;
|
|
105
|
+
registerAutoWorkerForSession: (basePath: string) => void;
|
|
104
106
|
lockBase: () => string;
|
|
105
107
|
buildLifecycle: () => WorktreeLifecycle;
|
|
106
108
|
}
|
|
@@ -202,9 +204,15 @@ export function decideSurvivorAction(
|
|
|
202
204
|
export function auditOrphanedMilestoneBranches(
|
|
203
205
|
basePath: string,
|
|
204
206
|
isolationMode: "worktree" | "branch" | "none",
|
|
207
|
+
gitDeps: {
|
|
208
|
+
branchList?: typeof nativeBranchList;
|
|
209
|
+
branchExists?: typeof nativeBranchExists;
|
|
210
|
+
} = {},
|
|
205
211
|
): { recovered: string[]; warnings: string[] } {
|
|
206
212
|
const recovered: string[] = [];
|
|
207
213
|
const warnings: string[] = [];
|
|
214
|
+
const branchList = gitDeps.branchList ?? nativeBranchList;
|
|
215
|
+
const branchExists = gitDeps.branchExists ?? nativeBranchExists;
|
|
208
216
|
|
|
209
217
|
// Skip in none mode — no milestone branches are created
|
|
210
218
|
if (isolationMode === "none") return { recovered, warnings };
|
|
@@ -213,15 +221,16 @@ export function auditOrphanedMilestoneBranches(
|
|
|
213
221
|
if (!isDbAvailable()) return { recovered, warnings };
|
|
214
222
|
|
|
215
223
|
let milestoneBranches: string[];
|
|
224
|
+
let milestoneBranchListAvailable = true;
|
|
216
225
|
try {
|
|
217
|
-
milestoneBranches =
|
|
226
|
+
milestoneBranches = branchList(basePath, "milestone/*");
|
|
218
227
|
} catch {
|
|
219
|
-
|
|
220
|
-
|
|
228
|
+
milestoneBranchListAvailable = false;
|
|
229
|
+
// git branch list failed — fall through with an empty branch set so the
|
|
230
|
+
// branch-less orphan pass can still run after per-milestone verification.
|
|
231
|
+
milestoneBranches = [];
|
|
221
232
|
}
|
|
222
233
|
|
|
223
|
-
if (milestoneBranches.length === 0) return { recovered, warnings };
|
|
224
|
-
|
|
225
234
|
// Detect main branch for merge-check
|
|
226
235
|
let mainBranch: string;
|
|
227
236
|
try {
|
|
@@ -354,6 +363,74 @@ export function auditOrphanedMilestoneBranches(
|
|
|
354
363
|
}
|
|
355
364
|
}
|
|
356
365
|
|
|
366
|
+
// Second pass (#5879): catch worktree directories stranded by a previous
|
|
367
|
+
// audit that deleted the milestone/* branch but failed to remove the
|
|
368
|
+
// directory (or the dir was orphaned by a separate path entirely, e.g.
|
|
369
|
+
// postflight-stash-restore-failed during closeout). The branch-keyed loop
|
|
370
|
+
// above is invisible to these cases — `nativeBranchList` returns nothing
|
|
371
|
+
// for the milestone, so the dir-cleanup block at line ~310 is never
|
|
372
|
+
// reached.
|
|
373
|
+
//
|
|
374
|
+
// Keyed on milestones whose DB status is `complete`. We do not iterate
|
|
375
|
+
// over arbitrary directories under .gsd/worktrees/ to avoid touching
|
|
376
|
+
// dirs that belong to an in-progress milestone whose branch was deleted
|
|
377
|
+
// separately — those are handled by the in-progress orphan path above
|
|
378
|
+
// when the branch is present, and by `/gsd doctor` when it is not.
|
|
379
|
+
const seenMilestoneIds = new Set(
|
|
380
|
+
milestoneBranches.map((branch) => branch.replace(/^milestone\//, "")),
|
|
381
|
+
);
|
|
382
|
+
let completedMilestones: readonly { id: string; status: string }[] = [];
|
|
383
|
+
try {
|
|
384
|
+
completedMilestones = getAllMilestones();
|
|
385
|
+
} catch {
|
|
386
|
+
// DB read failure — skip the second pass; the first pass is still useful.
|
|
387
|
+
completedMilestones = [];
|
|
388
|
+
}
|
|
389
|
+
for (const m of completedMilestones) {
|
|
390
|
+
if (m.status !== "complete") continue;
|
|
391
|
+
if (seenMilestoneIds.has(m.id)) continue; // already processed in the branch loop
|
|
392
|
+
if (!milestoneBranchListAvailable) {
|
|
393
|
+
try {
|
|
394
|
+
if (branchExists(basePath, `milestone/${m.id}`)) continue;
|
|
395
|
+
} catch (err) {
|
|
396
|
+
warnings.push(
|
|
397
|
+
`Could not verify whether milestone/${m.id} still exists; skipping branch-less worktree cleanup for safety: ${err instanceof Error ? err.message : String(err)}`,
|
|
398
|
+
);
|
|
399
|
+
continue;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
const wtDir = getWorktreeDir(basePath, m.id);
|
|
403
|
+
if (!existsSync(wtDir)) continue;
|
|
404
|
+
if (!isInsideWorktreesDir(basePath, wtDir)) {
|
|
405
|
+
warnings.push(
|
|
406
|
+
`Orphaned worktree directory for ${m.id} is outside .gsd/worktrees/ — skipping removal for safety.`,
|
|
407
|
+
);
|
|
408
|
+
continue;
|
|
409
|
+
}
|
|
410
|
+
// Try `git worktree remove` first in case the dir is still registered
|
|
411
|
+
// (defensive — usually it is not when we reach this branch-less pass).
|
|
412
|
+
try {
|
|
413
|
+
nativeWorktreeRemove(basePath, wtDir, true);
|
|
414
|
+
} catch (e) {
|
|
415
|
+
logWarning(
|
|
416
|
+
"engine",
|
|
417
|
+
`worktree remove failed (expected for branch-less orphans): ${e instanceof Error ? e.message : String(e)}`,
|
|
418
|
+
);
|
|
419
|
+
}
|
|
420
|
+
if (existsSync(wtDir)) {
|
|
421
|
+
try {
|
|
422
|
+
rmSync(wtDir, { recursive: true, force: true });
|
|
423
|
+
recovered.push(`Removed orphaned worktree directory for ${m.id} (branch already deleted).`);
|
|
424
|
+
} catch (err) {
|
|
425
|
+
warnings.push(
|
|
426
|
+
`Failed to remove orphaned worktree directory for ${m.id}: ${err instanceof Error ? err.message : String(err)}`,
|
|
427
|
+
);
|
|
428
|
+
}
|
|
429
|
+
} else {
|
|
430
|
+
recovered.push(`Removed orphaned worktree directory for ${m.id} (branch already deleted).`);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
|
|
357
434
|
return { recovered, warnings };
|
|
358
435
|
}
|
|
359
436
|
|
|
@@ -533,6 +610,7 @@ export async function bootstrapAutoSession(
|
|
|
533
610
|
const {
|
|
534
611
|
shouldUseWorktreeIsolation,
|
|
535
612
|
registerSigtermHandler,
|
|
613
|
+
registerAutoWorkerForSession,
|
|
536
614
|
lockBase,
|
|
537
615
|
buildLifecycle,
|
|
538
616
|
} = deps;
|
|
@@ -722,6 +800,7 @@ export async function bootstrapAutoSession(
|
|
|
722
800
|
// consult DB status and avoid clearing runtime units for milestones that
|
|
723
801
|
// only have a failure-path SUMMARY on disk (#4663).
|
|
724
802
|
await openProjectDbIfPresent(base);
|
|
803
|
+
registerAutoWorkerForSession(base);
|
|
725
804
|
|
|
726
805
|
// Clean stale runtime unit files for completed milestones (#887).
|
|
727
806
|
// DB-authoritative: when DB is available, require DB status to be closed
|
|
@@ -818,14 +897,18 @@ export async function bootstrapAutoSession(
|
|
|
818
897
|
// worktree cleanup) was never run — the survivor branch must be merged.
|
|
819
898
|
// Applies to both worktree and branch isolation modes.
|
|
820
899
|
let hasSurvivorBranch = false;
|
|
900
|
+
let survivorMilestoneId = state.activeMilestone?.id ?? null;
|
|
901
|
+
if (!survivorMilestoneId && state.phase === "complete") {
|
|
902
|
+
survivorMilestoneId = findUnmergedCompletedMilestone(base, getIsolationMode(base));
|
|
903
|
+
}
|
|
821
904
|
if (
|
|
822
|
-
|
|
905
|
+
survivorMilestoneId &&
|
|
823
906
|
(state.phase === "pre-planning" || state.phase === "complete") &&
|
|
824
907
|
getIsolationMode(base) !== "none" &&
|
|
825
908
|
!detectWorktreeName(base) &&
|
|
826
909
|
!base.includes(`${pathSep}.gsd${pathSep}worktrees${pathSep}`)
|
|
827
910
|
) {
|
|
828
|
-
const milestoneBranch = `milestone/${
|
|
911
|
+
const milestoneBranch = `milestone/${survivorMilestoneId}`;
|
|
829
912
|
const { nativeBranchExists } = await import("./native-git-bridge.js");
|
|
830
913
|
hasSurvivorBranch = nativeBranchExists(base, milestoneBranch);
|
|
831
914
|
if (hasSurvivorBranch) {
|
|
@@ -869,7 +952,7 @@ export async function bootstrapAutoSession(
|
|
|
869
952
|
// Re-evaluate via the helper — the discuss branch above may have cleared
|
|
870
953
|
// hasSurvivorBranch after a successful promotion.
|
|
871
954
|
if (decideSurvivorAction(hasSurvivorBranch, state.phase) === "finalize") {
|
|
872
|
-
const mid =
|
|
955
|
+
const mid = survivorMilestoneId!;
|
|
873
956
|
// Commit 68ef58a3c made `_mergeBranchMode` throw on wrong-branch
|
|
874
957
|
// instead of returning false silently. Wrap the call so the throw is
|
|
875
958
|
// converted into an error notify + clean bootstrap abort, not an
|
|
@@ -904,29 +987,24 @@ export async function bootstrapAutoSession(
|
|
|
904
987
|
{
|
|
905
988
|
const orphan = findUnmergedCompletedMilestone(base, getIsolationMode(base));
|
|
906
989
|
if (orphan && orphan !== state.activeMilestone?.id) {
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
s.originalBasePath
|
|
910
|
-
|
|
911
|
-
|
|
990
|
+
// ADR-016 phase 2 / B4 (#5622): the swap-run-revert protocol for
|
|
991
|
+
// the orphan-merge dance is owned by `adoptOrphanWorktree`. The
|
|
992
|
+
// verb snapshots prior `s.basePath` / `s.originalBasePath`, swaps
|
|
993
|
+
// into the orphan worktree, runs the merge callback under the
|
|
994
|
+
// swap, and reverts (or holds the swap) based on the result.
|
|
995
|
+
// Callers can no longer forget the revert step on failure — the
|
|
996
|
+
// pattern that originally motivated this verb.
|
|
997
|
+
const lifecycle = buildLifecycle();
|
|
998
|
+
const result = lifecycle.adoptOrphanWorktree(orphan, base, () =>
|
|
999
|
+
_mergeOrphanCompletedMilestone(lifecycle, orphan, ctx.ui),
|
|
1000
|
+
);
|
|
912
1001
|
if (!result.merged) {
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
try {
|
|
916
|
-
process.chdir(base);
|
|
917
|
-
} catch (err) {
|
|
918
|
-
logWarning("bootstrap", `could not restore cwd after orphan merge failure: ${err instanceof Error ? err.message : String(err)}`);
|
|
919
|
-
}
|
|
1002
|
+
// Verb already restored basePath/originalBasePath to `base` and
|
|
1003
|
+
// chdir'd there. Return early.
|
|
920
1004
|
return releaseLockAndReturn();
|
|
921
1005
|
}
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
s.originalBasePath = priorOriginalBasePath || base;
|
|
925
|
-
}
|
|
926
|
-
if (result.merged) {
|
|
927
|
-
invalidateAllCaches();
|
|
928
|
-
state = await deriveState(base);
|
|
929
|
-
}
|
|
1006
|
+
invalidateAllCaches();
|
|
1007
|
+
state = await deriveState(base);
|
|
930
1008
|
}
|
|
931
1009
|
}
|
|
932
1010
|
|
|
@@ -1040,7 +1118,10 @@ export async function bootstrapAutoSession(
|
|
|
1040
1118
|
s.stepMode = requestedStepMode;
|
|
1041
1119
|
s.verbose = verboseMode;
|
|
1042
1120
|
s.cmdCtx = ctx;
|
|
1043
|
-
|
|
1121
|
+
// ADR-016 phase 2 / B2 (#5620): single owner of bootstrap basePath
|
|
1122
|
+
// mutation. Sets s.basePath = base and s.originalBasePath = base
|
|
1123
|
+
// (originalBasePath is empty on a fresh bootstrap).
|
|
1124
|
+
buildLifecycle().adoptSessionRoot(base);
|
|
1044
1125
|
s.unitDispatchCount.clear();
|
|
1045
1126
|
s.unitRecoveryCount.clear();
|
|
1046
1127
|
s.lastBudgetAlertLevel = 0;
|
|
@@ -1098,7 +1179,9 @@ export async function bootstrapAutoSession(
|
|
|
1098
1179
|
}
|
|
1099
1180
|
|
|
1100
1181
|
// ── Auto-worktree setup ──
|
|
1101
|
-
s.originalBasePath
|
|
1182
|
+
// s.originalBasePath was set to `base` by `adoptSessionRoot(base)` above
|
|
1183
|
+
// (ADR-016 phase 2 / B2, #5620). The redundant assignment that used to
|
|
1184
|
+
// live here is gone.
|
|
1102
1185
|
|
|
1103
1186
|
const isUnderGsdWorktrees = (p: string): boolean => {
|
|
1104
1187
|
// Direct layout: /.gsd/worktrees/
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Auto-mode unit closeout metrics, activity capture, and ghost-run detection.
|
|
3
|
+
|
|
1
4
|
/**
|
|
2
5
|
* Unit closeout helper — consolidates the repeated pattern of
|
|
3
6
|
* snapshotting metrics + saving activity log + extracting memories
|
|
@@ -24,6 +27,54 @@ export interface CloseoutOptions {
|
|
|
24
27
|
gitError?: string;
|
|
25
28
|
}
|
|
26
29
|
|
|
30
|
+
export interface UnitActivitySnapshot {
|
|
31
|
+
elapsedMs: number;
|
|
32
|
+
toolCalls: number;
|
|
33
|
+
assistantMessages: number;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export const GHOST_COMPLETION_MAX_ELAPSED_MS = 500;
|
|
37
|
+
|
|
38
|
+
export function snapshotUnitActivity(
|
|
39
|
+
ctx: ExtensionContext,
|
|
40
|
+
startedAt: number,
|
|
41
|
+
now = Date.now(),
|
|
42
|
+
): UnitActivitySnapshot {
|
|
43
|
+
let toolCalls = 0;
|
|
44
|
+
let assistantMessages = 0;
|
|
45
|
+
const entries = ctx.sessionManager.getEntries() ?? [];
|
|
46
|
+
|
|
47
|
+
for (const entry of entries) {
|
|
48
|
+
if (entry.type !== "message") continue;
|
|
49
|
+
const msg = (entry as any).message;
|
|
50
|
+
if (!msg || msg.role !== "assistant") continue;
|
|
51
|
+
assistantMessages++;
|
|
52
|
+
if (!Array.isArray(msg.content)) continue;
|
|
53
|
+
for (const block of msg.content) {
|
|
54
|
+
if (block?.type === "toolCall") toolCalls++;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
elapsedMs: Math.max(0, now - startedAt),
|
|
60
|
+
toolCalls,
|
|
61
|
+
assistantMessages,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function isSuspiciousGhostCompletion(
|
|
66
|
+
ctx: ExtensionContext,
|
|
67
|
+
startedAt: number,
|
|
68
|
+
maxElapsedMs = GHOST_COMPLETION_MAX_ELAPSED_MS,
|
|
69
|
+
): boolean {
|
|
70
|
+
const activity = snapshotUnitActivity(ctx, startedAt);
|
|
71
|
+
return (
|
|
72
|
+
activity.elapsedMs < maxElapsedMs &&
|
|
73
|
+
activity.toolCalls === 0 &&
|
|
74
|
+
activity.assistantMessages === 0
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
27
78
|
/**
|
|
28
79
|
* Snapshot metrics, save activity log, and fire-and-forget memory extraction
|
|
29
80
|
* for a completed unit. Returns the activity log file path (if any).
|