@camaradesuk/git-worktree-tools 1.3.0 → 1.4.1

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 (284) hide show
  1. package/README.md +290 -3
  2. package/dist/api/clean.d.ts +65 -0
  3. package/dist/api/clean.d.ts.map +1 -0
  4. package/dist/api/clean.js +209 -0
  5. package/dist/api/clean.js.map +1 -0
  6. package/dist/api/create.d.ts +88 -0
  7. package/dist/api/create.d.ts.map +1 -0
  8. package/dist/api/create.js +373 -0
  9. package/dist/api/create.js.map +1 -0
  10. package/dist/api/index.d.ts +15 -0
  11. package/dist/api/index.d.ts.map +1 -0
  12. package/dist/api/index.js +19 -0
  13. package/dist/api/index.js.map +1 -0
  14. package/dist/api/list.d.ts +74 -0
  15. package/dist/api/list.d.ts.map +1 -0
  16. package/dist/api/list.js +80 -0
  17. package/dist/api/list.js.map +1 -0
  18. package/dist/api/state.d.ts +43 -0
  19. package/dist/api/state.d.ts.map +1 -0
  20. package/dist/api/state.js +70 -0
  21. package/dist/api/state.js.map +1 -0
  22. package/dist/cli/cleanpr.js +171 -28
  23. package/dist/cli/cleanpr.js.map +1 -1
  24. package/dist/cli/cleanpr.test.js +459 -7
  25. package/dist/cli/cleanpr.test.js.map +1 -1
  26. package/dist/cli/newpr.js +189 -28
  27. package/dist/cli/newpr.js.map +1 -1
  28. package/dist/cli/newpr.test.js +349 -0
  29. package/dist/cli/newpr.test.js.map +1 -1
  30. package/dist/cli/wtconfig.d.ts +14 -0
  31. package/dist/cli/wtconfig.d.ts.map +1 -0
  32. package/dist/cli/wtconfig.js +948 -0
  33. package/dist/cli/wtconfig.js.map +1 -0
  34. package/dist/cli/wtconfig.test.d.ts +5 -0
  35. package/dist/cli/wtconfig.test.d.ts.map +1 -0
  36. package/dist/cli/wtconfig.test.js +1281 -0
  37. package/dist/cli/wtconfig.test.js.map +1 -0
  38. package/dist/cli/wtlink.js +5 -0
  39. package/dist/cli/wtlink.js.map +1 -1
  40. package/dist/cli/wtstate.d.ts +8 -0
  41. package/dist/cli/wtstate.d.ts.map +1 -0
  42. package/dist/cli/wtstate.js +83 -0
  43. package/dist/cli/wtstate.js.map +1 -0
  44. package/dist/cli/wtstate.test.d.ts +5 -0
  45. package/dist/cli/wtstate.test.d.ts.map +1 -0
  46. package/dist/cli/wtstate.test.js +193 -0
  47. package/dist/cli/wtstate.test.js.map +1 -0
  48. package/dist/e2e/cleanpr/cleanpr.e2e.test.d.ts +2 -0
  49. package/dist/e2e/cleanpr/cleanpr.e2e.test.d.ts.map +1 -0
  50. package/dist/e2e/cleanpr/cleanpr.e2e.test.js +326 -0
  51. package/dist/e2e/cleanpr/cleanpr.e2e.test.js.map +1 -0
  52. package/dist/e2e/helpers/cli-runner.d.ts +103 -0
  53. package/dist/e2e/helpers/cli-runner.d.ts.map +1 -0
  54. package/dist/e2e/helpers/cli-runner.js +200 -0
  55. package/dist/e2e/helpers/cli-runner.js.map +1 -0
  56. package/dist/e2e/helpers/gh-mock.d.ts +87 -0
  57. package/dist/e2e/helpers/gh-mock.d.ts.map +1 -0
  58. package/dist/e2e/helpers/gh-mock.js +384 -0
  59. package/dist/e2e/helpers/gh-mock.js.map +1 -0
  60. package/dist/e2e/helpers/index.d.ts +12 -0
  61. package/dist/e2e/helpers/index.d.ts.map +1 -0
  62. package/dist/e2e/helpers/index.js +16 -0
  63. package/dist/e2e/helpers/index.js.map +1 -0
  64. package/dist/e2e/helpers/pty-wrapper.d.ts +118 -0
  65. package/dist/e2e/helpers/pty-wrapper.d.ts.map +1 -0
  66. package/dist/e2e/helpers/pty-wrapper.js +276 -0
  67. package/dist/e2e/helpers/pty-wrapper.js.map +1 -0
  68. package/dist/e2e/helpers/scenario-harness.d.ts +55 -0
  69. package/dist/e2e/helpers/scenario-harness.d.ts.map +1 -0
  70. package/dist/e2e/helpers/scenario-harness.js +360 -0
  71. package/dist/e2e/helpers/scenario-harness.js.map +1 -0
  72. package/dist/e2e/helpers/test-context.d.ts +120 -0
  73. package/dist/e2e/helpers/test-context.d.ts.map +1 -0
  74. package/dist/e2e/helpers/test-context.js +263 -0
  75. package/dist/e2e/helpers/test-context.js.map +1 -0
  76. package/dist/e2e/lswt/lswt.e2e.test.d.ts +2 -0
  77. package/dist/e2e/lswt/lswt.e2e.test.d.ts.map +1 -0
  78. package/dist/e2e/lswt/lswt.e2e.test.js +328 -0
  79. package/dist/e2e/lswt/lswt.e2e.test.js.map +1 -0
  80. package/dist/e2e/newpr/newpr.e2e.test.d.ts +2 -0
  81. package/dist/e2e/newpr/newpr.e2e.test.d.ts.map +1 -0
  82. package/dist/e2e/newpr/newpr.e2e.test.js +286 -0
  83. package/dist/e2e/newpr/newpr.e2e.test.js.map +1 -0
  84. package/dist/e2e/newpr/scenarios.e2e.test.d.ts +2 -0
  85. package/dist/e2e/newpr/scenarios.e2e.test.d.ts.map +1 -0
  86. package/dist/e2e/newpr/scenarios.e2e.test.js +426 -0
  87. package/dist/e2e/newpr/scenarios.e2e.test.js.map +1 -0
  88. package/dist/e2e/workflows/pr-lifecycle.e2e.test.d.ts +2 -0
  89. package/dist/e2e/workflows/pr-lifecycle.e2e.test.d.ts.map +1 -0
  90. package/dist/e2e/workflows/pr-lifecycle.e2e.test.js +298 -0
  91. package/dist/e2e/workflows/pr-lifecycle.e2e.test.js.map +1 -0
  92. package/dist/e2e/wtlink/wtlink.e2e.test.d.ts +2 -0
  93. package/dist/e2e/wtlink/wtlink.e2e.test.d.ts.map +1 -0
  94. package/dist/e2e/wtlink/wtlink.e2e.test.js +364 -0
  95. package/dist/e2e/wtlink/wtlink.e2e.test.js.map +1 -0
  96. package/dist/index.d.ts +15 -1
  97. package/dist/index.d.ts.map +1 -1
  98. package/dist/index.js +14 -0
  99. package/dist/index.js.map +1 -1
  100. package/dist/lib/ai/base-provider.d.ts +58 -0
  101. package/dist/lib/ai/base-provider.d.ts.map +1 -0
  102. package/dist/lib/ai/base-provider.js +246 -0
  103. package/dist/lib/ai/base-provider.js.map +1 -0
  104. package/dist/lib/ai/base-provider.test.d.ts +7 -0
  105. package/dist/lib/ai/base-provider.test.d.ts.map +1 -0
  106. package/dist/lib/ai/base-provider.test.js +320 -0
  107. package/dist/lib/ai/base-provider.test.js.map +1 -0
  108. package/dist/lib/ai/cli-provider.d.ts +87 -0
  109. package/dist/lib/ai/cli-provider.d.ts.map +1 -0
  110. package/dist/lib/ai/cli-provider.js +280 -0
  111. package/dist/lib/ai/cli-provider.js.map +1 -0
  112. package/dist/lib/ai/cli-provider.test.d.ts +5 -0
  113. package/dist/lib/ai/cli-provider.test.d.ts.map +1 -0
  114. package/dist/lib/ai/cli-provider.test.js +462 -0
  115. package/dist/lib/ai/cli-provider.test.js.map +1 -0
  116. package/dist/lib/ai/fallback-provider.d.ts +20 -0
  117. package/dist/lib/ai/fallback-provider.d.ts.map +1 -0
  118. package/dist/lib/ai/fallback-provider.js +125 -0
  119. package/dist/lib/ai/fallback-provider.js.map +1 -0
  120. package/dist/lib/ai/fallback-provider.test.d.ts +7 -0
  121. package/dist/lib/ai/fallback-provider.test.d.ts.map +1 -0
  122. package/dist/lib/ai/fallback-provider.test.js +165 -0
  123. package/dist/lib/ai/fallback-provider.test.js.map +1 -0
  124. package/dist/lib/ai/generation-service.d.ts +44 -0
  125. package/dist/lib/ai/generation-service.d.ts.map +1 -0
  126. package/dist/lib/ai/generation-service.js +107 -0
  127. package/dist/lib/ai/generation-service.js.map +1 -0
  128. package/dist/lib/ai/generation-service.test.d.ts +7 -0
  129. package/dist/lib/ai/generation-service.test.d.ts.map +1 -0
  130. package/dist/lib/ai/generation-service.test.js +213 -0
  131. package/dist/lib/ai/generation-service.test.js.map +1 -0
  132. package/dist/lib/ai/index.d.ts +19 -0
  133. package/dist/lib/ai/index.d.ts.map +1 -0
  134. package/dist/lib/ai/index.js +22 -0
  135. package/dist/lib/ai/index.js.map +1 -0
  136. package/dist/lib/ai/provider-manager.d.ts +109 -0
  137. package/dist/lib/ai/provider-manager.d.ts.map +1 -0
  138. package/dist/lib/ai/provider-manager.js +270 -0
  139. package/dist/lib/ai/provider-manager.js.map +1 -0
  140. package/dist/lib/ai/provider-manager.test.d.ts +5 -0
  141. package/dist/lib/ai/provider-manager.test.d.ts.map +1 -0
  142. package/dist/lib/ai/provider-manager.test.js +312 -0
  143. package/dist/lib/ai/provider-manager.test.js.map +1 -0
  144. package/dist/lib/ai/types.d.ts +166 -0
  145. package/dist/lib/ai/types.d.ts.map +1 -0
  146. package/dist/lib/ai/types.js +19 -0
  147. package/dist/lib/ai/types.js.map +1 -0
  148. package/dist/lib/cleanpr/args.d.ts.map +1 -1
  149. package/dist/lib/cleanpr/args.js +18 -0
  150. package/dist/lib/cleanpr/args.js.map +1 -1
  151. package/dist/lib/cleanpr/args.test.js +88 -11
  152. package/dist/lib/cleanpr/args.test.js.map +1 -1
  153. package/dist/lib/cleanpr/cleanup.d.ts +2 -0
  154. package/dist/lib/cleanpr/cleanup.d.ts.map +1 -1
  155. package/dist/lib/cleanpr/cleanup.js +30 -2
  156. package/dist/lib/cleanpr/cleanup.js.map +1 -1
  157. package/dist/lib/cleanpr/cleanup.test.js +37 -5
  158. package/dist/lib/cleanpr/cleanup.test.js.map +1 -1
  159. package/dist/lib/cleanpr/types.d.ts +10 -0
  160. package/dist/lib/cleanpr/types.d.ts.map +1 -1
  161. package/dist/lib/cleanpr/worktree-info.test.js +72 -1
  162. package/dist/lib/cleanpr/worktree-info.test.js.map +1 -1
  163. package/dist/lib/config.d.ts +170 -1
  164. package/dist/lib/config.d.ts.map +1 -1
  165. package/dist/lib/config.js +129 -2
  166. package/dist/lib/config.js.map +1 -1
  167. package/dist/lib/config.test.js +406 -2
  168. package/dist/lib/config.test.js.map +1 -1
  169. package/dist/lib/hooks/executor.d.ts +35 -0
  170. package/dist/lib/hooks/executor.d.ts.map +1 -0
  171. package/dist/lib/hooks/executor.js +401 -0
  172. package/dist/lib/hooks/executor.js.map +1 -0
  173. package/dist/lib/hooks/executor.test.d.ts +5 -0
  174. package/dist/lib/hooks/executor.test.d.ts.map +1 -0
  175. package/dist/lib/hooks/executor.test.js +648 -0
  176. package/dist/lib/hooks/executor.test.js.map +1 -0
  177. package/dist/lib/hooks/index.d.ts +25 -0
  178. package/dist/lib/hooks/index.d.ts.map +1 -0
  179. package/dist/lib/hooks/index.js +26 -0
  180. package/dist/lib/hooks/index.js.map +1 -0
  181. package/dist/lib/hooks/templates.d.ts +74 -0
  182. package/dist/lib/hooks/templates.d.ts.map +1 -0
  183. package/dist/lib/hooks/templates.js +270 -0
  184. package/dist/lib/hooks/templates.js.map +1 -0
  185. package/dist/lib/hooks/templates.test.d.ts +5 -0
  186. package/dist/lib/hooks/templates.test.d.ts.map +1 -0
  187. package/dist/lib/hooks/templates.test.js +163 -0
  188. package/dist/lib/hooks/templates.test.js.map +1 -0
  189. package/dist/lib/hooks/types.d.ts +161 -0
  190. package/dist/lib/hooks/types.d.ts.map +1 -0
  191. package/dist/lib/hooks/types.js +73 -0
  192. package/dist/lib/hooks/types.js.map +1 -0
  193. package/dist/lib/hooks/types.test.d.ts +5 -0
  194. package/dist/lib/hooks/types.test.d.ts.map +1 -0
  195. package/dist/lib/hooks/types.test.js +132 -0
  196. package/dist/lib/hooks/types.test.js.map +1 -0
  197. package/dist/lib/json-output.d.ts +172 -0
  198. package/dist/lib/json-output.d.ts.map +1 -0
  199. package/dist/lib/json-output.js +134 -0
  200. package/dist/lib/json-output.js.map +1 -0
  201. package/dist/lib/json-output.test.d.ts +5 -0
  202. package/dist/lib/json-output.test.d.ts.map +1 -0
  203. package/dist/lib/json-output.test.js +259 -0
  204. package/dist/lib/json-output.test.js.map +1 -0
  205. package/dist/lib/lswt/action-executors.test.js +6 -0
  206. package/dist/lib/lswt/action-executors.test.js.map +1 -1
  207. package/dist/lib/newpr/action-deps.d.ts +15 -0
  208. package/dist/lib/newpr/action-deps.d.ts.map +1 -0
  209. package/dist/lib/newpr/action-deps.js +22 -0
  210. package/dist/lib/newpr/action-deps.js.map +1 -0
  211. package/dist/lib/newpr/args.d.ts.map +1 -1
  212. package/dist/lib/newpr/args.js +56 -0
  213. package/dist/lib/newpr/args.js.map +1 -1
  214. package/dist/lib/newpr/hook-runner.d.ts +80 -0
  215. package/dist/lib/newpr/hook-runner.d.ts.map +1 -0
  216. package/dist/lib/newpr/hook-runner.js +182 -0
  217. package/dist/lib/newpr/hook-runner.js.map +1 -0
  218. package/dist/lib/newpr/hook-runner.test.d.ts +7 -0
  219. package/dist/lib/newpr/hook-runner.test.d.ts.map +1 -0
  220. package/dist/lib/newpr/hook-runner.test.js +301 -0
  221. package/dist/lib/newpr/hook-runner.test.js.map +1 -0
  222. package/dist/lib/newpr/index.d.ts +3 -0
  223. package/dist/lib/newpr/index.d.ts.map +1 -1
  224. package/dist/lib/newpr/index.js +3 -0
  225. package/dist/lib/newpr/index.js.map +1 -1
  226. package/dist/lib/newpr/types.d.ts +9 -0
  227. package/dist/lib/newpr/types.d.ts.map +1 -1
  228. package/dist/lib/wtconfig/config-manager.d.ts +72 -0
  229. package/dist/lib/wtconfig/config-manager.d.ts.map +1 -0
  230. package/dist/lib/wtconfig/config-manager.js +408 -0
  231. package/dist/lib/wtconfig/config-manager.js.map +1 -0
  232. package/dist/lib/wtconfig/config-manager.test.d.ts +5 -0
  233. package/dist/lib/wtconfig/config-manager.test.d.ts.map +1 -0
  234. package/dist/lib/wtconfig/config-manager.test.js +501 -0
  235. package/dist/lib/wtconfig/config-manager.test.js.map +1 -0
  236. package/dist/lib/wtconfig/environment.d.ts +23 -0
  237. package/dist/lib/wtconfig/environment.d.ts.map +1 -0
  238. package/dist/lib/wtconfig/environment.js +242 -0
  239. package/dist/lib/wtconfig/environment.js.map +1 -0
  240. package/dist/lib/wtconfig/environment.test.d.ts +5 -0
  241. package/dist/lib/wtconfig/environment.test.d.ts.map +1 -0
  242. package/dist/lib/wtconfig/environment.test.js +246 -0
  243. package/dist/lib/wtconfig/environment.test.js.map +1 -0
  244. package/dist/lib/wtconfig/index.d.ts +7 -0
  245. package/dist/lib/wtconfig/index.d.ts.map +1 -0
  246. package/dist/lib/wtconfig/index.js +8 -0
  247. package/dist/lib/wtconfig/index.js.map +1 -0
  248. package/dist/lib/wtconfig/types.d.ts +97 -0
  249. package/dist/lib/wtconfig/types.d.ts.map +1 -0
  250. package/dist/lib/wtconfig/types.js +5 -0
  251. package/dist/lib/wtconfig/types.js.map +1 -0
  252. package/dist/lib/wtstate/analyze.d.ts +13 -0
  253. package/dist/lib/wtstate/analyze.d.ts.map +1 -0
  254. package/dist/lib/wtstate/analyze.js +165 -0
  255. package/dist/lib/wtstate/analyze.js.map +1 -0
  256. package/dist/lib/wtstate/analyze.test.d.ts +5 -0
  257. package/dist/lib/wtstate/analyze.test.d.ts.map +1 -0
  258. package/dist/lib/wtstate/analyze.test.js +282 -0
  259. package/dist/lib/wtstate/analyze.test.js.map +1 -0
  260. package/dist/lib/wtstate/args.d.ts +17 -0
  261. package/dist/lib/wtstate/args.d.ts.map +1 -0
  262. package/dist/lib/wtstate/args.js +91 -0
  263. package/dist/lib/wtstate/args.js.map +1 -0
  264. package/dist/lib/wtstate/args.test.d.ts +5 -0
  265. package/dist/lib/wtstate/args.test.d.ts.map +1 -0
  266. package/dist/lib/wtstate/args.test.js +120 -0
  267. package/dist/lib/wtstate/args.test.js.map +1 -0
  268. package/dist/lib/wtstate/index.d.ts +7 -0
  269. package/dist/lib/wtstate/index.d.ts.map +1 -0
  270. package/dist/lib/wtstate/index.js +8 -0
  271. package/dist/lib/wtstate/index.js.map +1 -0
  272. package/dist/lib/wtstate/types.d.ts +64 -0
  273. package/dist/lib/wtstate/types.d.ts.map +1 -0
  274. package/dist/lib/wtstate/types.js +5 -0
  275. package/dist/lib/wtstate/types.js.map +1 -0
  276. package/dist/mcp/server.d.ts +14 -0
  277. package/dist/mcp/server.d.ts.map +1 -0
  278. package/dist/mcp/server.js +339 -0
  279. package/dist/mcp/server.js.map +1 -0
  280. package/dist/mcp/server.test.d.ts +9 -0
  281. package/dist/mcp/server.test.d.ts.map +1 -0
  282. package/dist/mcp/server.test.js +390 -0
  283. package/dist/mcp/server.test.js.map +1 -0
  284. package/package.json +8 -2
@@ -0,0 +1,360 @@
1
+ import { execSync } from 'child_process';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import os from 'os';
5
+ const DEFAULT_OPTIONS = {
6
+ baseBranch: 'main',
7
+ userEmail: 'test@test.com',
8
+ userName: 'Test User',
9
+ };
10
+ /**
11
+ * Execute a git command in a directory
12
+ */
13
+ function git(args, cwd, options = {}) {
14
+ try {
15
+ return execSync(`git ${args}`, {
16
+ cwd,
17
+ encoding: 'utf8',
18
+ stdio: options.stdio || 'pipe',
19
+ }).trim();
20
+ }
21
+ catch (error) {
22
+ if (options.stdio === 'ignore') {
23
+ return '';
24
+ }
25
+ throw error;
26
+ }
27
+ }
28
+ /**
29
+ * Create base repository structure with origin
30
+ */
31
+ function createBaseRepo(tempDir, options) {
32
+ const originPath = path.join(tempDir, 'origin.git');
33
+ const repoPath = path.join(tempDir, 'main-repo');
34
+ // Create bare origin
35
+ fs.mkdirSync(originPath);
36
+ git('init --bare', originPath);
37
+ // Create working repo
38
+ fs.mkdirSync(repoPath);
39
+ git('init', repoPath);
40
+ git(`config user.email "${options.userEmail}"`, repoPath);
41
+ git(`config user.name "${options.userName}"`, repoPath);
42
+ // Create initial commit
43
+ fs.writeFileSync(path.join(repoPath, 'README.md'), '# Test Repository\n');
44
+ git('add .', repoPath);
45
+ git('commit -m "Initial commit"', repoPath);
46
+ // Rename to main branch
47
+ git(`branch -M ${options.baseBranch}`, repoPath, { stdio: 'ignore' });
48
+ // Add origin and push
49
+ git(`remote add origin "${originPath}"`, repoPath);
50
+ git(`push -u origin ${options.baseBranch}`, repoPath, { stdio: 'ignore' });
51
+ return { repoPath, originPath };
52
+ }
53
+ /**
54
+ * Create Scenario 1: main_clean_same
55
+ * On main, same as origin/main, clean working tree
56
+ */
57
+ function createMainCleanSame(tempDir, options) {
58
+ const { repoPath, originPath } = createBaseRepo(tempDir, options);
59
+ return {
60
+ scenario: 'main_clean_same',
61
+ repoPath,
62
+ originPath,
63
+ tempDir,
64
+ cleanup: () => fs.rmSync(tempDir, { recursive: true, force: true }),
65
+ };
66
+ }
67
+ /**
68
+ * Create Scenario 2a: main_staged_same
69
+ * On main, same as origin/main, has staged changes
70
+ */
71
+ function createMainStagedSame(tempDir, options) {
72
+ const { repoPath, originPath } = createBaseRepo(tempDir, options);
73
+ // Create and stage a new file
74
+ fs.writeFileSync(path.join(repoPath, 'staged-file.ts'), 'export const x = 1;\n');
75
+ git('add staged-file.ts', repoPath);
76
+ return {
77
+ scenario: 'main_staged_same',
78
+ repoPath,
79
+ originPath,
80
+ tempDir,
81
+ cleanup: () => fs.rmSync(tempDir, { recursive: true, force: true }),
82
+ };
83
+ }
84
+ /**
85
+ * Create Scenario 2b: main_unstaged_same
86
+ * On main, same as origin/main, has unstaged changes
87
+ */
88
+ function createMainUnstagedSame(tempDir, options) {
89
+ const { repoPath, originPath } = createBaseRepo(tempDir, options);
90
+ // Create an untracked file
91
+ fs.mkdirSync(path.join(repoPath, 'docs'), { recursive: true });
92
+ fs.writeFileSync(path.join(repoPath, 'docs', 'new-file.md'), '# New documentation\n');
93
+ return {
94
+ scenario: 'main_unstaged_same',
95
+ repoPath,
96
+ originPath,
97
+ tempDir,
98
+ cleanup: () => fs.rmSync(tempDir, { recursive: true, force: true }),
99
+ };
100
+ }
101
+ /**
102
+ * Create Scenario 2c: main_both_same
103
+ * On main, same as origin/main, has both staged and unstaged changes
104
+ */
105
+ function createMainBothSame(tempDir, options) {
106
+ const { repoPath, originPath } = createBaseRepo(tempDir, options);
107
+ // Create and stage one file
108
+ fs.writeFileSync(path.join(repoPath, 'staged-file.ts'), 'export const staged = true;\n');
109
+ git('add staged-file.ts', repoPath);
110
+ // Create an untracked file
111
+ fs.writeFileSync(path.join(repoPath, 'unstaged-file.ts'), 'export const unstaged = true;\n');
112
+ return {
113
+ scenario: 'main_both_same',
114
+ repoPath,
115
+ originPath,
116
+ tempDir,
117
+ cleanup: () => fs.rmSync(tempDir, { recursive: true, force: true }),
118
+ };
119
+ }
120
+ /**
121
+ * Create Scenario 3: main_clean_ahead
122
+ * On main, ahead of origin/main, clean working tree
123
+ */
124
+ function createMainCleanAhead(tempDir, options) {
125
+ const { repoPath, originPath } = createBaseRepo(tempDir, options);
126
+ // Create a local commit (not pushed)
127
+ fs.writeFileSync(path.join(repoPath, 'local-feature.ts'), 'export const feature = 1;\n');
128
+ git('add .', repoPath);
129
+ git('commit -m "Add local feature"', repoPath);
130
+ return {
131
+ scenario: 'main_clean_ahead',
132
+ repoPath,
133
+ originPath,
134
+ tempDir,
135
+ cleanup: () => fs.rmSync(tempDir, { recursive: true, force: true }),
136
+ };
137
+ }
138
+ /**
139
+ * Create Scenario 4: main_changes_ahead
140
+ * On main, ahead of origin/main, has uncommitted changes
141
+ */
142
+ function createMainChangesAhead(tempDir, options) {
143
+ const { repoPath, originPath } = createBaseRepo(tempDir, options);
144
+ // Create a local commit (not pushed)
145
+ fs.writeFileSync(path.join(repoPath, 'local-feature.ts'), 'export const feature = 1;\n');
146
+ git('add .', repoPath);
147
+ git('commit -m "Add local feature"', repoPath);
148
+ // Create uncommitted changes
149
+ fs.writeFileSync(path.join(repoPath, 'work-in-progress.ts'), 'export const wip = true;\n');
150
+ return {
151
+ scenario: 'main_changes_ahead',
152
+ repoPath,
153
+ originPath,
154
+ tempDir,
155
+ cleanup: () => fs.rmSync(tempDir, { recursive: true, force: true }),
156
+ };
157
+ }
158
+ /**
159
+ * Create Scenario 5: branch_same_as_main
160
+ * On feature branch at same commit as main, clean
161
+ */
162
+ function createBranchSameAsMain(tempDir, options) {
163
+ const { repoPath, originPath } = createBaseRepo(tempDir, options);
164
+ // Create a branch at the same commit as main
165
+ git('checkout -b feature-branch', repoPath);
166
+ return {
167
+ scenario: 'branch_same_as_main',
168
+ repoPath,
169
+ originPath,
170
+ tempDir,
171
+ cleanup: () => fs.rmSync(tempDir, { recursive: true, force: true }),
172
+ };
173
+ }
174
+ /**
175
+ * Create Scenario 6: branch_ancestor
176
+ * On feature branch that is already merged into main (ancestor)
177
+ */
178
+ function createBranchAncestor(tempDir, options) {
179
+ const { repoPath, originPath } = createBaseRepo(tempDir, options);
180
+ // Create a feature branch
181
+ git('checkout -b old-feature', repoPath);
182
+ // Go back to main and add commits that include this branch's point
183
+ git(`checkout ${options.baseBranch}`, repoPath);
184
+ fs.writeFileSync(path.join(repoPath, 'new-main-feature.ts'), 'export const newer = 1;\n');
185
+ git('add .', repoPath);
186
+ git('commit -m "Add newer feature on main"', repoPath);
187
+ // Go back to the old feature branch (which is now an ancestor of main)
188
+ git('checkout old-feature', repoPath);
189
+ return {
190
+ scenario: 'branch_ancestor',
191
+ repoPath,
192
+ originPath,
193
+ tempDir,
194
+ cleanup: () => fs.rmSync(tempDir, { recursive: true, force: true }),
195
+ };
196
+ }
197
+ /**
198
+ * Create Scenario 7: branch_divergent
199
+ * On feature branch with commits not in main
200
+ */
201
+ function createBranchDivergent(tempDir, options) {
202
+ const { repoPath, originPath } = createBaseRepo(tempDir, options);
203
+ // Create a feature branch with unique commits
204
+ git('checkout -b divergent-feature', repoPath);
205
+ fs.writeFileSync(path.join(repoPath, 'feature.ts'), 'export const feature = 1;\n');
206
+ git('add .', repoPath);
207
+ git('commit -m "Add feature"', repoPath);
208
+ return {
209
+ scenario: 'branch_divergent',
210
+ repoPath,
211
+ originPath,
212
+ tempDir,
213
+ cleanup: () => fs.rmSync(tempDir, { recursive: true, force: true }),
214
+ };
215
+ }
216
+ /**
217
+ * Create Scenario 8: branch_with_changes
218
+ * On feature branch with uncommitted changes
219
+ */
220
+ function createBranchWithChanges(tempDir, options) {
221
+ const { repoPath, originPath } = createBaseRepo(tempDir, options);
222
+ // Create a feature branch with a commit
223
+ git('checkout -b feature-with-changes', repoPath);
224
+ fs.writeFileSync(path.join(repoPath, 'feature.ts'), 'export const feature = 1;\n');
225
+ git('add .', repoPath);
226
+ git('commit -m "Add feature"', repoPath);
227
+ // Add uncommitted changes
228
+ fs.writeFileSync(path.join(repoPath, 'wip.ts'), 'export const wip = true;\n');
229
+ return {
230
+ scenario: 'branch_with_changes',
231
+ repoPath,
232
+ originPath,
233
+ tempDir,
234
+ cleanup: () => fs.rmSync(tempDir, { recursive: true, force: true }),
235
+ };
236
+ }
237
+ /**
238
+ * Create Scenario 9: detached_head
239
+ * In detached HEAD state
240
+ */
241
+ function createDetachedHead(tempDir, options) {
242
+ const { repoPath, originPath } = createBaseRepo(tempDir, options);
243
+ // Get current commit SHA
244
+ const sha = git('rev-parse HEAD', repoPath);
245
+ // Checkout the SHA directly (detached HEAD)
246
+ git(`checkout ${sha}`, repoPath, { stdio: 'ignore' });
247
+ return {
248
+ scenario: 'detached_head',
249
+ repoPath,
250
+ originPath,
251
+ tempDir,
252
+ cleanup: () => fs.rmSync(tempDir, { recursive: true, force: true }),
253
+ };
254
+ }
255
+ /**
256
+ * Create Scenario 10: pr_worktree
257
+ * Running from a PR worktree
258
+ */
259
+ function createPrWorktree(tempDir, options) {
260
+ const { repoPath, originPath } = createBaseRepo(tempDir, options);
261
+ // Create a feature branch
262
+ git('checkout -b pr-feature', repoPath);
263
+ fs.writeFileSync(path.join(repoPath, 'feature.ts'), 'export const feature = 1;\n');
264
+ git('add .', repoPath);
265
+ git('commit -m "Add feature"', repoPath);
266
+ // Go back to main
267
+ git(`checkout ${options.baseBranch}`, repoPath);
268
+ // Create a worktree with PR naming pattern
269
+ const worktreePath = path.join(tempDir, 'main-repo.pr42');
270
+ git(`worktree add "${worktreePath}" pr-feature`, repoPath);
271
+ return {
272
+ scenario: 'pr_worktree',
273
+ repoPath,
274
+ originPath,
275
+ tempDir,
276
+ worktreePath,
277
+ cleanup: () => {
278
+ // Remove worktree first
279
+ try {
280
+ git('worktree prune', repoPath, { stdio: 'ignore' });
281
+ }
282
+ catch {
283
+ // Ignore
284
+ }
285
+ fs.rmSync(tempDir, { recursive: true, force: true });
286
+ },
287
+ };
288
+ }
289
+ /**
290
+ * Create a git repository in a specific scenario state
291
+ *
292
+ * @param scenario - The scenario to create
293
+ * @param options - Configuration options
294
+ * @returns Setup information with cleanup function
295
+ */
296
+ export function createScenario(scenario, options = {}) {
297
+ const opts = { ...DEFAULT_OPTIONS, ...options };
298
+ // Create temp directory with proper path resolution for cross-platform
299
+ const tempDir = fs.realpathSync.native(fs.mkdtempSync(path.join(os.tmpdir(), `e2e-scenario-${scenario}-`)));
300
+ const creators = {
301
+ main_clean_same: createMainCleanSame,
302
+ main_staged_same: createMainStagedSame,
303
+ main_unstaged_same: createMainUnstagedSame,
304
+ main_both_same: createMainBothSame,
305
+ main_clean_ahead: createMainCleanAhead,
306
+ main_changes_ahead: createMainChangesAhead,
307
+ branch_same_as_main: createBranchSameAsMain,
308
+ branch_ancestor: createBranchAncestor,
309
+ branch_divergent: createBranchDivergent,
310
+ branch_with_changes: createBranchWithChanges,
311
+ detached_head: createDetachedHead,
312
+ pr_worktree: createPrWorktree,
313
+ };
314
+ const creator = creators[scenario];
315
+ if (!creator) {
316
+ throw new Error(`Unknown scenario: ${scenario}`);
317
+ }
318
+ return creator(tempDir, opts);
319
+ }
320
+ /**
321
+ * All available scenarios
322
+ */
323
+ export const ALL_SCENARIOS = [
324
+ 'main_clean_same',
325
+ 'main_staged_same',
326
+ 'main_unstaged_same',
327
+ 'main_both_same',
328
+ 'main_clean_ahead',
329
+ 'main_changes_ahead',
330
+ 'branch_same_as_main',
331
+ 'branch_ancestor',
332
+ 'branch_divergent',
333
+ 'branch_with_changes',
334
+ 'detached_head',
335
+ 'pr_worktree',
336
+ ];
337
+ /**
338
+ * Create all scenarios at once (useful for parallel testing)
339
+ *
340
+ * @param options - Configuration options
341
+ * @returns Map of scenario to setup
342
+ */
343
+ export function createAllScenarios(options = {}) {
344
+ const setups = new Map();
345
+ for (const scenario of ALL_SCENARIOS) {
346
+ setups.set(scenario, createScenario(scenario, options));
347
+ }
348
+ return setups;
349
+ }
350
+ /**
351
+ * Clean up all scenarios from a map
352
+ *
353
+ * @param setups - Map of scenario setups to clean
354
+ */
355
+ export function cleanupAllScenarios(setups) {
356
+ for (const setup of setups.values()) {
357
+ setup.cleanup();
358
+ }
359
+ }
360
+ //# sourceMappingURL=scenario-harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenario-harness.js","sourceRoot":"","sources":["../../../src/e2e/helpers/scenario-harness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ import type { Scenario } from '../../lib/state-detection.js';
2
+ import { type GhMockSetup, type GhMockOptions } from './gh-mock.js';
3
+ import { type ScenarioOptions } from './scenario-harness.js';
4
+ /**
5
+ * Options for creating a test context
6
+ */
7
+ export interface TestContextOptions {
8
+ /** Scenario to create (if provided, creates a scenario-specific repo) */
9
+ scenario?: Scenario;
10
+ /** Options for the scenario */
11
+ scenarioOptions?: ScenarioOptions;
12
+ /** Options for the gh mock */
13
+ ghMockOptions?: GhMockOptions;
14
+ /** Skip the gh mock (for tests that don't need it) */
15
+ skipGhMock?: boolean;
16
+ /** Create a bare minimum repo instead of a full scenario */
17
+ minimalRepo?: boolean;
18
+ }
19
+ /**
20
+ * Test context containing all test resources
21
+ */
22
+ export interface TestContext {
23
+ /** Temp directory containing all test resources */
24
+ tempDir: string;
25
+ /** Path to the test repository */
26
+ repoDir: string;
27
+ /** Path to the origin (bare) repository */
28
+ originDir?: string;
29
+ /** Path to worktree (if created) */
30
+ worktreeDir?: string;
31
+ /** The scenario that was created (if any) */
32
+ scenario?: Scenario;
33
+ /** The gh mock setup */
34
+ ghMock?: GhMockSetup;
35
+ /** Environment variables to use when running CLI commands */
36
+ env: NodeJS.ProcessEnv;
37
+ /** Clean up all resources */
38
+ cleanup: () => void;
39
+ /** Reset the repo to a clean state */
40
+ reset: () => void;
41
+ }
42
+ /**
43
+ * Create a test context with isolated resources
44
+ *
45
+ * @param options - Context options
46
+ * @returns Test context with cleanup
47
+ */
48
+ export declare function createTestContext(options?: TestContextOptions): TestContext;
49
+ /**
50
+ * Vitest fixture factory for test contexts
51
+ *
52
+ * Usage:
53
+ * ```typescript
54
+ * describe('my tests', () => {
55
+ * let ctx: TestContext;
56
+ *
57
+ * beforeAll(() => {
58
+ * ctx = createTestContext({ scenario: 'main_clean_same' });
59
+ * });
60
+ *
61
+ * afterAll(() => {
62
+ * ctx.cleanup();
63
+ * });
64
+ *
65
+ * beforeEach(() => {
66
+ * ctx.reset();
67
+ * });
68
+ * });
69
+ * ```
70
+ */
71
+ export declare function useTestContext(options?: TestContextOptions): {
72
+ create: () => TestContext;
73
+ cleanup: (ctx: TestContext) => void;
74
+ reset: (ctx: TestContext) => void;
75
+ };
76
+ /**
77
+ * Create multiple test contexts for different scenarios
78
+ *
79
+ * @param scenarios - List of scenarios to create
80
+ * @param options - Common options for all contexts
81
+ * @returns Map of scenario to context
82
+ */
83
+ export declare function createMultiScenarioContexts(scenarios: Scenario[], options?: Omit<TestContextOptions, 'scenario'>): Map<Scenario, TestContext>;
84
+ /**
85
+ * Clean up all contexts from a map
86
+ *
87
+ * @param contexts - Map of contexts to clean up
88
+ */
89
+ export declare function cleanupAllContexts(contexts: Map<Scenario, TestContext>): void;
90
+ /**
91
+ * Helper to add a file to the test repo
92
+ */
93
+ export declare function addFile(ctx: TestContext, relativePath: string, content: string, options?: {
94
+ stage?: boolean;
95
+ commit?: boolean;
96
+ message?: string;
97
+ }): void;
98
+ /**
99
+ * Helper to create a branch in the test repo
100
+ */
101
+ export declare function createBranch(ctx: TestContext, branchName: string, options?: {
102
+ checkout?: boolean;
103
+ from?: string;
104
+ }): void;
105
+ /**
106
+ * Helper to create a worktree in the test repo
107
+ */
108
+ export declare function createWorktree(ctx: TestContext, worktreePath: string, branchName: string, options?: {
109
+ create?: boolean;
110
+ }): string;
111
+ /**
112
+ * Helper to get git status info
113
+ */
114
+ export declare function getGitStatus(ctx: TestContext): {
115
+ branch: string;
116
+ staged: string[];
117
+ unstaged: string[];
118
+ untracked: string[];
119
+ };
120
+ //# sourceMappingURL=test-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-context.d.ts","sourceRoot":"","sources":["../../../src/e2e/helpers/test-context.ts"],"names":[],"mappings":"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"}