@opengsd/gsd-pi 1.2.0-dev.9ad8ae33 → 1.2.0-dev.a6376d75
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-model-override.d.ts +15 -0
- package/dist/cli-model-override.js +21 -0
- package/dist/cli.js +1 -18
- package/dist/loader.js +6 -4
- package/dist/register-agent-bundles.d.ts +11 -2
- package/dist/register-agent-bundles.js +18 -4
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/ask-user-questions.js +3 -2
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +447 -215
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
- package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +21 -6
- package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
- package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
- package/dist/resources/extensions/gsd/auto/loop.js +4 -1
- package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +85 -15
- package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +17 -2372
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
- package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
- package/dist/resources/extensions/gsd/auto-worktree.js +1 -1
- package/dist/resources/extensions/gsd/auto.js +15 -1
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -7
- package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
- package/dist/resources/extensions/gsd/db/queries.js +30 -0
- package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
- package/dist/resources/extensions/gsd/guided-flow.js +88 -2
- package/dist/resources/extensions/gsd/health-widget.js +87 -28
- package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
- package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
- package/dist/resources/extensions/gsd/notifications.js +12 -7
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +2 -0
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/dist/resources/extensions/gsd/skill-activation.js +3 -6
- package/dist/resources/extensions/gsd/state.js +6 -2
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
- package/dist/resources/extensions/gsd/tools/complete-task.js +62 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
- package/dist/resources/extensions/gsd/unit-registry.js +34 -4
- package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
- package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
- package/dist/resources/extensions/mcp-client/manager.js +6 -1
- package/dist/runtime-checks.d.ts +10 -0
- package/dist/runtime-checks.js +27 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- 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 +8 -8
- package/dist/web/standalone/.next/server/middleware-build-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/package.json +2 -2
- 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/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +6 -4
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +8 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +50 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/README.md +12 -3
- package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
- package/packages/mcp-server/dist/cli-runner.js +137 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -0
- package/packages/mcp-server/dist/cli.js +2 -58
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
- package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
- package/packages/mcp-server/dist/pid-registry.js +452 -0
- package/packages/mcp-server/dist/pid-registry.js.map +1 -0
- package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
- package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
- package/packages/mcp-server/dist/probe-mode.js +10 -0
- package/packages/mcp-server/dist/probe-mode.js.map +1 -0
- package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
- package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
- package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
- package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +62 -43
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -5
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +43 -2
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/index.d.ts +1 -1
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +1 -1
- package/packages/pi-tui/dist/index.js.map +1 -1
- package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
- package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal-image.js +54 -2
- package/packages/pi-tui/dist/terminal-image.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +8 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +63 -18
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/dist/utils.d.ts.map +1 -1
- package/packages/pi-tui/dist/utils.js +110 -36
- package/packages/pi-tui/dist/utils.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +45 -17
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/ask-user-questions.ts +7 -2
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
- package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +22 -6
- package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
- package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
- package/src/resources/extensions/gsd/auto/loop.ts +4 -1
- package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +95 -15
- package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
- package/src/resources/extensions/gsd/auto/phases.ts +58 -3061
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
- package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +1 -1
- package/src/resources/extensions/gsd/auto.ts +20 -1
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +56 -6
- package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
- package/src/resources/extensions/gsd/db/queries.ts +29 -0
- package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
- package/src/resources/extensions/gsd/guided-flow.ts +128 -2
- package/src/resources/extensions/gsd/health-widget.ts +91 -27
- package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
- package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
- package/src/resources/extensions/gsd/notifications.ts +13 -6
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/execute-task.md +2 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +2 -0
- package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/src/resources/extensions/gsd/skill-activation.ts +3 -6
- package/src/resources/extensions/gsd/state.ts +7 -1
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +76 -12
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
- package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
- package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
- package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
- package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
- package/src/resources/extensions/gsd/unit-registry.ts +34 -4
- package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
- package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
- package/src/resources/extensions/mcp-client/manager.ts +7 -1
- /package/dist/web/standalone/.next/static/{FBNo5cT_chy7YNoAQsU3o → xyMkEaICFHJoa98VgJyzY}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{FBNo5cT_chy7YNoAQsU3o → xyMkEaICFHJoa98VgJyzY}/_ssgManifest.js +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Unit dispatch contract adapter for auto-mode loop.
|
|
3
3
|
import { ExecutionGraphScheduler } from "../uok/execution-graph.js";
|
|
4
|
-
import { runUnitPhase } from "./
|
|
4
|
+
import { runUnitPhase } from "./unit-phase.js";
|
|
5
5
|
import { decideDispatchNodeKind } from "./workflow-kernel.js";
|
|
6
6
|
export async function runUnitPhaseViaContract(dispatchContract, ic, iterData, loopState, sidecarItem, deps) {
|
|
7
7
|
if (dispatchContract === "legacy-direct") {
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Worktree-safety helpers shared across auto-loop phase modules.
|
|
3
|
+
import { classifyProject } from "../detection.js";
|
|
4
|
+
import { resolveEffectiveUnitIsolationMode } from "../preferences.js";
|
|
5
|
+
import { createWorktreeSafetyModule } from "../worktree-safety.js";
|
|
6
|
+
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
7
|
+
import { resolveManifest } from "../unit-context-manifest.js";
|
|
8
|
+
import { debugLog } from "../debug-logger.js";
|
|
9
|
+
import { isSamePathLocal } from "./phase-helpers.js";
|
|
10
|
+
import { hasHeldMilestoneLease, reclaimMissingMilestoneLease } from "./milestone-lease-reclaim.js";
|
|
11
|
+
export function shouldDegradeEmptyWorktreeToProjectRoot(worktreeClassification, projectRootClassification) {
|
|
12
|
+
return (worktreeClassification.kind === "greenfield" &&
|
|
13
|
+
projectRootClassification.kind !== "greenfield" &&
|
|
14
|
+
projectRootClassification.kind !== "invalid-repo");
|
|
15
|
+
}
|
|
16
|
+
export function unitWritesSource(unitType) {
|
|
17
|
+
if (unitType.startsWith("hook/"))
|
|
18
|
+
return false;
|
|
19
|
+
// Backward compatibility: sidecar queues from older builds may persist
|
|
20
|
+
// prefixed unit types (e.g. "sidecar/quick-task").
|
|
21
|
+
const normalizedUnitType = unitType.startsWith("sidecar/")
|
|
22
|
+
? unitType.slice("sidecar/".length)
|
|
23
|
+
: unitType;
|
|
24
|
+
const manifest = resolveManifest(normalizedUnitType);
|
|
25
|
+
if (!manifest)
|
|
26
|
+
return null;
|
|
27
|
+
return manifest.tools.mode === "all" || manifest.tools.mode === "docs";
|
|
28
|
+
}
|
|
29
|
+
export function formatWorktreeSafetyFailure(result) {
|
|
30
|
+
return `Worktree Safety failed (${result.kind}): ${result.reason} ${result.remediation}`;
|
|
31
|
+
}
|
|
32
|
+
export function formatWorktreeSafetyStopReason(result) {
|
|
33
|
+
if (result.kind === "empty-worktree-with-project-content") {
|
|
34
|
+
return `Worktree Safety failed (${result.kind}). Run /gsd doctor fix, then /gsd auto.`;
|
|
35
|
+
}
|
|
36
|
+
return `Worktree Safety failed (${result.kind}).`;
|
|
37
|
+
}
|
|
38
|
+
export function resolveEmptyWorktreeWithProjectContent(unitRoot, projectRoot) {
|
|
39
|
+
if (isSamePathLocal(unitRoot, projectRoot))
|
|
40
|
+
return false;
|
|
41
|
+
const worktreeClassification = classifyProject(unitRoot);
|
|
42
|
+
if (worktreeClassification.kind !== "greenfield")
|
|
43
|
+
return false;
|
|
44
|
+
const projectRootClassification = classifyProject(projectRoot);
|
|
45
|
+
return shouldDegradeEmptyWorktreeToProjectRoot(worktreeClassification, projectRootClassification);
|
|
46
|
+
}
|
|
47
|
+
export async function validateSourceWriteWorktreeSafety(ic, unitType, unitId, milestoneId, phase) {
|
|
48
|
+
const { ctx, pi, s, deps } = ic;
|
|
49
|
+
if (!s.basePath)
|
|
50
|
+
return null;
|
|
51
|
+
// Custom engine workflows (graph-driven, registered via run dirs) define
|
|
52
|
+
// their own step ids that are not in the GSD UnitContextManifest. Don't
|
|
53
|
+
// fail closed for those — the custom engine owns its own dispatch
|
|
54
|
+
// contract. The fail-closed safety check applies only to built-in GSD
|
|
55
|
+
// units whose Tool Contract is registered in the manifest. Use a truthy
|
|
56
|
+
// check so undefined (test sessions that never set the field) routes
|
|
57
|
+
// through the safety check, matching the regression test contract.
|
|
58
|
+
if (s.activeEngineId)
|
|
59
|
+
return null;
|
|
60
|
+
const writesSource = unitWritesSource(unitType);
|
|
61
|
+
if (writesSource === null) {
|
|
62
|
+
const msg = `Worktree Safety failed (missing-tool-contract): missing Tool Contract for ${unitType}. Add a UnitContextManifest entry before dispatching this Unit.`;
|
|
63
|
+
debugLog("worktreeSafety", {
|
|
64
|
+
phase,
|
|
65
|
+
unitType,
|
|
66
|
+
unitId,
|
|
67
|
+
milestoneId,
|
|
68
|
+
result: { ok: false, kind: "missing-tool-contract", reason: msg },
|
|
69
|
+
basePath: s.basePath,
|
|
70
|
+
});
|
|
71
|
+
ctx.ui.notify(msg, "error");
|
|
72
|
+
await deps.stopAuto(ctx, pi, msg);
|
|
73
|
+
return { action: "break", reason: "missing-tool-contract" };
|
|
74
|
+
}
|
|
75
|
+
if (!writesSource)
|
|
76
|
+
return null;
|
|
77
|
+
const projectRoot = s.canonicalProjectRoot ?? resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
|
|
78
|
+
// A degraded session already fell back to the milestone branch in the
|
|
79
|
+
// project root — validating against the canonical worktree root there
|
|
80
|
+
// would fail every dispatch with a false invalid-root. The same applies
|
|
81
|
+
// to a stranded-recovery session that adopted the milestone branch.
|
|
82
|
+
const isolationMode = resolveEffectiveUnitIsolationMode(deps.getIsolationMode(projectRoot), s.isolationDegraded, s.strandedRecoveryIsolationMode);
|
|
83
|
+
reclaimMissingMilestoneLease(s, milestoneId, isolationMode, phase);
|
|
84
|
+
const safety = createWorktreeSafetyModule();
|
|
85
|
+
const result = safety.validateUnitRoot({
|
|
86
|
+
unitType,
|
|
87
|
+
unitId,
|
|
88
|
+
writeScope: "source-writing",
|
|
89
|
+
projectRoot,
|
|
90
|
+
unitRoot: s.basePath,
|
|
91
|
+
milestoneId,
|
|
92
|
+
isolationMode,
|
|
93
|
+
expectedBranch: isolationMode !== "none" && milestoneId ? deps.autoWorktreeBranch(milestoneId) : null,
|
|
94
|
+
emptyWorktreeWithProjectContent: resolveEmptyWorktreeWithProjectContent(s.basePath, projectRoot),
|
|
95
|
+
// The milestone lease coordinates concurrent workers on an isolated
|
|
96
|
+
// milestone worktree/branch, which is established by enterMilestone in
|
|
97
|
+
// worktree/branch modes. `none` mode has no per-milestone isolation and
|
|
98
|
+
// does not reliably claim a lease (e.g. a fresh headless resume of an
|
|
99
|
+
// already-active milestone never re-enters it), so requiring a held lease
|
|
100
|
+
// there would falsely fail dispatch. Enforce the lease only in isolated
|
|
101
|
+
// modes; none-mode safety still validates the unit root.
|
|
102
|
+
lease: s.workerId
|
|
103
|
+
? {
|
|
104
|
+
required: isolationMode !== "none",
|
|
105
|
+
held: hasHeldMilestoneLease(s, milestoneId),
|
|
106
|
+
owner: s.workerId,
|
|
107
|
+
}
|
|
108
|
+
: undefined,
|
|
109
|
+
});
|
|
110
|
+
if (result.ok)
|
|
111
|
+
return null;
|
|
112
|
+
const msg = formatWorktreeSafetyFailure(result);
|
|
113
|
+
debugLog("worktreeSafety", {
|
|
114
|
+
phase,
|
|
115
|
+
unitType,
|
|
116
|
+
unitId,
|
|
117
|
+
milestoneId,
|
|
118
|
+
result,
|
|
119
|
+
basePath: s.basePath,
|
|
120
|
+
projectRoot,
|
|
121
|
+
});
|
|
122
|
+
ctx.ui.notify(msg, "error");
|
|
123
|
+
await deps.stopAuto(ctx, pi, formatWorktreeSafetyStopReason(result));
|
|
124
|
+
return { action: "break", reason: result.kind };
|
|
125
|
+
}
|
|
@@ -1041,7 +1041,7 @@ export function teardownAutoWorktree(originalBasePath, milestoneId, opts = {}) {
|
|
|
1041
1041
|
* still works after process restart when module state has been reset.
|
|
1042
1042
|
*/
|
|
1043
1043
|
export function isInAutoWorktree(basePath) {
|
|
1044
|
-
const targetPath = isGsdWorktreePath(basePath) ? basePath :
|
|
1044
|
+
const targetPath = isGsdWorktreePath(basePath) ? basePath : safeCwd("");
|
|
1045
1045
|
if (!isGsdWorktreePath(targetPath))
|
|
1046
1046
|
return false;
|
|
1047
1047
|
const storedBase = getAutoWorktreeOriginalBase();
|
|
@@ -512,6 +512,16 @@ export function _warnIfWorktreeMissingForTest(worktreePath, milestoneId) {
|
|
|
512
512
|
}
|
|
513
513
|
return false;
|
|
514
514
|
}
|
|
515
|
+
export function anchorProcessCwdForAutoResume(basePath) {
|
|
516
|
+
try {
|
|
517
|
+
process.chdir(basePath);
|
|
518
|
+
return true;
|
|
519
|
+
}
|
|
520
|
+
catch (err) {
|
|
521
|
+
logWarning("session", `resume cwd anchor failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts", basePath });
|
|
522
|
+
return false;
|
|
523
|
+
}
|
|
524
|
+
}
|
|
515
525
|
export function isAutoPaused() {
|
|
516
526
|
return s.paused;
|
|
517
527
|
}
|
|
@@ -751,6 +761,9 @@ function pauseAutoUnitIdentityMatches(expected) {
|
|
|
751
761
|
s.currentUnit.id === expected.id &&
|
|
752
762
|
s.currentUnit.startedAt === expected.startedAt;
|
|
753
763
|
}
|
|
764
|
+
function shouldPreserveCoordinationForPause(errorContext) {
|
|
765
|
+
return errorContext?.category === "provider" && errorContext.isTransient === true;
|
|
766
|
+
}
|
|
754
767
|
function setLifecycleOutcome(ctx, input) {
|
|
755
768
|
if (!ctx?.hasUI)
|
|
756
769
|
return;
|
|
@@ -1585,7 +1598,7 @@ export async function pauseAuto(ctx, _pi, _errorContext, options = {}) {
|
|
|
1585
1598
|
releaseSessionLock(lockBase());
|
|
1586
1599
|
clearLock(lockBase());
|
|
1587
1600
|
}
|
|
1588
|
-
if (s.workerId) {
|
|
1601
|
+
if (s.workerId && !shouldPreserveCoordinationForPause(_errorContext)) {
|
|
1589
1602
|
try {
|
|
1590
1603
|
if (s.currentMilestoneId && s.milestoneLeaseToken) {
|
|
1591
1604
|
releaseMilestoneLease(s.workerId, s.currentMilestoneId, s.milestoneLeaseToken);
|
|
@@ -2030,6 +2043,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
2030
2043
|
}
|
|
2031
2044
|
// ADR-016 phase 2 / B3 (#5621): paused-resume worktree-path adoption.
|
|
2032
2045
|
buildLifecycle().resumeFromPausedSession(base, resumeWorktreePath);
|
|
2046
|
+
anchorProcessCwdForAutoResume(s.basePath || base);
|
|
2033
2047
|
// Rebuild scope now that s.basePath reflects the actual worktree (or project root).
|
|
2034
2048
|
rebuildScope(s.basePath, s.currentMilestoneId);
|
|
2035
2049
|
// Ensure the workflow-logger audit log is pinned to the project root
|
|
@@ -5,7 +5,7 @@ import { homedir } from "node:os";
|
|
|
5
5
|
import { join } from "node:path";
|
|
6
6
|
import { createBashTool, createEditTool, createReadTool, createWriteTool } from "@gsd/pi-coding-agent";
|
|
7
7
|
import { logWarning } from "../workflow-logger.js";
|
|
8
|
-
import { openWorkflowDatabase } from "../db-workspace.js";
|
|
8
|
+
import { getWorkflowDatabaseStatus, openWorkflowDatabase, } from "../db-workspace.js";
|
|
9
9
|
import { getAutoWorktreePath } from "../auto-worktree.js";
|
|
10
10
|
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
11
11
|
import { worktreesDirs } from "../worktree-placement.js";
|
|
@@ -61,16 +61,46 @@ export function resolveWorkflowToolBasePath(ctx, scope) {
|
|
|
61
61
|
return cwd;
|
|
62
62
|
}
|
|
63
63
|
export { resolveProjectRootDbPath } from "../db-workspace.js";
|
|
64
|
+
function sqliteProviderHint(status, nodeVersion) {
|
|
65
|
+
if (status.provider)
|
|
66
|
+
return `Provider: ${status.provider}.`;
|
|
67
|
+
const major = Number.parseInt(nodeVersion.split(".")[0] ?? "", 10);
|
|
68
|
+
if (Number.isFinite(major) && major < 22) {
|
|
69
|
+
return (`No SQLite provider available. Upgrade Node to >= 22.0.0 (current: v${nodeVersion}), ` +
|
|
70
|
+
"use the packaged GSD runtime, or install/restore better-sqlite3 in this runtime.");
|
|
71
|
+
}
|
|
72
|
+
return ("No SQLite provider available. Use a Node build with node:sqlite enabled, " +
|
|
73
|
+
"run the packaged GSD runtime, or install/restore better-sqlite3 in this runtime.");
|
|
74
|
+
}
|
|
75
|
+
function dbOpenPhaseHint(status) {
|
|
76
|
+
if (status.lastPhase === "open")
|
|
77
|
+
return "The database file could not be opened";
|
|
78
|
+
if (status.lastPhase === "initSchema")
|
|
79
|
+
return "The database schema could not be initialized";
|
|
80
|
+
if (status.lastPhase === "vacuum-recovery")
|
|
81
|
+
return "Corruption recovery (VACUUM) failed";
|
|
82
|
+
if (status.attempted)
|
|
83
|
+
return "The database could not be opened";
|
|
84
|
+
return "The database provider could not be loaded";
|
|
85
|
+
}
|
|
86
|
+
export function formatWorkflowDatabaseOpenFailure(result, status, nodeVersion = process.versions.node) {
|
|
87
|
+
if (result.reason === "missing-gsd-dir") {
|
|
88
|
+
return `ensureDbOpen failed — no .gsd directory found at ${result.location.projectGsd}`;
|
|
89
|
+
}
|
|
90
|
+
if (result.reason === "missing-database") {
|
|
91
|
+
return `ensureDbOpen failed — no GSD database found at ${result.location.projectDb}`;
|
|
92
|
+
}
|
|
93
|
+
const resolvedStatus = status ?? getWorkflowDatabaseStatus();
|
|
94
|
+
const detail = result.error?.message ?? resolvedStatus.lastError?.message ?? "";
|
|
95
|
+
const detailSuffix = detail ? ` (${detail})` : "";
|
|
96
|
+
return (`ensureDbOpen failed for ${result.location.projectDb}: ` +
|
|
97
|
+
`${dbOpenPhaseHint(resolvedStatus)}${detailSuffix}. ${sqliteProviderHint(resolvedStatus, nodeVersion)}`);
|
|
98
|
+
}
|
|
64
99
|
export async function ensureDbOpen(basePath = safeWorkspaceCwd()) {
|
|
65
100
|
const result = openWorkflowDatabase(basePath);
|
|
66
101
|
if (result.ok)
|
|
67
102
|
return true;
|
|
68
|
-
|
|
69
|
-
logWarning("bootstrap", "ensureDbOpen failed — no .gsd directory found");
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
logWarning("bootstrap", `ensureDbOpen failed: ${result.error?.message ?? "open failed"}`);
|
|
73
|
-
}
|
|
103
|
+
logWarning("bootstrap", formatWorkflowDatabaseOpenFailure(result));
|
|
74
104
|
return false;
|
|
75
105
|
}
|
|
76
106
|
export function registerDynamicTools(pi) {
|
|
@@ -59,7 +59,7 @@ export function formatMcpStatusReport(servers) {
|
|
|
59
59
|
: s.connected
|
|
60
60
|
? `connected — ${s.toolCount} tools`
|
|
61
61
|
: s.available
|
|
62
|
-
? `available — ${s.toolCount} tools`
|
|
62
|
+
? `probe available — ${s.toolCount} tools`
|
|
63
63
|
: "disconnected";
|
|
64
64
|
const warningText = s.envWarnings?.length ? ` — ${s.envWarnings.length} warning(s)` : "";
|
|
65
65
|
lines.push(` ${icon} ${s.name} (${s.transport}) — ${status}${warningText}`);
|
|
@@ -83,7 +83,7 @@ export function formatMcpServerDetail(server) {
|
|
|
83
83
|
lines.push(` Error: ${server.error}`);
|
|
84
84
|
}
|
|
85
85
|
else if (server.connected || server.available) {
|
|
86
|
-
lines.push(` Status: ${server.connected ? "connected" : "available"}`);
|
|
86
|
+
lines.push(` Status: ${server.connected ? "connected" : "probe available"}`);
|
|
87
87
|
lines.push(` Tools: ${server.toolCount}`);
|
|
88
88
|
if (server.tools.length > 0) {
|
|
89
89
|
lines.push("");
|
|
@@ -59,6 +59,13 @@ function datePrefix() {
|
|
|
59
59
|
const dd = String(d.getDate()).padStart(2, "0");
|
|
60
60
|
return `${yy}${mm}${dd}`;
|
|
61
61
|
}
|
|
62
|
+
export function isWorkflowStateComplete(state) {
|
|
63
|
+
if (state.completedAt)
|
|
64
|
+
return true;
|
|
65
|
+
return Array.isArray(state.phases) &&
|
|
66
|
+
state.phases.length > 0 &&
|
|
67
|
+
state.phases.every((phase) => phase.status === "completed");
|
|
68
|
+
}
|
|
62
69
|
/**
|
|
63
70
|
* Write a STATE.json file to track workflow execution state.
|
|
64
71
|
*/
|
|
@@ -85,7 +92,7 @@ function writeWorkflowState(artifactDir, templateId, templateName, phases, descr
|
|
|
85
92
|
* Scan all workflow artifact directories for in-progress STATE.json files.
|
|
86
93
|
* Returns workflows that were started but not completed.
|
|
87
94
|
*/
|
|
88
|
-
function findInProgressWorkflows(basePath) {
|
|
95
|
+
export function findInProgressWorkflows(basePath) {
|
|
89
96
|
const workflowsRoot = join(gsdRoot(basePath), "workflows");
|
|
90
97
|
if (!existsSync(workflowsRoot))
|
|
91
98
|
return [];
|
|
@@ -105,7 +112,7 @@ function findInProgressWorkflows(basePath) {
|
|
|
105
112
|
try {
|
|
106
113
|
const raw = readFileSync(statePath, "utf-8");
|
|
107
114
|
const state = JSON.parse(raw);
|
|
108
|
-
if (!state
|
|
115
|
+
if (!isWorkflowStateComplete(state)) {
|
|
109
116
|
results.push(state);
|
|
110
117
|
}
|
|
111
118
|
}
|
|
@@ -218,6 +218,36 @@ export function getMilestoneSlices(milestoneId) {
|
|
|
218
218
|
const rows = getDbOrNull().prepare("SELECT * FROM slices WHERE milestone_id = :mid ORDER BY sequence, id").all({ ":mid": milestoneId });
|
|
219
219
|
return rows.map(rowToSlice);
|
|
220
220
|
}
|
|
221
|
+
/**
|
|
222
|
+
* Load slices for many milestones in a single query. Returns a Map keyed by
|
|
223
|
+
* milestone_id, preserving `ORDER BY sequence, id` within each bucket.
|
|
224
|
+
*/
|
|
225
|
+
export function getSlicesByMilestoneIds(milestoneIds) {
|
|
226
|
+
const db = getDbOrNull();
|
|
227
|
+
if (!db || milestoneIds.length === 0)
|
|
228
|
+
return new Map();
|
|
229
|
+
const idList = [...milestoneIds];
|
|
230
|
+
const placeholders = idList.map((_, i) => `:mid${i}`).join(",");
|
|
231
|
+
const params = {};
|
|
232
|
+
idList.forEach((id, i) => {
|
|
233
|
+
params[`:mid${i}`] = id;
|
|
234
|
+
});
|
|
235
|
+
const rows = db
|
|
236
|
+
.prepare(`SELECT * FROM slices WHERE milestone_id IN (${placeholders}) ORDER BY milestone_id, sequence, id`)
|
|
237
|
+
.all(params);
|
|
238
|
+
const byMilestone = new Map();
|
|
239
|
+
for (const row of rows) {
|
|
240
|
+
const slice = rowToSlice(row);
|
|
241
|
+
const bucket = byMilestone.get(slice.milestone_id);
|
|
242
|
+
if (bucket) {
|
|
243
|
+
bucket.push(slice);
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
byMilestone.set(slice.milestone_id, [slice]);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return byMilestone;
|
|
250
|
+
}
|
|
221
251
|
/**
|
|
222
252
|
* Consolidated DB read for dispatch/gate/completion decisions (ADR-017).
|
|
223
253
|
* `done` uses the canonical closed-status predicate (`isClosedStatus`) — the
|