@camaradesuk/git-worktree-tools 1.7.0 → 1.9.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 (295) hide show
  1. package/README.md +69 -8
  2. package/dist/cli/cleanpr.js +11 -5
  3. package/dist/cli/cleanpr.js.map +1 -1
  4. package/dist/cli/cleanpr.test.js +12 -1
  5. package/dist/cli/cleanpr.test.js.map +1 -1
  6. package/dist/cli/newpr.js +302 -37
  7. package/dist/cli/newpr.js.map +1 -1
  8. package/dist/cli/newpr.test.js +336 -9
  9. package/dist/cli/newpr.test.js.map +1 -1
  10. package/dist/cli/prs.d.ts +22 -0
  11. package/dist/cli/prs.d.ts.map +1 -0
  12. package/dist/cli/prs.js +275 -0
  13. package/dist/cli/prs.js.map +1 -0
  14. package/dist/cli/prs.test.d.ts +8 -0
  15. package/dist/cli/prs.test.d.ts.map +1 -0
  16. package/dist/cli/prs.test.js +410 -0
  17. package/dist/cli/prs.test.js.map +1 -0
  18. package/dist/cli/wt/interactive-menu.d.ts +2 -0
  19. package/dist/cli/wt/interactive-menu.d.ts.map +1 -1
  20. package/dist/cli/wt/interactive-menu.js +17 -0
  21. package/dist/cli/wt/interactive-menu.js.map +1 -1
  22. package/dist/cli/wt/interactive-menu.test.js +28 -0
  23. package/dist/cli/wt/interactive-menu.test.js.map +1 -1
  24. package/dist/cli/wt/prs.d.ts +21 -0
  25. package/dist/cli/wt/prs.d.ts.map +1 -0
  26. package/dist/cli/wt/prs.js +251 -0
  27. package/dist/cli/wt/prs.js.map +1 -0
  28. package/dist/cli/wt/prs.test.d.ts +5 -0
  29. package/dist/cli/wt/prs.test.d.ts.map +1 -0
  30. package/dist/cli/wt/prs.test.js +410 -0
  31. package/dist/cli/wt/prs.test.js.map +1 -0
  32. package/dist/cli/wt.d.ts +1 -0
  33. package/dist/cli/wt.d.ts.map +1 -1
  34. package/dist/cli/wt.js +5 -0
  35. package/dist/cli/wt.js.map +1 -1
  36. package/dist/cli/wtconfig.d.ts +1 -0
  37. package/dist/cli/wtconfig.d.ts.map +1 -1
  38. package/dist/cli/wtconfig.js +115 -0
  39. package/dist/cli/wtconfig.js.map +1 -1
  40. package/dist/cli/wtconfig.test.js +6 -0
  41. package/dist/cli/wtconfig.test.js.map +1 -1
  42. package/dist/cli/wtlink.d.ts +2 -1
  43. package/dist/cli/wtlink.d.ts.map +1 -1
  44. package/dist/cli/wtlink.js +60 -2
  45. package/dist/cli/wtlink.js.map +1 -1
  46. package/dist/e2e/cli.e2e.test.js +6 -2
  47. package/dist/e2e/cli.e2e.test.js.map +1 -1
  48. package/dist/e2e/helpers/cli-runner.d.ts.map +1 -1
  49. package/dist/e2e/helpers/cli-runner.js +1 -0
  50. package/dist/e2e/helpers/cli-runner.js.map +1 -1
  51. package/dist/e2e/helpers/gh-mock.d.ts.map +1 -1
  52. package/dist/e2e/helpers/gh-mock.js +55 -1
  53. package/dist/e2e/helpers/gh-mock.js.map +1 -1
  54. package/dist/e2e/helpers/pty-wrapper.d.ts +15 -0
  55. package/dist/e2e/helpers/pty-wrapper.d.ts.map +1 -1
  56. package/dist/e2e/helpers/pty-wrapper.js +65 -0
  57. package/dist/e2e/helpers/pty-wrapper.js.map +1 -1
  58. package/dist/e2e/newpr-full-flow.e2e.test.js +1 -0
  59. package/dist/e2e/newpr-full-flow.e2e.test.js.map +1 -1
  60. package/dist/e2e/prs/prs.e2e.test.d.ts +7 -0
  61. package/dist/e2e/prs/prs.e2e.test.d.ts.map +1 -0
  62. package/dist/e2e/prs/prs.e2e.test.js +606 -0
  63. package/dist/e2e/prs/prs.e2e.test.js.map +1 -0
  64. package/dist/e2e/wt/interactive-menu.e2e.test.d.ts +8 -0
  65. package/dist/e2e/wt/interactive-menu.e2e.test.d.ts.map +1 -0
  66. package/dist/e2e/wt/interactive-menu.e2e.test.js +583 -0
  67. package/dist/e2e/wt/interactive-menu.e2e.test.js.map +1 -0
  68. package/dist/e2e/wt/wt.e2e.test.js +217 -4
  69. package/dist/e2e/wt/wt.e2e.test.js.map +1 -1
  70. package/dist/integration/prs.integration.test.d.ts +8 -0
  71. package/dist/integration/prs.integration.test.d.ts.map +1 -0
  72. package/dist/integration/prs.integration.test.js +478 -0
  73. package/dist/integration/prs.integration.test.js.map +1 -0
  74. package/dist/lib/ai/types.d.ts +12 -0
  75. package/dist/lib/ai/types.d.ts.map +1 -1
  76. package/dist/lib/ai/types.js.map +1 -1
  77. package/dist/lib/cleanpr/worktree-info.d.ts.map +1 -1
  78. package/dist/lib/cleanpr/worktree-info.js +1 -6
  79. package/dist/lib/cleanpr/worktree-info.js.map +1 -1
  80. package/dist/lib/cleanpr/worktree-info.test.js +10 -13
  81. package/dist/lib/cleanpr/worktree-info.test.js.map +1 -1
  82. package/dist/lib/config-editor.d.ts.map +1 -1
  83. package/dist/lib/config-editor.js.map +1 -1
  84. package/dist/lib/config-migration/detector.d.ts +25 -0
  85. package/dist/lib/config-migration/detector.d.ts.map +1 -0
  86. package/dist/lib/config-migration/detector.js +372 -0
  87. package/dist/lib/config-migration/detector.js.map +1 -0
  88. package/dist/lib/config-migration/detector.test.d.ts +5 -0
  89. package/dist/lib/config-migration/detector.test.d.ts.map +1 -0
  90. package/dist/lib/config-migration/detector.test.js +201 -0
  91. package/dist/lib/config-migration/detector.test.js.map +1 -0
  92. package/dist/lib/config-migration/index.d.ts +29 -0
  93. package/dist/lib/config-migration/index.d.ts.map +1 -0
  94. package/dist/lib/config-migration/index.js +33 -0
  95. package/dist/lib/config-migration/index.js.map +1 -0
  96. package/dist/lib/config-migration/reporter.d.ts +53 -0
  97. package/dist/lib/config-migration/reporter.d.ts.map +1 -0
  98. package/dist/lib/config-migration/reporter.js +257 -0
  99. package/dist/lib/config-migration/reporter.js.map +1 -0
  100. package/dist/lib/config-migration/reporter.test.d.ts +5 -0
  101. package/dist/lib/config-migration/reporter.test.d.ts.map +1 -0
  102. package/dist/lib/config-migration/reporter.test.js +305 -0
  103. package/dist/lib/config-migration/reporter.test.js.map +1 -0
  104. package/dist/lib/config-migration/runner.d.ts +46 -0
  105. package/dist/lib/config-migration/runner.d.ts.map +1 -0
  106. package/dist/lib/config-migration/runner.js +364 -0
  107. package/dist/lib/config-migration/runner.js.map +1 -0
  108. package/dist/lib/config-migration/runner.test.d.ts +5 -0
  109. package/dist/lib/config-migration/runner.test.d.ts.map +1 -0
  110. package/dist/lib/config-migration/runner.test.js +235 -0
  111. package/dist/lib/config-migration/runner.test.js.map +1 -0
  112. package/dist/lib/config-migration/types.d.ts +120 -0
  113. package/dist/lib/config-migration/types.d.ts.map +1 -0
  114. package/dist/lib/config-migration/types.js +70 -0
  115. package/dist/lib/config-migration/types.js.map +1 -0
  116. package/dist/lib/config-validation.d.ts.map +1 -1
  117. package/dist/lib/config-validation.js +62 -0
  118. package/dist/lib/config-validation.js.map +1 -1
  119. package/dist/lib/config-validation.test.js +25 -0
  120. package/dist/lib/config-validation.test.js.map +1 -1
  121. package/dist/lib/config.d.ts +65 -7
  122. package/dist/lib/config.d.ts.map +1 -1
  123. package/dist/lib/config.js +12 -0
  124. package/dist/lib/config.js.map +1 -1
  125. package/dist/lib/git.d.ts +32 -0
  126. package/dist/lib/git.d.ts.map +1 -1
  127. package/dist/lib/git.js +95 -1
  128. package/dist/lib/git.js.map +1 -1
  129. package/dist/lib/git.test.js +118 -1
  130. package/dist/lib/git.test.js.map +1 -1
  131. package/dist/lib/github.d.ts +41 -0
  132. package/dist/lib/github.d.ts.map +1 -1
  133. package/dist/lib/github.js +109 -0
  134. package/dist/lib/github.js.map +1 -1
  135. package/dist/lib/global-check.d.ts +2 -2
  136. package/dist/lib/global-check.js +3 -3
  137. package/dist/lib/global-check.js.map +1 -1
  138. package/dist/lib/global-check.test.js +3 -6
  139. package/dist/lib/global-check.test.js.map +1 -1
  140. package/dist/lib/hooks/confirmation.d.ts +49 -0
  141. package/dist/lib/hooks/confirmation.d.ts.map +1 -0
  142. package/dist/lib/hooks/confirmation.js +147 -0
  143. package/dist/lib/hooks/confirmation.js.map +1 -0
  144. package/dist/lib/hooks/confirmation.test.d.ts +7 -0
  145. package/dist/lib/hooks/confirmation.test.d.ts.map +1 -0
  146. package/dist/lib/hooks/confirmation.test.js +300 -0
  147. package/dist/lib/hooks/confirmation.test.js.map +1 -0
  148. package/dist/lib/hooks/executor.d.ts +16 -1
  149. package/dist/lib/hooks/executor.d.ts.map +1 -1
  150. package/dist/lib/hooks/executor.js +53 -4
  151. package/dist/lib/hooks/executor.js.map +1 -1
  152. package/dist/lib/hooks/index.d.ts +4 -2
  153. package/dist/lib/hooks/index.d.ts.map +1 -1
  154. package/dist/lib/hooks/index.js +3 -2
  155. package/dist/lib/hooks/index.js.map +1 -1
  156. package/dist/lib/hooks/types.d.ts +16 -0
  157. package/dist/lib/hooks/types.d.ts.map +1 -1
  158. package/dist/lib/hooks/types.js +12 -0
  159. package/dist/lib/hooks/types.js.map +1 -1
  160. package/dist/lib/json-output.d.ts +1 -0
  161. package/dist/lib/json-output.d.ts.map +1 -1
  162. package/dist/lib/json-output.js +2 -0
  163. package/dist/lib/json-output.js.map +1 -1
  164. package/dist/lib/lswt/action-executors.d.ts +2 -0
  165. package/dist/lib/lswt/action-executors.d.ts.map +1 -1
  166. package/dist/lib/lswt/action-executors.js +6 -4
  167. package/dist/lib/lswt/action-executors.js.map +1 -1
  168. package/dist/lib/lswt/action-executors.test.js +8 -0
  169. package/dist/lib/lswt/action-executors.test.js.map +1 -1
  170. package/dist/lib/lswt/actions.d.ts +1 -0
  171. package/dist/lib/lswt/actions.d.ts.map +1 -1
  172. package/dist/lib/lswt/actions.js +38 -10
  173. package/dist/lib/lswt/actions.js.map +1 -1
  174. package/dist/lib/lswt/actions.test.js +34 -22
  175. package/dist/lib/lswt/actions.test.js.map +1 -1
  176. package/dist/lib/lswt/environment.d.ts +21 -2
  177. package/dist/lib/lswt/environment.d.ts.map +1 -1
  178. package/dist/lib/lswt/environment.js +73 -32
  179. package/dist/lib/lswt/environment.js.map +1 -1
  180. package/dist/lib/lswt/environment.test.js +79 -1
  181. package/dist/lib/lswt/environment.test.js.map +1 -1
  182. package/dist/lib/lswt/interactive.js +8 -8
  183. package/dist/lib/lswt/interactive.js.map +1 -1
  184. package/dist/lib/lswt/worktree-info.d.ts.map +1 -1
  185. package/dist/lib/lswt/worktree-info.js +1 -6
  186. package/dist/lib/lswt/worktree-info.js.map +1 -1
  187. package/dist/lib/lswt/worktree-info.test.js +5 -17
  188. package/dist/lib/lswt/worktree-info.test.js.map +1 -1
  189. package/dist/lib/newpr/args.d.ts.map +1 -1
  190. package/dist/lib/newpr/args.js +15 -1
  191. package/dist/lib/newpr/args.js.map +1 -1
  192. package/dist/lib/newpr/hook-runner.d.ts +11 -0
  193. package/dist/lib/newpr/hook-runner.d.ts.map +1 -1
  194. package/dist/lib/newpr/hook-runner.js +49 -1
  195. package/dist/lib/newpr/hook-runner.js.map +1 -1
  196. package/dist/lib/newpr/hook-runner.test.js +121 -0
  197. package/dist/lib/newpr/hook-runner.test.js.map +1 -1
  198. package/dist/lib/newpr/plan-generator.d.ts +121 -0
  199. package/dist/lib/newpr/plan-generator.d.ts.map +1 -0
  200. package/dist/lib/newpr/plan-generator.js +185 -0
  201. package/dist/lib/newpr/plan-generator.js.map +1 -0
  202. package/dist/lib/newpr/plan-generator.test.d.ts +7 -0
  203. package/dist/lib/newpr/plan-generator.test.d.ts.map +1 -0
  204. package/dist/lib/newpr/plan-generator.test.js +387 -0
  205. package/dist/lib/newpr/plan-generator.test.js.map +1 -0
  206. package/dist/lib/newpr/types.d.ts +6 -0
  207. package/dist/lib/newpr/types.d.ts.map +1 -1
  208. package/dist/lib/prompts.d.ts.map +1 -1
  209. package/dist/lib/prompts.js +16 -12
  210. package/dist/lib/prompts.js.map +1 -1
  211. package/dist/lib/prs/actions.d.ts +74 -0
  212. package/dist/lib/prs/actions.d.ts.map +1 -0
  213. package/dist/lib/prs/actions.js +446 -0
  214. package/dist/lib/prs/actions.js.map +1 -0
  215. package/dist/lib/prs/actions.test.d.ts +5 -0
  216. package/dist/lib/prs/actions.test.d.ts.map +1 -0
  217. package/dist/lib/prs/actions.test.js +356 -0
  218. package/dist/lib/prs/actions.test.js.map +1 -0
  219. package/dist/lib/prs/data.d.ts +48 -0
  220. package/dist/lib/prs/data.d.ts.map +1 -0
  221. package/dist/lib/prs/data.js +171 -0
  222. package/dist/lib/prs/data.js.map +1 -0
  223. package/dist/lib/prs/data.test.d.ts +5 -0
  224. package/dist/lib/prs/data.test.d.ts.map +1 -0
  225. package/dist/lib/prs/data.test.js +417 -0
  226. package/dist/lib/prs/data.test.js.map +1 -0
  227. package/dist/lib/prs/details.d.ts +57 -0
  228. package/dist/lib/prs/details.d.ts.map +1 -0
  229. package/dist/lib/prs/details.js +246 -0
  230. package/dist/lib/prs/details.js.map +1 -0
  231. package/dist/lib/prs/details.test.d.ts +5 -0
  232. package/dist/lib/prs/details.test.d.ts.map +1 -0
  233. package/dist/lib/prs/details.test.js +325 -0
  234. package/dist/lib/prs/details.test.js.map +1 -0
  235. package/dist/lib/prs/filters.d.ts +56 -0
  236. package/dist/lib/prs/filters.d.ts.map +1 -0
  237. package/dist/lib/prs/filters.js +171 -0
  238. package/dist/lib/prs/filters.js.map +1 -0
  239. package/dist/lib/prs/filters.test.d.ts +5 -0
  240. package/dist/lib/prs/filters.test.d.ts.map +1 -0
  241. package/dist/lib/prs/filters.test.js +312 -0
  242. package/dist/lib/prs/filters.test.js.map +1 -0
  243. package/dist/lib/prs/formatters.d.ts +83 -0
  244. package/dist/lib/prs/formatters.d.ts.map +1 -0
  245. package/dist/lib/prs/formatters.js +389 -0
  246. package/dist/lib/prs/formatters.js.map +1 -0
  247. package/dist/lib/prs/formatters.test.d.ts +2 -0
  248. package/dist/lib/prs/formatters.test.d.ts.map +1 -0
  249. package/dist/lib/prs/formatters.test.js +387 -0
  250. package/dist/lib/prs/formatters.test.js.map +1 -0
  251. package/dist/lib/prs/interactive.d.ts +50 -0
  252. package/dist/lib/prs/interactive.d.ts.map +1 -0
  253. package/dist/lib/prs/interactive.js +453 -0
  254. package/dist/lib/prs/interactive.js.map +1 -0
  255. package/dist/lib/prs/interactive.test.d.ts +5 -0
  256. package/dist/lib/prs/interactive.test.d.ts.map +1 -0
  257. package/dist/lib/prs/interactive.test.js +364 -0
  258. package/dist/lib/prs/interactive.test.js.map +1 -0
  259. package/dist/lib/prs/types.d.ts +152 -0
  260. package/dist/lib/prs/types.d.ts.map +1 -0
  261. package/dist/lib/prs/types.js +17 -0
  262. package/dist/lib/prs/types.js.map +1 -0
  263. package/dist/lib/wtconfig/environment.d.ts +18 -1
  264. package/dist/lib/wtconfig/environment.d.ts.map +1 -1
  265. package/dist/lib/wtconfig/environment.js +60 -24
  266. package/dist/lib/wtconfig/environment.js.map +1 -1
  267. package/dist/lib/wtconfig/environment.test.js +45 -1
  268. package/dist/lib/wtconfig/environment.test.js.map +1 -1
  269. package/dist/lib/wtlink/config-manifest.d.ts +101 -0
  270. package/dist/lib/wtlink/config-manifest.d.ts.map +1 -0
  271. package/dist/lib/wtlink/config-manifest.js +219 -0
  272. package/dist/lib/wtlink/config-manifest.js.map +1 -0
  273. package/dist/lib/wtlink/config-manifest.test.d.ts +2 -0
  274. package/dist/lib/wtlink/config-manifest.test.d.ts.map +1 -0
  275. package/dist/lib/wtlink/config-manifest.test.js +486 -0
  276. package/dist/lib/wtlink/config-manifest.test.js.map +1 -0
  277. package/dist/lib/wtlink/link-configs.d.ts.map +1 -1
  278. package/dist/lib/wtlink/link-configs.js +36 -11
  279. package/dist/lib/wtlink/link-configs.js.map +1 -1
  280. package/dist/lib/wtlink/main-menu.d.ts.map +1 -1
  281. package/dist/lib/wtlink/main-menu.js +58 -50
  282. package/dist/lib/wtlink/main-menu.js.map +1 -1
  283. package/dist/lib/wtlink/main-menu.test.js +42 -40
  284. package/dist/lib/wtlink/main-menu.test.js.map +1 -1
  285. package/dist/lib/wtlink/manage-manifest.d.ts +9 -0
  286. package/dist/lib/wtlink/manage-manifest.d.ts.map +1 -1
  287. package/dist/lib/wtlink/manage-manifest.js +346 -25
  288. package/dist/lib/wtlink/manage-manifest.js.map +1 -1
  289. package/dist/lib/wtlink/manage-manifest.test.js +52 -1
  290. package/dist/lib/wtlink/manage-manifest.test.js.map +1 -1
  291. package/dist/lib/wtlink/validate-manifest.d.ts.map +1 -1
  292. package/dist/lib/wtlink/validate-manifest.js +27 -6
  293. package/dist/lib/wtlink/validate-manifest.js.map +1 -1
  294. package/package.json +2 -1
  295. package/schemas/worktreerc.schema.json +49 -1
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Filter state management for PR browser
3
+ */
4
+ import type { PrFilterState } from './types.js';
5
+ /** PR state type */
6
+ export type PrState = 'OPEN' | 'MERGED' | 'CLOSED';
7
+ /**
8
+ * Toggle a state filter on/off
9
+ */
10
+ export declare function toggleStateFilter(filters: PrFilterState, state: PrState): PrFilterState;
11
+ /**
12
+ * Set state filter to a single state (exclusive)
13
+ */
14
+ export declare function setExclusiveState(filters: PrFilterState, state: PrState): PrFilterState;
15
+ /**
16
+ * Set state filter to show all states
17
+ */
18
+ export declare function setAllStates(filters: PrFilterState): PrFilterState;
19
+ /**
20
+ * Cycle draft filter: include -> only -> exclude -> include
21
+ */
22
+ export declare function cycleDraftFilter(filters: PrFilterState): PrFilterState;
23
+ /**
24
+ * Toggle worktree filter: null -> true -> false -> null
25
+ */
26
+ export declare function cycleWorktreeFilter(filters: PrFilterState): PrFilterState;
27
+ /**
28
+ * Toggle a label in the filter
29
+ */
30
+ export declare function toggleLabelFilter(filters: PrFilterState, label: string): PrFilterState;
31
+ /**
32
+ * Set the author filter
33
+ */
34
+ export declare function setAuthorFilter(filters: PrFilterState, author: string | null): PrFilterState;
35
+ /**
36
+ * Set the search query
37
+ */
38
+ export declare function setSearchQuery(filters: PrFilterState, searchQuery: string): PrFilterState;
39
+ /**
40
+ * Clear all filters (reset to default open-only state)
41
+ */
42
+ export declare function clearFilters(): PrFilterState;
43
+ /**
44
+ * Check if filters are at default state (only open PRs, no other filters)
45
+ */
46
+ export declare function isDefaultFilters(filters: PrFilterState): boolean;
47
+ /**
48
+ * Get human-readable description of active filters
49
+ */
50
+ export declare function describeFilters(filters: PrFilterState): string;
51
+ /**
52
+ * Handle keyboard shortcut for filter toggles
53
+ * Returns updated filter state or null if key not handled
54
+ */
55
+ export declare function handleFilterShortcut(key: string, filters: PrFilterState): PrFilterState | null;
56
+ //# sourceMappingURL=filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../../src/lib/prs/filters.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,oBAAoB;AACpB,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEnD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,GAAG,aAAa,CAWvF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,GAAG,aAAa,CAEvF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,aAAa,CAElE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,aAAa,CAUtE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,aAAa,CAUzE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CAStF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,aAAa,CAE5F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa,CAEzF;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,aAAa,CAS5C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAUhE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAuC9D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,aAAa,GAAG,IAAI,CAa9F"}
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Filter state management for PR browser
3
+ */
4
+ /**
5
+ * Toggle a state filter on/off
6
+ */
7
+ export function toggleStateFilter(filters, state) {
8
+ const newStates = new Set(filters.states);
9
+ if (newStates.has(state)) {
10
+ // Don't allow removing last state - at least one must be selected
11
+ if (newStates.size > 1) {
12
+ newStates.delete(state);
13
+ }
14
+ }
15
+ else {
16
+ newStates.add(state);
17
+ }
18
+ return { ...filters, states: newStates };
19
+ }
20
+ /**
21
+ * Set state filter to a single state (exclusive)
22
+ */
23
+ export function setExclusiveState(filters, state) {
24
+ return { ...filters, states: new Set([state]) };
25
+ }
26
+ /**
27
+ * Set state filter to show all states
28
+ */
29
+ export function setAllStates(filters) {
30
+ return { ...filters, states: new Set(['OPEN', 'MERGED', 'CLOSED']) };
31
+ }
32
+ /**
33
+ * Cycle draft filter: include -> only -> exclude -> include
34
+ */
35
+ export function cycleDraftFilter(filters) {
36
+ let newShowDrafts;
37
+ if (filters.showDrafts === true) {
38
+ newShowDrafts = 'only';
39
+ }
40
+ else if (filters.showDrafts === 'only') {
41
+ newShowDrafts = false;
42
+ }
43
+ else {
44
+ newShowDrafts = true;
45
+ }
46
+ return { ...filters, showDrafts: newShowDrafts };
47
+ }
48
+ /**
49
+ * Toggle worktree filter: null -> true -> false -> null
50
+ */
51
+ export function cycleWorktreeFilter(filters) {
52
+ let newHasWorktree;
53
+ if (filters.hasWorktree === null) {
54
+ newHasWorktree = true;
55
+ }
56
+ else if (filters.hasWorktree === true) {
57
+ newHasWorktree = false;
58
+ }
59
+ else {
60
+ newHasWorktree = null;
61
+ }
62
+ return { ...filters, hasWorktree: newHasWorktree };
63
+ }
64
+ /**
65
+ * Toggle a label in the filter
66
+ */
67
+ export function toggleLabelFilter(filters, label) {
68
+ const newLabels = [...filters.labels];
69
+ const index = newLabels.findIndex((l) => l.toLowerCase() === label.toLowerCase());
70
+ if (index >= 0) {
71
+ newLabels.splice(index, 1);
72
+ }
73
+ else {
74
+ newLabels.push(label);
75
+ }
76
+ return { ...filters, labels: newLabels };
77
+ }
78
+ /**
79
+ * Set the author filter
80
+ */
81
+ export function setAuthorFilter(filters, author) {
82
+ return { ...filters, author };
83
+ }
84
+ /**
85
+ * Set the search query
86
+ */
87
+ export function setSearchQuery(filters, searchQuery) {
88
+ return { ...filters, searchQuery };
89
+ }
90
+ /**
91
+ * Clear all filters (reset to default open-only state)
92
+ */
93
+ export function clearFilters() {
94
+ return {
95
+ states: new Set(['OPEN']),
96
+ showDrafts: true,
97
+ labels: [],
98
+ author: null,
99
+ hasWorktree: null,
100
+ searchQuery: '',
101
+ };
102
+ }
103
+ /**
104
+ * Check if filters are at default state (only open PRs, no other filters)
105
+ */
106
+ export function isDefaultFilters(filters) {
107
+ return (filters.states.size === 1 &&
108
+ filters.states.has('OPEN') &&
109
+ filters.showDrafts === true &&
110
+ filters.labels.length === 0 &&
111
+ filters.author === null &&
112
+ filters.hasWorktree === null &&
113
+ filters.searchQuery === '');
114
+ }
115
+ /**
116
+ * Get human-readable description of active filters
117
+ */
118
+ export function describeFilters(filters) {
119
+ const parts = [];
120
+ // States
121
+ const stateNames = Array.from(filters.states).map((s) => s.toLowerCase());
122
+ if (stateNames.length < 3) {
123
+ parts.push(stateNames.join(', '));
124
+ }
125
+ // Drafts
126
+ if (filters.showDrafts === 'only') {
127
+ parts.push('drafts only');
128
+ }
129
+ else if (filters.showDrafts === false) {
130
+ parts.push('no drafts');
131
+ }
132
+ // Worktree
133
+ if (filters.hasWorktree === true) {
134
+ parts.push('with worktree');
135
+ }
136
+ else if (filters.hasWorktree === false) {
137
+ parts.push('without worktree');
138
+ }
139
+ // Labels
140
+ if (filters.labels.length > 0) {
141
+ parts.push(`labels: ${filters.labels.join(', ')}`);
142
+ }
143
+ // Author
144
+ if (filters.author) {
145
+ parts.push(`by @${filters.author}`);
146
+ }
147
+ // Search
148
+ if (filters.searchQuery) {
149
+ parts.push(`"${filters.searchQuery}"`);
150
+ }
151
+ return parts.length > 0 ? parts.join(' + ') : 'all';
152
+ }
153
+ /**
154
+ * Handle keyboard shortcut for filter toggles
155
+ * Returns updated filter state or null if key not handled
156
+ */
157
+ export function handleFilterShortcut(key, filters) {
158
+ switch (key) {
159
+ case 'o':
160
+ return toggleStateFilter(filters, 'OPEN');
161
+ case 'm':
162
+ return toggleStateFilter(filters, 'MERGED');
163
+ case 'x':
164
+ return toggleStateFilter(filters, 'CLOSED');
165
+ case 'd':
166
+ return cycleDraftFilter(filters);
167
+ default:
168
+ return null;
169
+ }
170
+ }
171
+ //# sourceMappingURL=filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.js","sourceRoot":"","sources":["../../../src/lib/prs/filters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for PR filter state management
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=filters.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.test.d.ts","sourceRoot":"","sources":["../../../src/lib/prs/filters.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,312 @@
1
+ /**
2
+ * Tests for PR filter state management
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ import { toggleStateFilter, setExclusiveState, setAllStates, cycleDraftFilter, cycleWorktreeFilter, toggleLabelFilter, setAuthorFilter, setSearchQuery, clearFilters, isDefaultFilters, describeFilters, handleFilterShortcut, } from './filters.js';
6
+ import { createDefaultFilterState } from './types.js';
7
+ describe('filters', () => {
8
+ describe('toggleStateFilter', () => {
9
+ it('should add state when not present', () => {
10
+ const filters = createDefaultFilterState(); // has OPEN
11
+ const result = toggleStateFilter(filters, 'MERGED');
12
+ expect(result.states.has('OPEN')).toBe(true);
13
+ expect(result.states.has('MERGED')).toBe(true);
14
+ });
15
+ it('should remove state when present and not last', () => {
16
+ const filters = {
17
+ ...createDefaultFilterState(),
18
+ states: new Set(['OPEN', 'MERGED']),
19
+ };
20
+ const result = toggleStateFilter(filters, 'MERGED');
21
+ expect(result.states.has('OPEN')).toBe(true);
22
+ expect(result.states.has('MERGED')).toBe(false);
23
+ });
24
+ it('should not remove last state', () => {
25
+ const filters = createDefaultFilterState(); // only OPEN
26
+ const result = toggleStateFilter(filters, 'OPEN');
27
+ expect(result.states.has('OPEN')).toBe(true);
28
+ expect(result.states.size).toBe(1);
29
+ });
30
+ it('should not mutate original filters', () => {
31
+ const filters = createDefaultFilterState();
32
+ const originalSize = filters.states.size;
33
+ toggleStateFilter(filters, 'MERGED');
34
+ expect(filters.states.size).toBe(originalSize);
35
+ });
36
+ });
37
+ describe('setExclusiveState', () => {
38
+ it('should set single state', () => {
39
+ const filters = {
40
+ ...createDefaultFilterState(),
41
+ states: new Set(['OPEN', 'MERGED', 'CLOSED']),
42
+ };
43
+ const result = setExclusiveState(filters, 'CLOSED');
44
+ expect(result.states.size).toBe(1);
45
+ expect(result.states.has('CLOSED')).toBe(true);
46
+ });
47
+ });
48
+ describe('setAllStates', () => {
49
+ it('should set all three states', () => {
50
+ const filters = createDefaultFilterState();
51
+ const result = setAllStates(filters);
52
+ expect(result.states.size).toBe(3);
53
+ expect(result.states.has('OPEN')).toBe(true);
54
+ expect(result.states.has('MERGED')).toBe(true);
55
+ expect(result.states.has('CLOSED')).toBe(true);
56
+ });
57
+ });
58
+ describe('cycleDraftFilter', () => {
59
+ it('should cycle true -> only', () => {
60
+ const filters = {
61
+ ...createDefaultFilterState(),
62
+ showDrafts: true,
63
+ };
64
+ const result = cycleDraftFilter(filters);
65
+ expect(result.showDrafts).toBe('only');
66
+ });
67
+ it('should cycle only -> false', () => {
68
+ const filters = {
69
+ ...createDefaultFilterState(),
70
+ showDrafts: 'only',
71
+ };
72
+ const result = cycleDraftFilter(filters);
73
+ expect(result.showDrafts).toBe(false);
74
+ });
75
+ it('should cycle false -> true', () => {
76
+ const filters = {
77
+ ...createDefaultFilterState(),
78
+ showDrafts: false,
79
+ };
80
+ const result = cycleDraftFilter(filters);
81
+ expect(result.showDrafts).toBe(true);
82
+ });
83
+ });
84
+ describe('cycleWorktreeFilter', () => {
85
+ it('should cycle null -> true', () => {
86
+ const filters = createDefaultFilterState();
87
+ const result = cycleWorktreeFilter(filters);
88
+ expect(result.hasWorktree).toBe(true);
89
+ });
90
+ it('should cycle true -> false', () => {
91
+ const filters = {
92
+ ...createDefaultFilterState(),
93
+ hasWorktree: true,
94
+ };
95
+ const result = cycleWorktreeFilter(filters);
96
+ expect(result.hasWorktree).toBe(false);
97
+ });
98
+ it('should cycle false -> null', () => {
99
+ const filters = {
100
+ ...createDefaultFilterState(),
101
+ hasWorktree: false,
102
+ };
103
+ const result = cycleWorktreeFilter(filters);
104
+ expect(result.hasWorktree).toBe(null);
105
+ });
106
+ });
107
+ describe('toggleLabelFilter', () => {
108
+ it('should add label when not present', () => {
109
+ const filters = createDefaultFilterState();
110
+ const result = toggleLabelFilter(filters, 'preview');
111
+ expect(result.labels).toContain('preview');
112
+ });
113
+ it('should remove label when present', () => {
114
+ const filters = {
115
+ ...createDefaultFilterState(),
116
+ labels: ['preview', 'bug'],
117
+ };
118
+ const result = toggleLabelFilter(filters, 'preview');
119
+ expect(result.labels).not.toContain('preview');
120
+ expect(result.labels).toContain('bug');
121
+ });
122
+ it('should match labels case-insensitively', () => {
123
+ const filters = {
124
+ ...createDefaultFilterState(),
125
+ labels: ['Preview'],
126
+ };
127
+ const result = toggleLabelFilter(filters, 'preview');
128
+ expect(result.labels).not.toContain('Preview');
129
+ });
130
+ });
131
+ describe('setAuthorFilter', () => {
132
+ it('should set author', () => {
133
+ const filters = createDefaultFilterState();
134
+ const result = setAuthorFilter(filters, 'chris');
135
+ expect(result.author).toBe('chris');
136
+ });
137
+ it('should clear author with null', () => {
138
+ const filters = {
139
+ ...createDefaultFilterState(),
140
+ author: 'chris',
141
+ };
142
+ const result = setAuthorFilter(filters, null);
143
+ expect(result.author).toBe(null);
144
+ });
145
+ });
146
+ describe('setSearchQuery', () => {
147
+ it('should set search query', () => {
148
+ const filters = createDefaultFilterState();
149
+ const result = setSearchQuery(filters, 'dark mode');
150
+ expect(result.searchQuery).toBe('dark mode');
151
+ });
152
+ });
153
+ describe('clearFilters', () => {
154
+ it('should reset to default state', () => {
155
+ const result = clearFilters();
156
+ expect(result.states.size).toBe(1);
157
+ expect(result.states.has('OPEN')).toBe(true);
158
+ expect(result.showDrafts).toBe(true);
159
+ expect(result.labels).toEqual([]);
160
+ expect(result.author).toBe(null);
161
+ expect(result.hasWorktree).toBe(null);
162
+ expect(result.searchQuery).toBe('');
163
+ });
164
+ });
165
+ describe('isDefaultFilters', () => {
166
+ it('should return true for default filters', () => {
167
+ const filters = createDefaultFilterState();
168
+ expect(isDefaultFilters(filters)).toBe(true);
169
+ });
170
+ it('should return false when states differ', () => {
171
+ const filters = {
172
+ ...createDefaultFilterState(),
173
+ states: new Set(['OPEN', 'MERGED']),
174
+ };
175
+ expect(isDefaultFilters(filters)).toBe(false);
176
+ });
177
+ it('should return false when showDrafts differs', () => {
178
+ const filters = {
179
+ ...createDefaultFilterState(),
180
+ showDrafts: false,
181
+ };
182
+ expect(isDefaultFilters(filters)).toBe(false);
183
+ });
184
+ it('should return false when labels present', () => {
185
+ const filters = {
186
+ ...createDefaultFilterState(),
187
+ labels: ['bug'],
188
+ };
189
+ expect(isDefaultFilters(filters)).toBe(false);
190
+ });
191
+ it('should return false when author set', () => {
192
+ const filters = {
193
+ ...createDefaultFilterState(),
194
+ author: 'chris',
195
+ };
196
+ expect(isDefaultFilters(filters)).toBe(false);
197
+ });
198
+ it('should return false when hasWorktree set', () => {
199
+ const filters = {
200
+ ...createDefaultFilterState(),
201
+ hasWorktree: true,
202
+ };
203
+ expect(isDefaultFilters(filters)).toBe(false);
204
+ });
205
+ it('should return false when search query set', () => {
206
+ const filters = {
207
+ ...createDefaultFilterState(),
208
+ searchQuery: 'test',
209
+ };
210
+ expect(isDefaultFilters(filters)).toBe(false);
211
+ });
212
+ });
213
+ describe('describeFilters', () => {
214
+ it('should describe default as "all" for open only', () => {
215
+ const filters = createDefaultFilterState();
216
+ expect(describeFilters(filters)).toBe('open');
217
+ });
218
+ it('should describe multiple states', () => {
219
+ const filters = {
220
+ ...createDefaultFilterState(),
221
+ states: new Set(['OPEN', 'MERGED']),
222
+ };
223
+ const desc = describeFilters(filters);
224
+ expect(desc).toContain('open');
225
+ expect(desc).toContain('merged');
226
+ });
227
+ it('should describe drafts only', () => {
228
+ const filters = {
229
+ ...createDefaultFilterState(),
230
+ showDrafts: 'only',
231
+ };
232
+ expect(describeFilters(filters)).toContain('drafts only');
233
+ });
234
+ it('should describe no drafts', () => {
235
+ const filters = {
236
+ ...createDefaultFilterState(),
237
+ showDrafts: false,
238
+ };
239
+ expect(describeFilters(filters)).toContain('no drafts');
240
+ });
241
+ it('should describe with worktree', () => {
242
+ const filters = {
243
+ ...createDefaultFilterState(),
244
+ hasWorktree: true,
245
+ };
246
+ expect(describeFilters(filters)).toContain('with worktree');
247
+ });
248
+ it('should describe without worktree', () => {
249
+ const filters = {
250
+ ...createDefaultFilterState(),
251
+ hasWorktree: false,
252
+ };
253
+ expect(describeFilters(filters)).toContain('without worktree');
254
+ });
255
+ it('should describe labels', () => {
256
+ const filters = {
257
+ ...createDefaultFilterState(),
258
+ labels: ['preview', 'bug'],
259
+ };
260
+ expect(describeFilters(filters)).toContain('labels: preview, bug');
261
+ });
262
+ it('should describe author', () => {
263
+ const filters = {
264
+ ...createDefaultFilterState(),
265
+ author: 'chris',
266
+ };
267
+ expect(describeFilters(filters)).toContain('by @chris');
268
+ });
269
+ it('should describe search query', () => {
270
+ const filters = {
271
+ ...createDefaultFilterState(),
272
+ searchQuery: 'dark mode',
273
+ };
274
+ expect(describeFilters(filters)).toContain('"dark mode"');
275
+ });
276
+ });
277
+ describe('handleFilterShortcut', () => {
278
+ it('should handle "o" to toggle OPEN', () => {
279
+ const filters = {
280
+ ...createDefaultFilterState(),
281
+ states: new Set(['OPEN', 'MERGED']),
282
+ };
283
+ const result = handleFilterShortcut('o', filters);
284
+ expect(result).not.toBe(null);
285
+ expect(result.states.has('OPEN')).toBe(false);
286
+ });
287
+ it('should handle "m" to toggle MERGED', () => {
288
+ const filters = createDefaultFilterState();
289
+ const result = handleFilterShortcut('m', filters);
290
+ expect(result).not.toBe(null);
291
+ expect(result.states.has('MERGED')).toBe(true);
292
+ });
293
+ it('should handle "x" to toggle CLOSED', () => {
294
+ const filters = createDefaultFilterState();
295
+ const result = handleFilterShortcut('x', filters);
296
+ expect(result).not.toBe(null);
297
+ expect(result.states.has('CLOSED')).toBe(true);
298
+ });
299
+ it('should handle "d" to cycle draft filter', () => {
300
+ const filters = createDefaultFilterState();
301
+ const result = handleFilterShortcut('d', filters);
302
+ expect(result).not.toBe(null);
303
+ expect(result.showDrafts).toBe('only');
304
+ });
305
+ it('should return null for unhandled key', () => {
306
+ const filters = createDefaultFilterState();
307
+ const result = handleFilterShortcut('z', filters);
308
+ expect(result).toBe(null);
309
+ });
310
+ });
311
+ });
312
+ //# sourceMappingURL=filters.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.test.js","sourceRoot":"","sources":["../../../src/lib/prs/filters.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * PR display formatters - badges, colors, layout
3
+ */
4
+ import type { PrDisplayItem, PrFilterState } from './types.js';
5
+ /**
6
+ * Format relative time from ISO timestamp
7
+ */
8
+ export declare function formatRelativeTime(isoTimestamp: string): string;
9
+ /**
10
+ * Format state badge with color
11
+ */
12
+ export declare function formatStateBadge(state: 'OPEN' | 'MERGED' | 'CLOSED'): string;
13
+ /**
14
+ * Format draft badge
15
+ */
16
+ export declare function formatDraftBadge(isDraft: boolean): string;
17
+ /**
18
+ * Format worktree indicator
19
+ */
20
+ export declare function formatWorktreeIndicator(hasWorktree: boolean): string;
21
+ /**
22
+ * Format review status indicator
23
+ */
24
+ export declare function formatReviewStatus(reviewDecision: 'APPROVED' | 'CHANGES_REQUESTED' | 'REVIEW_REQUIRED' | null, approvalCount: number): string;
25
+ /**
26
+ * Format CI status indicator
27
+ */
28
+ export declare function formatCIStatus(checksStatus: 'SUCCESS' | 'FAILURE' | 'PENDING' | null): string;
29
+ /**
30
+ * Format label badge (for preview label)
31
+ */
32
+ export declare function formatLabelBadge(label: string): string;
33
+ /**
34
+ * Truncate text to max length with ellipsis
35
+ */
36
+ export declare function truncate(text: string, maxLength: number): string;
37
+ /**
38
+ * Get the raw badge text (without colors) for a PR
39
+ * Used to compute dynamic badge widths
40
+ */
41
+ export declare function getPrBadgeText(pr: PrDisplayItem): string;
42
+ /**
43
+ * Compute the maximum PR number width for alignment
44
+ */
45
+ export declare function computeMaxPrNumberWidth(prs: PrDisplayItem[]): number;
46
+ /**
47
+ * Alias for computeMaxPrNumberWidth (badge width = PR number width for list display)
48
+ */
49
+ export declare function computeMaxPrBadgeWidth(prs: PrDisplayItem[]): number;
50
+ /**
51
+ * Format column header for PR list
52
+ */
53
+ export declare function formatPrColumnHeader(prNumberWidth: number): string;
54
+ /**
55
+ * Format separator line for PR list header
56
+ */
57
+ export declare function formatPrColumnSeparator(prNumberWidth: number): string;
58
+ /**
59
+ * Format a single PR line for list display
60
+ */
61
+ export declare function formatPrListItem(pr: PrDisplayItem, prNumberWidth: number, previewLabel?: string, searchPattern?: string): string;
62
+ /**
63
+ * Format PR list header
64
+ */
65
+ export declare function formatPrListHeader(repoName: string): string;
66
+ /**
67
+ * Format summary line
68
+ */
69
+ export declare function formatPrSummary(prs: PrDisplayItem[]): string;
70
+ /**
71
+ * Format filter indicator line
72
+ * Shows current view clearly with available shortcuts
73
+ */
74
+ export declare function formatFilterIndicator(filters: PrFilterState): string;
75
+ /**
76
+ * Format shortcut legend
77
+ */
78
+ export declare function formatShortcutLegend(): string;
79
+ /**
80
+ * Format table output for non-interactive mode
81
+ */
82
+ export declare function formatPrTable(prs: PrDisplayItem[], previewLabel?: string): string;
83
+ //# sourceMappingURL=formatters.d.ts.map