gsd-pi 2.13.0 → 2.14.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 +3 -3
- package/dist/cli.js +1 -0
- package/dist/loader.js +50 -6
- package/dist/resource-loader.d.ts +7 -6
- package/dist/resource-loader.js +15 -8
- package/dist/resources/extensions/gsd/auto-worktree.ts +29 -183
- package/dist/resources/extensions/gsd/auto.ts +252 -370
- package/dist/resources/extensions/gsd/commands.ts +118 -34
- package/dist/resources/extensions/gsd/doctor.ts +29 -4
- package/dist/resources/extensions/gsd/git-self-heal.ts +0 -71
- package/dist/resources/extensions/gsd/git-service.ts +8 -431
- package/dist/resources/extensions/gsd/gitignore.ts +11 -4
- package/dist/resources/extensions/gsd/guided-flow.ts +141 -5
- package/dist/resources/extensions/gsd/preferences.ts +18 -17
- package/dist/resources/extensions/gsd/prompts/discuss.md +35 -0
- package/dist/resources/extensions/gsd/prompts/queue.md +7 -1
- package/dist/resources/extensions/gsd/state.ts +26 -8
- package/dist/resources/extensions/gsd/templates/state.md +0 -1
- package/dist/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +3 -2
- package/dist/resources/extensions/gsd/tests/auto-worktree.test.ts +1 -1
- package/dist/resources/extensions/gsd/tests/derive-state.test.ts +35 -0
- package/dist/resources/extensions/gsd/tests/doctor-git.test.ts +22 -4
- package/dist/resources/extensions/gsd/tests/draft-promotion.test.ts +2 -1
- package/dist/resources/extensions/gsd/tests/git-self-heal.test.ts +8 -111
- package/dist/resources/extensions/gsd/tests/git-service.test.ts +11 -770
- package/dist/resources/extensions/gsd/tests/idle-recovery.test.ts +21 -113
- package/dist/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +16 -82
- package/dist/resources/extensions/gsd/tests/preferences-git.test.ts +29 -50
- package/dist/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -91
- package/dist/resources/extensions/gsd/tests/worktree-integration.test.ts +28 -55
- package/dist/resources/extensions/gsd/tests/worktree.test.ts +1 -426
- package/dist/resources/extensions/gsd/types.ts +0 -1
- package/dist/resources/extensions/gsd/worktree-manager.ts +7 -3
- package/dist/resources/extensions/gsd/worktree.ts +7 -65
- package/dist/resources/extensions/search-the-web/command-search-provider.ts +3 -1
- package/package.json +1 -1
- package/packages/pi-ai/dist/providers/google.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google.js +12 -4
- package/packages/pi-ai/dist/providers/google.js.map +1 -1
- package/packages/pi-ai/dist/providers/mistral.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/mistral.js +10 -2
- package/packages/pi-ai/dist/providers/mistral.js.map +1 -1
- package/packages/pi-ai/src/providers/google.ts +20 -8
- package/packages/pi-ai/src/providers/mistral.ts +14 -2
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +10 -7
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js +4 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js.map +1 -1
- 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 +12 -3
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +13 -9
- package/packages/pi-coding-agent/src/modes/interactive/components/extension-input.ts +4 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +14 -3
- package/packages/pi-tui/dist/components/input.d.ts +1 -0
- package/packages/pi-tui/dist/components/input.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/input.js +10 -0
- package/packages/pi-tui/dist/components/input.js.map +1 -1
- package/packages/pi-tui/src/components/input.ts +11 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +29 -183
- package/src/resources/extensions/gsd/auto.ts +252 -370
- package/src/resources/extensions/gsd/commands.ts +118 -34
- package/src/resources/extensions/gsd/doctor.ts +29 -4
- package/src/resources/extensions/gsd/git-self-heal.ts +0 -71
- package/src/resources/extensions/gsd/git-service.ts +8 -431
- package/src/resources/extensions/gsd/gitignore.ts +11 -4
- package/src/resources/extensions/gsd/guided-flow.ts +141 -5
- package/src/resources/extensions/gsd/preferences.ts +18 -17
- package/src/resources/extensions/gsd/prompts/discuss.md +35 -0
- package/src/resources/extensions/gsd/prompts/queue.md +7 -1
- package/src/resources/extensions/gsd/state.ts +26 -8
- package/src/resources/extensions/gsd/templates/state.md +0 -1
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/doctor-git.test.ts +22 -4
- package/src/resources/extensions/gsd/tests/draft-promotion.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/git-self-heal.test.ts +8 -111
- package/src/resources/extensions/gsd/tests/git-service.test.ts +11 -770
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +21 -113
- package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +16 -82
- package/src/resources/extensions/gsd/tests/preferences-git.test.ts +29 -50
- package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -91
- package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +28 -55
- package/src/resources/extensions/gsd/tests/worktree.test.ts +1 -426
- package/src/resources/extensions/gsd/types.ts +0 -1
- package/src/resources/extensions/gsd/worktree-manager.ts +7 -3
- package/src/resources/extensions/gsd/worktree.ts +7 -65
- package/src/resources/extensions/search-the-web/command-search-provider.ts +3 -1
- package/dist/resources/extensions/gsd/tests/auto-worktree-merge.test.ts +0 -282
- package/dist/resources/extensions/gsd/tests/isolation-resolver.test.ts +0 -107
- package/dist/resources/extensions/gsd/tests/orphaned-branch.test.ts +0 -353
- package/src/resources/extensions/gsd/tests/auto-worktree-merge.test.ts +0 -282
- package/src/resources/extensions/gsd/tests/isolation-resolver.test.ts +0 -107
- package/src/resources/extensions/gsd/tests/orphaned-branch.test.ts +0 -353
|
@@ -6,17 +6,14 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { execSync } from "node:child_process";
|
|
9
|
-
import { existsSync, mkdtempSync, writeFileSync
|
|
9
|
+
import { existsSync, mkdtempSync, writeFileSync } from "node:fs";
|
|
10
10
|
import { join } from "node:path";
|
|
11
11
|
import { tmpdir } from "node:os";
|
|
12
12
|
import { rmSync } from "node:fs";
|
|
13
13
|
import assert from "node:assert/strict";
|
|
14
14
|
import {
|
|
15
15
|
abortAndReset,
|
|
16
|
-
withMergeHeal,
|
|
17
|
-
recoverCheckout,
|
|
18
16
|
formatGitError,
|
|
19
|
-
MergeConflictError,
|
|
20
17
|
} from "../git-self-heal.js";
|
|
21
18
|
|
|
22
19
|
// ─── Helpers ─────────────────────────────────────────────────────────
|
|
@@ -24,10 +21,11 @@ import {
|
|
|
24
21
|
function makeTempRepo(): string {
|
|
25
22
|
const dir = mkdtempSync(join(tmpdir(), "gsd-self-heal-"));
|
|
26
23
|
execSync("git init", { cwd: dir, stdio: "pipe" });
|
|
27
|
-
execSync("git config user.email
|
|
28
|
-
execSync("git config user.name
|
|
24
|
+
execSync("git config user.email \"test@test.com\"", { cwd: dir, stdio: "pipe" });
|
|
25
|
+
execSync("git config user.name \"Test\"", { cwd: dir, stdio: "pipe" });
|
|
29
26
|
writeFileSync(join(dir, "README.md"), "# init\n");
|
|
30
|
-
execSync("git add -A && git commit -m
|
|
27
|
+
execSync("git add -A && git commit -m \"init\"", { cwd: dir, stdio: "pipe" });
|
|
28
|
+
execSync("git branch -M main", { cwd: dir, stdio: "pipe" });
|
|
31
29
|
return dir;
|
|
32
30
|
}
|
|
33
31
|
|
|
@@ -50,10 +48,10 @@ console.log("── abortAndReset ──");
|
|
|
50
48
|
// Create a conflicting branch
|
|
51
49
|
execSync("git checkout -b feature", { cwd: dir, stdio: "pipe" });
|
|
52
50
|
writeFileSync(join(dir, "file.txt"), "feature content\n");
|
|
53
|
-
execSync("git add -A && git commit -m
|
|
54
|
-
execSync("git checkout
|
|
51
|
+
execSync("git add -A && git commit -m \"feature\"", { cwd: dir, stdio: "pipe" });
|
|
52
|
+
execSync("git checkout main", { cwd: dir, stdio: "pipe" });
|
|
55
53
|
writeFileSync(join(dir, "file.txt"), "main content\n");
|
|
56
|
-
execSync("git add -A && git commit -m
|
|
54
|
+
execSync("git add -A && git commit -m \"main change\"", { cwd: dir, stdio: "pipe" });
|
|
57
55
|
|
|
58
56
|
// Create a merge conflict → MERGE_HEAD will exist
|
|
59
57
|
try {
|
|
@@ -104,107 +102,6 @@ console.log("── abortAndReset ──");
|
|
|
104
102
|
}
|
|
105
103
|
}
|
|
106
104
|
|
|
107
|
-
// ─── withMergeHeal ───────────────────────────────────────────────────
|
|
108
|
-
|
|
109
|
-
console.log("── withMergeHeal ──");
|
|
110
|
-
|
|
111
|
-
// Test: transient failure succeeds on retry
|
|
112
|
-
{
|
|
113
|
-
const dir = makeTempRepo();
|
|
114
|
-
try {
|
|
115
|
-
let callCount = 0;
|
|
116
|
-
const result = withMergeHeal(dir, () => {
|
|
117
|
-
callCount++;
|
|
118
|
-
if (callCount === 1) throw new Error("transient git error");
|
|
119
|
-
return "success";
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
assert.strictEqual(result, "success", "should return mergeFn result on retry");
|
|
123
|
-
assert.strictEqual(callCount, 2, "should have called mergeFn twice");
|
|
124
|
-
|
|
125
|
-
console.log(" ✓ transient failure succeeds on retry");
|
|
126
|
-
} finally {
|
|
127
|
-
cleanup(dir);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// Test: real conflict escalates immediately (no retry)
|
|
132
|
-
{
|
|
133
|
-
const dir = makeTempRepo();
|
|
134
|
-
try {
|
|
135
|
-
// Set up a real merge conflict
|
|
136
|
-
execSync("git checkout -b conflict-branch", { cwd: dir, stdio: "pipe" });
|
|
137
|
-
writeFileSync(join(dir, "conflict.txt"), "branch A\n");
|
|
138
|
-
execSync("git add -A && git commit -m 'branch A'", { cwd: dir, stdio: "pipe" });
|
|
139
|
-
execSync("git checkout master 2>/dev/null || git checkout main", { cwd: dir, stdio: "pipe" });
|
|
140
|
-
writeFileSync(join(dir, "conflict.txt"), "branch B\n");
|
|
141
|
-
execSync("git add -A && git commit -m 'branch B'", { cwd: dir, stdio: "pipe" });
|
|
142
|
-
|
|
143
|
-
let callCount = 0;
|
|
144
|
-
try {
|
|
145
|
-
withMergeHeal(dir, () => {
|
|
146
|
-
callCount++;
|
|
147
|
-
// Actually perform the conflicting merge
|
|
148
|
-
execSync("git merge conflict-branch", { cwd: dir, stdio: "pipe" });
|
|
149
|
-
});
|
|
150
|
-
assert.fail("should have thrown MergeConflictError");
|
|
151
|
-
} catch (err) {
|
|
152
|
-
assert.ok(err instanceof MergeConflictError, `should throw MergeConflictError, got ${(err as Error).constructor.name}`);
|
|
153
|
-
assert.strictEqual(callCount, 1, "should NOT retry on real conflict");
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
console.log(" ✓ real conflict escalates immediately without retry");
|
|
157
|
-
} finally {
|
|
158
|
-
cleanup(dir);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
// ─── recoverCheckout ─────────────────────────────────────────────────
|
|
163
|
-
|
|
164
|
-
console.log("── recoverCheckout ──");
|
|
165
|
-
|
|
166
|
-
// Test: dirty index recovery
|
|
167
|
-
{
|
|
168
|
-
const dir = makeTempRepo();
|
|
169
|
-
try {
|
|
170
|
-
// Create a branch to checkout to
|
|
171
|
-
execSync("git checkout -b target-branch", { cwd: dir, stdio: "pipe" });
|
|
172
|
-
execSync("git checkout master 2>/dev/null || git checkout main", { cwd: dir, stdio: "pipe" });
|
|
173
|
-
|
|
174
|
-
// Dirty the index
|
|
175
|
-
writeFileSync(join(dir, "README.md"), "dirty changes\n");
|
|
176
|
-
execSync("git add README.md", { cwd: dir, stdio: "pipe" });
|
|
177
|
-
|
|
178
|
-
// Normal checkout would complain about dirty index
|
|
179
|
-
recoverCheckout(dir, "target-branch");
|
|
180
|
-
|
|
181
|
-
const branch = execSync("git branch --show-current", { cwd: dir, encoding: "utf-8" }).trim();
|
|
182
|
-
assert.strictEqual(branch, "target-branch", "should be on target branch after recovery");
|
|
183
|
-
|
|
184
|
-
console.log(" ✓ recovers checkout with dirty index");
|
|
185
|
-
} finally {
|
|
186
|
-
cleanup(dir);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
// Test: non-existent branch throws with context
|
|
191
|
-
{
|
|
192
|
-
const dir = makeTempRepo();
|
|
193
|
-
try {
|
|
194
|
-
try {
|
|
195
|
-
recoverCheckout(dir, "nonexistent-branch");
|
|
196
|
-
assert.fail("should have thrown");
|
|
197
|
-
} catch (err) {
|
|
198
|
-
assert.ok((err as Error).message.includes("recoverCheckout failed"), "should include context in error");
|
|
199
|
-
assert.ok((err as Error).message.includes("nonexistent-branch"), "should mention branch name");
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
console.log(" ✓ throws with context for non-existent branch");
|
|
203
|
-
} finally {
|
|
204
|
-
cleanup(dir);
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
105
|
// ─── formatGitError ──────────────────────────────────────────────────
|
|
209
106
|
|
|
210
107
|
console.log("── formatGitError ──");
|