@camaradesuk/git-worktree-tools 1.3.0 → 1.4.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 (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 +370 -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 +238 -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,13 @@
1
+ /**
2
+ * wtstate analyze - core analysis logic
3
+ */
4
+ import type { WtstateResult, WtstateOptions } from './types.js';
5
+ /**
6
+ * Analyze current git state and return structured result
7
+ */
8
+ export declare function analyzeState(options: WtstateOptions): WtstateResult;
9
+ /**
10
+ * Format result as human-readable text
11
+ */
12
+ export declare function formatText(result: WtstateResult, verbose: boolean): string;
13
+ //# sourceMappingURL=analyze.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../src/lib/wtstate/analyze.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAgB,cAAc,EAAE,MAAM,YAAY,CAAC;AA2F9E;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,CA2BnE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAyD1E"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * wtstate analyze - core analysis logic
3
+ */
4
+ import { analyzeGitState, detectScenario } from '../state-detection.js';
5
+ import { getScenarioContext } from '../newpr/scenario-handler.js';
6
+ /**
7
+ * Scenario descriptions for human-readable output
8
+ */
9
+ const SCENARIO_DESCRIPTIONS = {
10
+ main_clean_same: 'On main branch, same as origin/main, no changes',
11
+ main_staged_same: 'On main branch, same as origin/main, staged changes only',
12
+ main_unstaged_same: 'On main branch, same as origin/main, unstaged changes only',
13
+ main_both_same: 'On main branch, same as origin/main, both staged and unstaged changes',
14
+ main_clean_ahead: 'On main branch, ahead of origin/main, no uncommitted changes',
15
+ main_changes_ahead: 'On main branch, ahead of origin/main, with uncommitted changes',
16
+ branch_same_as_main: 'On feature branch at same commit as main (no divergent commits)',
17
+ branch_ancestor: 'On feature branch that is an ancestor of main (already merged)',
18
+ branch_divergent: 'On feature branch with commits not in main',
19
+ branch_with_changes: 'On feature branch with uncommitted changes',
20
+ detached_head: 'In detached HEAD state',
21
+ pr_worktree: 'In a PR worktree (not the main worktree)',
22
+ };
23
+ /**
24
+ * Get the recommended action for a scenario
25
+ */
26
+ function getRecommendedAction(scenario) {
27
+ switch (scenario) {
28
+ case 'main_clean_same':
29
+ return 'empty_commit';
30
+ case 'main_staged_same':
31
+ return 'commit_staged';
32
+ case 'main_unstaged_same':
33
+ return 'commit_all';
34
+ case 'main_both_same':
35
+ return 'commit_staged'; // Commit staged, unstaged go to worktree
36
+ case 'main_clean_ahead':
37
+ return 'use_commits';
38
+ case 'main_changes_ahead':
39
+ return 'use_commits_and_commit_all';
40
+ case 'branch_divergent':
41
+ return 'create_pr_for_branch';
42
+ case 'branch_with_changes':
43
+ return 'pr_for_branch_commit_all';
44
+ case 'detached_head':
45
+ return 'branch_from_detached';
46
+ case 'branch_same_as_main':
47
+ case 'branch_ancestor':
48
+ return 'empty_commit';
49
+ case 'pr_worktree':
50
+ return null; // Special case - needs re-analysis
51
+ default:
52
+ return null;
53
+ }
54
+ }
55
+ /**
56
+ * Convert scenario choices to available actions
57
+ */
58
+ function getAvailableActions(scenario, state, baseBranch) {
59
+ const context = getScenarioContext(scenario, state, baseBranch);
60
+ if (!context) {
61
+ return [];
62
+ }
63
+ return context.choices
64
+ .filter((choice) => choice.action !== null)
65
+ .map((choice) => ({
66
+ key: choice.action.action,
67
+ label: choice.label,
68
+ description: undefined,
69
+ }));
70
+ }
71
+ /**
72
+ * Detect worktree type
73
+ */
74
+ function detectWorktreeType(state) {
75
+ if (state.worktreeType === 'main_worktree') {
76
+ return 'main_worktree';
77
+ }
78
+ else if (state.worktreeType === 'pr_worktree') {
79
+ return 'pr_worktree';
80
+ }
81
+ return 'other';
82
+ }
83
+ /**
84
+ * Analyze current git state and return structured result
85
+ */
86
+ export function analyzeState(options) {
87
+ const state = analyzeGitState(options.baseBranch);
88
+ const scenario = detectScenario(state);
89
+ const worktreeType = detectWorktreeType(state);
90
+ const hasChanges = state.stagedFiles.length > 0 || state.unstagedFiles.length > 0;
91
+ const hasStagedChanges = state.stagedFiles.length > 0;
92
+ const hasUnstagedChanges = state.unstagedFiles.length > 0;
93
+ const availableActions = getAvailableActions(scenario, state, options.baseBranch);
94
+ const recommendedAction = getRecommendedAction(scenario);
95
+ return {
96
+ scenario,
97
+ scenarioDescription: SCENARIO_DESCRIPTIONS[scenario] || 'Unknown scenario',
98
+ currentBranch: state.currentBranch,
99
+ baseBranch: options.baseBranch,
100
+ worktreeType,
101
+ hasChanges,
102
+ hasStagedChanges,
103
+ hasUnstagedChanges,
104
+ localCommits: state.localCommits,
105
+ stagedFiles: options.verbose ? state.stagedFiles : [],
106
+ unstagedFiles: options.verbose ? state.unstagedFiles : [],
107
+ availableActions,
108
+ recommendedAction,
109
+ };
110
+ }
111
+ /**
112
+ * Format result as human-readable text
113
+ */
114
+ export function formatText(result, verbose) {
115
+ const lines = [];
116
+ lines.push(`Scenario: ${result.scenario}`);
117
+ lines.push(` ${result.scenarioDescription}`);
118
+ lines.push('');
119
+ lines.push(`Branch: ${result.currentBranch || '(detached HEAD)'}`);
120
+ lines.push(`Base: ${result.baseBranch}`);
121
+ lines.push(`Worktree type: ${result.worktreeType}`);
122
+ lines.push('');
123
+ lines.push(`Changes:`);
124
+ lines.push(` Staged: ${result.hasStagedChanges ? 'yes' : 'no'}`);
125
+ lines.push(` Unstaged: ${result.hasUnstagedChanges ? 'yes' : 'no'}`);
126
+ lines.push(` Local commits: ${result.localCommits.length}`);
127
+ if (verbose && result.stagedFiles.length > 0) {
128
+ lines.push('');
129
+ lines.push('Staged files:');
130
+ for (const file of result.stagedFiles) {
131
+ lines.push(` ${file}`);
132
+ }
133
+ }
134
+ if (verbose && result.unstagedFiles.length > 0) {
135
+ lines.push('');
136
+ lines.push('Unstaged files:');
137
+ for (const file of result.unstagedFiles) {
138
+ lines.push(` ${file}`);
139
+ }
140
+ }
141
+ if (verbose && result.localCommits.length > 0) {
142
+ lines.push('');
143
+ lines.push('Local commits:');
144
+ for (const commit of result.localCommits.slice(0, 10)) {
145
+ lines.push(` ${commit}`);
146
+ }
147
+ if (result.localCommits.length > 10) {
148
+ lines.push(` ... and ${result.localCommits.length - 10} more`);
149
+ }
150
+ }
151
+ if (result.availableActions.length > 0) {
152
+ lines.push('');
153
+ lines.push('Available actions:');
154
+ for (const action of result.availableActions) {
155
+ const recommended = action.key === result.recommendedAction ? ' (recommended)' : '';
156
+ lines.push(` ${action.key}: ${action.label}${recommended}`);
157
+ }
158
+ }
159
+ if (result.recommendedAction) {
160
+ lines.push('');
161
+ lines.push(`Recommended: ${result.recommendedAction}`);
162
+ }
163
+ return lines.join('\n');
164
+ }
165
+ //# sourceMappingURL=analyze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../src/lib/wtstate/analyze.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * wtstate analyze tests
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=analyze.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.test.d.ts","sourceRoot":"","sources":["../../../src/lib/wtstate/analyze.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,282 @@
1
+ /**
2
+ * wtstate analyze tests
3
+ */
4
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
5
+ import { analyzeState, formatText } from './analyze.js';
6
+ // Mock the dependencies
7
+ vi.mock('../state-detection.js', () => ({
8
+ analyzeGitState: vi.fn(),
9
+ detectScenario: vi.fn(),
10
+ }));
11
+ vi.mock('../newpr/scenario-handler.js', () => ({
12
+ getScenarioContext: vi.fn(),
13
+ }));
14
+ // Import after mocking
15
+ import { analyzeGitState, detectScenario } from '../state-detection.js';
16
+ import { getScenarioContext } from '../newpr/scenario-handler.js';
17
+ describe('wtstate/analyze', () => {
18
+ const defaultOptions = {
19
+ json: false,
20
+ verbose: false,
21
+ baseBranch: 'main',
22
+ };
23
+ beforeEach(() => {
24
+ vi.resetAllMocks();
25
+ });
26
+ describe('analyzeState', () => {
27
+ it('returns analysis for clean main branch', () => {
28
+ vi.mocked(analyzeGitState).mockReturnValue({
29
+ currentBranch: 'main',
30
+ branchType: 'main',
31
+ commitRelationship: 'same',
32
+ workingTreeStatus: 'clean',
33
+ stagedFiles: [],
34
+ unstagedFiles: [],
35
+ localCommits: [],
36
+ worktreeType: 'main_worktree',
37
+ repoRoot: '/test/repo',
38
+ repoName: 'repo',
39
+ });
40
+ vi.mocked(detectScenario).mockReturnValue('main_clean_same');
41
+ vi.mocked(getScenarioContext).mockReturnValue({
42
+ message: 'What would you like to do?',
43
+ choices: [
44
+ {
45
+ label: 'Create empty commit',
46
+ action: { action: 'empty_commit', branchFrom: 'origin_main', stashUnstaged: false },
47
+ },
48
+ ],
49
+ });
50
+ const result = analyzeState(defaultOptions);
51
+ expect(result.scenario).toBe('main_clean_same');
52
+ expect(result.currentBranch).toBe('main');
53
+ expect(result.hasChanges).toBe(false);
54
+ expect(result.worktreeType).toBe('main_worktree');
55
+ });
56
+ it('returns analysis for branch with staged changes', () => {
57
+ vi.mocked(analyzeGitState).mockReturnValue({
58
+ currentBranch: 'feature-1',
59
+ branchType: 'other',
60
+ commitRelationship: 'divergent',
61
+ workingTreeStatus: 'staged_only',
62
+ stagedFiles: ['file1.ts', 'file2.ts'],
63
+ unstagedFiles: [],
64
+ localCommits: ['Add feature'],
65
+ worktreeType: 'pr_worktree',
66
+ repoRoot: '/test/repo',
67
+ repoName: 'repo',
68
+ });
69
+ vi.mocked(detectScenario).mockReturnValue('branch_with_changes');
70
+ vi.mocked(getScenarioContext).mockReturnValue({
71
+ message: 'Feature branch has uncommitted changes',
72
+ choices: [
73
+ {
74
+ label: 'Commit all and create PR',
75
+ action: {
76
+ action: 'pr_for_branch_commit_all',
77
+ branchFrom: 'head',
78
+ stashUnstaged: false,
79
+ },
80
+ },
81
+ ],
82
+ });
83
+ const result = analyzeState({ ...defaultOptions, verbose: true });
84
+ expect(result.scenario).toBe('branch_with_changes');
85
+ expect(result.currentBranch).toBe('feature-1');
86
+ expect(result.hasStagedChanges).toBe(true);
87
+ expect(result.hasUnstagedChanges).toBe(false);
88
+ expect(result.hasChanges).toBe(true);
89
+ expect(result.stagedFiles).toEqual(['file1.ts', 'file2.ts']);
90
+ expect(result.worktreeType).toBe('pr_worktree');
91
+ });
92
+ it('detects main worktree type for main branch', () => {
93
+ vi.mocked(analyzeGitState).mockReturnValue({
94
+ currentBranch: 'main',
95
+ branchType: 'main',
96
+ commitRelationship: 'same',
97
+ workingTreeStatus: 'clean',
98
+ stagedFiles: [],
99
+ unstagedFiles: [],
100
+ localCommits: [],
101
+ worktreeType: 'main_worktree',
102
+ repoRoot: '/test/repo',
103
+ repoName: 'repo',
104
+ });
105
+ vi.mocked(detectScenario).mockReturnValue('main_clean_same');
106
+ vi.mocked(getScenarioContext).mockReturnValue({
107
+ message: 'Ready to create a new branch',
108
+ choices: [],
109
+ });
110
+ const result = analyzeState(defaultOptions);
111
+ expect(result.worktreeType).toBe('main_worktree');
112
+ });
113
+ it('provides available actions for scenarios', () => {
114
+ vi.mocked(analyzeGitState).mockReturnValue({
115
+ currentBranch: 'main',
116
+ branchType: 'main',
117
+ commitRelationship: 'same',
118
+ workingTreeStatus: 'staged_only',
119
+ stagedFiles: ['file.ts'],
120
+ unstagedFiles: [],
121
+ localCommits: [],
122
+ worktreeType: 'main_worktree',
123
+ repoRoot: '/test/repo',
124
+ repoName: 'repo',
125
+ });
126
+ vi.mocked(detectScenario).mockReturnValue('main_staged_same');
127
+ vi.mocked(getScenarioContext).mockReturnValue({
128
+ message: 'You have staged changes',
129
+ choices: [
130
+ {
131
+ label: 'Commit staged changes',
132
+ action: { action: 'commit_staged', branchFrom: 'origin_main', stashUnstaged: false },
133
+ },
134
+ {
135
+ label: 'Stash and empty',
136
+ action: { action: 'stash_and_empty', branchFrom: 'origin_main', stashUnstaged: true },
137
+ },
138
+ ],
139
+ });
140
+ const result = analyzeState(defaultOptions);
141
+ expect(result.availableActions.length).toBe(2);
142
+ expect(result.availableActions[0]).toHaveProperty('key');
143
+ expect(result.availableActions[0]).toHaveProperty('label');
144
+ expect(result.availableActions[0].key).toBe('commit_staged');
145
+ });
146
+ it('recommends an action when available', () => {
147
+ vi.mocked(analyzeGitState).mockReturnValue({
148
+ currentBranch: 'main',
149
+ branchType: 'main',
150
+ commitRelationship: 'same',
151
+ workingTreeStatus: 'staged_only',
152
+ stagedFiles: ['file.ts'],
153
+ unstagedFiles: [],
154
+ localCommits: [],
155
+ worktreeType: 'main_worktree',
156
+ repoRoot: '/test/repo',
157
+ repoName: 'repo',
158
+ });
159
+ vi.mocked(detectScenario).mockReturnValue('main_staged_same');
160
+ vi.mocked(getScenarioContext).mockReturnValue({
161
+ message: 'You have staged changes',
162
+ choices: [
163
+ {
164
+ label: 'Commit staged',
165
+ action: { action: 'commit_staged', branchFrom: 'origin_main', stashUnstaged: false },
166
+ },
167
+ ],
168
+ });
169
+ const result = analyzeState(defaultOptions);
170
+ expect(result.recommendedAction).toBe('commit_staged');
171
+ });
172
+ it('handles pr_worktree scenario with null recommended action', () => {
173
+ vi.mocked(analyzeGitState).mockReturnValue({
174
+ currentBranch: 'feature-x',
175
+ branchType: 'other',
176
+ commitRelationship: 'divergent',
177
+ workingTreeStatus: 'clean',
178
+ stagedFiles: [],
179
+ unstagedFiles: [],
180
+ localCommits: [],
181
+ worktreeType: 'pr_worktree',
182
+ repoRoot: '/test/repo',
183
+ repoName: 'repo',
184
+ });
185
+ vi.mocked(detectScenario).mockReturnValue('pr_worktree');
186
+ vi.mocked(getScenarioContext).mockReturnValue(null);
187
+ const result = analyzeState(defaultOptions);
188
+ expect(result.scenario).toBe('pr_worktree');
189
+ expect(result.recommendedAction).toBeNull();
190
+ expect(result.availableActions).toEqual([]);
191
+ });
192
+ });
193
+ describe('formatText', () => {
194
+ const makeResult = (overrides = {}) => ({
195
+ scenario: 'main_clean_same',
196
+ scenarioDescription: 'On main, clean, synced with origin',
197
+ currentBranch: 'main',
198
+ baseBranch: 'main',
199
+ worktreeType: 'main_worktree',
200
+ hasChanges: false,
201
+ hasStagedChanges: false,
202
+ hasUnstagedChanges: false,
203
+ localCommits: [],
204
+ stagedFiles: [],
205
+ unstagedFiles: [],
206
+ availableActions: [{ key: 'empty_commit', label: 'Create empty commit' }],
207
+ recommendedAction: 'empty_commit',
208
+ ...overrides,
209
+ });
210
+ it('formats basic state info', () => {
211
+ const result = makeResult();
212
+ const text = formatText(result, false);
213
+ expect(text).toContain('Scenario');
214
+ expect(text).toContain('main_clean_same');
215
+ expect(text).toContain('Branch');
216
+ expect(text).toContain('main');
217
+ });
218
+ it('includes verbose info when verbose is true', () => {
219
+ const result = makeResult({
220
+ stagedFiles: ['file1.ts', 'file2.ts'],
221
+ hasStagedChanges: true,
222
+ hasChanges: true,
223
+ });
224
+ const text = formatText(result, true);
225
+ expect(text).toContain('file1.ts');
226
+ expect(text).toContain('file2.ts');
227
+ });
228
+ it('shows available actions', () => {
229
+ const result = makeResult({
230
+ availableActions: [
231
+ { key: 'empty_commit', label: 'Create empty commit' },
232
+ { key: 'commit_staged', label: 'Commit staged changes' },
233
+ ],
234
+ });
235
+ const text = formatText(result, false);
236
+ expect(text).toContain('Available actions:');
237
+ expect(text).toContain('empty_commit');
238
+ });
239
+ it('shows recommended action', () => {
240
+ const result = makeResult({
241
+ recommendedAction: 'commit_staged',
242
+ });
243
+ const text = formatText(result, false);
244
+ expect(text).toContain('Recommended');
245
+ expect(text).toContain('commit_staged');
246
+ });
247
+ it('handles null branch (detached head)', () => {
248
+ const result = makeResult({
249
+ currentBranch: null,
250
+ scenario: 'detached_head',
251
+ scenarioDescription: 'In detached HEAD state',
252
+ });
253
+ const text = formatText(result, false);
254
+ expect(text).toContain('detached');
255
+ });
256
+ it('includes local commits in verbose mode', () => {
257
+ const result = makeResult({
258
+ localCommits: ['abc123 First commit', 'def456 Second commit'],
259
+ });
260
+ const text = formatText(result, true);
261
+ expect(text).toContain('Local commits:');
262
+ expect(text).toContain('abc123 First commit');
263
+ expect(text).toContain('def456 Second commit');
264
+ });
265
+ it('truncates many local commits in verbose mode', () => {
266
+ const commits = Array.from({ length: 15 }, (_, i) => `commit${i} Message ${i}`);
267
+ const result = makeResult({
268
+ localCommits: commits,
269
+ });
270
+ const text = formatText(result, true);
271
+ expect(text).toContain('... and 5 more');
272
+ });
273
+ it('shows worktree type', () => {
274
+ const result = makeResult({
275
+ worktreeType: 'pr_worktree',
276
+ });
277
+ const text = formatText(result, false);
278
+ expect(text).toContain('Worktree type: pr_worktree');
279
+ });
280
+ });
281
+ });
282
+ //# sourceMappingURL=analyze.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.test.js","sourceRoot":"","sources":["../../../src/lib/wtstate/analyze.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * wtstate args - pure argument parsing
3
+ */
4
+ import type { WtstateOptions, ParseResult } from './types.js';
5
+ /**
6
+ * Default options
7
+ */
8
+ export declare function getDefaultOptions(): WtstateOptions;
9
+ /**
10
+ * Parse command line arguments - pure function, no side effects
11
+ */
12
+ export declare function parseArgs(args: string[]): ParseResult;
13
+ /**
14
+ * Get help text as a string
15
+ */
16
+ export declare function getHelpText(): string;
17
+ //# sourceMappingURL=args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../../src/lib/wtstate/args.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9D;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,CAMlD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAwCrD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAoCpC"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * wtstate args - pure argument parsing
3
+ */
4
+ /**
5
+ * Default options
6
+ */
7
+ export function getDefaultOptions() {
8
+ return {
9
+ json: false,
10
+ baseBranch: 'main',
11
+ verbose: false,
12
+ };
13
+ }
14
+ /**
15
+ * Parse command line arguments - pure function, no side effects
16
+ */
17
+ export function parseArgs(args) {
18
+ const options = getDefaultOptions();
19
+ let i = 0;
20
+ while (i < args.length) {
21
+ const arg = args[i];
22
+ switch (arg) {
23
+ case '-h':
24
+ case '--help':
25
+ return { kind: 'help' };
26
+ case '--json':
27
+ options.json = true;
28
+ break;
29
+ case '-v':
30
+ case '--verbose':
31
+ options.verbose = true;
32
+ break;
33
+ case '-b':
34
+ case '--base':
35
+ i++;
36
+ if (!args[i] || args[i].startsWith('-')) {
37
+ return { kind: 'error', message: '--base requires a branch name' };
38
+ }
39
+ options.baseBranch = args[i];
40
+ break;
41
+ default:
42
+ if (arg.startsWith('-')) {
43
+ return { kind: 'error', message: `Unknown option: ${arg}` };
44
+ }
45
+ return { kind: 'error', message: `Unexpected argument: ${arg}` };
46
+ }
47
+ i++;
48
+ }
49
+ return { kind: 'success', options };
50
+ }
51
+ /**
52
+ * Get help text as a string
53
+ */
54
+ export function getHelpText() {
55
+ return `
56
+ wtstate - Query git worktree state for AI agents
57
+
58
+ Usage:
59
+ wtstate [options] Query current git state
60
+
61
+ Options:
62
+ --json Output as JSON (recommended for AI usage)
63
+ -b, --base BRANCH Base branch for comparison (default: main)
64
+ -v, --verbose Include file lists in output
65
+ -h, --help Show this help message
66
+
67
+ Output:
68
+ The command outputs information about the current git state including:
69
+ - Current scenario (e.g., main_clean_same, branch_with_changes)
70
+ - Branch and worktree information
71
+ - Change status (staged/unstaged files)
72
+ - Available actions for the scenario
73
+ - Recommended action for AI agents
74
+
75
+ Examples:
76
+ wtstate --json # Query state as JSON
77
+ wtstate --json --verbose # Include file lists
78
+ wtstate --base develop # Compare against develop branch
79
+
80
+ AI/Automation workflow:
81
+ # 1. Query state
82
+ STATE=$(wtstate --json)
83
+
84
+ # 2. Get recommended action
85
+ ACTION=$(echo $STATE | jq -r '.recommendedAction')
86
+
87
+ # 3. Execute with chosen action
88
+ newpr "Fix bug" --non-interactive --action=$ACTION --json
89
+ `.trim();
90
+ }
91
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../../src/lib/wtstate/args.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO;QACL,IAAI,EAAE,KAAK;QACX,UAAU,EAAE,MAAM;QAClB,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;IAEpC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,IAAI,CAAC;YACV,KAAK,QAAQ;gBACX,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAE1B,KAAK,QAAQ;gBACX,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;gBACpB,MAAM;YAER,KAAK,IAAI,CAAC;YACV,KAAK,WAAW;gBACd,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;gBACvB,MAAM;YAER,KAAK,IAAI,CAAC;YACV,KAAK,QAAQ;gBACX,CAAC,EAAE,CAAC;gBACJ,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACxC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAC;gBACrE,CAAC;gBACD,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC7B,MAAM;YAER;gBACE,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACxB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,GAAG,EAAE,EAAE,CAAC;gBAC9D,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,wBAAwB,GAAG,EAAE,EAAE,CAAC;QACrE,CAAC;QACD,CAAC,EAAE,CAAC;IACN,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCR,CAAC,IAAI,EAAE,CAAC;AACT,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * wtstate args tests
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=args.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.test.d.ts","sourceRoot":"","sources":["../../../src/lib/wtstate/args.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}