gsd-pi 2.24.0 → 2.26.0
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 +13 -3
- package/dist/headless.js +24 -4
- package/dist/models-resolver.d.ts +0 -11
- package/dist/models-resolver.js +0 -15
- package/dist/resource-loader.d.ts +0 -1
- package/dist/resource-loader.js +0 -9
- package/dist/resources/GSD-WORKFLOW.md +12 -9
- package/dist/resources/extensions/async-jobs/index.ts +9 -1
- package/dist/resources/extensions/bg-shell/index.ts +3 -2
- package/dist/resources/extensions/bg-shell/overlay.ts +18 -17
- package/dist/resources/extensions/get-secrets-from-user.ts +5 -23
- package/dist/resources/extensions/gsd/activity-log.ts +5 -3
- package/dist/resources/extensions/gsd/auto-prompts.ts +14 -0
- package/dist/resources/extensions/gsd/auto-recovery.ts +7 -4
- package/dist/resources/extensions/gsd/auto-worktree.ts +132 -3
- package/dist/resources/extensions/gsd/auto.ts +265 -48
- package/dist/resources/extensions/gsd/cache.ts +3 -1
- package/dist/resources/extensions/gsd/doctor-proactive.ts +7 -6
- package/dist/resources/extensions/gsd/doctor.ts +26 -1
- package/dist/resources/extensions/gsd/files.ts +13 -2
- package/dist/resources/extensions/gsd/git-service.ts +74 -14
- package/dist/resources/extensions/gsd/gsd-db.ts +78 -1
- package/dist/resources/extensions/gsd/guided-flow.ts +54 -22
- package/dist/resources/extensions/gsd/index.ts +62 -8
- package/dist/resources/extensions/gsd/memory-extractor.ts +352 -0
- package/dist/resources/extensions/gsd/memory-store.ts +441 -0
- package/dist/resources/extensions/gsd/migrate/command.ts +2 -2
- package/dist/resources/extensions/gsd/migrate/writer.ts +39 -0
- package/dist/resources/extensions/gsd/parallel-orchestrator.ts +122 -4
- package/dist/resources/extensions/gsd/preferences.ts +2 -1
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +4 -4
- package/dist/resources/extensions/gsd/prompts/discuss.md +5 -5
- package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/queue.md +3 -3
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/dist/resources/extensions/gsd/roadmap-slices.ts +45 -1
- package/dist/resources/extensions/gsd/state.ts +17 -6
- package/dist/resources/extensions/gsd/tests/auto-recovery.test.ts +54 -0
- package/dist/resources/extensions/gsd/tests/auto-worktree.test.ts +58 -0
- package/dist/resources/extensions/gsd/tests/derive-state.test.ts +70 -0
- package/dist/resources/extensions/gsd/tests/doctor-proactive.test.ts +23 -3
- package/dist/resources/extensions/gsd/tests/git-service.test.ts +70 -4
- package/dist/resources/extensions/gsd/tests/gsd-db.test.ts +2 -2
- package/dist/resources/extensions/gsd/tests/md-importer.test.ts +2 -3
- package/dist/resources/extensions/gsd/tests/memory-extractor.test.ts +180 -0
- package/dist/resources/extensions/gsd/tests/memory-store.test.ts +345 -0
- package/dist/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +13 -7
- package/dist/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +171 -0
- package/dist/resources/extensions/gsd/tests/smart-entry-draft.test.ts +1 -1
- package/dist/resources/extensions/gsd/tests/validate-milestone.test.ts +8 -4
- package/dist/resources/extensions/gsd/tests/visualizer-data.test.ts +147 -2
- package/dist/resources/extensions/gsd/tests/visualizer-overlay.test.ts +88 -10
- package/dist/resources/extensions/gsd/tests/visualizer-views.test.ts +314 -87
- package/dist/resources/extensions/gsd/triage-ui.ts +1 -1
- package/dist/resources/extensions/gsd/types.ts +2 -0
- package/dist/resources/extensions/gsd/visualizer-data.ts +291 -10
- package/dist/resources/extensions/gsd/visualizer-overlay.ts +237 -28
- package/dist/resources/extensions/gsd/visualizer-views.ts +462 -48
- package/dist/resources/extensions/gsd/worktree.ts +9 -2
- package/dist/resources/extensions/search-the-web/native-search.ts +19 -5
- package/dist/resources/extensions/shared/path-display.ts +19 -0
- package/package.json +1 -6
- package/packages/pi-agent-core/dist/agent-loop.js +2 -0
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.ts +2 -0
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +64 -0
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/mistral.js +3 -0
- package/packages/pi-ai/dist/providers/mistral.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +23 -1
- 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/src/providers/anthropic.ts +65 -1
- package/packages/pi-ai/src/providers/mistral.ts +3 -0
- package/packages/pi-ai/src/types.ts +19 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +7 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +32 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/keybindings.js +1 -1
- package/packages/pi-coding-agent/dist/core/keybindings.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/client.js +12 -1
- package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/index.js +7 -0
- package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +8 -3
- package/packages/pi-coding-agent/dist/core/sdk.js.map +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 +8 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -0
- package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +2 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +5 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts +41 -3
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +301 -62
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +17 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +5 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +135 -30
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/tests/path-display.test.d.ts +8 -0
- package/packages/pi-coding-agent/dist/tests/path-display.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/path-display.test.js +60 -0
- package/packages/pi-coding-agent/dist/tests/path-display.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/utils/clipboard-image.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/clipboard-image.js +32 -6
- package/packages/pi-coding-agent/dist/utils/clipboard-image.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/path-display.d.ts +34 -0
- package/packages/pi-coding-agent/dist/utils/path-display.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/utils/path-display.js +36 -0
- package/packages/pi-coding-agent/dist/utils/path-display.js.map +1 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +36 -0
- package/packages/pi-coding-agent/src/core/keybindings.ts +1 -1
- package/packages/pi-coding-agent/src/core/lsp/client.ts +11 -1
- package/packages/pi-coding-agent/src/core/lsp/index.ts +7 -0
- package/packages/pi-coding-agent/src/core/sdk.ts +17 -1
- package/packages/pi-coding-agent/src/core/settings-manager.ts +11 -0
- package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
- package/packages/pi-coding-agent/src/core/system-prompt.ts +2 -1
- package/packages/pi-coding-agent/src/index.ts +15 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +347 -62
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +18 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +124 -4
- package/packages/pi-coding-agent/src/tests/path-display.test.ts +85 -0
- package/packages/pi-coding-agent/src/utils/clipboard-image.ts +33 -6
- package/packages/pi-coding-agent/src/utils/path-display.ts +36 -0
- package/src/resources/GSD-WORKFLOW.md +12 -9
- package/src/resources/extensions/async-jobs/index.ts +9 -1
- package/src/resources/extensions/bg-shell/index.ts +3 -2
- package/src/resources/extensions/bg-shell/overlay.ts +18 -17
- package/src/resources/extensions/get-secrets-from-user.ts +5 -23
- package/src/resources/extensions/gsd/activity-log.ts +5 -3
- package/src/resources/extensions/gsd/auto-prompts.ts +14 -0
- package/src/resources/extensions/gsd/auto-recovery.ts +7 -4
- package/src/resources/extensions/gsd/auto-worktree.ts +132 -3
- package/src/resources/extensions/gsd/auto.ts +265 -48
- package/src/resources/extensions/gsd/cache.ts +3 -1
- package/src/resources/extensions/gsd/doctor-proactive.ts +7 -6
- package/src/resources/extensions/gsd/doctor.ts +26 -1
- package/src/resources/extensions/gsd/files.ts +13 -2
- package/src/resources/extensions/gsd/git-service.ts +74 -14
- package/src/resources/extensions/gsd/gsd-db.ts +78 -1
- package/src/resources/extensions/gsd/guided-flow.ts +54 -22
- package/src/resources/extensions/gsd/index.ts +62 -8
- package/src/resources/extensions/gsd/memory-extractor.ts +352 -0
- package/src/resources/extensions/gsd/memory-store.ts +441 -0
- package/src/resources/extensions/gsd/migrate/command.ts +2 -2
- package/src/resources/extensions/gsd/migrate/writer.ts +39 -0
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +122 -4
- package/src/resources/extensions/gsd/preferences.ts +2 -1
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +4 -4
- package/src/resources/extensions/gsd/prompts/discuss.md +5 -5
- package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/queue.md +3 -3
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/src/resources/extensions/gsd/roadmap-slices.ts +45 -1
- package/src/resources/extensions/gsd/state.ts +17 -6
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +23 -3
- package/src/resources/extensions/gsd/tests/git-service.test.ts +70 -4
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +2 -3
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +180 -0
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +345 -0
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +13 -7
- package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +171 -0
- package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +8 -4
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +147 -2
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +88 -10
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +314 -87
- package/src/resources/extensions/gsd/triage-ui.ts +1 -1
- package/src/resources/extensions/gsd/types.ts +2 -0
- package/src/resources/extensions/gsd/visualizer-data.ts +291 -10
- package/src/resources/extensions/gsd/visualizer-overlay.ts +237 -28
- package/src/resources/extensions/gsd/visualizer-views.ts +462 -48
- package/src/resources/extensions/gsd/worktree.ts +9 -2
- package/src/resources/extensions/search-the-web/native-search.ts +19 -5
- package/src/resources/extensions/shared/path-display.ts +19 -0
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* manages create, enter, detect, and teardown for auto-mode worktrees.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import { existsSync, cpSync, readFileSync, realpathSync, utimesSync } from "node:fs";
|
|
9
|
+
import { existsSync, cpSync, readFileSync, writeFileSync, readdirSync, mkdirSync, realpathSync, utimesSync, unlinkSync } from "node:fs";
|
|
10
10
|
import { isAbsolute, join, resolve } from "node:path";
|
|
11
11
|
import { copyWorktreeDb, reconcileWorktreeDb, isDbAvailable } from "./gsd-db.js";
|
|
12
12
|
import { execSync, execFileSync } from "node:child_process";
|
|
@@ -134,6 +134,112 @@ export function autoWorktreeBranch(milestoneId: string): string {
|
|
|
134
134
|
* Atomic: chdir + originalBase update happen in the same try block
|
|
135
135
|
* to prevent split-brain.
|
|
136
136
|
*/
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Forward-merge plan checkbox state from the project root into a freshly
|
|
140
|
+
* re-attached worktree (#778).
|
|
141
|
+
*
|
|
142
|
+
* When auto-mode stops via crash (not graceful stop), the milestone branch
|
|
143
|
+
* HEAD may be behind the filesystem state at the project root because
|
|
144
|
+
* syncStateToProjectRoot() runs after every task completion but the final
|
|
145
|
+
* git commit may not have happened before the crash. On restart the worktree
|
|
146
|
+
* is re-attached to the branch HEAD, which has [ ] for the crashed task,
|
|
147
|
+
* causing verifyExpectedArtifact() to fail and triggering an infinite
|
|
148
|
+
* dispatch/skip loop.
|
|
149
|
+
*
|
|
150
|
+
* Fix: after re-attaching, read every *.md plan file in the milestone
|
|
151
|
+
* directory at the project root and apply any [x] checkbox states that are
|
|
152
|
+
* ahead of the worktree version (forward-only: never downgrade [x] → [ ]).
|
|
153
|
+
*
|
|
154
|
+
* This is safe because syncStateToProjectRoot() is the authoritative source
|
|
155
|
+
* of post-task state at the project root — it writes the same [x] the LLM
|
|
156
|
+
* produced, then the auto-commit follows. If the commit never happened, the
|
|
157
|
+
* filesystem copy is still valid and correct.
|
|
158
|
+
*/
|
|
159
|
+
function reconcilePlanCheckboxes(projectRoot: string, wtPath: string, milestoneId: string): void {
|
|
160
|
+
const srcMilestone = join(projectRoot, ".gsd", "milestones", milestoneId);
|
|
161
|
+
const dstMilestone = join(wtPath, ".gsd", "milestones", milestoneId);
|
|
162
|
+
if (!existsSync(srcMilestone) || !existsSync(dstMilestone)) return;
|
|
163
|
+
|
|
164
|
+
// Walk all markdown files in the milestone directory (plans, summaries, etc.)
|
|
165
|
+
function walkMd(dir: string): string[] {
|
|
166
|
+
const results: string[] = [];
|
|
167
|
+
try {
|
|
168
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
169
|
+
const full = join(dir, entry.name);
|
|
170
|
+
if (entry.isDirectory()) {
|
|
171
|
+
results.push(...walkMd(full));
|
|
172
|
+
} else if (entry.isFile() && entry.name.endsWith(".md")) {
|
|
173
|
+
results.push(full);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
} catch { /* non-fatal */ }
|
|
177
|
+
return results;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
for (const srcFile of walkMd(srcMilestone)) {
|
|
181
|
+
const rel = srcFile.slice(srcMilestone.length);
|
|
182
|
+
const dstFile = dstMilestone + rel;
|
|
183
|
+
if (!existsSync(dstFile)) continue; // only reconcile existing files
|
|
184
|
+
|
|
185
|
+
let srcContent: string;
|
|
186
|
+
let dstContent: string;
|
|
187
|
+
try {
|
|
188
|
+
srcContent = readFileSync(srcFile, "utf-8");
|
|
189
|
+
dstContent = readFileSync(dstFile, "utf-8");
|
|
190
|
+
} catch { continue; }
|
|
191
|
+
|
|
192
|
+
if (srcContent === dstContent) continue;
|
|
193
|
+
|
|
194
|
+
// Extract all checked task IDs from the source (project root)
|
|
195
|
+
// Pattern: - [x] **T<id>: or - [x] **S<id>: (case-insensitive x)
|
|
196
|
+
const checkedRe = /^- \[[xX]\] \*\*([TS]\d+):/gm;
|
|
197
|
+
const srcChecked = new Set<string>();
|
|
198
|
+
for (const m of srcContent.matchAll(checkedRe)) srcChecked.add(m[1]);
|
|
199
|
+
|
|
200
|
+
if (srcChecked.size === 0) continue;
|
|
201
|
+
|
|
202
|
+
// Forward-apply: replace [ ] → [x] for any IDs that are checked in src
|
|
203
|
+
let updated = dstContent;
|
|
204
|
+
let changed = false;
|
|
205
|
+
for (const id of srcChecked) {
|
|
206
|
+
const escapedId = id.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
207
|
+
const uncheckedRe = new RegExp(`^(- )\\[ \\]( \\*\\*${escapedId}:)`, "gm");
|
|
208
|
+
if (uncheckedRe.test(updated)) {
|
|
209
|
+
updated = updated.replace(
|
|
210
|
+
new RegExp(`^(- )\\[ \\]( \\*\\*${escapedId}:)`, "gm"),
|
|
211
|
+
"$1[x]$2",
|
|
212
|
+
);
|
|
213
|
+
changed = true;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
if (changed) {
|
|
218
|
+
try {
|
|
219
|
+
writeFileSync(dstFile, updated, "utf-8");
|
|
220
|
+
} catch { /* non-fatal */ }
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Also forward-merge completed-units.json (set-union)
|
|
225
|
+
const srcKeys = join(projectRoot, ".gsd", "completed-units.json");
|
|
226
|
+
const dstKeys = join(wtPath, ".gsd", "completed-units.json");
|
|
227
|
+
if (existsSync(srcKeys)) {
|
|
228
|
+
try {
|
|
229
|
+
const src: string[] = JSON.parse(readFileSync(srcKeys, "utf-8"));
|
|
230
|
+
let dst: string[] = [];
|
|
231
|
+
if (existsSync(dstKeys)) {
|
|
232
|
+
try { dst = JSON.parse(readFileSync(dstKeys, "utf-8")); } catch { /* ignore corrupt */ }
|
|
233
|
+
}
|
|
234
|
+
const merged = [...new Set([...dst, ...src])];
|
|
235
|
+
if (merged.length > dst.length) {
|
|
236
|
+
mkdirSync(join(wtPath, ".gsd"), { recursive: true });
|
|
237
|
+
writeFileSync(dstKeys, JSON.stringify(merged), "utf-8");
|
|
238
|
+
}
|
|
239
|
+
} catch { /* non-fatal */ }
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
137
243
|
export function createAutoWorktree(basePath: string, milestoneId: string): string {
|
|
138
244
|
const branch = autoWorktreeBranch(milestoneId);
|
|
139
245
|
|
|
@@ -166,6 +272,18 @@ export function createAutoWorktree(basePath: string, milestoneId: string): strin
|
|
|
166
272
|
// not always fully synced.
|
|
167
273
|
if (!branchExists) {
|
|
168
274
|
copyPlanningArtifacts(basePath, info.path);
|
|
275
|
+
} else {
|
|
276
|
+
// Re-attaching to an existing branch: forward-merge any plan checkpoint
|
|
277
|
+
// state from the project root into the worktree (#778).
|
|
278
|
+
//
|
|
279
|
+
// If auto-mode stopped via crash, the milestone branch HEAD may lag behind
|
|
280
|
+
// the project root filesystem because syncStateToProjectRoot() ran after
|
|
281
|
+
// task completion but the auto-commit never fired. On restart the worktree
|
|
282
|
+
// is re-created from the branch HEAD (which has [ ] for the crashed task),
|
|
283
|
+
// causing verifyExpectedArtifact() to return false → stale-key eviction →
|
|
284
|
+
// infinite dispatch/skip loop. Reconciling here ensures the worktree sees
|
|
285
|
+
// the same [x] state that syncStateToProjectRoot() wrote to the root.
|
|
286
|
+
reconcilePlanCheckboxes(basePath, info.path, milestoneId);
|
|
169
287
|
}
|
|
170
288
|
|
|
171
289
|
// Run user-configured post-create hook (#597) — e.g. copy .env, symlink assets
|
|
@@ -194,7 +312,8 @@ export function createAutoWorktree(basePath: string, milestoneId: string): strin
|
|
|
194
312
|
|
|
195
313
|
/**
|
|
196
314
|
* Copy .gsd/ planning artifacts from source repo to a new worktree.
|
|
197
|
-
* Copies milestones/, DECISIONS.md, REQUIREMENTS.md, PROJECT.md, QUEUE.md
|
|
315
|
+
* Copies milestones/, DECISIONS.md, REQUIREMENTS.md, PROJECT.md, QUEUE.md,
|
|
316
|
+
* STATE.md, KNOWLEDGE.md, and OVERRIDES.md.
|
|
198
317
|
* Skips runtime files (auto.lock, metrics.json, etc.) and the worktrees/ dir.
|
|
199
318
|
* Best-effort — failures are non-fatal since auto-mode can recreate artifacts.
|
|
200
319
|
*/
|
|
@@ -212,7 +331,7 @@ function copyPlanningArtifacts(srcBase: string, wtPath: string): void {
|
|
|
212
331
|
}
|
|
213
332
|
|
|
214
333
|
// Copy top-level planning files
|
|
215
|
-
for (const file of ["DECISIONS.md", "REQUIREMENTS.md", "PROJECT.md", "QUEUE.md"]) {
|
|
334
|
+
for (const file of ["DECISIONS.md", "REQUIREMENTS.md", "PROJECT.md", "QUEUE.md", "STATE.md", "KNOWLEDGE.md", "OVERRIDES.md"]) {
|
|
216
335
|
const src = join(srcGsd, file);
|
|
217
336
|
if (existsSync(src)) {
|
|
218
337
|
try {
|
|
@@ -441,6 +560,16 @@ export function mergeMilestoneToMain(
|
|
|
441
560
|
// when main is already checked out in the project-root worktree, #757)
|
|
442
561
|
const currentBranchAtBase = nativeGetCurrentBranch(originalBasePath_);
|
|
443
562
|
if (currentBranchAtBase !== mainBranch) {
|
|
563
|
+
// Remove untracked .gsd/ state files that may conflict with the branch
|
|
564
|
+
// being checked out. These are regenerated by doctor/rebuildState and
|
|
565
|
+
// are not meaningful in the main working tree — the worktree had the
|
|
566
|
+
// real state. Without this, `git checkout main` fails with
|
|
567
|
+
// "Your local changes would be overwritten" (#827).
|
|
568
|
+
const gsdStateFiles = ["STATE.md", "completed-units.json", "auto.lock"];
|
|
569
|
+
for (const f of gsdStateFiles) {
|
|
570
|
+
const p = join(originalBasePath_, ".gsd", f);
|
|
571
|
+
try { unlinkSync(p); } catch { /* non-fatal — file may not exist */ }
|
|
572
|
+
}
|
|
444
573
|
nativeCheckoutBranch(originalBasePath_, mainBranch);
|
|
445
574
|
}
|
|
446
575
|
|