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.
Files changed (99) hide show
  1. package/README.md +3 -3
  2. package/dist/cli.js +1 -0
  3. package/dist/loader.js +50 -6
  4. package/dist/resource-loader.d.ts +7 -6
  5. package/dist/resource-loader.js +15 -8
  6. package/dist/resources/extensions/gsd/auto-worktree.ts +29 -183
  7. package/dist/resources/extensions/gsd/auto.ts +252 -370
  8. package/dist/resources/extensions/gsd/commands.ts +118 -34
  9. package/dist/resources/extensions/gsd/doctor.ts +29 -4
  10. package/dist/resources/extensions/gsd/git-self-heal.ts +0 -71
  11. package/dist/resources/extensions/gsd/git-service.ts +8 -431
  12. package/dist/resources/extensions/gsd/gitignore.ts +11 -4
  13. package/dist/resources/extensions/gsd/guided-flow.ts +141 -5
  14. package/dist/resources/extensions/gsd/preferences.ts +18 -17
  15. package/dist/resources/extensions/gsd/prompts/discuss.md +35 -0
  16. package/dist/resources/extensions/gsd/prompts/queue.md +7 -1
  17. package/dist/resources/extensions/gsd/state.ts +26 -8
  18. package/dist/resources/extensions/gsd/templates/state.md +0 -1
  19. package/dist/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +3 -2
  20. package/dist/resources/extensions/gsd/tests/auto-worktree.test.ts +1 -1
  21. package/dist/resources/extensions/gsd/tests/derive-state.test.ts +35 -0
  22. package/dist/resources/extensions/gsd/tests/doctor-git.test.ts +22 -4
  23. package/dist/resources/extensions/gsd/tests/draft-promotion.test.ts +2 -1
  24. package/dist/resources/extensions/gsd/tests/git-self-heal.test.ts +8 -111
  25. package/dist/resources/extensions/gsd/tests/git-service.test.ts +11 -770
  26. package/dist/resources/extensions/gsd/tests/idle-recovery.test.ts +21 -113
  27. package/dist/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +16 -82
  28. package/dist/resources/extensions/gsd/tests/preferences-git.test.ts +29 -50
  29. package/dist/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -91
  30. package/dist/resources/extensions/gsd/tests/worktree-integration.test.ts +28 -55
  31. package/dist/resources/extensions/gsd/tests/worktree.test.ts +1 -426
  32. package/dist/resources/extensions/gsd/types.ts +0 -1
  33. package/dist/resources/extensions/gsd/worktree-manager.ts +7 -3
  34. package/dist/resources/extensions/gsd/worktree.ts +7 -65
  35. package/dist/resources/extensions/search-the-web/command-search-provider.ts +3 -1
  36. package/package.json +1 -1
  37. package/packages/pi-ai/dist/providers/google.d.ts.map +1 -1
  38. package/packages/pi-ai/dist/providers/google.js +12 -4
  39. package/packages/pi-ai/dist/providers/google.js.map +1 -1
  40. package/packages/pi-ai/dist/providers/mistral.d.ts.map +1 -1
  41. package/packages/pi-ai/dist/providers/mistral.js +10 -2
  42. package/packages/pi-ai/dist/providers/mistral.js.map +1 -1
  43. package/packages/pi-ai/src/providers/google.ts +20 -8
  44. package/packages/pi-ai/src/providers/mistral.ts +14 -2
  45. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +3 -0
  46. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  47. package/packages/pi-coding-agent/dist/core/extensions/loader.js +10 -7
  48. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  49. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.d.ts +1 -1
  50. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  51. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js +4 -1
  52. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js.map +1 -1
  53. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  54. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +12 -3
  55. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  56. package/packages/pi-coding-agent/src/core/extensions/loader.ts +13 -9
  57. package/packages/pi-coding-agent/src/modes/interactive/components/extension-input.ts +4 -1
  58. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +14 -3
  59. package/packages/pi-tui/dist/components/input.d.ts +1 -0
  60. package/packages/pi-tui/dist/components/input.d.ts.map +1 -1
  61. package/packages/pi-tui/dist/components/input.js +10 -0
  62. package/packages/pi-tui/dist/components/input.js.map +1 -1
  63. package/packages/pi-tui/src/components/input.ts +11 -0
  64. package/src/resources/extensions/gsd/auto-worktree.ts +29 -183
  65. package/src/resources/extensions/gsd/auto.ts +252 -370
  66. package/src/resources/extensions/gsd/commands.ts +118 -34
  67. package/src/resources/extensions/gsd/doctor.ts +29 -4
  68. package/src/resources/extensions/gsd/git-self-heal.ts +0 -71
  69. package/src/resources/extensions/gsd/git-service.ts +8 -431
  70. package/src/resources/extensions/gsd/gitignore.ts +11 -4
  71. package/src/resources/extensions/gsd/guided-flow.ts +141 -5
  72. package/src/resources/extensions/gsd/preferences.ts +18 -17
  73. package/src/resources/extensions/gsd/prompts/discuss.md +35 -0
  74. package/src/resources/extensions/gsd/prompts/queue.md +7 -1
  75. package/src/resources/extensions/gsd/state.ts +26 -8
  76. package/src/resources/extensions/gsd/templates/state.md +0 -1
  77. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +3 -2
  78. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +1 -1
  79. package/src/resources/extensions/gsd/tests/derive-state.test.ts +35 -0
  80. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +22 -4
  81. package/src/resources/extensions/gsd/tests/draft-promotion.test.ts +2 -1
  82. package/src/resources/extensions/gsd/tests/git-self-heal.test.ts +8 -111
  83. package/src/resources/extensions/gsd/tests/git-service.test.ts +11 -770
  84. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +21 -113
  85. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +16 -82
  86. package/src/resources/extensions/gsd/tests/preferences-git.test.ts +29 -50
  87. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -91
  88. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +28 -55
  89. package/src/resources/extensions/gsd/tests/worktree.test.ts +1 -426
  90. package/src/resources/extensions/gsd/types.ts +0 -1
  91. package/src/resources/extensions/gsd/worktree-manager.ts +7 -3
  92. package/src/resources/extensions/gsd/worktree.ts +7 -65
  93. package/src/resources/extensions/search-the-web/command-search-provider.ts +3 -1
  94. package/dist/resources/extensions/gsd/tests/auto-worktree-merge.test.ts +0 -282
  95. package/dist/resources/extensions/gsd/tests/isolation-resolver.test.ts +0 -107
  96. package/dist/resources/extensions/gsd/tests/orphaned-branch.test.ts +0 -353
  97. package/src/resources/extensions/gsd/tests/auto-worktree-merge.test.ts +0 -282
  98. package/src/resources/extensions/gsd/tests/isolation-resolver.test.ts +0 -107
  99. 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, mkdirSync } from "node:fs";
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 'test@test.com'", { cwd: dir, stdio: "pipe" });
28
- execSync("git config user.name 'Test'", { cwd: dir, stdio: "pipe" });
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 'init'", { cwd: dir, stdio: "pipe" });
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 'feature'", { cwd: dir, stdio: "pipe" });
54
- execSync("git checkout master 2>/dev/null || git checkout main", { cwd: dir, stdio: "pipe" });
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 'main change'", { cwd: dir, stdio: "pipe" });
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 ──");