@opengsd/gsd-pi 1.2.0-dev.844675c9 → 1.2.0-dev.b1abb545
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/dist/cli-web-branch.d.ts +2 -0
- package/dist/cli-web-branch.js +9 -2
- package/dist/help-text.js +5 -0
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/ask-user-questions.js +78 -23
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +84 -228
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -0
- package/dist/resources/extensions/github-sync/templates.js +3 -3
- package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
- package/dist/resources/extensions/gsd/auto/loop.js +74 -56
- package/dist/resources/extensions/gsd/auto/orchestrator.js +109 -11
- package/dist/resources/extensions/gsd/auto/phases.js +28 -3
- package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
- package/dist/resources/extensions/gsd/auto-dispatch.js +6 -5
- package/dist/resources/extensions/gsd/auto-model-selection.js +8 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +4 -3
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -8
- package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
- package/dist/resources/extensions/gsd/auto-runtime-state.js +14 -0
- package/dist/resources/extensions/gsd/auto-start.js +12 -23
- package/dist/resources/extensions/gsd/auto-timers.js +16 -2
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +32 -0
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +4 -29
- package/dist/resources/extensions/gsd/auto-verification.js +7 -7
- package/dist/resources/extensions/gsd/auto-worktree.js +21 -19
- package/dist/resources/extensions/gsd/auto.js +11 -7
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +11 -37
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +100 -138
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +63 -4
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
- package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +20 -0
- package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
- package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
- package/dist/resources/extensions/gsd/commands-ship.js +2 -2
- package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
- package/dist/resources/extensions/gsd/db-workspace.js +103 -0
- package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
- package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/dist/resources/extensions/gsd/doctor.js +16 -9
- package/dist/resources/extensions/gsd/error-classifier.js +1 -1
- package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
- package/dist/resources/extensions/gsd/gsd-db.js +12 -0
- package/dist/resources/extensions/gsd/guided-flow.js +34 -468
- package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +2 -1
- package/dist/resources/extensions/gsd/mcp-filter.js +2 -1
- package/dist/resources/extensions/gsd/mcp-tool-name.js +26 -0
- package/dist/resources/extensions/gsd/md-importer.js +4 -3
- package/dist/resources/extensions/gsd/migrate/safety.js +2 -2
- package/dist/resources/extensions/gsd/migration-auto-check.js +3 -2
- package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
- package/dist/resources/extensions/gsd/milestone-closeout.js +12 -4
- package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
- package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
- package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
- package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
- package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
- package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
- package/dist/resources/extensions/gsd/preferences.js +147 -29
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
- package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
- package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
- package/dist/resources/extensions/gsd/question-transport.js +86 -0
- package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/state.js +13 -5
- package/dist/resources/extensions/gsd/templates/plan.md +7 -0
- package/dist/resources/extensions/gsd/templates/project.md +1 -0
- package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/dist/resources/extensions/gsd/templates/uat.md +5 -1
- package/dist/resources/extensions/gsd/tool-contract.js +52 -8
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +15 -34
- package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
- package/dist/resources/extensions/gsd/uat-policy.js +16 -10
- package/dist/resources/extensions/gsd/uat-run.js +9 -14
- package/dist/resources/extensions/gsd/unit-context-composer.js +40 -20
- package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +2 -1
- package/dist/resources/extensions/gsd/user-input-boundary.js +23 -0
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
- package/dist/resources/extensions/gsd/web-app-uat.js +80 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
- package/dist/resources/extensions/gsd/workflow-reconcile.js +4 -3
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
- package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
- package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
- package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
- package/dist/resources/extensions/shared/interview-ui.js +2 -2
- package/dist/resources/shared/claude-runtime-floor.js +182 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-cmd.js +20 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +7 -7
- 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 +8 -8
- 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.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- 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 +1 -1
- 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 +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +7 -7
- package/dist/web/standalone/.next/server/chunks/8357.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/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/2659.b7b129ee6a769448.js +1 -0
- package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
- package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
- package/dist/web/standalone/.next/static/chunks/796.cf859a427a2cb2ac.js +10 -0
- package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-fbea77b5f9953368.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web-mode.d.ts +2 -0
- package/dist/web-mode.js +20 -8
- package/package.json +2 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +106 -40
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/server.d.ts +10 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +8 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +41 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +2 -1
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +8 -93
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +35 -120
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/components/input.js +1 -1
- package/packages/pi-tui/dist/components/input.js.map +1 -1
- package/packages/pi-tui/dist/keys.d.ts.map +1 -1
- package/packages/pi-tui/dist/keys.js +39 -30
- package/packages/pi-tui/dist/keys.js.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.js +22 -0
- package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/extensions/ask-user-questions.ts +87 -24
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +108 -281
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +240 -0
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -0
- package/src/resources/extensions/github-sync/templates.ts +3 -3
- package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
- package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +32 -2
- package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -0
- package/src/resources/extensions/gsd/auto/loop.ts +83 -61
- package/src/resources/extensions/gsd/auto/orchestrator.ts +125 -12
- package/src/resources/extensions/gsd/auto/phases.ts +35 -3
- package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
- package/src/resources/extensions/gsd/auto/session.ts +4 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
- package/src/resources/extensions/gsd/auto-dispatch.ts +20 -7
- package/src/resources/extensions/gsd/auto-model-selection.ts +8 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +4 -3
- package/src/resources/extensions/gsd/auto-prompts.ts +107 -9
- package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
- package/src/resources/extensions/gsd/auto-runtime-state.ts +26 -0
- package/src/resources/extensions/gsd/auto-start.ts +17 -20
- package/src/resources/extensions/gsd/auto-timers.ts +16 -2
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +35 -0
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +9 -30
- package/src/resources/extensions/gsd/auto-verification.ts +7 -8
- package/src/resources/extensions/gsd/auto-worktree.ts +33 -26
- package/src/resources/extensions/gsd/auto.ts +15 -8
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +10 -37
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +116 -151
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +107 -3
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
- package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +18 -0
- package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
- package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
- package/src/resources/extensions/gsd/commands-ship.ts +2 -2
- package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
- package/src/resources/extensions/gsd/db-workspace.ts +170 -0
- package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
- package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
- package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/src/resources/extensions/gsd/doctor.ts +15 -5
- package/src/resources/extensions/gsd/error-classifier.ts +1 -1
- package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
- package/src/resources/extensions/gsd/gsd-db.ts +12 -0
- package/src/resources/extensions/gsd/guided-flow.ts +47 -558
- package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +2 -1
- package/src/resources/extensions/gsd/mcp-filter.ts +2 -1
- package/src/resources/extensions/gsd/mcp-tool-name.ts +35 -0
- package/src/resources/extensions/gsd/md-importer.ts +3 -3
- package/src/resources/extensions/gsd/migrate/safety.ts +2 -2
- package/src/resources/extensions/gsd/migration-auto-check.ts +2 -2
- package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
- package/src/resources/extensions/gsd/milestone-closeout.ts +12 -4
- package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
- package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
- package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
- package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
- package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
- package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
- package/src/resources/extensions/gsd/preferences-types.ts +16 -0
- package/src/resources/extensions/gsd/preferences.ts +173 -28
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
- package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
- package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
- package/src/resources/extensions/gsd/question-transport.ts +138 -0
- package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/state.ts +15 -5
- package/src/resources/extensions/gsd/templates/plan.md +7 -0
- package/src/resources/extensions/gsd/templates/project.md +1 -0
- package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/src/resources/extensions/gsd/templates/uat.md +5 -1
- package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +321 -5
- package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +133 -4
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +38 -1
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
- package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +94 -0
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +25 -1
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +101 -1
- package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +86 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +150 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +126 -9
- package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +79 -0
- package/src/resources/extensions/gsd/tool-contract.ts +86 -8
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +16 -33
- package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
- package/src/resources/extensions/gsd/uat-policy.ts +19 -10
- package/src/resources/extensions/gsd/uat-run.ts +10 -14
- package/src/resources/extensions/gsd/unit-context-composer.ts +85 -20
- package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +2 -1
- package/src/resources/extensions/gsd/user-input-boundary.ts +18 -0
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
- package/src/resources/extensions/gsd/web-app-uat.ts +101 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
- package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +73 -0
- package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +7 -16
- package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
- package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
- package/src/resources/extensions/shared/interview-ui.ts +15 -2
- package/src/resources/shared/claude-runtime-floor.ts +248 -0
- package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
- package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
- package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
- package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
- package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
- package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
- /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → 3PtrU9qGPEXwNLWkIyiqk}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → 3PtrU9qGPEXwNLWkIyiqk}/_ssgManifest.js +0 -0
|
@@ -287,10 +287,23 @@ export function startUnitSupervision(sctx: SupervisionContext): void {
|
|
|
287
287
|
}, 15000);
|
|
288
288
|
|
|
289
289
|
// ── 3. Hard timeout ──
|
|
290
|
-
|
|
290
|
+
const hardTimeoutBody = async () => {
|
|
291
291
|
try {
|
|
292
292
|
s.unitTimeoutHandle = null;
|
|
293
293
|
if (!s.active) return;
|
|
294
|
+
// User-interactive tools (ask_user_questions, secure_env_collect) block
|
|
295
|
+
// waiting for human input by design. Unlike the idle watchdog (above),
|
|
296
|
+
// the hard timeout had no interactive exemption, so a long human
|
|
297
|
+
// deliberation crossing the hard cap would still closeout + recover
|
|
298
|
+
// (triggerTurn) and abort the turn hosting the elicitation, reintroducing
|
|
299
|
+
// the self-cancel loop on slow answers (#2676). Re-arm instead of firing
|
|
300
|
+
// while a human is being asked, mirroring the idle watchdog's
|
|
301
|
+
// refresh-and-return. Conditional on hasInteractiveToolInFlight(), so a
|
|
302
|
+
// genuinely hung non-interactive unit still hits the hard cap.
|
|
303
|
+
if (getInFlightToolCount() > 0 && hasInteractiveToolInFlight()) {
|
|
304
|
+
s.unitTimeoutHandle = setTimeout(hardTimeoutBody, hardTimeoutMs);
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
294
307
|
const expectedCurrentUnit = s.currentUnit
|
|
295
308
|
? { type: s.currentUnit.type, id: s.currentUnit.id, startedAt: s.currentUnit.startedAt }
|
|
296
309
|
: null;
|
|
@@ -323,7 +336,8 @@ export function startUnitSupervision(sctx: SupervisionContext): void {
|
|
|
323
336
|
logWarning("timer", `notification failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
324
337
|
}
|
|
325
338
|
}
|
|
326
|
-
}
|
|
339
|
+
};
|
|
340
|
+
s.unitTimeoutHandle = setTimeout(hardTimeoutBody, hardTimeoutMs);
|
|
327
341
|
|
|
328
342
|
// ── 4. Context-pressure continue-here monitor ──
|
|
329
343
|
if (s.continueHereHandle) {
|
|
@@ -19,6 +19,17 @@ const inFlightTools = new Map<string, InFlightTool>();
|
|
|
19
19
|
*/
|
|
20
20
|
const INTERACTIVE_TOOLS = new Set(["ask_user_questions", "secure_env_collect"]);
|
|
21
21
|
|
|
22
|
+
/**
|
|
23
|
+
* Mode-agnostic refcount of in-flight interactive elicitations that are an
|
|
24
|
+
* active human boundary (the model ASKED via ask_user_questions). Unlike the
|
|
25
|
+
* `inFlightTools` Map, this is NOT gated by auto-session.active, so it is true
|
|
26
|
+
* in FOREGROUND (where s.active is false). Kept SEPARATE from inFlightTools so
|
|
27
|
+
* getInFlightToolCount()/getOldestInFlightToolAgeMs()/hasInteractiveToolInFlight()
|
|
28
|
+
* and the auto-watchdog accounting are byte-for-byte unchanged. A refcount (not
|
|
29
|
+
* a boolean) handles nested/back-to-back elicitations in a single turn.
|
|
30
|
+
*/
|
|
31
|
+
let interactiveElicitationDepth = 0;
|
|
32
|
+
|
|
22
33
|
/**
|
|
23
34
|
* Mark a tool execution as in-flight.
|
|
24
35
|
* Records start time and tool name so the idle watchdog can detect tools
|
|
@@ -36,6 +47,29 @@ export function markToolEnd(toolCallId: string): void {
|
|
|
36
47
|
inFlightTools.delete(toolCallId);
|
|
37
48
|
}
|
|
38
49
|
|
|
50
|
+
/**
|
|
51
|
+
* Mark an interactive elicitation (the model asking via ask_user_questions) as
|
|
52
|
+
* in flight. Ungated by auto-session.active so it is observable in foreground.
|
|
53
|
+
*/
|
|
54
|
+
export function markInteractiveElicitationStart(): void {
|
|
55
|
+
interactiveElicitationDepth++;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Mark an interactive elicitation as completed. Idempotent below zero.
|
|
60
|
+
*/
|
|
61
|
+
export function markInteractiveElicitationEnd(): void {
|
|
62
|
+
if (interactiveElicitationDepth > 0) interactiveElicitationDepth--;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Returns true if any interactive elicitation is currently the active human
|
|
67
|
+
* boundary. True in ALL modes (foreground and auto) while one is in flight.
|
|
68
|
+
*/
|
|
69
|
+
export function isInteractiveElicitationInFlight(): boolean {
|
|
70
|
+
return interactiveElicitationDepth > 0;
|
|
71
|
+
}
|
|
72
|
+
|
|
39
73
|
/**
|
|
40
74
|
* Returns the age (ms) of the oldest currently in-flight tool, or 0 if none.
|
|
41
75
|
*/
|
|
@@ -84,6 +118,7 @@ export function hasInteractiveToolInFlight(): boolean {
|
|
|
84
118
|
*/
|
|
85
119
|
export function clearInFlightTools(): void {
|
|
86
120
|
inFlightTools.clear();
|
|
121
|
+
interactiveElicitationDepth = 0;
|
|
87
122
|
}
|
|
88
123
|
|
|
89
124
|
// ─── Tool invocation error classification (#2883) ────────────────────────
|
|
@@ -3,32 +3,18 @@ import {
|
|
|
3
3
|
AUTO_UNIT_SCOPED_TOOLS,
|
|
4
4
|
getForbiddenGsdToolReason,
|
|
5
5
|
} from "./unit-tool-contracts.js";
|
|
6
|
+
import {
|
|
7
|
+
WORKFLOW_TOOL_ALIAS_PAIRS,
|
|
8
|
+
canonicalWorkflowSurfaceToolName,
|
|
9
|
+
isWorkflowSurfaceAliasTool,
|
|
10
|
+
stripMcpToolPrefix,
|
|
11
|
+
} from "./workflow-tool-surface.js";
|
|
6
12
|
|
|
7
13
|
export {
|
|
8
14
|
AUTO_UNIT_SCOPED_TOOLS,
|
|
9
15
|
RUN_UAT_BROWSER_TOOL_NAMES,
|
|
10
16
|
} from "./unit-tool-contracts.js";
|
|
11
17
|
|
|
12
|
-
const WORKFLOW_TOOL_ALIASES: Record<string, string> = {
|
|
13
|
-
gsd_save_decision: "gsd_decision_save",
|
|
14
|
-
gsd_update_requirement: "gsd_requirement_update",
|
|
15
|
-
gsd_save_requirement: "gsd_requirement_save",
|
|
16
|
-
gsd_save_summary: "gsd_summary_save",
|
|
17
|
-
gsd_generate_milestone_id: "gsd_milestone_generate_id",
|
|
18
|
-
gsd_milestone_plan: "gsd_plan_milestone",
|
|
19
|
-
gsd_slice_plan: "gsd_plan_slice",
|
|
20
|
-
gsd_task_plan: "gsd_plan_task",
|
|
21
|
-
gsd_slice_replan: "gsd_replan_slice",
|
|
22
|
-
gsd_complete_slice: "gsd_slice_complete",
|
|
23
|
-
gsd_milestone_complete: "gsd_complete_milestone",
|
|
24
|
-
gsd_milestone_validate: "gsd_validate_milestone",
|
|
25
|
-
gsd_roadmap_reassess: "gsd_reassess_roadmap",
|
|
26
|
-
gsd_complete_task: "gsd_task_complete",
|
|
27
|
-
gsd_reopen_task: "gsd_task_reopen",
|
|
28
|
-
gsd_reopen_slice: "gsd_slice_reopen",
|
|
29
|
-
gsd_reopen_milestone: "gsd_milestone_reopen",
|
|
30
|
-
};
|
|
31
|
-
|
|
32
18
|
const EXECUTE_TASK_UNIT_TYPES = new Set([
|
|
33
19
|
"execute-task",
|
|
34
20
|
"execute-task-simple",
|
|
@@ -55,7 +41,7 @@ const EXTRA_SCOPED_GSD_LIFECYCLE_TOOLS = [
|
|
|
55
41
|
const SCOPED_GSD_LIFECYCLE_TOOLS = new Set(
|
|
56
42
|
[
|
|
57
43
|
...Object.values(AUTO_UNIT_SCOPED_TOOLS).flat(),
|
|
58
|
-
...
|
|
44
|
+
...WORKFLOW_TOOL_ALIAS_PAIRS.map(({ canonical }) => canonical),
|
|
59
45
|
...EXTRA_SCOPED_GSD_LIFECYCLE_TOOLS,
|
|
60
46
|
]
|
|
61
47
|
.filter((tool) => tool.startsWith("gsd_"))
|
|
@@ -72,19 +58,12 @@ type AutoUnitToolScopeResult = {
|
|
|
72
58
|
displayReason?: string;
|
|
73
59
|
};
|
|
74
60
|
|
|
75
|
-
function stripMcpToolPrefix(toolName: string): string {
|
|
76
|
-
if (!toolName.startsWith("mcp__")) return toolName;
|
|
77
|
-
const toolSeparator = toolName.indexOf("__", "mcp__".length);
|
|
78
|
-
return toolSeparator >= 0 ? toolName.slice(toolSeparator + 2) : toolName;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
61
|
export function canonicalWorkflowToolName(toolName: string): string {
|
|
82
|
-
|
|
83
|
-
return WORKFLOW_TOOL_ALIASES[base] ?? base;
|
|
62
|
+
return canonicalWorkflowSurfaceToolName(toolName);
|
|
84
63
|
}
|
|
85
64
|
|
|
86
65
|
export function isWorkflowAliasTool(toolName: string): boolean {
|
|
87
|
-
return
|
|
66
|
+
return isWorkflowSurfaceAliasTool(toolName);
|
|
88
67
|
}
|
|
89
68
|
|
|
90
69
|
function hardBlockReason(unitType: string, what: string): string {
|
|
@@ -16,13 +16,13 @@
|
|
|
16
16
|
import type { ExtensionContext, ExtensionAPI } from "@gsd/pi-coding-agent";
|
|
17
17
|
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
|
|
18
18
|
import { gsdProjectionRoot, resolveSliceFile, resolveSlicePath, resolveMilestoneFile } from "./paths.js";
|
|
19
|
+
import { resolveMilestoneValidationVerdict } from "./milestone-validation-verdict.js";
|
|
19
20
|
import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
|
|
20
21
|
import { parseUnitId } from "./unit-id.js";
|
|
21
22
|
import { isDbAvailable, getTask, getSliceTasks, getMilestoneSlices } from "./gsd-db.js";
|
|
22
23
|
import type { TaskRow } from "./db-task-slice-rows.js";
|
|
23
24
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
24
25
|
import type { GSDPreferences } from "./preferences-types.js";
|
|
25
|
-
import { extractVerdict } from "./verdict-parser.js";
|
|
26
26
|
import { isClosedStatus } from "./status-guards.js";
|
|
27
27
|
import { loadFile } from "./files.js";
|
|
28
28
|
import { parseRoadmap } from "./parsers-legacy.js";
|
|
@@ -269,28 +269,27 @@ async function runValidateMilestonePostCheck(
|
|
|
269
269
|
mid,
|
|
270
270
|
`${mid}-VALIDATION.md`,
|
|
271
271
|
);
|
|
272
|
-
|
|
272
|
+
const validationContent = await loadFile(validationFile);
|
|
273
|
+
if (validationContent !== null && validationContent.trim() === "") {
|
|
273
274
|
if (await reassessmentInvalidatedValidation()) {
|
|
274
275
|
clearValidationRetry();
|
|
275
276
|
return "continue";
|
|
276
277
|
}
|
|
277
278
|
return setToolFailureRetry(
|
|
278
|
-
"You must call gsd_validate_milestone to persist the validation results.
|
|
279
|
+
"You must call gsd_validate_milestone to persist the validation results. VALIDATION.md exists but is empty.",
|
|
279
280
|
);
|
|
280
281
|
}
|
|
281
282
|
|
|
282
|
-
const
|
|
283
|
-
if (!
|
|
283
|
+
const verdict = await resolveMilestoneValidationVerdict(s.basePath, mid);
|
|
284
|
+
if (!verdict) {
|
|
284
285
|
if (await reassessmentInvalidatedValidation()) {
|
|
285
286
|
clearValidationRetry();
|
|
286
287
|
return "continue";
|
|
287
288
|
}
|
|
288
289
|
return setToolFailureRetry(
|
|
289
|
-
"You must call gsd_validate_milestone to persist the validation results. VALIDATION.md
|
|
290
|
+
"You must call gsd_validate_milestone to persist the validation results. No VALIDATION.md was created.",
|
|
290
291
|
);
|
|
291
292
|
}
|
|
292
|
-
|
|
293
|
-
const verdict = extractVerdict(validationContent);
|
|
294
293
|
if (verdict === "needs-attention") {
|
|
295
294
|
ctx.ui.notify(
|
|
296
295
|
`Milestone ${mid} validation returned verdict=needs-attention. Pausing for human review.`,
|
|
@@ -28,10 +28,12 @@ import {
|
|
|
28
28
|
getMilestone,
|
|
29
29
|
getMilestoneSlices,
|
|
30
30
|
getSliceTasks,
|
|
31
|
-
closeDatabase,
|
|
32
|
-
openDatabase,
|
|
33
|
-
getDbPath,
|
|
34
31
|
} from "./gsd-db.js";
|
|
32
|
+
import {
|
|
33
|
+
closeWorkflowDatabase,
|
|
34
|
+
getWorkflowDatabasePath,
|
|
35
|
+
openWorkflowDatabasePath,
|
|
36
|
+
} from "./db-workspace.js";
|
|
35
37
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
36
38
|
import { execFileSync } from "node:child_process";
|
|
37
39
|
import { gsdRoot, resolveGsdPathContract } from "./paths.js";
|
|
@@ -53,8 +55,11 @@ import {
|
|
|
53
55
|
resolveWorktreeProjectRoot,
|
|
54
56
|
} from "./worktree-root.js";
|
|
55
57
|
import { autoResolveSafeConflictPaths } from "./git-conflict-resolve.js";
|
|
56
|
-
import { MergeConflictError,
|
|
57
|
-
import {
|
|
58
|
+
import { MergeConflictError, readIntegrationBranch, resolveMilestoneIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
|
|
59
|
+
import {
|
|
60
|
+
buildPullRequestEvidence,
|
|
61
|
+
createDraftPullRequestFromEvidence,
|
|
62
|
+
} from "./pull-request-process.js";
|
|
58
63
|
import { debugLog } from "./debug-logger.js";
|
|
59
64
|
import { logWarning, logError } from "./workflow-logger.js";
|
|
60
65
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
@@ -86,16 +91,14 @@ import {
|
|
|
86
91
|
} from "./native-git-bridge.js";
|
|
87
92
|
import {
|
|
88
93
|
CLOSEOUT_CONSISTENCY_BLOCKED_REASON,
|
|
89
|
-
checkCloseoutConsistencyGate,
|
|
90
|
-
formatCloseoutConsistencyBlock,
|
|
91
94
|
} from "./closeout-consistency-gate.js";
|
|
95
|
+
import {
|
|
96
|
+
formatCloseoutProofBlock,
|
|
97
|
+
proveMilestoneCloseout,
|
|
98
|
+
} from "./milestone-closeout-proof.js";
|
|
92
99
|
import { gsdHome } from "./gsd-home.js";
|
|
93
100
|
import { type MilestoneScope, type GsdWorkspace, createWorkspace } from "./workspace.js";
|
|
94
|
-
import {
|
|
95
|
-
_finalizeProjectionForMergeImpl,
|
|
96
|
-
_projectRootToWorktreeImpl,
|
|
97
|
-
_projectWorktreeToRootImpl,
|
|
98
|
-
} from "./worktree-state-projection.js";
|
|
101
|
+
import { WorktreeStateProjection } from "./worktree-state-projection.js";
|
|
99
102
|
|
|
100
103
|
const PROJECT_PREFERENCES_FILE = "PREFERENCES.md";
|
|
101
104
|
const LEGACY_PROJECT_PREFERENCES_FILE = "preferences.md";
|
|
@@ -584,7 +587,7 @@ export function syncProjectRootToWorktree(
|
|
|
584
587
|
worktreePath_: string,
|
|
585
588
|
milestoneId: string | null,
|
|
586
589
|
): void {
|
|
587
|
-
|
|
590
|
+
new WorktreeStateProjection().projectRootToWorktreePaths(projectRoot, worktreePath_, milestoneId);
|
|
588
591
|
}
|
|
589
592
|
|
|
590
593
|
/**
|
|
@@ -597,7 +600,7 @@ export function syncStateToProjectRoot(
|
|
|
597
600
|
projectRoot: string,
|
|
598
601
|
milestoneId: string | null,
|
|
599
602
|
): void {
|
|
600
|
-
|
|
603
|
+
new WorktreeStateProjection().projectWorktreeToRootPaths(worktreePath_, projectRoot, milestoneId);
|
|
601
604
|
}
|
|
602
605
|
|
|
603
606
|
// ─── Resource Staleness ───────────────────────────────────────────────────
|
|
@@ -960,7 +963,11 @@ export function syncWorktreeStateBack(
|
|
|
960
963
|
worktreePath: string,
|
|
961
964
|
milestoneId: string,
|
|
962
965
|
): { synced: string[] } {
|
|
963
|
-
return
|
|
966
|
+
return new WorktreeStateProjection().finalizeProjectionForMergePaths(
|
|
967
|
+
mainBasePath,
|
|
968
|
+
worktreePath,
|
|
969
|
+
milestoneId,
|
|
970
|
+
);
|
|
964
971
|
}
|
|
965
972
|
export { runWorktreePostCreateHook } from "./worktree-post-create-hook.js";
|
|
966
973
|
|
|
@@ -1782,10 +1789,10 @@ export function mergeMilestoneToMain(
|
|
|
1782
1789
|
const worktreeDbPath = join(contract.worktreeGsd ?? join(worktreeCwd, ".gsd"), "gsd.db");
|
|
1783
1790
|
const mainDbPath = contract.projectDb;
|
|
1784
1791
|
try {
|
|
1785
|
-
const activeDbPath =
|
|
1792
|
+
const activeDbPath = getWorkflowDatabasePath();
|
|
1786
1793
|
if (activeDbPath && _shouldReconcileWorktreeDb(activeDbPath, mainDbPath)) {
|
|
1787
|
-
|
|
1788
|
-
if (!
|
|
1794
|
+
closeWorkflowDatabase();
|
|
1795
|
+
if (!openWorkflowDatabasePath(mainDbPath)) {
|
|
1789
1796
|
throw new Error(`cannot open project DB at ${mainDbPath}`);
|
|
1790
1797
|
}
|
|
1791
1798
|
}
|
|
@@ -1798,9 +1805,9 @@ export function mergeMilestoneToMain(
|
|
|
1798
1805
|
throw new GSDError(GSD_GIT_ERROR, `${message}. Recovery reason: ${CLOSEOUT_CONSISTENCY_BLOCKED_REASON}.`);
|
|
1799
1806
|
}
|
|
1800
1807
|
|
|
1801
|
-
const
|
|
1802
|
-
if (!
|
|
1803
|
-
throw new GSDError(GSD_GIT_ERROR,
|
|
1808
|
+
const closeoutProof = proveMilestoneCloseout(milestoneId);
|
|
1809
|
+
if (!closeoutProof.ok) {
|
|
1810
|
+
throw new GSDError(GSD_GIT_ERROR, formatCloseoutProofBlock(closeoutProof));
|
|
1804
1811
|
}
|
|
1805
1812
|
}
|
|
1806
1813
|
|
|
@@ -2127,10 +2134,10 @@ export function mergeMilestoneToMain(
|
|
|
2127
2134
|
// stashing so Windows releases the handles; reopen after. No-op on
|
|
2128
2135
|
// POSIX, where advisory locks don't block git.
|
|
2129
2136
|
const needsDbCycle = process.platform === "win32" && isDbAvailable();
|
|
2130
|
-
const dbPathToReopen = needsDbCycle ?
|
|
2137
|
+
const dbPathToReopen = needsDbCycle ? getWorkflowDatabasePath() : null;
|
|
2131
2138
|
if (needsDbCycle) {
|
|
2132
2139
|
try {
|
|
2133
|
-
|
|
2140
|
+
closeWorkflowDatabase();
|
|
2134
2141
|
} catch (err) {
|
|
2135
2142
|
logWarning("worktree", `pre-stash db close failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2136
2143
|
}
|
|
@@ -2180,7 +2187,7 @@ export function mergeMilestoneToMain(
|
|
|
2180
2187
|
: nativeMergeSquash(originalBasePath_, milestoneBranch);
|
|
2181
2188
|
if (needsDbCycle && dbPathToReopen) {
|
|
2182
2189
|
try {
|
|
2183
|
-
|
|
2190
|
+
openWorkflowDatabasePath(dbPathToReopen);
|
|
2184
2191
|
} catch (err) {
|
|
2185
2192
|
logWarning("worktree", `post-merge db reopen failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2186
2193
|
}
|
|
@@ -2544,7 +2551,7 @@ export function mergeMilestoneToMain(
|
|
|
2544
2551
|
stdio: ["ignore", "pipe", "pipe"],
|
|
2545
2552
|
encoding: "utf-8",
|
|
2546
2553
|
});
|
|
2547
|
-
const prEvidence =
|
|
2554
|
+
const prEvidence = buildPullRequestEvidence({
|
|
2548
2555
|
milestoneId,
|
|
2549
2556
|
milestoneTitle,
|
|
2550
2557
|
changeType: "feat",
|
|
@@ -2553,7 +2560,7 @@ export function mergeMilestoneToMain(
|
|
|
2553
2560
|
rollbackNotes: ["Close the draft PR or revert the merge commit if review finds a behavior regression."],
|
|
2554
2561
|
how: "Generated by git.auto_pr after the milestone branch was pushed and merged locally.",
|
|
2555
2562
|
});
|
|
2556
|
-
const prUrl =
|
|
2563
|
+
const prUrl = createDraftPullRequestFromEvidence(originalBasePath_, milestoneId, prEvidence, {
|
|
2557
2564
|
head: milestoneBranch,
|
|
2558
2565
|
base: prTarget,
|
|
2559
2566
|
});
|
|
@@ -185,6 +185,7 @@ import {
|
|
|
185
185
|
} from "./auto-worktree.js";
|
|
186
186
|
import { pruneQueueOrder } from "./queue-order.js";
|
|
187
187
|
import { startCommandPolling as _startCommandPolling, isRemoteConfigured } from "../remote-questions/manager.js";
|
|
188
|
+
import { createMilestoneMergeTransaction } from "./milestone-merge-transaction.js";
|
|
188
189
|
|
|
189
190
|
import { debugLog, isDebugEnabled, writeDebugSummary } from "./debug-logger.js";
|
|
190
191
|
import {
|
|
@@ -225,8 +226,8 @@ import {
|
|
|
225
226
|
getMilestoneSlices,
|
|
226
227
|
getSlice,
|
|
227
228
|
getTask,
|
|
228
|
-
refreshOpenDatabaseFromDisk,
|
|
229
229
|
} from "./gsd-db.js";
|
|
230
|
+
import { closeWorkflowDatabase } from "./db-workspace.js";
|
|
230
231
|
import { markLatestActiveForWorkerCanceled } from "./db/unit-dispatches.js";
|
|
231
232
|
import { writeUnitRuntimeRecord } from "./unit-runtime.js";
|
|
232
233
|
import { countPendingCaptures } from "./captures.js";
|
|
@@ -320,7 +321,7 @@ export type {
|
|
|
320
321
|
UnitRouting,
|
|
321
322
|
StartModel,
|
|
322
323
|
} from "./auto/session.js";
|
|
323
|
-
import { autoSession as s } from "./auto-runtime-state.js";
|
|
324
|
+
import { autoSession as s, getAutoRuntimeSnapshot } from "./auto-runtime-state.js";
|
|
324
325
|
import { gsdHome } from "./gsd-home.js";
|
|
325
326
|
import { createWorkspace, scopeMilestone } from "./workspace.js";
|
|
326
327
|
import {
|
|
@@ -791,6 +792,7 @@ export { type AutoDashboardData } from "./auto-dashboard.js";
|
|
|
791
792
|
|
|
792
793
|
export function getAutoDashboardData(): AutoDashboardData {
|
|
793
794
|
const ledger = getLedger();
|
|
795
|
+
const runtimeSnapshot = getAutoRuntimeSnapshot();
|
|
794
796
|
const totals = ledger ? getProjectTotals(ledger.units) : null;
|
|
795
797
|
const sessionId = s.cmdCtx?.sessionManager?.getSessionId?.() ?? null;
|
|
796
798
|
const rtkSavings = sessionId && s.basePath
|
|
@@ -822,6 +824,7 @@ export function getAutoDashboardData(): AutoDashboardData {
|
|
|
822
824
|
pendingCaptureCount,
|
|
823
825
|
rtkSavings,
|
|
824
826
|
rtkEnabled,
|
|
827
|
+
toolSurface: runtimeSnapshot.toolSurface,
|
|
825
828
|
};
|
|
826
829
|
}
|
|
827
830
|
|
|
@@ -1476,12 +1479,17 @@ export async function stopAuto(
|
|
|
1476
1479
|
// worktree was active, and whether the current milestone was merged before
|
|
1477
1480
|
// stopAuto. The unmerged-work warning is only meaningful for real worktrees.
|
|
1478
1481
|
try {
|
|
1479
|
-
const {
|
|
1482
|
+
const {
|
|
1483
|
+
autoExitReasonForTerminalOutcome,
|
|
1484
|
+
emitAutoExit,
|
|
1485
|
+
normalizeAutoExitReason,
|
|
1486
|
+
} = await import("./worktree-telemetry.js");
|
|
1480
1487
|
// Normalize the free-form reason to a closed set so the telemetry
|
|
1481
1488
|
// aggregator buckets stably. Raw detail is preserved in the phases.ts
|
|
1482
1489
|
// notification and the notify'd error string.
|
|
1483
1490
|
const rawReason = reason ?? "stop";
|
|
1484
|
-
const normalizedReason =
|
|
1491
|
+
const normalizedReason = autoExitReasonForTerminalOutcome(options.terminalOutcome)
|
|
1492
|
+
?? normalizeAutoExitReason(rawReason);
|
|
1485
1493
|
const telemetryBase = s.originalBasePath || s.basePath;
|
|
1486
1494
|
emitAutoExit(telemetryBase, {
|
|
1487
1495
|
reason: normalizedReason,
|
|
@@ -1674,8 +1682,7 @@ export async function stopAuto(
|
|
|
1674
1682
|
// ── Step 6: DB cleanup ──
|
|
1675
1683
|
if (isDbAvailable()) {
|
|
1676
1684
|
try {
|
|
1677
|
-
|
|
1678
|
-
closeDatabase();
|
|
1685
|
+
closeWorkflowDatabase();
|
|
1679
1686
|
} catch (e) {
|
|
1680
1687
|
debugLog("db-close-failed", {
|
|
1681
1688
|
error: e instanceof Error ? e.message : String(e),
|
|
@@ -2143,7 +2150,7 @@ export function buildWorktreeLifecycleDeps(): WorktreeLifecycleDeps {
|
|
|
2143
2150
|
// C4 (#5627) — GitServiceImpl constructor → gitServiceFactory
|
|
2144
2151
|
//
|
|
2145
2152
|
// Final WorktreeLifecycleDeps shape: 3 fields (gitServiceFactory,
|
|
2146
|
-
// worktreeProjection, mergeMilestoneToMain). Down from 18 at slice-7
|
|
2153
|
+
// worktreeProjection, mergeMilestoneToMain transaction runner). Down from 18 at slice-7
|
|
2147
2154
|
// closure.
|
|
2148
2155
|
return {
|
|
2149
2156
|
gitServiceFactory: (basePath: string) => {
|
|
@@ -2152,7 +2159,7 @@ export function buildWorktreeLifecycleDeps(): WorktreeLifecycleDeps {
|
|
|
2152
2159
|
return new GitServiceImpl(basePath, gitConfig);
|
|
2153
2160
|
},
|
|
2154
2161
|
worktreeProjection: new WorktreeStateProjection(),
|
|
2155
|
-
mergeMilestoneToMain,
|
|
2162
|
+
mergeMilestoneToMain: createMilestoneMergeTransaction(mergeMilestoneToMain),
|
|
2156
2163
|
};
|
|
2157
2164
|
}
|
|
2158
2165
|
|
|
@@ -12,6 +12,7 @@ import { logError } from "../workflow-logger.js";
|
|
|
12
12
|
import { getErrorMessage } from "../error-utils.js";
|
|
13
13
|
import { incrementLegacyTelemetry } from "../legacy-telemetry.js";
|
|
14
14
|
import { prepareSaveGateResultArguments } from "../tools/save-gate-result-args.js";
|
|
15
|
+
import { aliasesForWorkflowTool } from "../workflow-tool-surface.js";
|
|
15
16
|
|
|
16
17
|
async function loadWorkflowExecutors(): Promise<typeof import("../tools/workflow-tool-executors.js")> {
|
|
17
18
|
return importWorkflowExecutorsModule();
|
|
@@ -53,6 +54,14 @@ function registerAlias(pi: ExtensionAPI, toolDef: any, aliasName: string, canoni
|
|
|
53
54
|
});
|
|
54
55
|
}
|
|
55
56
|
|
|
57
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- toolDef shape matches ToolDefinition but varies by schema
|
|
58
|
+
function registerWorkflowTool(pi: ExtensionAPI, toolDef: any): void {
|
|
59
|
+
pi.registerTool(toolDef);
|
|
60
|
+
for (const alias of aliasesForWorkflowTool(toolDef.name)) {
|
|
61
|
+
registerAlias(pi, toolDef, alias, toolDef.name);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
56
65
|
function requirementRootWriteGuard(operation: string, basePath: string): { content: Array<{ type: "text"; text: string }>; details: Record<string, unknown>; isError: true } | null {
|
|
57
66
|
const guard = shouldBlockRootArtifactSaveInSnapshot(loadWriteGateSnapshot(basePath), "REQUIREMENTS");
|
|
58
67
|
if (!guard.block) return null;
|
|
@@ -171,8 +180,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
171
180
|
},
|
|
172
181
|
};
|
|
173
182
|
|
|
174
|
-
pi
|
|
175
|
-
registerAlias(pi, decisionSaveTool, "gsd_save_decision", "gsd_decision_save");
|
|
183
|
+
registerWorkflowTool(pi, decisionSaveTool);
|
|
176
184
|
|
|
177
185
|
// ─── gsd_requirement_update (formerly gsd_update_requirement) ───────────
|
|
178
186
|
|
|
@@ -252,8 +260,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
252
260
|
},
|
|
253
261
|
};
|
|
254
262
|
|
|
255
|
-
pi
|
|
256
|
-
registerAlias(pi, requirementUpdateTool, "gsd_update_requirement", "gsd_requirement_update");
|
|
263
|
+
registerWorkflowTool(pi, requirementUpdateTool);
|
|
257
264
|
|
|
258
265
|
// ─── gsd_requirement_save ─────────────────────────────────────────────
|
|
259
266
|
|
|
@@ -355,8 +362,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
355
362
|
},
|
|
356
363
|
};
|
|
357
364
|
|
|
358
|
-
pi
|
|
359
|
-
registerAlias(pi, requirementSaveTool, "gsd_save_requirement", "gsd_requirement_save");
|
|
365
|
+
registerWorkflowTool(pi, requirementSaveTool);
|
|
360
366
|
|
|
361
367
|
// ─── gsd_summary_save (formerly gsd_save_summary) ──────────────────────
|
|
362
368
|
|
|
@@ -413,8 +419,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
413
419
|
},
|
|
414
420
|
};
|
|
415
421
|
|
|
416
|
-
pi
|
|
417
|
-
registerAlias(pi, summarySaveTool, "gsd_save_summary", "gsd_summary_save");
|
|
422
|
+
registerWorkflowTool(pi, summarySaveTool);
|
|
418
423
|
|
|
419
424
|
// ─── gsd_uat_result_save ─────────────────────────────────────────────────
|
|
420
425
|
|
|
@@ -503,7 +508,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
503
508
|
},
|
|
504
509
|
};
|
|
505
510
|
|
|
506
|
-
pi
|
|
511
|
+
registerWorkflowTool(pi, uatResultSaveTool);
|
|
507
512
|
|
|
508
513
|
// ─── gsd_milestone_generate_id (formerly gsd_generate_milestone_id) ────
|
|
509
514
|
|
|
@@ -592,8 +597,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
592
597
|
},
|
|
593
598
|
};
|
|
594
599
|
|
|
595
|
-
pi
|
|
596
|
-
registerAlias(pi, milestoneGenerateIdTool, "gsd_generate_milestone_id", "gsd_milestone_generate_id");
|
|
600
|
+
registerWorkflowTool(pi, milestoneGenerateIdTool);
|
|
597
601
|
|
|
598
602
|
// ─── gsd_plan_milestone (gsd_milestone_plan alias) ─────────────────────
|
|
599
603
|
|
|
@@ -664,8 +668,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
664
668
|
execute: planMilestoneExecute,
|
|
665
669
|
};
|
|
666
670
|
|
|
667
|
-
pi
|
|
668
|
-
registerAlias(pi, planMilestoneTool, "gsd_milestone_plan", "gsd_plan_milestone");
|
|
671
|
+
registerWorkflowTool(pi, planMilestoneTool);
|
|
669
672
|
|
|
670
673
|
// ─── gsd_plan_slice (gsd_slice_plan alias) ─────────────────────────────
|
|
671
674
|
|
|
@@ -714,8 +717,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
714
717
|
execute: planSliceExecute,
|
|
715
718
|
};
|
|
716
719
|
|
|
717
|
-
pi
|
|
718
|
-
registerAlias(pi, planSliceTool, "gsd_slice_plan", "gsd_plan_slice");
|
|
720
|
+
registerWorkflowTool(pi, planSliceTool);
|
|
719
721
|
|
|
720
722
|
// ─── gsd_plan_task (gsd_task_plan alias) ───────────────────────────────
|
|
721
723
|
|
|
@@ -788,8 +790,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
788
790
|
execute: planTaskExecute,
|
|
789
791
|
};
|
|
790
792
|
|
|
791
|
-
pi
|
|
792
|
-
registerAlias(pi, planTaskTool, "gsd_task_plan", "gsd_plan_task");
|
|
793
|
+
registerWorkflowTool(pi, planTaskTool);
|
|
793
794
|
|
|
794
795
|
// ─── gsd_task_complete (gsd_complete_task alias) ────────────────────────
|
|
795
796
|
|
|
@@ -857,8 +858,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
857
858
|
execute: taskCompleteExecute,
|
|
858
859
|
};
|
|
859
860
|
|
|
860
|
-
pi
|
|
861
|
-
registerAlias(pi, taskCompleteTool, "gsd_complete_task", "gsd_task_complete");
|
|
861
|
+
registerWorkflowTool(pi, taskCompleteTool);
|
|
862
862
|
|
|
863
863
|
// ─── gsd_slice_complete (gsd_complete_slice alias) ─────────────────────
|
|
864
864
|
|
|
@@ -943,8 +943,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
943
943
|
execute: sliceCompleteExecute,
|
|
944
944
|
};
|
|
945
945
|
|
|
946
|
-
pi
|
|
947
|
-
registerAlias(pi, sliceCompleteTool, "gsd_complete_slice", "gsd_slice_complete");
|
|
946
|
+
registerWorkflowTool(pi, sliceCompleteTool);
|
|
948
947
|
|
|
949
948
|
// ─── gsd_skip_slice (#3477 / #3487) ───────────────────────────────────
|
|
950
949
|
|
|
@@ -1016,7 +1015,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
1016
1015
|
}
|
|
1017
1016
|
};
|
|
1018
1017
|
|
|
1019
|
-
pi
|
|
1018
|
+
registerWorkflowTool(pi, {
|
|
1020
1019
|
name: "gsd_skip_slice",
|
|
1021
1020
|
label: "Skip Slice",
|
|
1022
1021
|
description:
|
|
@@ -1081,8 +1080,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
1081
1080
|
execute: milestoneCompleteExecute,
|
|
1082
1081
|
};
|
|
1083
1082
|
|
|
1084
|
-
pi
|
|
1085
|
-
registerAlias(pi, milestoneCompleteTool, "gsd_milestone_complete", "gsd_complete_milestone");
|
|
1083
|
+
registerWorkflowTool(pi, milestoneCompleteTool);
|
|
1086
1084
|
|
|
1087
1085
|
// ─── gsd_validate_milestone (gsd_milestone_validate alias) ─────────────
|
|
1088
1086
|
|
|
@@ -1121,8 +1119,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
1121
1119
|
execute: milestoneValidateExecute,
|
|
1122
1120
|
};
|
|
1123
1121
|
|
|
1124
|
-
pi
|
|
1125
|
-
registerAlias(pi, milestoneValidateTool, "gsd_milestone_validate", "gsd_validate_milestone");
|
|
1122
|
+
registerWorkflowTool(pi, milestoneValidateTool);
|
|
1126
1123
|
|
|
1127
1124
|
// ─── gsd_replan_slice (gsd_slice_replan alias) ─────────────────────────
|
|
1128
1125
|
|
|
@@ -1172,8 +1169,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
1172
1169
|
execute: replanSliceExecute,
|
|
1173
1170
|
};
|
|
1174
1171
|
|
|
1175
|
-
pi
|
|
1176
|
-
registerAlias(pi, replanSliceTool, "gsd_slice_replan", "gsd_replan_slice");
|
|
1172
|
+
registerWorkflowTool(pi, replanSliceTool);
|
|
1177
1173
|
|
|
1178
1174
|
// ─── gsd_reassess_roadmap (gsd_roadmap_reassess alias) ─────────────────
|
|
1179
1175
|
|
|
@@ -1231,8 +1227,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
1231
1227
|
execute: reassessRoadmapExecute,
|
|
1232
1228
|
};
|
|
1233
1229
|
|
|
1234
|
-
pi
|
|
1235
|
-
registerAlias(pi, reassessRoadmapTool, "gsd_roadmap_reassess", "gsd_reassess_roadmap");
|
|
1230
|
+
registerWorkflowTool(pi, reassessRoadmapTool);
|
|
1236
1231
|
|
|
1237
1232
|
// ─── gsd_task_reopen (gsd_reopen_task alias) ───────────────────────────
|
|
1238
1233
|
// Single-writer v3, Stream 3: reversibility tools for closed units.
|
|
@@ -1299,8 +1294,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
1299
1294
|
execute: reopenTaskExecute,
|
|
1300
1295
|
};
|
|
1301
1296
|
|
|
1302
|
-
pi
|
|
1303
|
-
registerAlias(pi, reopenTaskTool, "gsd_reopen_task", "gsd_task_reopen");
|
|
1297
|
+
registerWorkflowTool(pi, reopenTaskTool);
|
|
1304
1298
|
|
|
1305
1299
|
// ─── gsd_slice_reopen (gsd_reopen_slice alias) ─────────────────────────
|
|
1306
1300
|
|
|
@@ -1366,8 +1360,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
1366
1360
|
execute: reopenSliceExecute,
|
|
1367
1361
|
};
|
|
1368
1362
|
|
|
1369
|
-
pi
|
|
1370
|
-
registerAlias(pi, reopenSliceTool, "gsd_reopen_slice", "gsd_slice_reopen");
|
|
1363
|
+
registerWorkflowTool(pi, reopenSliceTool);
|
|
1371
1364
|
|
|
1372
1365
|
// ─── gsd_milestone_reopen (gsd_reopen_milestone alias) ─────────────────
|
|
1373
1366
|
|
|
@@ -1431,8 +1424,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
1431
1424
|
execute: reopenMilestoneExecute,
|
|
1432
1425
|
};
|
|
1433
1426
|
|
|
1434
|
-
pi
|
|
1435
|
-
registerAlias(pi, reopenMilestoneTool, "gsd_reopen_milestone", "gsd_milestone_reopen");
|
|
1427
|
+
registerWorkflowTool(pi, reopenMilestoneTool);
|
|
1436
1428
|
|
|
1437
1429
|
// ─── gsd_save_gate_result ──────────────────────────────────────────────
|
|
1438
1430
|
|
|
@@ -1500,5 +1492,5 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
1500
1492
|
},
|
|
1501
1493
|
};
|
|
1502
1494
|
|
|
1503
|
-
pi
|
|
1495
|
+
registerWorkflowTool(pi, saveGateResultTool);
|
|
1504
1496
|
}
|