@camaradesuk/git-worktree-tools 1.4.1 → 1.6.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 (200) hide show
  1. package/README.md +82 -11
  2. package/dist/api/list.d.ts +10 -4
  3. package/dist/api/list.d.ts.map +1 -1
  4. package/dist/api/list.js +5 -1
  5. package/dist/api/list.js.map +1 -1
  6. package/dist/api/list.test.d.ts +5 -0
  7. package/dist/api/list.test.d.ts.map +1 -0
  8. package/dist/api/list.test.js +390 -0
  9. package/dist/api/list.test.js.map +1 -0
  10. package/dist/cli/cleanpr.js +35 -4
  11. package/dist/cli/cleanpr.js.map +1 -1
  12. package/dist/cli/cleanpr.test.js +254 -0
  13. package/dist/cli/cleanpr.test.js.map +1 -1
  14. package/dist/cli/lswt.js +54 -6
  15. package/dist/cli/lswt.js.map +1 -1
  16. package/dist/cli/lswt.test.js +207 -0
  17. package/dist/cli/lswt.test.js.map +1 -1
  18. package/dist/cli/newpr.js +94 -66
  19. package/dist/cli/newpr.js.map +1 -1
  20. package/dist/cli/newpr.test.js +10 -9
  21. package/dist/cli/newpr.test.js.map +1 -1
  22. package/dist/cli/wt/clean.d.ts +16 -0
  23. package/dist/cli/wt/clean.d.ts.map +1 -0
  24. package/dist/cli/wt/clean.js +64 -0
  25. package/dist/cli/wt/clean.js.map +1 -0
  26. package/dist/cli/wt/completion.d.ts +12 -0
  27. package/dist/cli/wt/completion.d.ts.map +1 -0
  28. package/dist/cli/wt/completion.js +246 -0
  29. package/dist/cli/wt/completion.js.map +1 -0
  30. package/dist/cli/wt/completion.test.d.ts +5 -0
  31. package/dist/cli/wt/completion.test.d.ts.map +1 -0
  32. package/dist/cli/wt/completion.test.js +173 -0
  33. package/dist/cli/wt/completion.test.js.map +1 -0
  34. package/dist/cli/wt/config.d.ts +13 -0
  35. package/dist/cli/wt/config.d.ts.map +1 -0
  36. package/dist/cli/wt/config.js +40 -0
  37. package/dist/cli/wt/config.js.map +1 -0
  38. package/dist/cli/wt/entry.test.d.ts +8 -0
  39. package/dist/cli/wt/entry.test.d.ts.map +1 -0
  40. package/dist/cli/wt/entry.test.js +198 -0
  41. package/dist/cli/wt/entry.test.js.map +1 -0
  42. package/dist/cli/wt/link.d.ts +13 -0
  43. package/dist/cli/wt/link.d.ts.map +1 -0
  44. package/dist/cli/wt/link.js +88 -0
  45. package/dist/cli/wt/link.js.map +1 -0
  46. package/dist/cli/wt/list.d.ts +16 -0
  47. package/dist/cli/wt/list.d.ts.map +1 -0
  48. package/dist/cli/wt/list.js +65 -0
  49. package/dist/cli/wt/list.js.map +1 -0
  50. package/dist/cli/wt/new.d.ts +18 -0
  51. package/dist/cli/wt/new.d.ts.map +1 -0
  52. package/dist/cli/wt/new.js +78 -0
  53. package/dist/cli/wt/new.js.map +1 -0
  54. package/dist/cli/wt/run-command.d.ts +31 -0
  55. package/dist/cli/wt/run-command.d.ts.map +1 -0
  56. package/dist/cli/wt/run-command.js +49 -0
  57. package/dist/cli/wt/run-command.js.map +1 -0
  58. package/dist/cli/wt/run-command.test.d.ts +5 -0
  59. package/dist/cli/wt/run-command.test.d.ts.map +1 -0
  60. package/dist/cli/wt/run-command.test.js +88 -0
  61. package/dist/cli/wt/run-command.test.js.map +1 -0
  62. package/dist/cli/wt/state.d.ts +13 -0
  63. package/dist/cli/wt/state.d.ts.map +1 -0
  64. package/dist/cli/wt/state.js +38 -0
  65. package/dist/cli/wt/state.js.map +1 -0
  66. package/dist/cli/wt/wt.test.d.ts +8 -0
  67. package/dist/cli/wt/wt.test.d.ts.map +1 -0
  68. package/dist/cli/wt/wt.test.js +378 -0
  69. package/dist/cli/wt/wt.test.js.map +1 -0
  70. package/dist/cli/wt.d.ts +25 -0
  71. package/dist/cli/wt.d.ts.map +1 -0
  72. package/dist/cli/wt.js +74 -0
  73. package/dist/cli/wt.js.map +1 -0
  74. package/dist/cli/wtconfig.js +4 -4
  75. package/dist/cli/wtconfig.js.map +1 -1
  76. package/dist/cli/wtlink.js +66 -9
  77. package/dist/cli/wtlink.js.map +1 -1
  78. package/dist/cli/wtlink.test.js +101 -0
  79. package/dist/cli/wtlink.test.js.map +1 -1
  80. package/dist/e2e/cli.e2e.test.js +156 -1
  81. package/dist/e2e/cli.e2e.test.js.map +1 -1
  82. package/dist/e2e/lswt/lswt.e2e.test.js +33 -0
  83. package/dist/e2e/lswt/lswt.e2e.test.js.map +1 -1
  84. package/dist/e2e/newpr-full-flow.e2e.test.d.ts +2 -0
  85. package/dist/e2e/newpr-full-flow.e2e.test.d.ts.map +1 -0
  86. package/dist/e2e/newpr-full-flow.e2e.test.js +279 -0
  87. package/dist/e2e/newpr-full-flow.e2e.test.js.map +1 -0
  88. package/dist/e2e/wtlink/wtlink.e2e.test.js +52 -0
  89. package/dist/e2e/wtlink/wtlink.e2e.test.js.map +1 -1
  90. package/dist/integration/lswt-remote-pr.integration.test.d.ts +2 -0
  91. package/dist/integration/lswt-remote-pr.integration.test.d.ts.map +1 -0
  92. package/dist/integration/lswt-remote-pr.integration.test.js +222 -0
  93. package/dist/integration/lswt-remote-pr.integration.test.js.map +1 -0
  94. package/dist/integration/newpr-branchfrom-head.integration.test.d.ts +2 -0
  95. package/dist/integration/newpr-branchfrom-head.integration.test.d.ts.map +1 -0
  96. package/dist/integration/newpr-branchfrom-head.integration.test.js +498 -0
  97. package/dist/integration/newpr-branchfrom-head.integration.test.js.map +1 -0
  98. package/dist/lib/git.d.ts +1 -0
  99. package/dist/lib/git.d.ts.map +1 -1
  100. package/dist/lib/git.js +17 -30
  101. package/dist/lib/git.js.map +1 -1
  102. package/dist/lib/git.test.js +154 -123
  103. package/dist/lib/git.test.js.map +1 -1
  104. package/dist/lib/github.d.ts +45 -0
  105. package/dist/lib/github.d.ts.map +1 -1
  106. package/dist/lib/github.js +172 -0
  107. package/dist/lib/github.js.map +1 -1
  108. package/dist/lib/github.test.js +127 -1
  109. package/dist/lib/github.test.js.map +1 -1
  110. package/dist/lib/json-output.d.ts +11 -1
  111. package/dist/lib/json-output.d.ts.map +1 -1
  112. package/dist/lib/json-output.js +42 -1
  113. package/dist/lib/json-output.js.map +1 -1
  114. package/dist/lib/json-output.test.js +2 -0
  115. package/dist/lib/json-output.test.js.map +1 -1
  116. package/dist/lib/lswt/action-executors.d.ts.map +1 -1
  117. package/dist/lib/lswt/action-executors.js +143 -35
  118. package/dist/lib/lswt/action-executors.js.map +1 -1
  119. package/dist/lib/lswt/action-executors.test.js +362 -0
  120. package/dist/lib/lswt/action-executors.test.js.map +1 -1
  121. package/dist/lib/lswt/actions.d.ts.map +1 -1
  122. package/dist/lib/lswt/actions.js +38 -0
  123. package/dist/lib/lswt/actions.js.map +1 -1
  124. package/dist/lib/lswt/actions.test.js +126 -0
  125. package/dist/lib/lswt/actions.test.js.map +1 -1
  126. package/dist/lib/lswt/environment.d.ts +4 -0
  127. package/dist/lib/lswt/environment.d.ts.map +1 -1
  128. package/dist/lib/lswt/environment.js +23 -0
  129. package/dist/lib/lswt/environment.js.map +1 -1
  130. package/dist/lib/lswt/environment.test.js +129 -2
  131. package/dist/lib/lswt/environment.test.js.map +1 -1
  132. package/dist/lib/lswt/formatters.d.ts +2 -1
  133. package/dist/lib/lswt/formatters.d.ts.map +1 -1
  134. package/dist/lib/lswt/formatters.js +27 -2
  135. package/dist/lib/lswt/formatters.js.map +1 -1
  136. package/dist/lib/lswt/formatters.test.js +66 -2
  137. package/dist/lib/lswt/formatters.test.js.map +1 -1
  138. package/dist/lib/lswt/fuzzy-search.d.ts +27 -0
  139. package/dist/lib/lswt/fuzzy-search.d.ts.map +1 -0
  140. package/dist/lib/lswt/fuzzy-search.js +130 -0
  141. package/dist/lib/lswt/fuzzy-search.js.map +1 -0
  142. package/dist/lib/lswt/fuzzy-search.test.d.ts +5 -0
  143. package/dist/lib/lswt/fuzzy-search.test.d.ts.map +1 -0
  144. package/dist/lib/lswt/fuzzy-search.test.js +207 -0
  145. package/dist/lib/lswt/fuzzy-search.test.js.map +1 -0
  146. package/dist/lib/lswt/index.d.ts +3 -1
  147. package/dist/lib/lswt/index.d.ts.map +1 -1
  148. package/dist/lib/lswt/index.js +3 -2
  149. package/dist/lib/lswt/index.js.map +1 -1
  150. package/dist/lib/lswt/interactive.d.ts +50 -4
  151. package/dist/lib/lswt/interactive.d.ts.map +1 -1
  152. package/dist/lib/lswt/interactive.js +458 -56
  153. package/dist/lib/lswt/interactive.js.map +1 -1
  154. package/dist/lib/lswt/interactive.test.js +454 -66
  155. package/dist/lib/lswt/interactive.test.js.map +1 -1
  156. package/dist/lib/lswt/types.d.ts +8 -2
  157. package/dist/lib/lswt/types.d.ts.map +1 -1
  158. package/dist/lib/lswt/worktree-info.d.ts +11 -0
  159. package/dist/lib/lswt/worktree-info.d.ts.map +1 -1
  160. package/dist/lib/lswt/worktree-info.js +48 -0
  161. package/dist/lib/lswt/worktree-info.js.map +1 -1
  162. package/dist/lib/lswt/worktree-info.test.js +169 -0
  163. package/dist/lib/lswt/worktree-info.test.js.map +1 -1
  164. package/dist/lib/newpr/action-deps.test.d.ts +5 -0
  165. package/dist/lib/newpr/action-deps.test.d.ts.map +1 -0
  166. package/dist/lib/newpr/action-deps.test.js +111 -0
  167. package/dist/lib/newpr/action-deps.test.js.map +1 -0
  168. package/dist/lib/newpr/args.d.ts.map +1 -1
  169. package/dist/lib/newpr/args.js +6 -2
  170. package/dist/lib/newpr/args.js.map +1 -1
  171. package/dist/lib/newpr/args.test.js +209 -1
  172. package/dist/lib/newpr/args.test.js.map +1 -1
  173. package/dist/lib/newpr/scenario-handler.d.ts.map +1 -1
  174. package/dist/lib/newpr/scenario-handler.js +14 -5
  175. package/dist/lib/newpr/scenario-handler.js.map +1 -1
  176. package/dist/lib/newpr/scenario-handler.test.js +6 -0
  177. package/dist/lib/newpr/scenario-handler.test.js.map +1 -1
  178. package/dist/lib/prompts.d.ts +4 -0
  179. package/dist/lib/prompts.d.ts.map +1 -1
  180. package/dist/lib/prompts.js +178 -1
  181. package/dist/lib/prompts.js.map +1 -1
  182. package/dist/lib/prompts.test.js +279 -0
  183. package/dist/lib/prompts.test.js.map +1 -1
  184. package/dist/lib/wtlink/link-configs.test.js +282 -2
  185. package/dist/lib/wtlink/link-configs.test.js.map +1 -1
  186. package/dist/lib/wtlink/main-menu.js +1 -0
  187. package/dist/lib/wtlink/main-menu.js.map +1 -1
  188. package/dist/lib/wtlink/main-menu.test.d.ts +5 -0
  189. package/dist/lib/wtlink/main-menu.test.d.ts.map +1 -0
  190. package/dist/lib/wtlink/main-menu.test.js +124 -0
  191. package/dist/lib/wtlink/main-menu.test.js.map +1 -0
  192. package/dist/lib/wtlink/manage-manifest.d.ts +5 -0
  193. package/dist/lib/wtlink/manage-manifest.d.ts.map +1 -1
  194. package/dist/lib/wtlink/manage-manifest.js +65 -2
  195. package/dist/lib/wtlink/manage-manifest.js.map +1 -1
  196. package/dist/lib/wtlink/manage-manifest.test.js +144 -2
  197. package/dist/lib/wtlink/manage-manifest.test.js.map +1 -1
  198. package/dist/mcp/server.test.js +49 -0
  199. package/dist/mcp/server.test.js.map +1 -1
  200. package/package.json +2 -1
package/README.md CHANGED
@@ -30,27 +30,51 @@ npm install -g @camaradesuk/git-worktree-tools
30
30
  ## Quick Start
31
31
 
32
32
  ```bash
33
- # Create a new PR with worktree
33
+ # Using the unified wt command (recommended)
34
+ wt new "Add user authentication feature" # Create PR with worktree
35
+ wt list # List worktrees
36
+ wt clean # Clean up merged/closed PRs
37
+ wt link # Manage shared config files
38
+ wt state --json # Query git state
39
+ wt config init # Configure settings
40
+
41
+ # Or use individual commands directly
34
42
  newpr "Add user authentication feature"
35
-
36
- # List all worktrees
37
43
  lswt
38
-
39
- # Clean up merged/closed PR worktrees
40
44
  cleanpr
41
-
42
- # Manage shared config files between worktrees
43
45
  wtlink
44
-
45
- # Query git state (for AI agents)
46
46
  wtstate --json
47
-
48
- # Configure settings with interactive wizard
49
47
  wtconfig init
50
48
  ```
51
49
 
52
50
  ## Commands
53
51
 
52
+ ### wt (Unified Command)
53
+
54
+ The `wt` command provides a single entry point for all git-worktree-tools functionality:
55
+
56
+ ```bash
57
+ wt <command> [options]
58
+ ```
59
+
60
+ | Command | Alias | Description |
61
+ | -------------------- | -------- | ----------------------------------- |
62
+ | `wt new <desc>` | `wt n` | Create a new PR with worktree |
63
+ | `wt list` | `wt ls` | List worktrees with PR status |
64
+ | `wt clean [pr]` | `wt c` | Clean up merged/closed PR worktrees |
65
+ | `wt link [cmd]` | `wt l` | Manage gitignored files via links |
66
+ | `wt state` | `wt s` | Query git worktree state |
67
+ | `wt config [cmd]` | `wt cfg` | Configuration management |
68
+ | `wt completion <sh>` | - | Generate shell completion scripts |
69
+
70
+ All subcommands accept the same options as their standalone equivalents. For example:
71
+
72
+ ```bash
73
+ wt new "Add feature" --draft # Same as: newpr "Add feature" --draft
74
+ wt list --json # Same as: lswt --json
75
+ wt clean --all # Same as: cleanpr --all
76
+ ```
77
+
54
78
  ### newpr
55
79
 
56
80
  Create a new PR with an associated worktree.
@@ -107,6 +131,15 @@ When running in a TTY terminal, `lswt` enters interactive mode where you can sel
107
131
  | `r` | Remove worktree (not available for main) |
108
132
  | `q` | Quit |
109
133
 
134
+ **Fuzzy search** — Press `/` to enter search mode and filter worktrees by:
135
+
136
+ - Branch name (`dark-mode`, `feat/auth`)
137
+ - PR number (`#42`, `42`)
138
+ - PR title (`Add dark mode`)
139
+ - PR state (`OPEN`, `MERGED`, `CLOSED`)
140
+
141
+ The search uses fuzzy matching, so typing `dm` will match `dark-mode`. Press `Enter` to confirm the filter, `Escape` to cancel, or `Backspace` to edit.
142
+
110
143
  Use `--no-interactive` to disable interactive mode, or pipe output to automatically switch to list mode.
111
144
 
112
145
  ### wtlink
@@ -550,6 +583,44 @@ cleanpr
550
583
  # → Deletes local branches
551
584
  ```
552
585
 
586
+ ## Shell Completion
587
+
588
+ Enable tab completion for `wt` commands in your shell:
589
+
590
+ ### Bash
591
+
592
+ ```bash
593
+ # Add to ~/.bashrc
594
+ wt completion bash >> ~/.bashrc
595
+ source ~/.bashrc
596
+ ```
597
+
598
+ ### Zsh
599
+
600
+ ```bash
601
+ # Create completion directory and add completion
602
+ mkdir -p ~/.zsh/completions
603
+ wt completion zsh > ~/.zsh/completions/_wt
604
+
605
+ # Add to ~/.zshrc (if not already present)
606
+ fpath=(~/.zsh/completions $fpath)
607
+ autoload -Uz compinit && compinit
608
+ ```
609
+
610
+ ### Fish
611
+
612
+ ```bash
613
+ wt completion fish > ~/.config/fish/completions/wt.fish
614
+ ```
615
+
616
+ After setup, you can tab-complete commands and options:
617
+
618
+ ```bash
619
+ wt <TAB> # Shows: new, list, clean, link, state, config, completion
620
+ wt new --<TAB> # Shows: --pr, --draft, --json, --non-interactive, --action
621
+ wt list --<TAB> # Shows: --verbose, --json, --no-status, --no-interactive
622
+ ```
623
+
553
624
  ## Development
554
625
 
555
626
  ```bash
@@ -16,8 +16,8 @@ export interface WorktreeInfo {
16
16
  branch: string | null;
17
17
  /** Short commit hash */
18
18
  commit: string;
19
- /** Type of worktree: 'main', 'pr', 'branch', or 'detached' */
20
- type: 'main' | 'pr' | 'branch' | 'detached';
19
+ /** Type of worktree: 'main', 'pr', 'branch', 'detached', or 'remote_pr' */
20
+ type: 'main' | 'pr' | 'branch' | 'detached' | 'remote_pr';
21
21
  /** PR number if this is a PR worktree */
22
22
  prNumber: number | null;
23
23
  /** PR state: 'OPEN', 'MERGED', 'CLOSED', or null if not a PR */
@@ -26,6 +26,10 @@ export interface WorktreeInfo {
26
26
  isDraft: boolean | null;
27
27
  /** Whether the worktree has uncommitted changes */
28
28
  hasChanges: boolean;
29
+ /** PR title (for remote PRs that have no local worktree) */
30
+ prTitle?: string;
31
+ /** PR URL (for remote PRs) */
32
+ prUrl?: string;
29
33
  }
30
34
  /**
31
35
  * Options for listing worktrees
@@ -44,9 +48,11 @@ export interface ListWorktreesResultData {
44
48
  worktrees: WorktreeInfo[];
45
49
  /** Total number of worktrees */
46
50
  total: number;
47
- /** Number of PR worktrees */
51
+ /** Number of local PR worktrees */
48
52
  prCount: number;
49
- /** Number of open PRs */
53
+ /** Number of remote PRs without local worktrees */
54
+ remotePrCount: number;
55
+ /** Number of open PRs (local and remote) */
50
56
  openCount: number;
51
57
  /** Number of worktrees with uncommitted changes */
52
58
  changesCount: number;
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/api/list.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,EACL,KAAK,aAAa,EAInB,MAAM,uBAAuB,CAAC;AAI/B;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC5C,yCAAyC;IACzC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,gEAAgE;IAChE,OAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC;IAC7C,4DAA4D;IAC5D,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,mDAAmD;IACnD,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,sDAAsD;IACtD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wDAAwD;IACxD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,wBAAwB;IACxB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,aAAa,CAAC,uBAAuB,CAAC,CAAC;AAEzE;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,aAAa,CACjC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CAiE9B"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/api/list.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,EACL,KAAK,aAAa,EAInB,MAAM,uBAAuB,CAAC;AAI/B;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAC;IAC1D,yCAAyC;IACzC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,gEAAgE;IAChE,OAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC;IAC7C,4DAA4D;IAC5D,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,mDAAmD;IACnD,UAAU,EAAE,OAAO,CAAC;IACpB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,sDAAsD;IACtD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wDAAwD;IACxD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,wBAAwB;IACxB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,aAAa,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,aAAa,CAAC,uBAAuB,CAAC,CAAC;AAEzE;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,aAAa,CACjC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CAqE9B"}
package/dist/api/list.js CHANGED
@@ -47,7 +47,7 @@ export async function listWorktrees(options = {}) {
47
47
  // Gather worktree info
48
48
  const deps = createDefaultDeps();
49
49
  const worktreeDisplays = await gatherWorktreeInfo(repoRoot, listOptions, deps);
50
- // Map to our API type
50
+ // Map to our API type (include prTitle and prUrl for remote PRs)
51
51
  const worktrees = worktreeDisplays.map((wt) => ({
52
52
  path: wt.path,
53
53
  name: wt.name,
@@ -58,15 +58,19 @@ export async function listWorktrees(options = {}) {
58
58
  prState: wt.prState,
59
59
  isDraft: wt.isDraft,
60
60
  hasChanges: wt.hasChanges,
61
+ ...(wt.prTitle && { prTitle: wt.prTitle }),
62
+ ...(wt.prUrl && { prUrl: wt.prUrl }),
61
63
  }));
62
64
  // Calculate summary stats
63
65
  const prCount = worktrees.filter((w) => w.type === 'pr').length;
66
+ const remotePrCount = worktrees.filter((w) => w.type === 'remote_pr').length;
64
67
  const openCount = worktrees.filter((w) => w.prState === 'OPEN').length;
65
68
  const changesCount = worktrees.filter((w) => w.hasChanges).length;
66
69
  const data = {
67
70
  worktrees,
68
71
  total: worktrees.length,
69
72
  prCount,
73
+ remotePrCount,
70
74
  openCount,
71
75
  changesCount,
72
76
  };
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/api/list.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/api/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for the list worktrees API
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=list.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.test.d.ts","sourceRoot":"","sources":["../../src/api/list.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,390 @@
1
+ /**
2
+ * Tests for the list worktrees API
3
+ */
4
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
5
+ import { listWorktrees } from './list.js';
6
+ // Mock dependencies
7
+ vi.mock('../lib/git.js', () => ({
8
+ getRepoRoot: vi.fn(),
9
+ }));
10
+ vi.mock('../lib/github.js', () => ({
11
+ isGhInstalled: vi.fn(),
12
+ }));
13
+ vi.mock('../lib/lswt/index.js', () => ({
14
+ gatherWorktreeInfo: vi.fn(),
15
+ createDefaultDeps: vi.fn(() => ({})),
16
+ }));
17
+ import * as git from '../lib/git.js';
18
+ import * as github from '../lib/github.js';
19
+ import { gatherWorktreeInfo } from '../lib/lswt/index.js';
20
+ describe('api/list', () => {
21
+ beforeEach(() => {
22
+ vi.clearAllMocks();
23
+ });
24
+ describe('listWorktrees', () => {
25
+ it('returns error when not in a git repository', async () => {
26
+ vi.mocked(git.getRepoRoot).mockReturnValue(null);
27
+ const result = await listWorktrees();
28
+ expect(result.success).toBe(false);
29
+ expect(result.error?.code).toBe('NOT_GIT_REPO');
30
+ });
31
+ it('returns worktrees with basic fields', async () => {
32
+ vi.mocked(git.getRepoRoot).mockReturnValue('/test/repo');
33
+ vi.mocked(github.isGhInstalled).mockReturnValue(true);
34
+ vi.mocked(gatherWorktreeInfo).mockResolvedValue([
35
+ {
36
+ path: '/test/repo',
37
+ name: 'repo',
38
+ branch: 'main',
39
+ commit: 'abc123',
40
+ type: 'main',
41
+ prNumber: null,
42
+ prState: null,
43
+ isDraft: null,
44
+ hasChanges: false,
45
+ },
46
+ ]);
47
+ const result = await listWorktrees({ showStatus: true });
48
+ expect(result.success).toBe(true);
49
+ expect(result.data?.worktrees).toHaveLength(1);
50
+ expect(result.data?.worktrees[0]).toEqual({
51
+ path: '/test/repo',
52
+ name: 'repo',
53
+ branch: 'main',
54
+ commit: 'abc123',
55
+ type: 'main',
56
+ prNumber: null,
57
+ prState: null,
58
+ isDraft: null,
59
+ hasChanges: false,
60
+ });
61
+ });
62
+ it('includes prTitle and prUrl for remote PRs', async () => {
63
+ vi.mocked(git.getRepoRoot).mockReturnValue('/test/repo');
64
+ vi.mocked(github.isGhInstalled).mockReturnValue(true);
65
+ vi.mocked(gatherWorktreeInfo).mockResolvedValue([
66
+ {
67
+ path: '/test/repo',
68
+ name: 'repo',
69
+ branch: 'main',
70
+ commit: 'abc123',
71
+ type: 'main',
72
+ prNumber: null,
73
+ prState: null,
74
+ isDraft: null,
75
+ hasChanges: false,
76
+ },
77
+ {
78
+ path: '[remote]',
79
+ name: 'PR #42',
80
+ branch: 'feature/new-feature',
81
+ commit: 'def456',
82
+ type: 'remote_pr',
83
+ prNumber: 42,
84
+ prState: 'OPEN',
85
+ isDraft: false,
86
+ hasChanges: false,
87
+ prTitle: 'Add amazing new feature',
88
+ prUrl: 'https://github.com/test/repo/pull/42',
89
+ },
90
+ ]);
91
+ const result = await listWorktrees({ showStatus: true });
92
+ expect(result.success).toBe(true);
93
+ expect(result.data?.worktrees).toHaveLength(2);
94
+ const remotePr = result.data?.worktrees.find((w) => w.type === 'remote_pr');
95
+ expect(remotePr).toBeDefined();
96
+ expect(remotePr?.prTitle).toBe('Add amazing new feature');
97
+ expect(remotePr?.prUrl).toBe('https://github.com/test/repo/pull/42');
98
+ expect(remotePr?.prNumber).toBe(42);
99
+ expect(remotePr?.prState).toBe('OPEN');
100
+ });
101
+ it('does not include prTitle/prUrl when not present', async () => {
102
+ vi.mocked(git.getRepoRoot).mockReturnValue('/test/repo');
103
+ vi.mocked(github.isGhInstalled).mockReturnValue(true);
104
+ vi.mocked(gatherWorktreeInfo).mockResolvedValue([
105
+ {
106
+ path: '/test/repo.pr42',
107
+ name: 'repo.pr42',
108
+ branch: 'feature/local-pr',
109
+ commit: 'abc123',
110
+ type: 'pr',
111
+ prNumber: 42,
112
+ prState: 'OPEN',
113
+ isDraft: false,
114
+ hasChanges: true,
115
+ // No prTitle or prUrl - these are only for remote PRs
116
+ },
117
+ ]);
118
+ const result = await listWorktrees({ showStatus: true });
119
+ expect(result.success).toBe(true);
120
+ const localPr = result.data?.worktrees[0];
121
+ expect(localPr?.type).toBe('pr');
122
+ expect(localPr).not.toHaveProperty('prTitle');
123
+ expect(localPr).not.toHaveProperty('prUrl');
124
+ });
125
+ describe('summary stats', () => {
126
+ it('calculates prCount for local PR worktrees only', async () => {
127
+ vi.mocked(git.getRepoRoot).mockReturnValue('/test/repo');
128
+ vi.mocked(github.isGhInstalled).mockReturnValue(true);
129
+ vi.mocked(gatherWorktreeInfo).mockResolvedValue([
130
+ {
131
+ path: '/test/repo',
132
+ name: 'repo',
133
+ branch: 'main',
134
+ commit: 'abc123',
135
+ type: 'main',
136
+ prNumber: null,
137
+ prState: null,
138
+ isDraft: null,
139
+ hasChanges: false,
140
+ },
141
+ {
142
+ path: '/test/repo.pr1',
143
+ name: 'repo.pr1',
144
+ branch: 'feature/one',
145
+ commit: 'pr1abc',
146
+ type: 'pr',
147
+ prNumber: 1,
148
+ prState: 'OPEN',
149
+ isDraft: false,
150
+ hasChanges: false,
151
+ },
152
+ {
153
+ path: '/test/repo.pr2',
154
+ name: 'repo.pr2',
155
+ branch: 'feature/two',
156
+ commit: 'pr2abc',
157
+ type: 'pr',
158
+ prNumber: 2,
159
+ prState: 'MERGED',
160
+ isDraft: false,
161
+ hasChanges: false,
162
+ },
163
+ ]);
164
+ const result = await listWorktrees({ showStatus: true });
165
+ expect(result.success).toBe(true);
166
+ expect(result.data?.prCount).toBe(2);
167
+ });
168
+ it('calculates remotePrCount for remote PRs without local worktrees', async () => {
169
+ vi.mocked(git.getRepoRoot).mockReturnValue('/test/repo');
170
+ vi.mocked(github.isGhInstalled).mockReturnValue(true);
171
+ vi.mocked(gatherWorktreeInfo).mockResolvedValue([
172
+ {
173
+ path: '/test/repo',
174
+ name: 'repo',
175
+ branch: 'main',
176
+ commit: 'abc123',
177
+ type: 'main',
178
+ prNumber: null,
179
+ prState: null,
180
+ isDraft: null,
181
+ hasChanges: false,
182
+ },
183
+ {
184
+ path: '[remote]',
185
+ name: 'PR #10',
186
+ branch: 'feature/remote-one',
187
+ commit: 'rem1abc',
188
+ type: 'remote_pr',
189
+ prNumber: 10,
190
+ prState: 'OPEN',
191
+ isDraft: false,
192
+ hasChanges: false,
193
+ prTitle: 'Remote PR One',
194
+ prUrl: 'https://github.com/test/repo/pull/10',
195
+ },
196
+ {
197
+ path: '[remote]',
198
+ name: 'PR #20',
199
+ branch: 'feature/remote-two',
200
+ commit: 'rem2abc',
201
+ type: 'remote_pr',
202
+ prNumber: 20,
203
+ prState: 'OPEN',
204
+ isDraft: true,
205
+ hasChanges: false,
206
+ prTitle: 'Remote PR Two',
207
+ prUrl: 'https://github.com/test/repo/pull/20',
208
+ },
209
+ ]);
210
+ const result = await listWorktrees({ showStatus: true });
211
+ expect(result.success).toBe(true);
212
+ expect(result.data?.remotePrCount).toBe(2);
213
+ expect(result.data?.prCount).toBe(0); // No local PR worktrees
214
+ });
215
+ it('calculates openCount including both local and remote PRs', async () => {
216
+ vi.mocked(git.getRepoRoot).mockReturnValue('/test/repo');
217
+ vi.mocked(github.isGhInstalled).mockReturnValue(true);
218
+ vi.mocked(gatherWorktreeInfo).mockResolvedValue([
219
+ {
220
+ path: '/test/repo.pr1',
221
+ name: 'repo.pr1',
222
+ branch: 'feature/local',
223
+ commit: 'loc1abc',
224
+ type: 'pr',
225
+ prNumber: 1,
226
+ prState: 'OPEN',
227
+ isDraft: false,
228
+ hasChanges: false,
229
+ },
230
+ {
231
+ path: '/test/repo.pr2',
232
+ name: 'repo.pr2',
233
+ branch: 'feature/merged',
234
+ commit: 'loc2abc',
235
+ type: 'pr',
236
+ prNumber: 2,
237
+ prState: 'MERGED',
238
+ isDraft: false,
239
+ hasChanges: false,
240
+ },
241
+ {
242
+ path: '[remote]',
243
+ name: 'PR #10',
244
+ branch: 'feature/remote',
245
+ commit: 'rem1abc',
246
+ type: 'remote_pr',
247
+ prNumber: 10,
248
+ prState: 'OPEN',
249
+ isDraft: false,
250
+ hasChanges: false,
251
+ prTitle: 'Remote Open PR',
252
+ prUrl: 'https://github.com/test/repo/pull/10',
253
+ },
254
+ ]);
255
+ const result = await listWorktrees({ showStatus: true });
256
+ expect(result.success).toBe(true);
257
+ // 1 local open + 1 remote open = 2 open PRs
258
+ expect(result.data?.openCount).toBe(2);
259
+ expect(result.data?.prCount).toBe(2); // 2 local PR worktrees
260
+ expect(result.data?.remotePrCount).toBe(1); // 1 remote PR
261
+ });
262
+ it('calculates changesCount correctly', async () => {
263
+ vi.mocked(git.getRepoRoot).mockReturnValue('/test/repo');
264
+ vi.mocked(github.isGhInstalled).mockReturnValue(true);
265
+ vi.mocked(gatherWorktreeInfo).mockResolvedValue([
266
+ {
267
+ path: '/test/repo',
268
+ name: 'repo',
269
+ branch: 'main',
270
+ commit: 'abc123',
271
+ type: 'main',
272
+ prNumber: null,
273
+ prState: null,
274
+ isDraft: null,
275
+ hasChanges: true,
276
+ },
277
+ {
278
+ path: '/test/repo.pr1',
279
+ name: 'repo.pr1',
280
+ branch: 'feature/dirty',
281
+ commit: 'pr1abc',
282
+ type: 'pr',
283
+ prNumber: 1,
284
+ prState: 'OPEN',
285
+ isDraft: false,
286
+ hasChanges: true,
287
+ },
288
+ {
289
+ path: '/test/repo.pr2',
290
+ name: 'repo.pr2',
291
+ branch: 'feature/clean',
292
+ commit: 'pr2abc',
293
+ type: 'pr',
294
+ prNumber: 2,
295
+ prState: 'OPEN',
296
+ isDraft: false,
297
+ hasChanges: false,
298
+ },
299
+ ]);
300
+ const result = await listWorktrees({ showStatus: true });
301
+ expect(result.success).toBe(true);
302
+ expect(result.data?.changesCount).toBe(2); // main + pr1 have changes
303
+ });
304
+ it('calculates total including all worktree types', async () => {
305
+ vi.mocked(git.getRepoRoot).mockReturnValue('/test/repo');
306
+ vi.mocked(github.isGhInstalled).mockReturnValue(true);
307
+ vi.mocked(gatherWorktreeInfo).mockResolvedValue([
308
+ {
309
+ path: '/test/repo',
310
+ name: 'repo',
311
+ branch: 'main',
312
+ commit: 'abc123',
313
+ type: 'main',
314
+ prNumber: null,
315
+ prState: null,
316
+ isDraft: null,
317
+ hasChanges: false,
318
+ },
319
+ {
320
+ path: '/test/repo.pr1',
321
+ name: 'repo.pr1',
322
+ branch: 'feature/local',
323
+ commit: 'pr1abc',
324
+ type: 'pr',
325
+ prNumber: 1,
326
+ prState: 'OPEN',
327
+ isDraft: false,
328
+ hasChanges: false,
329
+ },
330
+ {
331
+ path: '[remote]',
332
+ name: 'PR #10',
333
+ branch: 'feature/remote',
334
+ commit: 'rem1abc',
335
+ type: 'remote_pr',
336
+ prNumber: 10,
337
+ prState: 'OPEN',
338
+ isDraft: false,
339
+ hasChanges: false,
340
+ prTitle: 'Remote PR',
341
+ prUrl: 'https://github.com/test/repo/pull/10',
342
+ },
343
+ {
344
+ path: '/test/branch-wt',
345
+ name: 'branch-wt',
346
+ branch: 'feature/no-pr',
347
+ commit: 'branchabc',
348
+ type: 'branch',
349
+ prNumber: null,
350
+ prState: null,
351
+ isDraft: null,
352
+ hasChanges: false,
353
+ },
354
+ ]);
355
+ const result = await listWorktrees({ showStatus: true });
356
+ expect(result.success).toBe(true);
357
+ expect(result.data?.total).toBe(4); // main + pr + remote_pr + branch
358
+ });
359
+ });
360
+ describe('warnings', () => {
361
+ it('adds warning when gh is not installed but showStatus is requested', async () => {
362
+ vi.mocked(git.getRepoRoot).mockReturnValue('/test/repo');
363
+ vi.mocked(github.isGhInstalled).mockReturnValue(false);
364
+ vi.mocked(gatherWorktreeInfo).mockResolvedValue([]);
365
+ const result = await listWorktrees({ showStatus: true });
366
+ expect(result.success).toBe(true);
367
+ expect(result.warnings).toBeDefined();
368
+ expect(result.warnings).toContain('GitHub CLI (gh) not installed. PR status will not be shown.');
369
+ });
370
+ it('does not add warning when showStatus is false', async () => {
371
+ vi.mocked(git.getRepoRoot).mockReturnValue('/test/repo');
372
+ vi.mocked(github.isGhInstalled).mockReturnValue(false);
373
+ vi.mocked(gatherWorktreeInfo).mockResolvedValue([]);
374
+ const result = await listWorktrees({ showStatus: false });
375
+ expect(result.success).toBe(true);
376
+ expect(result.warnings).toBeUndefined();
377
+ });
378
+ });
379
+ describe('cwd option', () => {
380
+ it('passes cwd to getRepoRoot', async () => {
381
+ vi.mocked(git.getRepoRoot).mockReturnValue('/custom/path/repo');
382
+ vi.mocked(github.isGhInstalled).mockReturnValue(true);
383
+ vi.mocked(gatherWorktreeInfo).mockResolvedValue([]);
384
+ await listWorktrees({ cwd: '/custom/path' });
385
+ expect(git.getRepoRoot).toHaveBeenCalledWith('/custom/path');
386
+ });
387
+ });
388
+ });
389
+ });
390
+ //# sourceMappingURL=list.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.test.js","sourceRoot":"","sources":["../../src/api/list.test.ts"],"names":[],"mappings":"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"}