gsd-pi 2.82.0-dev.ed17d078d → 3.0.0-dev.04f5ccf82
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 +93 -18
- package/dist/cli.js +20 -9
- package/dist/headless-ui.js +13 -6
- package/dist/headless.js +9 -2
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +10 -1
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +44 -6
- package/dist/resources/extensions/cmux/index.js +5 -0
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +1 -1
- package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
- package/dist/resources/extensions/gsd/auto/loop.js +122 -40
- package/dist/resources/extensions/gsd/auto/orchestrator.js +15 -4
- package/dist/resources/extensions/gsd/auto/phases.js +146 -49
- package/dist/resources/extensions/gsd/auto/session.js +6 -0
- package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -1
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
- package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
- package/dist/resources/extensions/gsd/auto-budget.js +9 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +72 -5
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +185 -30
- package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +329 -137
- package/dist/resources/extensions/gsd/auto-prompts.js +36 -10
- package/dist/resources/extensions/gsd/auto-recovery.js +82 -16
- package/dist/resources/extensions/gsd/auto-start.js +99 -16
- package/dist/resources/extensions/gsd/auto-timers.js +11 -3
- package/dist/resources/extensions/gsd/auto-verification.js +146 -34
- package/dist/resources/extensions/gsd/auto-worktree.js +185 -26
- package/dist/resources/extensions/gsd/auto.js +135 -74
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +65 -10
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +13 -10
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +14 -4
- package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
- package/dist/resources/extensions/gsd/clean-root-preflight.js +267 -8
- package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +38 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
- package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +2 -0
- package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +16 -4
- package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +55 -7
- package/dist/resources/extensions/gsd/db/auto-workers.js +30 -0
- package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
- package/dist/resources/extensions/gsd/db-base-schema.js +2 -0
- package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
- package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
- package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -0
- package/dist/resources/extensions/gsd/doctor-git-checks.js +74 -3
- package/dist/resources/extensions/gsd/doctor-proactive.js +14 -2
- 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/forensics.js +10 -3
- package/dist/resources/extensions/gsd/git-conflict-state.js +21 -0
- package/dist/resources/extensions/gsd/git-service.js +152 -15
- package/dist/resources/extensions/gsd/gsd-db.js +76 -33
- package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
- package/dist/resources/extensions/gsd/guided-flow.js +110 -117
- package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
- package/dist/resources/extensions/gsd/init-wizard.js +17 -2
- package/dist/resources/extensions/gsd/markdown-renderer.js +14 -11
- package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
- package/dist/resources/extensions/gsd/migrate/parsers.js +121 -2
- 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 +57 -14
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
- package/dist/resources/extensions/gsd/paths.js +4 -0
- package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
- package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
- package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
- package/dist/resources/extensions/gsd/pre-execution-checks.js +54 -19
- package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
- package/dist/resources/extensions/gsd/preferences-models.js +6 -4
- package/dist/resources/extensions/gsd/preferences-types.js +3 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +147 -0
- package/dist/resources/extensions/gsd/preferences.js +35 -0
- 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 +1 -1
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
- package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
- package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
- 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/reactive-execute.md +1 -1
- 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/queue-reorder-ui.js +30 -13
- package/dist/resources/extensions/gsd/repo-identity.js +39 -22
- package/dist/resources/extensions/gsd/repository-registry.js +44 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
- package/dist/resources/extensions/gsd/session-lock.js +15 -2
- package/dist/resources/extensions/gsd/slice-parallel-conflict.js +2 -2
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +84 -5
- package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
- package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
- package/dist/resources/extensions/gsd/state.js +28 -7
- package/dist/resources/extensions/gsd/status-guards.js +14 -2
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
- package/dist/resources/extensions/gsd/templates/plan.md +9 -5
- package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +15 -9
- package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -10
- package/dist/resources/extensions/gsd/tools/exec-tool.js +87 -5
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
- package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +32 -1
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +185 -40
- package/dist/resources/extensions/gsd/tui/render-kit.js +33 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +2 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +69 -17
- package/dist/resources/extensions/gsd/validation.js +23 -1
- package/dist/resources/extensions/gsd/verification-gate.js +142 -7
- package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
- package/dist/resources/extensions/gsd/watch/header-renderer.js +34 -25
- package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
- package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +86 -19
- package/dist/resources/extensions/gsd/worktree-manager.js +11 -2
- package/dist/resources/extensions/gsd/worktree-safety.js +43 -4
- package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
- package/dist/resources/extensions/gsd/worktree-telemetry.js +32 -0
- package/dist/resources/extensions/shared/html-shell.js +388 -0
- package/dist/resources/extensions/shared/interview-ui.js +6 -4
- package/dist/resources/extensions/shared/next-action-ui.js +13 -5
- 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/ttsr/ttsr-manager.js +3 -1
- 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/resources/skills/forensics/SKILL.md +1 -1
- 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 +8 -8
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
- package/dist/web/standalone/.next/required-server-files.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +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/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -7
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -7
- 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 +8 -8
- package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/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.65b24fac92188a6b.js +10 -0
- package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
- package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
- package/dist/web/standalone/server.js +1 -1
- package/dist/welcome-screen.js +7 -8
- package/package.json +4 -4
- 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 +13 -4
- 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.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/src/__tests__/stream-process.test.mjs +32 -12
- 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-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
- 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/package.json +1 -1
- package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
- package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
- 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/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/chat-controller-ordering.test.js +44 -3
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +8 -2
- 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/dynamic-border.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +3 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +16 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.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 +24 -6
- 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.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +82 -97
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- 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/chat-controller-ordering.test.ts +53 -3
- package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
- package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +17 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +20 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +3 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +91 -102
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/loader.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/loader.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/loader.test.js +24 -0
- package/packages/pi-tui/dist/__tests__/loader.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/tui.test.js +72 -4
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
- package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/loader.js +3 -0
- package/packages/pi-tui/dist/components/loader.js.map +1 -1
- package/packages/pi-tui/dist/terminal.d.ts +2 -0
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +12 -0
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +1 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +117 -33
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/loader.test.ts +30 -0
- package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
- package/packages/pi-tui/src/__tests__/tui.test.ts +90 -4
- package/packages/pi-tui/src/components/loader.ts +3 -0
- package/packages/pi-tui/src/terminal.ts +11 -0
- package/packages/pi-tui/src/tui.ts +116 -33
- 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/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +10 -1
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
- package/src/resources/extensions/cmux/index.ts +6 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +19 -6
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +1 -0
- package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
- package/src/resources/extensions/gsd/auto/loop.ts +123 -40
- package/src/resources/extensions/gsd/auto/orchestrator.ts +15 -4
- package/src/resources/extensions/gsd/auto/phases.ts +172 -60
- package/src/resources/extensions/gsd/auto/session.ts +16 -0
- package/src/resources/extensions/gsd/auto/types.ts +3 -0
- package/src/resources/extensions/gsd/auto/unit-runner-events.ts +6 -2
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
- package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
- package/src/resources/extensions/gsd/auto-budget.ts +11 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +78 -5
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +208 -29
- package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +369 -148
- package/src/resources/extensions/gsd/auto-prompts.ts +36 -13
- package/src/resources/extensions/gsd/auto-recovery.ts +86 -13
- package/src/resources/extensions/gsd/auto-start.ts +109 -14
- package/src/resources/extensions/gsd/auto-timers.ts +10 -3
- package/src/resources/extensions/gsd/auto-verification.ts +174 -42
- package/src/resources/extensions/gsd/auto-worktree.ts +202 -30
- package/src/resources/extensions/gsd/auto.ts +172 -81
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +66 -10
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +13 -10
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +13 -4
- package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
- package/src/resources/extensions/gsd/clean-root-preflight.ts +284 -8
- package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +41 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
- package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
- package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +17 -4
- package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
- package/src/resources/extensions/gsd/crash-recovery.ts +55 -6
- package/src/resources/extensions/gsd/db/auto-workers.ts +37 -0
- package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
- package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
- package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
- package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
- package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -0
- package/src/resources/extensions/gsd/doctor-git-checks.ts +73 -3
- package/src/resources/extensions/gsd/doctor-proactive.ts +18 -2
- 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/forensics.ts +9 -3
- package/src/resources/extensions/gsd/git-conflict-state.ts +23 -0
- package/src/resources/extensions/gsd/git-service.ts +182 -16
- package/src/resources/extensions/gsd/gsd-db.ts +80 -31
- package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
- package/src/resources/extensions/gsd/guided-flow.ts +142 -134
- package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
- package/src/resources/extensions/gsd/init-wizard.ts +17 -2
- package/src/resources/extensions/gsd/journal.ts +8 -1
- package/src/resources/extensions/gsd/markdown-renderer.ts +14 -11
- package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
- package/src/resources/extensions/gsd/migrate/parsers.ts +139 -2
- 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 +63 -14
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
- package/src/resources/extensions/gsd/paths.ts +5 -0
- package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
- package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
- package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
- package/src/resources/extensions/gsd/pre-execution-checks.ts +67 -19
- package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
- package/src/resources/extensions/gsd/preferences-models.ts +6 -4
- package/src/resources/extensions/gsd/preferences-types.ts +35 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +154 -0
- package/src/resources/extensions/gsd/preferences.ts +39 -0
- 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 +1 -1
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
- package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
- package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
- 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/reactive-execute.md +1 -1
- 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/queue-reorder-ui.ts +31 -13
- package/src/resources/extensions/gsd/repo-identity.ts +45 -25
- package/src/resources/extensions/gsd/repository-registry.ts +77 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
- package/src/resources/extensions/gsd/session-lock.ts +15 -2
- package/src/resources/extensions/gsd/slice-parallel-conflict.ts +2 -2
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +75 -3
- package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
- package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
- package/src/resources/extensions/gsd/state.ts +33 -7
- package/src/resources/extensions/gsd/status-guards.ts +16 -2
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
- package/src/resources/extensions/gsd/templates/plan.md +9 -5
- package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +10 -1
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -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 +775 -34
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +245 -28
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
- 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 +18 -6
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +136 -13
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/auto-workers.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
- package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +170 -3
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
- package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +55 -2
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +60 -9
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +104 -2
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
- package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +139 -1
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +140 -1
- package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +99 -1
- package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +15 -1
- package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
- 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/headless-milestone-parity.test.ts +7 -7
- 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/init-prefs-routing.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +36 -1
- package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +226 -2
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +5 -21
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
- package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +21 -40
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +59 -1
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
- package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
- 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/pipeline-variant-dispatch.test.ts +2 -1
- 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 +343 -3
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
- package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +8 -1
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +147 -0
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +42 -1
- package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
- package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +28 -1
- package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +59 -1
- package/src/resources/extensions/gsd/tests/slice-parallel-conflict.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +112 -1
- package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +94 -2
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
- package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
- package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +131 -9
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +188 -1
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
- package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -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 +153 -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 +64 -12
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +73 -2
- package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +18 -10
- package/src/resources/extensions/gsd/tools/complete-slice.ts +57 -10
- package/src/resources/extensions/gsd/tools/exec-tool.ts +98 -5
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
- package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +31 -0
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +166 -17
- package/src/resources/extensions/gsd/tui/render-kit.ts +44 -0
- package/src/resources/extensions/gsd/types.ts +1 -1
- package/src/resources/extensions/gsd/unit-context-composer.ts +3 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +86 -19
- package/src/resources/extensions/gsd/validation.ts +23 -1
- package/src/resources/extensions/gsd/verification-gate.ts +170 -6
- package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
- package/src/resources/extensions/gsd/watch/header-renderer.ts +35 -24
- package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
- package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +98 -20
- package/src/resources/extensions/gsd/worktree-manager.ts +14 -2
- package/src/resources/extensions/gsd/worktree-safety.ts +57 -10
- package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
- package/src/resources/extensions/gsd/worktree-telemetry.ts +39 -0
- package/src/resources/extensions/shared/html-shell.ts +412 -0
- package/src/resources/extensions/shared/interview-ui.ts +6 -4
- package/src/resources/extensions/shared/next-action-ui.ts +11 -5
- package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
- package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +32 -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/ttsr/ttsr-manager.ts +5 -1
- 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/src/resources/skills/forensics/SKILL.md +1 -1
- 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/8359.e059d86b255fce1c.js +0 -10
- package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.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/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → w_ikFkx_-OHxisG9xjz4u}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → w_ikFkx_-OHxisG9xjz4u}/_ssgManifest.js +0 -0
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
*
|
|
8
8
|
* Split into two functions called sequentially by auto-loop with
|
|
9
9
|
* the verification gate between them:
|
|
10
|
-
* 1. postUnitPreVerification() —
|
|
11
|
-
* 2. postUnitPostVerification() — DB dual-write, hooks, triage, quick-tasks
|
|
10
|
+
* 1. postUnitPreVerification() — closeout git for non-task units, doctor, state rebuild, worktree sync, artifact verification
|
|
11
|
+
* 2. postUnitPostVerification() — post-verified task git, DB dual-write, hooks, triage, quick-tasks
|
|
12
12
|
*
|
|
13
13
|
* Extracted from the pre-loop agent_end handler in auto.ts.
|
|
14
14
|
*/
|
|
@@ -23,12 +23,12 @@ import { rebuildState } from "./doctor.js";
|
|
|
23
23
|
import { parseUnitId } from "./unit-id.js";
|
|
24
24
|
import { closeoutUnit } from "./auto-unit-closeout.js";
|
|
25
25
|
import { runTurnGitAction, } from "./git-service.js";
|
|
26
|
-
import { verifyExpectedArtifact, resolveExpectedArtifactPath, writeBlockerPlaceholder, diagnoseExpectedArtifact, } from "./auto-recovery.js";
|
|
26
|
+
import { verifyExpectedArtifact, resolveExpectedArtifactPath, writeBlockerPlaceholder, diagnoseExpectedArtifact, diagnoseWorktreeIntegrityFailure, } from "./auto-recovery.js";
|
|
27
27
|
import { regenerateIfMissing } from "./workflow-projections.js";
|
|
28
28
|
import { WorktreeStateProjection } from "./worktree-state-projection.js";
|
|
29
29
|
import { createWorkspace, scopeMilestone } from "./workspace.js";
|
|
30
30
|
import { normalizeWorktreePathForCompare } from "./worktree-root.js";
|
|
31
|
-
import { isDbAvailable, getTask, getSlice, getMilestone, updateTaskStatus, _getAdapter, getVerificationEvidence } from "./gsd-db.js";
|
|
31
|
+
import { isDbAvailable, getDbPath, refreshOpenDatabaseFromDisk, getTask, getSlice, getMilestone, updateTaskStatus, _getAdapter, getVerificationEvidence } from "./gsd-db.js";
|
|
32
32
|
import { renderPlanCheckboxes } from "./markdown-renderer.js";
|
|
33
33
|
import { consumeSignal } from "./session-status-io.js";
|
|
34
34
|
import { checkPostUnitHooks, isRetryPending, consumeRetryTrigger, persistHookState, resolveHookArtifactPath, } from "./post-unit-hooks.js";
|
|
@@ -37,8 +37,7 @@ import { debugLog } from "./debug-logger.js";
|
|
|
37
37
|
import { runSafely } from "./auto-utils.js";
|
|
38
38
|
import { getEvidence, clearEvidenceFromDisk } from "./safety/evidence-collector.js";
|
|
39
39
|
import { validateFileChanges } from "./safety/file-change-validator.js";
|
|
40
|
-
|
|
41
|
-
// import { crossReferenceEvidence, type ClaimedEvidence } from "./safety/evidence-cross-ref.js";
|
|
40
|
+
import { crossReferenceEvidence } from "./safety/evidence-cross-ref.js";
|
|
42
41
|
import { validateContent } from "./safety/content-validator.js";
|
|
43
42
|
import { resolveSafetyHarnessConfig } from "./safety/safety-harness.js";
|
|
44
43
|
import { resolveExpectedArtifactPath as resolveArtifactForContent } from "./auto-artifact-paths.js";
|
|
@@ -56,6 +55,8 @@ import { isDeterministicPolicyError } from "./auto-tool-tracking.js";
|
|
|
56
55
|
import { clearProjectResearchInflightMarker, finalizeProjectResearchTimeout, } from "./project-research-policy.js";
|
|
57
56
|
import { validateArtifact } from "./schemas/validate.js";
|
|
58
57
|
import { verificationRetryKey } from "./auto/verification-retry-policy.js";
|
|
58
|
+
import { getLedger } from "./metrics.js";
|
|
59
|
+
import { getUnitCostSpikeAction } from "./auto-budget.js";
|
|
59
60
|
// ─── Path Comparison Helper ───────────────────────────────────────────────
|
|
60
61
|
/** Compare two paths for physical identity, tolerating trailing slashes and symlinks. */
|
|
61
62
|
function isSamePathLocal(a, b) {
|
|
@@ -76,6 +77,40 @@ function formatPreExecutionCheckDetail(check) {
|
|
|
76
77
|
}
|
|
77
78
|
const COMPLETE_MILESTONE_DB_SETTLE_MS = 1500;
|
|
78
79
|
const COMPLETE_MILESTONE_DB_SETTLE_POLL_MS = 100;
|
|
80
|
+
const GIT_ACTION_FAILURE_LOG_REL_PATH = ".gsd/git-action-failures.log";
|
|
81
|
+
const DEFAULT_PER_UNIT_COST_CAP_USD = 5.0;
|
|
82
|
+
function getCurrentUnitCostStats(unitId) {
|
|
83
|
+
const ledger = getLedger();
|
|
84
|
+
if (!ledger || !Array.isArray(ledger.units) || ledger.units.length === 0) {
|
|
85
|
+
return { unitCostUsd: 0, rollingAvgUsd: 0 };
|
|
86
|
+
}
|
|
87
|
+
let unitCostUsd = 0;
|
|
88
|
+
let totalCost = 0;
|
|
89
|
+
let totalUnits = 0;
|
|
90
|
+
for (const unit of ledger.units) {
|
|
91
|
+
const cost = typeof unit?.cost === "number" ? unit.cost : 0;
|
|
92
|
+
if (!Number.isFinite(cost) || cost < 0)
|
|
93
|
+
continue;
|
|
94
|
+
totalCost += cost;
|
|
95
|
+
totalUnits++;
|
|
96
|
+
if (unit?.id === unitId)
|
|
97
|
+
unitCostUsd += cost;
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
unitCostUsd,
|
|
101
|
+
rollingAvgUsd: totalUnits > 0 ? totalCost / totalUnits : 0,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function persistGitActionFailure(basePath, action, message) {
|
|
105
|
+
const logPath = join(basePath, GIT_ACTION_FAILURE_LOG_REL_PATH);
|
|
106
|
+
const logDir = join(basePath, ".gsd");
|
|
107
|
+
const timestamp = new Date().toISOString();
|
|
108
|
+
const body = message.trim() || "unknown git failure";
|
|
109
|
+
const entry = `[${timestamp}] action=${action}\n${body}\n\n`;
|
|
110
|
+
mkdirSync(logDir, { recursive: true });
|
|
111
|
+
appendFileSync(logPath, entry, "utf-8");
|
|
112
|
+
return logPath;
|
|
113
|
+
}
|
|
79
114
|
function stripKnownIdPrefix(value, id) {
|
|
80
115
|
const raw = String(value ?? "").trim();
|
|
81
116
|
if (!raw)
|
|
@@ -126,7 +161,12 @@ async function buildTaskCommitContextForUnit(basePath, unitId) {
|
|
|
126
161
|
sliceId: sid,
|
|
127
162
|
sliceTitle: stripKnownIdPrefix(slice?.title, sid),
|
|
128
163
|
oneLiner: summary?.oneLiner || task?.one_liner || undefined,
|
|
129
|
-
keyFiles: summary?.frontmatter.key_files?.filter(f =>
|
|
164
|
+
keyFiles: summary?.frontmatter.key_files?.filter((f) => {
|
|
165
|
+
const normalized = f.trim();
|
|
166
|
+
return normalized.length > 0 &&
|
|
167
|
+
!normalized.includes("{{") &&
|
|
168
|
+
!/^(?:\(none\)|none\.?|n\/a)$/i.test(normalized);
|
|
169
|
+
}) ??
|
|
130
170
|
task?.key_files ??
|
|
131
171
|
undefined,
|
|
132
172
|
issueNumber: ghIssueNumber,
|
|
@@ -171,6 +211,9 @@ export function _shouldDispatchQuickTaskForTest(state) {
|
|
|
171
211
|
!!state.currentUnit &&
|
|
172
212
|
state.currentUnit.type !== "quick-task";
|
|
173
213
|
}
|
|
214
|
+
export function shouldDeferCloseoutGitAction(unitType) {
|
|
215
|
+
return unitType === "execute-task";
|
|
216
|
+
}
|
|
174
217
|
/** Unit types that only touch `.gsd/` internal state files (no code changes).
|
|
175
218
|
* Auto-commit is skipped for these — their state files are picked up by the
|
|
176
219
|
* next actual task commit via `smartStage()`. */
|
|
@@ -181,7 +224,7 @@ const LIFECYCLE_ONLY_UNITS = new Set([
|
|
|
181
224
|
"reassess-roadmap", "rewrite-docs",
|
|
182
225
|
]);
|
|
183
226
|
import { describeNextUnit, } from "./auto-dashboard.js";
|
|
184
|
-
import { existsSync, unlinkSync } from "node:fs";
|
|
227
|
+
import { appendFileSync, existsSync, mkdirSync, unlinkSync } from "node:fs";
|
|
185
228
|
import { join, relative } from "node:path";
|
|
186
229
|
import { _resetHasChangesCache } from "./native-git-bridge.js";
|
|
187
230
|
import { autoCommitCurrentBranch } from "./worktree.js";
|
|
@@ -292,14 +335,27 @@ export function detectRogueFileWrites(unitType, unitId, basePath) {
|
|
|
292
335
|
* looping indefinitely (#2007).
|
|
293
336
|
*/
|
|
294
337
|
export const MAX_ARTIFACT_VERIFICATION_RETRIES = 3;
|
|
295
|
-
export const STEP_COMPLETE_FALLBACK_MESSAGE = "Step complete. Run /clear, then /gsd to continue (or /gsd auto to run continuously).";
|
|
338
|
+
export const STEP_COMPLETE_FALLBACK_MESSAGE = "Step complete. Run /clear if you want a clean view, then /gsd next to continue one step (or /gsd auto to run continuously).";
|
|
296
339
|
export function buildStepCompleteMessage(nextState) {
|
|
297
340
|
if (nextState.phase === "complete") {
|
|
298
341
|
return "Step complete — milestone finished. Run /gsd status to review, or start the next milestone.";
|
|
299
342
|
}
|
|
300
343
|
const next = describeNextUnit(nextState);
|
|
301
344
|
return `Step complete. Next: ${next.label}\n`
|
|
302
|
-
+ `Run /clear, then /gsd to continue (or /gsd auto to run continuously).`;
|
|
345
|
+
+ `Run /clear if you want a clean view, then /gsd next to continue one step (or /gsd auto to run continuously).`;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Decide whether step mode should stop at the step wizard after a unit finishes.
|
|
349
|
+
*
|
|
350
|
+
* @param currentUnitType The just-finished unit type, such as "execute-task" or
|
|
351
|
+
* "complete-milestone"; may be null/undefined when no current unit is known.
|
|
352
|
+
* @param phaseAfterUnit The freshly derived next phase, such as "executing" or
|
|
353
|
+
* "complete"; may be null/undefined if state derivation failed.
|
|
354
|
+
* @returns true to show the step wizard; false to keep the loop running so
|
|
355
|
+
* terminal milestone completion can reach the merge/finalization path.
|
|
356
|
+
*/
|
|
357
|
+
export function shouldReturnStepWizardAfterUnit(currentUnitType, phaseAfterUnit) {
|
|
358
|
+
return currentUnitType !== "complete-milestone" && phaseAfterUnit !== "complete";
|
|
303
359
|
}
|
|
304
360
|
export const USER_DRIVEN_DEEP_UNITS = new Set([
|
|
305
361
|
"discuss-project",
|
|
@@ -316,6 +372,10 @@ function artifactValidationKind(unitType) {
|
|
|
316
372
|
return null;
|
|
317
373
|
}
|
|
318
374
|
function describeArtifactVerificationFailure(unitType, unitId, basePath) {
|
|
375
|
+
const worktreeFailure = diagnoseWorktreeIntegrityFailure(basePath);
|
|
376
|
+
if (worktreeFailure) {
|
|
377
|
+
return `${worktreeFailure} Unit: ${unitType} ${unitId}.`;
|
|
378
|
+
}
|
|
319
379
|
const artifactPath = resolveExpectedArtifactPath(unitType, unitId, basePath);
|
|
320
380
|
if (!artifactPath) {
|
|
321
381
|
return `Artifact verification failed: ${unitType} "${unitId}" has no resolvable artifact path.`;
|
|
@@ -360,6 +420,162 @@ export async function autoCommitUnit(basePath, unitType, unitId, ctx) {
|
|
|
360
420
|
return null;
|
|
361
421
|
}
|
|
362
422
|
}
|
|
423
|
+
/**
|
|
424
|
+
* Execute the turn-level git action (commit, snapshot, or status-only).
|
|
425
|
+
*
|
|
426
|
+
* @param opts.softFailure - Defaults to false. When true, retry git failures,
|
|
427
|
+
* warn, and continue without pausing auto-mode; use for best-effort deferred
|
|
428
|
+
* closeout work where a git failure should not block the run.
|
|
429
|
+
*/
|
|
430
|
+
async function runCloseoutGitAction(pctx, unit, opts) {
|
|
431
|
+
const { s, ctx, pi, pauseAuto } = pctx;
|
|
432
|
+
const prefs = loadEffectiveGSDPreferences()?.preferences;
|
|
433
|
+
const uokFlags = resolveUokFlags(prefs);
|
|
434
|
+
const turnAction = uokFlags.gitops ? uokFlags.gitopsTurnAction : "commit";
|
|
435
|
+
const traceId = s.currentTraceId ?? `turn:${unit.startedAt}`;
|
|
436
|
+
const turnId = s.currentTurnId ?? `${unit.type}/${unit.id}/${unit.startedAt}`;
|
|
437
|
+
s.lastGitActionFailure = null;
|
|
438
|
+
s.lastGitActionStatus = null;
|
|
439
|
+
try {
|
|
440
|
+
let taskContext;
|
|
441
|
+
let targetRepositories;
|
|
442
|
+
if (turnAction === "commit" && unit.type === "execute-task") {
|
|
443
|
+
taskContext = await buildTaskCommitContextForUnit(s.basePath, unit.id);
|
|
444
|
+
const { milestone: mid, slice: sid, task: tid } = parseUnitId(unit.id);
|
|
445
|
+
if (mid && sid && tid && isDbAvailable()) {
|
|
446
|
+
targetRepositories = getTask(mid, sid, tid)?.target_repositories;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
// Invalidate the nativeHasChanges cache before auto-commit (#1853).
|
|
450
|
+
// The cache has a 10-second TTL and is keyed by basePath. A stale
|
|
451
|
+
// `false` result causes autoCommit to skip staging entirely.
|
|
452
|
+
_resetHasChangesCache();
|
|
453
|
+
const skipLifecycleCommit = turnAction === "commit" && LIFECYCLE_ONLY_UNITS.has(unit.type);
|
|
454
|
+
if (skipLifecycleCommit) {
|
|
455
|
+
debugLog("postUnit", {
|
|
456
|
+
phase: "git-action-skipped",
|
|
457
|
+
reason: "lifecycle-only-unit",
|
|
458
|
+
unitType: unit.type,
|
|
459
|
+
unitId: unit.id,
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
else {
|
|
463
|
+
const maxAttempts = opts?.softFailure ? 3 : 1;
|
|
464
|
+
let gitResult = runTurnGitAction({
|
|
465
|
+
basePath: s.basePath,
|
|
466
|
+
action: turnAction,
|
|
467
|
+
unitType: unit.type,
|
|
468
|
+
unitId: unit.id,
|
|
469
|
+
taskContext,
|
|
470
|
+
targetRepositories,
|
|
471
|
+
});
|
|
472
|
+
for (let attempt = 1; gitResult.status === "failed" && attempt < maxAttempts; attempt++) {
|
|
473
|
+
await new Promise((resolve) => setTimeout(resolve, 250 * attempt));
|
|
474
|
+
gitResult = runTurnGitAction({
|
|
475
|
+
basePath: s.basePath,
|
|
476
|
+
action: turnAction,
|
|
477
|
+
unitType: unit.type,
|
|
478
|
+
unitId: unit.id,
|
|
479
|
+
taskContext,
|
|
480
|
+
targetRepositories,
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
if (uokFlags.gitops) {
|
|
484
|
+
writeTurnGitTransaction({
|
|
485
|
+
basePath: s.basePath,
|
|
486
|
+
traceId,
|
|
487
|
+
turnId,
|
|
488
|
+
unitType: unit.type,
|
|
489
|
+
unitId: unit.id,
|
|
490
|
+
stage: "publish",
|
|
491
|
+
action: turnAction,
|
|
492
|
+
push: uokFlags.gitopsTurnPush,
|
|
493
|
+
status: gitResult.status,
|
|
494
|
+
error: gitResult.error,
|
|
495
|
+
metadata: {
|
|
496
|
+
dirty: gitResult.dirty,
|
|
497
|
+
dirtyRepositories: gitResult.dirtyRepositories,
|
|
498
|
+
commitMessage: gitResult.commitMessage,
|
|
499
|
+
commitMessages: gitResult.commitMessages,
|
|
500
|
+
commitErrors: gitResult.commitErrors,
|
|
501
|
+
skippedRepositories: gitResult.skippedRepositories,
|
|
502
|
+
snapshotLabel: gitResult.snapshotLabel,
|
|
503
|
+
},
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
if (gitResult.status === "failed") {
|
|
507
|
+
s.lastGitActionFailure = gitResult.error ?? `git ${turnAction} failed`;
|
|
508
|
+
s.lastGitActionStatus = "failed";
|
|
509
|
+
const fullError = gitResult.error ?? "unknown error";
|
|
510
|
+
const failureLogPath = persistGitActionFailure(s.basePath, turnAction, fullError);
|
|
511
|
+
if (uokFlags.gitops && uokFlags.gates) {
|
|
512
|
+
const parsed = parseUnitId(unit.id);
|
|
513
|
+
const gateRunner = new UokGateRunner();
|
|
514
|
+
gateRunner.register({
|
|
515
|
+
id: "closeout-git-action",
|
|
516
|
+
type: "closeout",
|
|
517
|
+
execute: async () => ({
|
|
518
|
+
outcome: "fail",
|
|
519
|
+
failureClass: "git",
|
|
520
|
+
rationale: `turn git action "${turnAction}" failed`,
|
|
521
|
+
findings: fullError,
|
|
522
|
+
}),
|
|
523
|
+
});
|
|
524
|
+
await gateRunner.run("closeout-git-action", {
|
|
525
|
+
basePath: s.basePath,
|
|
526
|
+
traceId,
|
|
527
|
+
turnId,
|
|
528
|
+
milestoneId: parsed.milestone ?? undefined,
|
|
529
|
+
sliceId: parsed.slice ?? undefined,
|
|
530
|
+
taskId: parsed.task ?? undefined,
|
|
531
|
+
unitType: unit.type,
|
|
532
|
+
unitId: unit.id,
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
const failureMsg = `Git ${turnAction} failed: ${fullError.split("\n")[0]} (full details: ${failureLogPath})`;
|
|
536
|
+
ctx.ui.notify(failureMsg, opts?.softFailure ? "warning" : "error");
|
|
537
|
+
debugLog("postUnit", {
|
|
538
|
+
phase: opts?.softFailure ? "git-action-failed-soft" : "git-action-failed-blocking",
|
|
539
|
+
action: turnAction,
|
|
540
|
+
error: fullError,
|
|
541
|
+
failureLogPath,
|
|
542
|
+
});
|
|
543
|
+
if (opts?.softFailure) {
|
|
544
|
+
return "continue";
|
|
545
|
+
}
|
|
546
|
+
await pauseAuto(ctx, pi);
|
|
547
|
+
return "dispatched";
|
|
548
|
+
}
|
|
549
|
+
s.lastGitActionStatus = "ok";
|
|
550
|
+
if (turnAction === "commit" && gitResult.commitMessage) {
|
|
551
|
+
ctx.ui.notify(`Committed: ${gitResult.commitMessage.split("\n")[0]}`, "info");
|
|
552
|
+
}
|
|
553
|
+
else if (turnAction === "snapshot" && gitResult.snapshotLabel) {
|
|
554
|
+
ctx.ui.notify(`Snapshot recorded: ${gitResult.snapshotLabel}`, "info");
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
catch (e) {
|
|
559
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
560
|
+
s.lastGitActionFailure = message;
|
|
561
|
+
s.lastGitActionStatus = "failed";
|
|
562
|
+
debugLog("postUnit", { phase: "git-action", error: message, action: turnAction });
|
|
563
|
+
ctx.ui.notify(`Git ${turnAction} failed: ${message.split("\n")[0]}`, opts?.softFailure ? "warning" : "error");
|
|
564
|
+
if (opts?.softFailure) {
|
|
565
|
+
return "continue";
|
|
566
|
+
}
|
|
567
|
+
if (uokFlags.gitops) {
|
|
568
|
+
await pauseAuto(ctx, pi);
|
|
569
|
+
return "dispatched";
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
// GitHub sync (non-blocking, opt-in)
|
|
573
|
+
await runSafely("postUnit", "github-sync", async () => {
|
|
574
|
+
const { runGitHubSync } = await import("../github-sync/sync.js");
|
|
575
|
+
await runGitHubSync(s.basePath, unit.type, unit.id);
|
|
576
|
+
});
|
|
577
|
+
return "continue";
|
|
578
|
+
}
|
|
363
579
|
/**
|
|
364
580
|
* Pre-verification processing: parallel worker signal check, cache invalidation,
|
|
365
581
|
* auto-commit, doctor run, state rebuild, worktree sync, artifact verification.
|
|
@@ -370,7 +586,7 @@ export async function autoCommitUnit(basePath, unitType, unitId, ctx) {
|
|
|
370
586
|
* - "retry" — artifact verification failed, s.pendingVerificationRetry set for loop re-iteration
|
|
371
587
|
*/
|
|
372
588
|
export async function postUnitPreVerification(pctx, opts) {
|
|
373
|
-
const { s, ctx, pi,
|
|
589
|
+
const { s, ctx, pi, stopAuto, pauseAuto } = pctx;
|
|
374
590
|
// ── Parallel worker signal check ──
|
|
375
591
|
const milestoneLock = process.env.GSD_MILESTONE_LOCK;
|
|
376
592
|
if (milestoneLock) {
|
|
@@ -392,125 +608,29 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
392
608
|
if (!opts?.skipSettleDelay) {
|
|
393
609
|
await new Promise(r => setTimeout(r, 100));
|
|
394
610
|
}
|
|
395
|
-
const
|
|
396
|
-
|
|
611
|
+
const dbPath = getDbPath();
|
|
612
|
+
if (isDbAvailable() && dbPath && dbPath !== ":memory:") {
|
|
613
|
+
const refreshed = refreshOpenDatabaseFromDisk();
|
|
614
|
+
if (!refreshed) {
|
|
615
|
+
logWarning("db", "post-unit database refresh failed; derived state may be stale");
|
|
616
|
+
}
|
|
617
|
+
}
|
|
397
618
|
// Turn-level git action (commit | snapshot | status-only)
|
|
398
619
|
if (s.currentUnit) {
|
|
399
620
|
const unit = s.currentUnit;
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
let taskContext;
|
|
407
|
-
if (turnAction === "commit" && s.currentUnit.type === "execute-task") {
|
|
408
|
-
taskContext = await buildTaskCommitContextForUnit(s.basePath, s.currentUnit.id);
|
|
409
|
-
}
|
|
410
|
-
// Invalidate the nativeHasChanges cache before auto-commit (#1853).
|
|
411
|
-
// The cache has a 10-second TTL and is keyed by basePath. A stale
|
|
412
|
-
// `false` result causes autoCommit to skip staging entirely, leaving
|
|
413
|
-
// code files only in the working tree where they are destroyed by
|
|
414
|
-
// `git worktree remove --force` during teardown.
|
|
415
|
-
_resetHasChangesCache();
|
|
416
|
-
const skipLifecycleCommit = turnAction === "commit" && LIFECYCLE_ONLY_UNITS.has(s.currentUnit.type);
|
|
417
|
-
if (skipLifecycleCommit) {
|
|
418
|
-
debugLog("postUnit", {
|
|
419
|
-
phase: "git-action-skipped",
|
|
420
|
-
reason: "lifecycle-only-unit",
|
|
421
|
-
unitType: s.currentUnit.type,
|
|
422
|
-
unitId: s.currentUnit.id,
|
|
423
|
-
});
|
|
424
|
-
}
|
|
425
|
-
else {
|
|
426
|
-
const gitResult = runTurnGitAction({
|
|
427
|
-
basePath: s.basePath,
|
|
428
|
-
action: turnAction,
|
|
429
|
-
unitType: s.currentUnit.type,
|
|
430
|
-
unitId: s.currentUnit.id,
|
|
431
|
-
taskContext,
|
|
432
|
-
});
|
|
433
|
-
if (uokFlags.gitops) {
|
|
434
|
-
writeTurnGitTransaction({
|
|
435
|
-
basePath: s.basePath,
|
|
436
|
-
traceId,
|
|
437
|
-
turnId,
|
|
438
|
-
unitType: unit.type,
|
|
439
|
-
unitId: unit.id,
|
|
440
|
-
stage: "publish",
|
|
441
|
-
action: turnAction,
|
|
442
|
-
push: uokFlags.gitopsTurnPush,
|
|
443
|
-
status: gitResult.status,
|
|
444
|
-
error: gitResult.error,
|
|
445
|
-
metadata: {
|
|
446
|
-
dirty: gitResult.dirty,
|
|
447
|
-
commitMessage: gitResult.commitMessage,
|
|
448
|
-
snapshotLabel: gitResult.snapshotLabel,
|
|
449
|
-
},
|
|
450
|
-
});
|
|
451
|
-
}
|
|
452
|
-
if (gitResult.status === "failed") {
|
|
453
|
-
s.lastGitActionFailure = gitResult.error ?? `git ${turnAction} failed`;
|
|
454
|
-
s.lastGitActionStatus = "failed";
|
|
455
|
-
if (uokFlags.gitops && uokFlags.gates) {
|
|
456
|
-
const parsed = parseUnitId(unit.id);
|
|
457
|
-
const gateRunner = new UokGateRunner();
|
|
458
|
-
gateRunner.register({
|
|
459
|
-
id: "closeout-git-action",
|
|
460
|
-
type: "closeout",
|
|
461
|
-
execute: async () => ({
|
|
462
|
-
outcome: "fail",
|
|
463
|
-
failureClass: "git",
|
|
464
|
-
rationale: `turn git action "${turnAction}" failed`,
|
|
465
|
-
findings: gitResult.error ?? "unknown git failure",
|
|
466
|
-
}),
|
|
467
|
-
});
|
|
468
|
-
await gateRunner.run("closeout-git-action", {
|
|
469
|
-
basePath: s.basePath,
|
|
470
|
-
traceId,
|
|
471
|
-
turnId,
|
|
472
|
-
milestoneId: parsed.milestone ?? undefined,
|
|
473
|
-
sliceId: parsed.slice ?? undefined,
|
|
474
|
-
taskId: parsed.task ?? undefined,
|
|
475
|
-
unitType: unit.type,
|
|
476
|
-
unitId: unit.id,
|
|
477
|
-
});
|
|
478
|
-
}
|
|
479
|
-
const failureMsg = `Git ${turnAction} failed: ${(gitResult.error ?? "unknown error").split("\n")[0]}`;
|
|
480
|
-
ctx.ui.notify(failureMsg, "error");
|
|
481
|
-
debugLog("postUnit", {
|
|
482
|
-
phase: "git-action-failed-blocking",
|
|
483
|
-
action: turnAction,
|
|
484
|
-
error: gitResult.error ?? "unknown error",
|
|
485
|
-
});
|
|
486
|
-
await pauseAuto(ctx, pi);
|
|
487
|
-
return "dispatched";
|
|
488
|
-
}
|
|
489
|
-
s.lastGitActionStatus = "ok";
|
|
490
|
-
if (turnAction === "commit" && gitResult.commitMessage) {
|
|
491
|
-
ctx.ui.notify(`Committed: ${gitResult.commitMessage.split("\n")[0]}`, "info");
|
|
492
|
-
}
|
|
493
|
-
else if (turnAction === "snapshot" && gitResult.snapshotLabel) {
|
|
494
|
-
ctx.ui.notify(`Snapshot recorded: ${gitResult.snapshotLabel}`, "info");
|
|
495
|
-
}
|
|
496
|
-
}
|
|
621
|
+
if (shouldDeferCloseoutGitAction(unit.type)) {
|
|
622
|
+
debugLog("postUnit", {
|
|
623
|
+
phase: "git-action-deferred-until-verification",
|
|
624
|
+
unitType: unit.type,
|
|
625
|
+
unitId: unit.id,
|
|
626
|
+
});
|
|
497
627
|
}
|
|
498
|
-
|
|
499
|
-
const
|
|
500
|
-
|
|
501
|
-
s.lastGitActionStatus = "failed";
|
|
502
|
-
debugLog("postUnit", { phase: "git-action", error: message, action: turnAction });
|
|
503
|
-
ctx.ui.notify(`Git ${turnAction} failed: ${message.split("\n")[0]}`, uokFlags.gitops ? "error" : "warning");
|
|
504
|
-
if (uokFlags.gitops) {
|
|
505
|
-
await pauseAuto(ctx, pi);
|
|
628
|
+
else {
|
|
629
|
+
const gitActionResult = await runCloseoutGitAction(pctx, unit);
|
|
630
|
+
if (gitActionResult === "dispatched") {
|
|
506
631
|
return "dispatched";
|
|
507
632
|
}
|
|
508
633
|
}
|
|
509
|
-
// GitHub sync (non-blocking, opt-in)
|
|
510
|
-
await runSafely("postUnit", "github-sync", async () => {
|
|
511
|
-
const { runGitHubSync } = await import("../github-sync/sync.js");
|
|
512
|
-
await runGitHubSync(s.basePath, unit.type, unit.id);
|
|
513
|
-
});
|
|
514
634
|
// Prune dead bg-shell processes
|
|
515
635
|
await runSafely("postUnit", "prune-bg-shell", async () => {
|
|
516
636
|
const { pruneDeadProcesses } = await import("../bg-shell/process-manager.js");
|
|
@@ -723,7 +843,7 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
723
843
|
const safetyConfig = resolveSafetyHarnessConfig(prefs?.safety_harness);
|
|
724
844
|
if (safetyConfig.enabled) {
|
|
725
845
|
const { milestone: sMid, slice: sSid, task: sTid } = parseUnitId(s.currentUnit.id);
|
|
726
|
-
// File change validation (execute-task only, after
|
|
846
|
+
// File change validation (execute-task only, after unit execution)
|
|
727
847
|
if (safetyConfig.file_change_validation && s.currentUnit.type === "execute-task" && sMid && sSid && sTid && isDbAvailable()) {
|
|
728
848
|
try {
|
|
729
849
|
const taskRow = getTask(sMid, sSid, sTid);
|
|
@@ -756,12 +876,35 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
756
876
|
const bashCalls = actual.filter(e => e.kind === "bash");
|
|
757
877
|
if (sMid && sSid && sTid && isDbAvailable()) {
|
|
758
878
|
const taskRow = getTask(sMid, sSid, sTid);
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
879
|
+
if (taskRow?.status === "complete") {
|
|
880
|
+
const claimedEvidence = getVerificationEvidence(sMid, sSid, sTid)
|
|
881
|
+
.map((row) => ({
|
|
882
|
+
command: row.command,
|
|
883
|
+
exitCode: row.exit_code,
|
|
884
|
+
verdict: row.verdict,
|
|
885
|
+
createdAt: row.created_at,
|
|
886
|
+
}))
|
|
887
|
+
.filter((row) => typeof row.command === "string" && row.command.trim().length > 0);
|
|
888
|
+
const mismatches = crossReferenceEvidence(claimedEvidence, actual);
|
|
889
|
+
for (const mismatch of mismatches) {
|
|
890
|
+
const logMessage = `evidence-xref: ${mismatch.reason}`;
|
|
891
|
+
if (mismatch.severity === "error") {
|
|
892
|
+
logError("safety", logMessage);
|
|
893
|
+
}
|
|
894
|
+
else {
|
|
895
|
+
logWarning("safety", logMessage);
|
|
896
|
+
}
|
|
897
|
+
}
|
|
898
|
+
if (claimedEvidence.length > 0 && bashCalls.length === 0) {
|
|
899
|
+
logWarning("safety", "task claimed verification command evidence but no execution tool calls were recorded");
|
|
900
|
+
ctx.ui.notify(`Safety: task ${sTid} claimed command evidence but no execution tool calls were recorded`, "warning");
|
|
901
|
+
}
|
|
902
|
+
const blockingMismatch = mismatches.find((mismatch) => mismatch.severity === "error");
|
|
903
|
+
if (blockingMismatch) {
|
|
904
|
+
ctx.ui.notify(`Safety: task ${sTid} claimed passing verification that failed in recorded execution`, "error");
|
|
905
|
+
await pauseAuto(ctx, pi);
|
|
906
|
+
return "dispatched";
|
|
907
|
+
}
|
|
765
908
|
}
|
|
766
909
|
}
|
|
767
910
|
}
|
|
@@ -919,9 +1062,25 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
919
1062
|
s.verificationRetryCount.delete(retryKey);
|
|
920
1063
|
s.verificationRetryFailureHashes.delete(retryKey);
|
|
921
1064
|
writeBlockerPlaceholder(s.currentUnit.type, s.currentUnit.id, s.basePath, reason);
|
|
922
|
-
ctx.ui.notify(`${s.currentUnit.type} ${s.currentUnit.id} — deterministic policy rejection, wrote blocker placeholder (no retries)
|
|
1065
|
+
ctx.ui.notify(`${s.currentUnit.type} ${s.currentUnit.id} — deterministic policy rejection, wrote blocker placeholder (no retries)`, "warning");
|
|
923
1066
|
// Fall through to "continue" — do NOT enter the retry or db-unavailable paths.
|
|
924
1067
|
}
|
|
1068
|
+
else if (!triggerArtifactVerified && diagnoseWorktreeIntegrityFailure(s.basePath)) {
|
|
1069
|
+
const retryKey = `${s.currentUnit.type}:${s.currentUnit.id}`;
|
|
1070
|
+
const worktreeFailure = diagnoseWorktreeIntegrityFailure(s.basePath);
|
|
1071
|
+
s.pendingVerificationRetry = null;
|
|
1072
|
+
s.verificationRetryCount.delete(retryKey);
|
|
1073
|
+
s.verificationRetryFailureHashes.delete(retryKey);
|
|
1074
|
+
debugLog("postUnit", {
|
|
1075
|
+
phase: "worktree-integrity-failure",
|
|
1076
|
+
unitType: s.currentUnit.type,
|
|
1077
|
+
unitId: s.currentUnit.id,
|
|
1078
|
+
basePath: s.basePath,
|
|
1079
|
+
});
|
|
1080
|
+
ctx.ui.notify(`${worktreeFailure} Retry ${s.currentUnit.id} after repair.`, "error");
|
|
1081
|
+
await pauseAuto(ctx, pi);
|
|
1082
|
+
return "dispatched";
|
|
1083
|
+
}
|
|
925
1084
|
else if (!triggerArtifactVerified && !isDbAvailable()) {
|
|
926
1085
|
debugLog("postUnit", { phase: "artifact-verify-skip-db-unavailable", unitType: s.currentUnit.type, unitId: s.currentUnit.id });
|
|
927
1086
|
const dbSkipDiag = diagnoseExpectedArtifact(s.currentUnit.type, s.currentUnit.id, s.basePath);
|
|
@@ -942,6 +1101,27 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
942
1101
|
const hasExpectedArtifact = resolveExpectedArtifactPath(s.currentUnit.type, s.currentUnit.id, s.basePath) !== null;
|
|
943
1102
|
if (hasExpectedArtifact) {
|
|
944
1103
|
const retryKey = `${s.currentUnit.type}:${s.currentUnit.id}`;
|
|
1104
|
+
const prefs = loadEffectiveGSDPreferences()?.preferences;
|
|
1105
|
+
const perUnitCapUsd = typeof prefs?.per_unit_cost_cap_usd === "number" && Number.isFinite(prefs.per_unit_cost_cap_usd) && prefs.per_unit_cost_cap_usd > 0
|
|
1106
|
+
? prefs.per_unit_cost_cap_usd
|
|
1107
|
+
: DEFAULT_PER_UNIT_COST_CAP_USD;
|
|
1108
|
+
const { unitCostUsd, rollingAvgUsd } = getCurrentUnitCostStats(s.currentUnit.id);
|
|
1109
|
+
if (unitCostUsd >= perUnitCapUsd) {
|
|
1110
|
+
s.pendingVerificationRetry = null;
|
|
1111
|
+
s.verificationRetryCount.delete(retryKey);
|
|
1112
|
+
s.verificationRetryFailureHashes.delete(retryKey);
|
|
1113
|
+
ctx.ui.notify(`Unit ${s.currentUnit.id} hit per-unit cap $${perUnitCapUsd.toFixed(2)} — pausing auto-mode.`, "error");
|
|
1114
|
+
await pauseAuto(ctx, pi);
|
|
1115
|
+
return "dispatched";
|
|
1116
|
+
}
|
|
1117
|
+
if (getUnitCostSpikeAction(unitCostUsd, rollingAvgUsd, 3.0) === "pause") {
|
|
1118
|
+
s.pendingVerificationRetry = null;
|
|
1119
|
+
s.verificationRetryCount.delete(retryKey);
|
|
1120
|
+
s.verificationRetryFailureHashes.delete(retryKey);
|
|
1121
|
+
ctx.ui.notify(`Unit ${s.currentUnit.id} cost spike detected (${unitCostUsd.toFixed(2)} vs avg ${rollingAvgUsd.toFixed(2)}) — pausing auto-mode.`, "error");
|
|
1122
|
+
await pauseAuto(ctx, pi);
|
|
1123
|
+
return "dispatched";
|
|
1124
|
+
}
|
|
945
1125
|
const attempt = (s.verificationRetryCount.get(retryKey) ?? 0) + 1;
|
|
946
1126
|
const failureDetails = describeArtifactVerificationFailure(s.currentUnit.type, s.currentUnit.id, s.basePath);
|
|
947
1127
|
if (attempt > MAX_ARTIFACT_VERIFICATION_RETRIES) {
|
|
@@ -992,6 +1172,12 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
992
1172
|
export async function postUnitPostVerification(pctx) {
|
|
993
1173
|
const { s, ctx, pi, buildSnapshotOpts, lockBase, stopAuto, pauseAuto, updateProgressWidget } = pctx;
|
|
994
1174
|
if (s.currentUnit) {
|
|
1175
|
+
if (shouldDeferCloseoutGitAction(s.currentUnit.type)) {
|
|
1176
|
+
const gitActionResult = await runCloseoutGitAction(pctx, s.currentUnit, { softFailure: true });
|
|
1177
|
+
if (gitActionResult === "dispatched") {
|
|
1178
|
+
return "stopped";
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
995
1181
|
try {
|
|
996
1182
|
const codebasePrefs = loadEffectiveGSDPreferences()?.preferences?.codebase;
|
|
997
1183
|
const refresh = ensureCodebaseMapFresh(s.basePath, codebasePrefs
|
|
@@ -1161,7 +1347,9 @@ export async function postUnitPostVerification(pctx) {
|
|
|
1161
1347
|
// s.canonicalProjectRoot is the project root and lacks files that a
|
|
1162
1348
|
// prior slice wrote to the worktree but hasn't merged to main yet.
|
|
1163
1349
|
const preExecutionBasePath = s.basePath;
|
|
1164
|
-
const result = await runPreExecutionChecks(tasks, preExecutionBasePath
|
|
1350
|
+
const result = await runPreExecutionChecks(tasks, preExecutionBasePath, {
|
|
1351
|
+
additionalRoots: [s.canonicalProjectRoot],
|
|
1352
|
+
});
|
|
1165
1353
|
// Log summary to stderr in existing verification output format
|
|
1166
1354
|
const emoji = result.status === "pass" ? "✅" : result.status === "warn" ? "⚠️" : "❌";
|
|
1167
1355
|
process.stderr.write(`gsd-pre-exec: ${emoji} Pre-execution checks ${result.status} for ${mid}/${sid} (${result.durationMs}ms)\n`);
|
|
@@ -1171,12 +1359,12 @@ export async function postUnitPostVerification(pctx) {
|
|
|
1171
1359
|
process.stderr.write(`gsd-pre-exec: ${checkEmoji} [${check.category}] ${check.target}: ${check.message}\n`);
|
|
1172
1360
|
}
|
|
1173
1361
|
// Write evidence JSON to slice artifacts directory
|
|
1174
|
-
const slicePath = resolveSlicePath(
|
|
1362
|
+
const slicePath = resolveSlicePath(s.canonicalProjectRoot, mid, sid);
|
|
1175
1363
|
const evidenceFileName = `${sid}-PRE-EXEC-VERIFY.json`;
|
|
1176
1364
|
let evidencePath = join(".gsd", "milestones", mid, "slices", sid, evidenceFileName);
|
|
1177
1365
|
if (slicePath) {
|
|
1178
1366
|
writePreExecutionEvidence(result, slicePath, mid, sid);
|
|
1179
|
-
evidencePath = relative(
|
|
1367
|
+
evidencePath = relative(s.canonicalProjectRoot, join(slicePath, evidenceFileName)) || evidenceFileName;
|
|
1180
1368
|
}
|
|
1181
1369
|
if (uokFlags.gates) {
|
|
1182
1370
|
const failedChecks = result.checks
|
|
@@ -1356,18 +1544,22 @@ export async function postUnitPostVerification(pctx) {
|
|
|
1356
1544
|
}
|
|
1357
1545
|
}
|
|
1358
1546
|
// Step mode → show wizard instead of dispatch.
|
|
1359
|
-
// Without this notify(), /gsd
|
|
1360
|
-
//
|
|
1547
|
+
// Without this notify(), /gsd next finishes a unit and silently exits the
|
|
1548
|
+
// loop, leaving the user with no next-step command.
|
|
1361
1549
|
if (s.stepMode) {
|
|
1550
|
+
let phaseAfterUnit = null;
|
|
1362
1551
|
try {
|
|
1363
1552
|
const nextState = await deriveState(s.canonicalProjectRoot);
|
|
1553
|
+
phaseAfterUnit = nextState.phase;
|
|
1364
1554
|
ctx.ui.notify(buildStepCompleteMessage(nextState), "info");
|
|
1365
1555
|
}
|
|
1366
1556
|
catch (e) {
|
|
1367
1557
|
debugLog("postUnit", { phase: "step-wizard-notify", error: String(e) });
|
|
1368
1558
|
ctx.ui.notify(STEP_COMPLETE_FALLBACK_MESSAGE, "info");
|
|
1369
1559
|
}
|
|
1370
|
-
return
|
|
1560
|
+
return shouldReturnStepWizardAfterUnit(s.currentUnit?.type, phaseAfterUnit)
|
|
1561
|
+
? "step-wizard"
|
|
1562
|
+
: "continue";
|
|
1371
1563
|
}
|
|
1372
1564
|
return "continue";
|
|
1373
1565
|
}
|