@opengsd/gsd-pi 1.4.0-dev.c18009cd → 1.5.0-dev.553dc518
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -10
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/gsd/auto/closeout.js +97 -5
- package/dist/resources/extensions/gsd/auto/orchestrator.js +4 -3
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +6 -3
- package/dist/resources/extensions/gsd/auto/unit-phase.js +5 -9
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +4 -5
- package/dist/resources/extensions/gsd/auto-start.js +3 -2
- package/dist/resources/extensions/gsd/auto-worktree-branch-lifecycle.js +189 -0
- package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +133 -0
- package/dist/resources/extensions/gsd/auto-worktree-conflict-auto-resolve.js +35 -0
- package/dist/resources/extensions/gsd/auto-worktree-creation.js +130 -0
- package/dist/resources/extensions/gsd/auto-worktree-entry.js +118 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-already-merged.js +98 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-branch-head.js +52 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-cleanup.js +87 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-code-changes.js +46 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-db-ready.js +68 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-integration-branch.js +51 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-message.js +106 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-pre-teardown.js +64 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-stash.js +168 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge.js +302 -0
- package/dist/resources/extensions/gsd/auto-worktree-milestone-shelter.js +119 -0
- package/dist/resources/extensions/gsd/auto-worktree-path-resolution.js +5 -0
- package/dist/resources/extensions/gsd/auto-worktree-path-utils.js +5 -0
- package/dist/resources/extensions/gsd/auto-worktree-resource-version.js +41 -0
- package/dist/resources/extensions/gsd/auto-worktree-runtime-cleanup.js +99 -0
- package/dist/resources/extensions/gsd/auto-worktree-session-registry.js +57 -0
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +249 -0
- package/dist/resources/extensions/gsd/auto-worktree-teardown.js +120 -0
- package/dist/resources/extensions/gsd/auto-worktree.js +20 -2073
- package/dist/resources/extensions/gsd/auto.js +9 -3
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +19 -1
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +118 -21
- package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +3 -3
- package/dist/resources/extensions/gsd/db/queries.js +9 -9
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +93 -11
- package/dist/resources/extensions/gsd/flat-phase-migration.js +14 -3
- package/dist/resources/extensions/gsd/forensics.js +1 -1
- package/dist/resources/extensions/gsd/git-conflict-resolve.js +2 -2
- package/dist/resources/extensions/gsd/git-service.js +45 -0
- package/dist/resources/extensions/gsd/gsd-db.js +11 -0
- package/dist/resources/extensions/gsd/guided-flow.js +6 -10
- package/dist/resources/extensions/gsd/markdown-renderer.js +15 -3
- package/dist/resources/extensions/gsd/milestone-merge-transaction.js +11 -0
- package/dist/resources/extensions/gsd/milestone-settlement.js +1 -1
- package/dist/resources/extensions/gsd/parallel-merge.js +1 -1
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -1
- package/dist/resources/extensions/gsd/preferences-types.js +1 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +82 -0
- package/dist/resources/extensions/gsd/prompts/system.md +6 -6
- package/dist/resources/extensions/gsd/quick.js +12 -3
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +2 -1
- package/dist/resources/extensions/gsd/state/derive/from-db.js +88 -153
- package/dist/resources/extensions/gsd/tool-contract.js +14 -0
- package/dist/resources/extensions/gsd/unit-registry.js +12 -2
- package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +1 -1
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -1
- package/dist/resources/extensions/gsd/workspace-git-preflight.js +2 -2
- package/dist/resources/extensions/gsd/worktree-command.js +1 -1
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +14 -9
- package/dist/resources/extensions/gsd/worktree-reentry.js +2 -1
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
- package/dist/web/standalone/.next/build-manifest.json +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/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/integrations/hermes/open_gsd_hermes/gsd_client.py +24 -35
- package/integrations/hermes/tests/test_gsd_client_timeout.py +4 -4
- package/package.json +6 -6
- 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/export-html/template.js +53 -4
- 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 +3 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/package.json +4 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +14 -9
- 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/dist/index.d.ts +1 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +1 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/transform-messages.js +7 -3
- package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
- package/packages/pi-ai/dist/tool-result-content.d.ts +3 -0
- package/packages/pi-ai/dist/tool-result-content.d.ts.map +1 -0
- package/packages/pi-ai/dist/tool-result-content.js +62 -0
- package/packages/pi-ai/dist/tool-result-content.js.map +1 -0
- package/packages/pi-ai/dist/types.d.ts +8 -20
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.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/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/core/export-html/template.js +53 -4
- package/pkg/package.json +1 -1
- package/src/resources/extensions/gsd/auto/closeout.ts +114 -7
- package/src/resources/extensions/gsd/auto/orchestrator.ts +4 -3
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +6 -3
- package/src/resources/extensions/gsd/auto/unit-phase.ts +5 -9
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +4 -5
- package/src/resources/extensions/gsd/auto-start.ts +4 -2
- package/src/resources/extensions/gsd/auto-worktree-branch-lifecycle.ts +237 -0
- package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +166 -0
- package/src/resources/extensions/gsd/auto-worktree-conflict-auto-resolve.ts +37 -0
- package/src/resources/extensions/gsd/auto-worktree-creation.ts +171 -0
- package/src/resources/extensions/gsd/auto-worktree-entry.ts +154 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-already-merged.ts +161 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-branch-head.ts +83 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-cleanup.ts +132 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-code-changes.ts +71 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-db-ready.ts +112 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-integration-branch.ts +99 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-message.ts +166 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-pre-teardown.ts +93 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-stash.ts +213 -0
- package/src/resources/extensions/gsd/auto-worktree-merge.ts +391 -0
- package/src/resources/extensions/gsd/auto-worktree-milestone-shelter.ts +159 -0
- package/src/resources/extensions/gsd/auto-worktree-path-resolution.ts +6 -0
- package/src/resources/extensions/gsd/auto-worktree-path-utils.ts +10 -0
- package/src/resources/extensions/gsd/auto-worktree-resource-version.ts +44 -0
- package/src/resources/extensions/gsd/auto-worktree-runtime-cleanup.ts +119 -0
- package/src/resources/extensions/gsd/auto-worktree-session-registry.ts +71 -0
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +370 -0
- package/src/resources/extensions/gsd/auto-worktree-teardown.ts +161 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +69 -2429
- package/src/resources/extensions/gsd/auto.ts +11 -17
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +19 -1
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +152 -21
- package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +3 -3
- package/src/resources/extensions/gsd/db/queries.ts +9 -9
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +109 -10
- package/src/resources/extensions/gsd/flat-phase-migration.ts +14 -3
- package/src/resources/extensions/gsd/forensics.ts +1 -1
- package/src/resources/extensions/gsd/git-conflict-resolve.ts +2 -2
- package/src/resources/extensions/gsd/git-service.ts +53 -0
- package/src/resources/extensions/gsd/gsd-db.ts +13 -0
- package/src/resources/extensions/gsd/guided-flow.ts +7 -11
- package/src/resources/extensions/gsd/markdown-renderer.ts +15 -3
- package/src/resources/extensions/gsd/milestone-merge-transaction.ts +15 -0
- package/src/resources/extensions/gsd/milestone-settlement.ts +1 -1
- package/src/resources/extensions/gsd/parallel-merge.ts +1 -1
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -1
- package/src/resources/extensions/gsd/preferences-types.ts +30 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +69 -0
- package/src/resources/extensions/gsd/prompts/system.md +6 -6
- package/src/resources/extensions/gsd/quick.ts +11 -3
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +3 -1
- package/src/resources/extensions/gsd/state/derive/from-db.ts +201 -157
- package/src/resources/extensions/gsd/tests/auto-loop-no-copy-artifacts.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-already-merged.test.ts +177 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-branch-head.test.ts +118 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-cleanup.test.ts +115 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-code-changes.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-db-ready.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-integration-branch.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-message.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-pre-teardown.test.ts +84 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-stash.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-shelter.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/auto-worktree-resource-version.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-untracked-content.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +174 -0
- package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/flat-phase-renderer.test.ts +25 -1
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +4 -6
- package/src/resources/extensions/gsd/tests/integration/auto-stash-merge.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +7 -8
- package/src/resources/extensions/gsd/tests/integration/feature-branch-lifecycle-integration.test.ts +2 -5
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/integration/merge-cwd-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration/merge-preserve-worktree-on-preteardown-error.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/integration/workspace-collapse-integration.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +439 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/parallel-worker-lock-contention.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +1 -4
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +3 -5
- package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/system-flat-phase-layout.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/teardown-cleanup-parity.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/teardown-failure-clears-registry.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +26 -1
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +1 -3
- package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +5 -2
- package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +1 -1
- package/src/resources/extensions/gsd/tool-contract.ts +29 -0
- package/src/resources/extensions/gsd/unit-registry.ts +16 -2
- package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +1 -1
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -1
- package/src/resources/extensions/gsd/workspace-git-preflight.ts +2 -2
- package/src/resources/extensions/gsd/worktree-command.ts +1 -1
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +19 -15
- package/src/resources/extensions/gsd/worktree-reentry.ts +2 -1
- /package/dist/web/standalone/.next/static/{L2UMqXELiDH3oz-7yguXp → ZpFDazP-38PXBPiI_LdZf}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{L2UMqXELiDH3oz-7yguXp → ZpFDazP-38PXBPiI_LdZf}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// gsd-pi — Regression tests: system.md documents the flat-phase layout, not legacy milestone/slice/task paths
|
|
2
|
+
|
|
3
|
+
import test from "node:test";
|
|
4
|
+
import assert from "node:assert/strict";
|
|
5
|
+
import { readFileSync } from "node:fs";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
|
|
8
|
+
const promptsDir = join(process.cwd(), "src/resources/extensions/gsd/prompts");
|
|
9
|
+
|
|
10
|
+
function readPrompt(name: string): string {
|
|
11
|
+
return readFileSync(join(promptsDir, `${name}.md`), "utf-8");
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
test("system.md does not advertise legacy milestone/slice/task artifact paths", () => {
|
|
15
|
+
const prompt = readPrompt("system");
|
|
16
|
+
for (const legacy of [".gsd/milestones", "milestones/M001", "slices/S01", "tasks/T01-PLAN.md"]) {
|
|
17
|
+
assert.ok(
|
|
18
|
+
!prompt.includes(legacy),
|
|
19
|
+
`system.md must not reference the legacy path fragment "${legacy}" after flat-phase migration`,
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test("system.md documents the flat-phase directory structure", () => {
|
|
25
|
+
const prompt = readPrompt("system");
|
|
26
|
+
assert.match(prompt, /phases\/\{MM\}-\{slug\}/, "system.md must document phases/{MM}-{slug}/ directories");
|
|
27
|
+
assert.match(prompt, /\{MM\}-\{SS\}-PLAN\.md/, "system.md must document {MM}-{SS}-PLAN.md slice plans");
|
|
28
|
+
assert.match(
|
|
29
|
+
prompt,
|
|
30
|
+
/do not expect `tasks\/T##-PLAN\.md`/,
|
|
31
|
+
"system.md must state task plan content lives inside the slice plan, not tasks/T##-PLAN.md",
|
|
32
|
+
);
|
|
33
|
+
});
|
|
@@ -36,13 +36,13 @@ import { join } from "node:path";
|
|
|
36
36
|
import { tmpdir } from "node:os";
|
|
37
37
|
import { execFileSync } from "node:child_process";
|
|
38
38
|
|
|
39
|
+
import { createAutoWorktree } from "../auto-worktree-creation.ts";
|
|
39
40
|
import {
|
|
40
|
-
createAutoWorktree,
|
|
41
|
-
teardownAutoWorktree,
|
|
42
|
-
getAutoWorktreeOriginalBase,
|
|
43
41
|
getActiveAutoWorktreeContext,
|
|
42
|
+
getAutoWorktreeOriginalBase,
|
|
44
43
|
_resetAutoWorktreeOriginalBaseForTests,
|
|
45
|
-
} from "../auto-worktree.ts";
|
|
44
|
+
} from "../auto-worktree-session-registry.ts";
|
|
45
|
+
import { teardownAutoWorktree } from "../auto-worktree-teardown.ts";
|
|
46
46
|
|
|
47
47
|
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
48
48
|
|
|
@@ -22,7 +22,8 @@ import { join } from "node:path";
|
|
|
22
22
|
import { tmpdir } from "node:os";
|
|
23
23
|
import { execFileSync } from "node:child_process";
|
|
24
24
|
|
|
25
|
-
import {
|
|
25
|
+
import { _resetAutoWorktreeOriginalBaseForTests } from "../auto-worktree-session-registry.ts";
|
|
26
|
+
import { teardownAutoWorktree } from "../auto-worktree-teardown.ts";
|
|
26
27
|
|
|
27
28
|
function git(args: string[], cwd: string): void {
|
|
28
29
|
execFileSync("git", args, { cwd, stdio: ["ignore", "pipe", "pipe"] });
|
|
@@ -38,13 +38,13 @@ import { join } from "node:path";
|
|
|
38
38
|
import { tmpdir } from "node:os";
|
|
39
39
|
import { execFileSync } from "node:child_process";
|
|
40
40
|
|
|
41
|
+
import { createAutoWorktree } from "../auto-worktree-creation.ts";
|
|
41
42
|
import {
|
|
42
|
-
createAutoWorktree,
|
|
43
|
-
teardownAutoWorktree,
|
|
44
|
-
getAutoWorktreeOriginalBase,
|
|
45
43
|
getActiveAutoWorktreeContext,
|
|
44
|
+
getAutoWorktreeOriginalBase,
|
|
46
45
|
_resetAutoWorktreeOriginalBaseForTests,
|
|
47
|
-
} from "../auto-worktree.ts";
|
|
46
|
+
} from "../auto-worktree-session-registry.ts";
|
|
47
|
+
import { teardownAutoWorktree } from "../auto-worktree-teardown.ts";
|
|
48
48
|
|
|
49
49
|
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
50
50
|
|
|
@@ -7,6 +7,7 @@ import { test } from 'node:test';
|
|
|
7
7
|
import assert from 'node:assert/strict';
|
|
8
8
|
import {
|
|
9
9
|
checkToolCallLoop,
|
|
10
|
+
configureToolCallLoopGuard,
|
|
10
11
|
recordToolCallLoopMutation,
|
|
11
12
|
resetToolCallLoopGuard,
|
|
12
13
|
disableToolCallLoopGuard,
|
|
@@ -448,3 +449,105 @@ console.log('\n── Loop guard: browser exemption does not widen to other tool
|
|
|
448
449
|
}
|
|
449
450
|
|
|
450
451
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
452
|
+
// Configurable thresholds (#1198)
|
|
453
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
454
|
+
|
|
455
|
+
console.log('\n── Loop guard: master switch disables both guards (#1198) ──');
|
|
456
|
+
|
|
457
|
+
{
|
|
458
|
+
configureToolCallLoopGuard({ enabled: false });
|
|
459
|
+
resetToolCallLoopGuard();
|
|
460
|
+
// Neither identical-args nor per-tool cap should ever trip while disabled.
|
|
461
|
+
for (let i = 1; i <= 30; i++) {
|
|
462
|
+
const result = checkToolCallLoop('gsd_complete_milestone', { same: 'args' });
|
|
463
|
+
assert.ok(result.block === false, `disabled guard should allow call ${i}`);
|
|
464
|
+
}
|
|
465
|
+
// Restore defaults for subsequent tests.
|
|
466
|
+
configureToolCallLoopGuard(null);
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
console.log('\n── Loop guard: repeated_tool disabled keeps identical-args protection (#1198) ──');
|
|
470
|
+
|
|
471
|
+
{
|
|
472
|
+
configureToolCallLoopGuard({ repeated_tool: { enabled: false } });
|
|
473
|
+
resetToolCallLoopGuard();
|
|
474
|
+
// Per-tool cap is off: many varied-arg calls are allowed.
|
|
475
|
+
for (let i = 1; i <= 20; i++) {
|
|
476
|
+
const result = checkToolCallLoop('gsd_exec', { cmd: `run-${i}` });
|
|
477
|
+
assert.ok(result.block === false, `repeated_tool disabled should allow varied call ${i}`);
|
|
478
|
+
}
|
|
479
|
+
// Identical-args guard is still active.
|
|
480
|
+
resetToolCallLoopGuard();
|
|
481
|
+
for (let i = 1; i <= 4; i++) {
|
|
482
|
+
assert.ok(checkToolCallLoop('gsd_exec', { cmd: 'same' }).block === false);
|
|
483
|
+
}
|
|
484
|
+
const blocked = checkToolCallLoop('gsd_exec', { cmd: 'same' });
|
|
485
|
+
assert.ok(blocked.block === true, 'identical-args guard should still trip when repeated_tool is off');
|
|
486
|
+
assert.ok(blocked.reason?.includes('identical args'));
|
|
487
|
+
configureToolCallLoopGuard(null);
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
console.log('\n── Loop guard: raised caps allow more repeated calls (#1198) ──');
|
|
491
|
+
|
|
492
|
+
{
|
|
493
|
+
configureToolCallLoopGuard({ repeated_tool: { default_cap: 10 } });
|
|
494
|
+
resetToolCallLoopGuard();
|
|
495
|
+
for (let i = 1; i <= 10; i++) {
|
|
496
|
+
const result = checkToolCallLoop('gsd_complete_milestone', { arg: `v${i}` });
|
|
497
|
+
assert.ok(result.block === false, `raised-cap call ${i} should be allowed`);
|
|
498
|
+
}
|
|
499
|
+
const blocked = checkToolCallLoop('gsd_complete_milestone', { arg: 'v11' });
|
|
500
|
+
assert.ok(blocked.block === true, '11th call should trip the raised cap of 10');
|
|
501
|
+
assert.ok(blocked.reason?.includes('cap 10'), 'block message should mention the active cap');
|
|
502
|
+
assert.ok(blocked.reason?.includes('tool_call_loop_guard'), 'block message should mention the config key');
|
|
503
|
+
configureToolCallLoopGuard(null);
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
console.log('\n── Loop guard: user-added exempt tools bypass the per-tool cap (#1198) ──');
|
|
507
|
+
|
|
508
|
+
{
|
|
509
|
+
configureToolCallLoopGuard({ repeated_tool: { exempt_tools: ['ctx_execute'] } });
|
|
510
|
+
resetToolCallLoopGuard();
|
|
511
|
+
for (let i = 1; i <= 30; i++) {
|
|
512
|
+
const result = checkToolCallLoop('ctx_execute', { arg: `v${i}` });
|
|
513
|
+
assert.ok(result.block === false, `exempt tool call ${i} should be allowed`);
|
|
514
|
+
}
|
|
515
|
+
// Built-in exempt defaults are preserved alongside the user-added tool.
|
|
516
|
+
resetToolCallLoopGuard();
|
|
517
|
+
for (let i = 1; i <= 30; i++) {
|
|
518
|
+
assert.ok(checkToolCallLoop('read', { path: `f${i}` }).block === false, 'built-in exempt read should remain exempt');
|
|
519
|
+
}
|
|
520
|
+
configureToolCallLoopGuard(null);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
console.log('\n── Loop guard: identical-args max is configurable (#1198) ──');
|
|
524
|
+
|
|
525
|
+
{
|
|
526
|
+
configureToolCallLoopGuard({ identical_args: { max_consecutive_calls: 2 } });
|
|
527
|
+
resetToolCallLoopGuard();
|
|
528
|
+
assert.ok(checkToolCallLoop('web_search', { q: 'x' }).block === false, 'call 1 allowed');
|
|
529
|
+
assert.ok(checkToolCallLoop('web_search', { q: 'x' }).block === false, 'call 2 allowed');
|
|
530
|
+
const blocked = checkToolCallLoop('web_search', { q: 'x' });
|
|
531
|
+
assert.ok(blocked.block === true, '3rd identical call should trip lowered max of 2');
|
|
532
|
+
assert.ok(blocked.reason?.includes('max 2'), 'block message should mention active max');
|
|
533
|
+
configureToolCallLoopGuard(null);
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
console.log('\n── Loop guard: env overrides win over preferences (#1198) ──');
|
|
537
|
+
|
|
538
|
+
{
|
|
539
|
+
process.env.GSD_TOOL_LOOP_REPEATED_DEFAULT_CAP = '2';
|
|
540
|
+
configureToolCallLoopGuard({ repeated_tool: { default_cap: 6 } });
|
|
541
|
+
resetToolCallLoopGuard();
|
|
542
|
+
assert.ok(checkToolCallLoop('gsd_complete_milestone', { a: '1' }).block === false, 'call 1 allowed');
|
|
543
|
+
assert.ok(checkToolCallLoop('gsd_complete_milestone', { a: '2' }).block === false, 'call 2 allowed');
|
|
544
|
+
const blocked = checkToolCallLoop('gsd_complete_milestone', { a: '3' });
|
|
545
|
+
assert.ok(blocked.block === true, 'env override cap of 2 should win over preference cap of 6');
|
|
546
|
+
delete process.env.GSD_TOOL_LOOP_REPEATED_DEFAULT_CAP;
|
|
547
|
+
configureToolCallLoopGuard(null);
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
551
|
+
// Reset restores default guard state after configuration tests
|
|
552
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
553
|
+
resetToolCallLoopGuard();
|
|
@@ -30,7 +30,7 @@ import { join } from "node:path";
|
|
|
30
30
|
import { tmpdir } from "node:os";
|
|
31
31
|
import { execFileSync } from "node:child_process";
|
|
32
32
|
|
|
33
|
-
import { syncProjectRootToWorktree } from "../auto-worktree.ts";
|
|
33
|
+
import { syncProjectRootToWorktree } from "../auto-worktree-sync.ts";
|
|
34
34
|
import {
|
|
35
35
|
createWorktree,
|
|
36
36
|
removeWorktree,
|
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
getUnitDescriptor,
|
|
19
19
|
getUnitPhaseChain,
|
|
20
20
|
getUnitPromptTemplate,
|
|
21
|
+
getUnitPromptTemplates,
|
|
21
22
|
} from "../unit-registry.ts";
|
|
22
23
|
import {
|
|
23
24
|
AUTO_UNIT_SCOPED_TOOLS,
|
|
@@ -123,13 +124,16 @@ const EXPECTED_DIRECT_PROMPT_TEMPLATES: Record<string, string> = {
|
|
|
123
124
|
};
|
|
124
125
|
|
|
125
126
|
const EXPECTED_UNDECLARED_PROMPT_TEMPLATE_TYPES = [
|
|
126
|
-
"discuss-milestone",
|
|
127
127
|
"discuss-slice",
|
|
128
128
|
"execute-task-simple",
|
|
129
129
|
"triage-captures",
|
|
130
130
|
"quick-task",
|
|
131
131
|
];
|
|
132
132
|
|
|
133
|
+
const EXPECTED_CONDITIONAL_PROMPT_TEMPLATES: Record<string, string[]> = {
|
|
134
|
+
"discuss-milestone": ["discuss", "discuss-headless", "guided-discuss-milestone"],
|
|
135
|
+
};
|
|
136
|
+
|
|
133
137
|
// ─── Derived-view parity ──────────────────────────────────────────────────
|
|
134
138
|
|
|
135
139
|
test("KNOWN_UNIT_TYPES derives exactly the pre-registry list, in order", () => {
|
|
@@ -190,6 +194,27 @@ test("direct prompt-template associations live on the Unit Registry", () => {
|
|
|
190
194
|
}
|
|
191
195
|
});
|
|
192
196
|
|
|
197
|
+
test("conditional prompt-template associations live on the Unit Registry without pretending to be direct", () => {
|
|
198
|
+
for (const [unitType, promptTemplates] of Object.entries(EXPECTED_CONDITIONAL_PROMPT_TEMPLATES)) {
|
|
199
|
+
assert.equal(
|
|
200
|
+
getUnitPromptTemplate(unitType),
|
|
201
|
+
undefined,
|
|
202
|
+
`${unitType} must not expose a single direct prompt template`,
|
|
203
|
+
);
|
|
204
|
+
assert.deepEqual(
|
|
205
|
+
getUnitPromptTemplates(unitType),
|
|
206
|
+
promptTemplates,
|
|
207
|
+
`prompt templates for ${unitType}`,
|
|
208
|
+
);
|
|
209
|
+
for (const promptTemplate of promptTemplates) {
|
|
210
|
+
assert.ok(
|
|
211
|
+
existsSync(join(process.cwd(), "src/resources/extensions/gsd/prompts", `${promptTemplate}.md`)),
|
|
212
|
+
`prompt template file must exist for ${unitType}: ${promptTemplate}`,
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
|
|
193
218
|
test("AUTO_UNIT_SCOPED_TOOLS mirrors each contract's allowed tools", () => {
|
|
194
219
|
for (const [unitType, contract] of Object.entries(UNIT_TOOL_CONTRACTS)) {
|
|
195
220
|
assert.deepEqual(AUTO_UNIT_SCOPED_TOOLS[unitType], contract.allowedGsdTools);
|
|
@@ -17,7 +17,7 @@ import { join } from "node:path";
|
|
|
17
17
|
import { tmpdir } from "node:os";
|
|
18
18
|
import { execSync } from "node:child_process";
|
|
19
19
|
|
|
20
|
-
import { createAutoWorktree } from "../auto-worktree.ts";
|
|
20
|
+
import { createAutoWorktree } from "../auto-worktree-creation.ts";
|
|
21
21
|
import { worktreePath } from "../worktree-manager.ts";
|
|
22
22
|
import {
|
|
23
23
|
copyWorktreeDb,
|
|
@@ -17,7 +17,7 @@ import { mkdtempSync, mkdirSync, writeFileSync, rmSync, existsSync, readFileSync
|
|
|
17
17
|
import { join } from 'node:path';
|
|
18
18
|
import { tmpdir } from 'node:os';
|
|
19
19
|
|
|
20
|
-
import { syncProjectRootToWorktree } from '../auto-worktree.ts';
|
|
20
|
+
import { syncProjectRootToWorktree } from '../auto-worktree-sync.ts';
|
|
21
21
|
import { describe, test } from 'node:test';
|
|
22
22
|
import assert from 'node:assert/strict';
|
|
23
23
|
|
|
@@ -18,9 +18,7 @@ import {
|
|
|
18
18
|
reconcileWorktreeDb,
|
|
19
19
|
insertDecision,
|
|
20
20
|
} from "../gsd-db.ts";
|
|
21
|
-
import {
|
|
22
|
-
_shouldReconcileWorktreeDb,
|
|
23
|
-
} from "../auto-worktree.ts";
|
|
21
|
+
import { _shouldReconcileWorktreeDb } from "../auto-worktree-sync.ts";
|
|
24
22
|
import { isInfrastructureError } from "../auto/infra-errors.ts";
|
|
25
23
|
|
|
26
24
|
describe("#2823: reconcileWorktreeDb same-file guard", () => {
|
|
@@ -6,7 +6,7 @@ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
|
6
6
|
import { join, resolve } from "node:path";
|
|
7
7
|
import { tmpdir } from "node:os";
|
|
8
8
|
|
|
9
|
-
import { _isExpectedWorktreeUnlinkError } from "../auto-worktree.ts";
|
|
9
|
+
import { _isExpectedWorktreeUnlinkError } from "../auto-worktree-path-utils.ts";
|
|
10
10
|
import { resolveGitDir } from "../worktree-manager.ts";
|
|
11
11
|
|
|
12
12
|
describe("worktree expected-condition warning suppression (#3665)", () => {
|
|
@@ -5,7 +5,7 @@ import { join } from "node:path";
|
|
|
5
5
|
import { tmpdir } from "node:os";
|
|
6
6
|
import { execFileSync } from "node:child_process";
|
|
7
7
|
|
|
8
|
-
import { _gitPathspecForWorktreePath } from "../auto-worktree.ts";
|
|
8
|
+
import { _gitPathspecForWorktreePath } from "../auto-worktree-path-utils.ts";
|
|
9
9
|
|
|
10
10
|
function run(cmd: string, args: string[], cwd: string): string {
|
|
11
11
|
return execFileSync(cmd, args, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { test } from "node:test";
|
|
4
4
|
import assert from "node:assert/strict";
|
|
5
5
|
|
|
6
|
-
import { _resolveAutoWorktreeStartPoint } from "../auto-worktree.ts";
|
|
6
|
+
import { _resolveAutoWorktreeStartPoint } from "../auto-worktree-branch-lifecycle.ts";
|
|
7
7
|
|
|
8
8
|
test("auto-worktree start point prefers milestone integration branch", () => {
|
|
9
9
|
const startPoint = _resolveAutoWorktreeStartPoint(
|
|
@@ -13,7 +13,8 @@ import { join } from "node:path";
|
|
|
13
13
|
import { tmpdir } from "node:os";
|
|
14
14
|
import { execFileSync } from "node:child_process";
|
|
15
15
|
|
|
16
|
-
import { createAutoWorktree
|
|
16
|
+
import { createAutoWorktree } from "../auto-worktree-creation.ts";
|
|
17
|
+
import { _resetAutoWorktreeOriginalBaseForTests } from "../auto-worktree-session-registry.ts";
|
|
17
18
|
import { reenterActiveWorktreeIfNeeded } from "../worktree-reentry.ts";
|
|
18
19
|
|
|
19
20
|
// Safe: all inputs below are hardcoded test strings, not user input.
|
|
@@ -27,8 +27,11 @@ import { mkdtempSync, mkdirSync, writeFileSync, rmSync, existsSync, readFileSync
|
|
|
27
27
|
import { join } from 'node:path';
|
|
28
28
|
import { tmpdir } from 'node:os';
|
|
29
29
|
|
|
30
|
-
import {
|
|
31
|
-
|
|
30
|
+
import {
|
|
31
|
+
syncGsdStateToWorktree,
|
|
32
|
+
syncProjectRootToWorktree,
|
|
33
|
+
syncWorktreeStateBack,
|
|
34
|
+
} from '../auto-worktree-sync.ts';
|
|
32
35
|
import { describe, test } from 'node:test';
|
|
33
36
|
import assert from 'node:assert/strict';
|
|
34
37
|
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
import { join } from "node:path";
|
|
26
26
|
import { tmpdir } from "node:os";
|
|
27
27
|
|
|
28
|
-
import { syncProjectRootToWorktree } from "../auto-worktree.ts";
|
|
28
|
+
import { syncProjectRootToWorktree } from "../auto-worktree-sync.ts";
|
|
29
29
|
|
|
30
30
|
function createBase(name: string): string {
|
|
31
31
|
const base = mkdtempSync(join(tmpdir(), `gsd-wt-1886-${name}-`));
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
import { join } from "node:path";
|
|
19
19
|
import { tmpdir } from "node:os";
|
|
20
20
|
|
|
21
|
-
import { syncWorktreeStateBack } from "../auto-worktree.ts";
|
|
21
|
+
import { syncWorktreeStateBack } from "../auto-worktree-sync.ts";
|
|
22
22
|
|
|
23
23
|
function makeTempDir(prefix: string): string {
|
|
24
24
|
return mkdtempSync(join(tmpdir(), `gsd-sync-test-${prefix}-`));
|
|
@@ -85,6 +85,18 @@ export interface UnitWorkflowDispatchReadinessInput {
|
|
|
85
85
|
activeTools?: string[];
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
+
export interface WorkflowDispatchModelContext {
|
|
89
|
+
provider?: string;
|
|
90
|
+
baseUrl?: string;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export interface UnitWorkflowDispatchReadinessForModelInput
|
|
94
|
+
extends Omit<UnitWorkflowDispatchReadinessInput, "provider" | "authMode" | "baseUrl"> {
|
|
95
|
+
model?: WorkflowDispatchModelContext | null;
|
|
96
|
+
fallbackModel?: WorkflowDispatchModelContext | null;
|
|
97
|
+
getProviderAuthMode?: (provider: string) => WorkflowCapabilityOptions["authMode"] | undefined;
|
|
98
|
+
}
|
|
99
|
+
|
|
88
100
|
export function compileUnitContextContract(unitType: string): UnitContextContractResult {
|
|
89
101
|
const manifest = resolveManifest(unitType);
|
|
90
102
|
if (!manifest) {
|
|
@@ -115,6 +127,23 @@ export function getUnitWorkflowDispatchReadinessError(
|
|
|
115
127
|
);
|
|
116
128
|
}
|
|
117
129
|
|
|
130
|
+
export function getUnitWorkflowDispatchReadinessErrorForModel(
|
|
131
|
+
input: UnitWorkflowDispatchReadinessForModelInput,
|
|
132
|
+
): string | null {
|
|
133
|
+
const provider = input.model?.provider ?? input.fallbackModel?.provider;
|
|
134
|
+
const baseUrl = input.model?.baseUrl ?? input.fallbackModel?.baseUrl;
|
|
135
|
+
return getUnitWorkflowDispatchReadinessError({
|
|
136
|
+
provider,
|
|
137
|
+
unitType: input.unitType,
|
|
138
|
+
projectRoot: input.projectRoot,
|
|
139
|
+
env: input.env,
|
|
140
|
+
surface: input.surface,
|
|
141
|
+
authMode: provider ? input.getProviderAuthMode?.(provider) : undefined,
|
|
142
|
+
baseUrl,
|
|
143
|
+
activeTools: input.activeTools,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
|
|
118
147
|
export function compileUnitToolContract(unitType: string): ToolContractResult {
|
|
119
148
|
const manifest = resolveManifest(unitType);
|
|
120
149
|
const surfaceContract = getUnitToolSurfaceContract(unitType);
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
// Not yet declared here (remaining ADR-033 steps): the manifest data
|
|
22
22
|
// (`UNIT_MANIFESTS` stays in unit-context-manifest.ts, already type-enforced
|
|
23
23
|
// against the registry's `UnitType`). Prompt-template association is declared
|
|
24
|
-
// for direct one-template units
|
|
25
|
-
// with
|
|
24
|
+
// for direct one-template units and verified conditional template sets;
|
|
25
|
+
// composition logic stays with prompt builders.
|
|
26
26
|
|
|
27
27
|
import type { CanonicalWorkflowToolName } from "@opengsd/contracts";
|
|
28
28
|
import { BROWSER_CONTRACT_TOOL_NAMES } from "../shared/browser-contract.js";
|
|
@@ -68,6 +68,11 @@ export interface UnitDescriptor {
|
|
|
68
68
|
* verified prompt associations.
|
|
69
69
|
*/
|
|
70
70
|
readonly promptTemplate?: string;
|
|
71
|
+
/**
|
|
72
|
+
* Prompt template ids a conditional or composite builder may choose from.
|
|
73
|
+
* Omitted unless every listed association is verified against the builder.
|
|
74
|
+
*/
|
|
75
|
+
readonly promptTemplates?: readonly string[];
|
|
71
76
|
/** `null` = the unit has no scoped gsd-tool contract. */
|
|
72
77
|
readonly toolContract: UnitToolSurfaceContract | null;
|
|
73
78
|
}
|
|
@@ -137,6 +142,7 @@ export const UNIT_REGISTRY = {
|
|
|
137
142
|
kind: "primary",
|
|
138
143
|
scopeClass: "standard",
|
|
139
144
|
phaseChain: ["discuss", "planning"],
|
|
145
|
+
promptTemplates: ["discuss", "discuss-headless", "guided-discuss-milestone"],
|
|
140
146
|
toolContract: {
|
|
141
147
|
allowedGsdTools: [
|
|
142
148
|
"gsd_summary_save",
|
|
@@ -526,3 +532,11 @@ export function getUnitPhaseChain(unitType: string): readonly GSDModelPhaseKey[]
|
|
|
526
532
|
export function getUnitPromptTemplate(unitType: string): string | undefined {
|
|
527
533
|
return getUnitDescriptor(unitType)?.promptTemplate;
|
|
528
534
|
}
|
|
535
|
+
|
|
536
|
+
/** Prompt template ids for any verified direct or conditional prompt builder. */
|
|
537
|
+
export function getUnitPromptTemplates(unitType: string): readonly string[] {
|
|
538
|
+
const descriptor = getUnitDescriptor(unitType);
|
|
539
|
+
if (!descriptor) return [];
|
|
540
|
+
if (descriptor.promptTemplates) return descriptor.promptTemplates;
|
|
541
|
+
return descriptor.promptTemplate ? [descriptor.promptTemplate] : [];
|
|
542
|
+
}
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
nativeDiffNumstat,
|
|
10
10
|
nativeIsAncestor,
|
|
11
11
|
} from "./native-git-bridge.js";
|
|
12
|
-
import { autoWorktreeBranch } from "./auto-worktree.js";
|
|
12
|
+
import { autoWorktreeBranch } from "./auto-worktree-branch-lifecycle.js";
|
|
13
13
|
import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
|
|
14
14
|
import { getAllMilestones } from "./gsd-db.js";
|
|
15
15
|
import { resolveMilestoneIntegrationBranch } from "./git-service.js";
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
|
|
4
4
|
import { existsSync } from "node:fs";
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import { isInAutoWorktree } from "./auto-worktree-entry.js";
|
|
7
|
+
import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
|
|
7
8
|
import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
|
|
8
9
|
import { refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
|
|
9
10
|
import { getIsolationMode } from "./preferences.js";
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
|
|
4
4
|
import { existsSync, realpathSync } from "node:fs";
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
6
|
+
import { isSafeToAutoResolve } from "./auto-worktree-conflict-auto-resolve.js";
|
|
7
|
+
import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
|
|
8
8
|
import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
|
|
9
9
|
import {
|
|
10
10
|
listMergeStateBlockers,
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
import type { ExtensionAPI, ExtensionCommandContext } from "@gsd/pi-coding-agent";
|
|
14
14
|
import { loadPrompt } from "./prompt-loader.js";
|
|
15
15
|
import { autoCommitCurrentBranch, getMainBranch, resolveGitHeadPath, nudgeGitBranchCache } from "./worktree.js";
|
|
16
|
-
import { runWorktreePostCreateHook } from "./
|
|
16
|
+
import { runWorktreePostCreateHook } from "./worktree-post-create-hook.js";
|
|
17
17
|
import { showConfirm } from "../shared/tui.js";
|
|
18
18
|
import { gsdRoot, milestonesDir, resolveGsdPathContract } from "./paths.js";
|
|
19
19
|
import {
|
|
@@ -68,19 +68,21 @@ import {
|
|
|
68
68
|
getCurrentBranch,
|
|
69
69
|
} from "./worktree.js";
|
|
70
70
|
import { nativeCheckoutBranch } from "./native-git-bridge.js";
|
|
71
|
-
// ADR-016 phase 2 / C2 (#5625):
|
|
72
|
-
//
|
|
73
|
-
//
|
|
74
|
-
//
|
|
71
|
+
// ADR-016 phase 2 / C2 (#5625): lifecycle uses focused auto-worktree
|
|
72
|
+
// modules instead of the legacy compatibility barrel. Branch, entry/path,
|
|
73
|
+
// creation, and teardown primitives are still implementation-level seams for
|
|
74
|
+
// Lifecycle; tests vary them through `WorktreeLifecycleTestOverrides` below.
|
|
75
75
|
import {
|
|
76
76
|
autoWorktreeBranch,
|
|
77
|
-
createAutoWorktree,
|
|
78
|
-
enterAutoWorktree,
|
|
79
77
|
enterBranchModeForMilestone,
|
|
80
|
-
|
|
78
|
+
} from "./auto-worktree-branch-lifecycle.js";
|
|
79
|
+
import { createAutoWorktree } from "./auto-worktree-creation.js";
|
|
80
|
+
import {
|
|
81
|
+
enterAutoWorktree,
|
|
81
82
|
isInAutoWorktree,
|
|
82
|
-
|
|
83
|
-
} from "./auto-worktree.js";
|
|
83
|
+
} from "./auto-worktree-entry.js";
|
|
84
|
+
import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
|
|
85
|
+
import { teardownAutoWorktree } from "./auto-worktree-teardown.js";
|
|
84
86
|
import { resolveRoadmapForMilestoneMerge } from "./milestone-merge-roadmap.js";
|
|
85
87
|
import type { MilestoneMergeTransactionRunner } from "./milestone-merge-transaction.js";
|
|
86
88
|
|
|
@@ -353,7 +355,7 @@ export interface MergeContext {
|
|
|
353
355
|
originalBasePath: string;
|
|
354
356
|
/**
|
|
355
357
|
* Current worktree path or project root when in branch mode. Used as the
|
|
356
|
-
* cwd anchor for
|
|
358
|
+
* cwd anchor for the milestone merge transaction and the source for
|
|
357
359
|
* `Projection.finalizeProjectionForMerge`.
|
|
358
360
|
*/
|
|
359
361
|
worktreeBasePath: string;
|
|
@@ -381,7 +383,8 @@ export interface MergeStandaloneResult {
|
|
|
381
383
|
pushed: boolean;
|
|
382
384
|
/**
|
|
383
385
|
* Commit message produced by the squash merge, if available. Forwarded
|
|
384
|
-
* from
|
|
386
|
+
* from the milestone merge transaction. Only populated when
|
|
387
|
+
* `merged === true`.
|
|
385
388
|
*/
|
|
386
389
|
commitMessage?: string;
|
|
387
390
|
}
|
|
@@ -1373,8 +1376,9 @@ function _mergeBranchModeImpl(
|
|
|
1373
1376
|
* **CWD anchor**: anchors `process.cwd()` at `originalBasePath` before
|
|
1374
1377
|
* non-worktree merge paths to mirror the single-loop guard against ENOENT
|
|
1375
1378
|
* after teardown (de73fb43d). Worktree-mode merge paths keep the real
|
|
1376
|
-
* worktree as cwd because
|
|
1377
|
-
*
|
|
1379
|
+
* worktree as cwd because the default milestone merge transaction delegates
|
|
1380
|
+
* to the legacy merge primitive, which infers source worktree state from
|
|
1381
|
+
* `process.cwd()`. Best-effort; silent on failure.
|
|
1378
1382
|
*
|
|
1379
1383
|
* **Failure handling**: `MergeConflictError` and other unrecoverable errors
|
|
1380
1384
|
* propagate to the caller. The caller is responsible for any state restore
|
|
@@ -1475,8 +1479,8 @@ export function mergeMilestoneStandalone(
|
|
|
1475
1479
|
|
|
1476
1480
|
// Set cwd to the correct anchor before dispatching to mode implementations.
|
|
1477
1481
|
// Worktree mode / in-worktree override must run from the live worktree so
|
|
1478
|
-
//
|
|
1479
|
-
// the original project root. Best-effort for synthetic test paths.
|
|
1482
|
+
// The default merge transaction can find worktree-local state; branch mode
|
|
1483
|
+
// runs from the original project root. Best-effort for synthetic test paths.
|
|
1480
1484
|
const targetCwd = mode === "worktree" || inWorktree
|
|
1481
1485
|
? worktreeBasePath
|
|
1482
1486
|
: originalBasePath;
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
|
|
9
9
|
import { readdirSync } from "node:fs";
|
|
10
10
|
|
|
11
|
-
import { enterAutoWorktree
|
|
11
|
+
import { enterAutoWorktree } from "./auto-worktree-entry.js";
|
|
12
|
+
import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
|
|
12
13
|
import { getIsolationMode } from "./preferences.js";
|
|
13
14
|
import { allWorktreesDirs } from "./worktree-manager.js";
|
|
14
15
|
import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "./worktree-root.js";
|
|
File without changes
|
|
File without changes
|