@camaradesuk/git-worktree-tools 1.7.0 → 1.8.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 (190) 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 +10 -1
  5. package/dist/cli/cleanpr.test.js.map +1 -1
  6. package/dist/cli/newpr.js +100 -28
  7. package/dist/cli/newpr.js.map +1 -1
  8. package/dist/cli/newpr.test.js +24 -6
  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 +408 -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 +25 -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.test.js +3 -0
  37. package/dist/cli/wtconfig.test.js.map +1 -1
  38. package/dist/cli/wtlink.d.ts +2 -1
  39. package/dist/cli/wtlink.d.ts.map +1 -1
  40. package/dist/cli/wtlink.js +41 -2
  41. package/dist/cli/wtlink.js.map +1 -1
  42. package/dist/e2e/cli.e2e.test.js +6 -2
  43. package/dist/e2e/cli.e2e.test.js.map +1 -1
  44. package/dist/e2e/helpers/cli-runner.d.ts.map +1 -1
  45. package/dist/e2e/helpers/cli-runner.js +1 -0
  46. package/dist/e2e/helpers/cli-runner.js.map +1 -1
  47. package/dist/e2e/helpers/gh-mock.d.ts.map +1 -1
  48. package/dist/e2e/helpers/gh-mock.js +55 -1
  49. package/dist/e2e/helpers/gh-mock.js.map +1 -1
  50. package/dist/e2e/helpers/pty-wrapper.d.ts +15 -0
  51. package/dist/e2e/helpers/pty-wrapper.d.ts.map +1 -1
  52. package/dist/e2e/helpers/pty-wrapper.js +65 -0
  53. package/dist/e2e/helpers/pty-wrapper.js.map +1 -1
  54. package/dist/e2e/newpr-full-flow.e2e.test.js +1 -0
  55. package/dist/e2e/newpr-full-flow.e2e.test.js.map +1 -1
  56. package/dist/e2e/prs/prs.e2e.test.d.ts +7 -0
  57. package/dist/e2e/prs/prs.e2e.test.d.ts.map +1 -0
  58. package/dist/e2e/prs/prs.e2e.test.js +606 -0
  59. package/dist/e2e/prs/prs.e2e.test.js.map +1 -0
  60. package/dist/e2e/wt/interactive-menu.e2e.test.d.ts +8 -0
  61. package/dist/e2e/wt/interactive-menu.e2e.test.d.ts.map +1 -0
  62. package/dist/e2e/wt/interactive-menu.e2e.test.js +583 -0
  63. package/dist/e2e/wt/interactive-menu.e2e.test.js.map +1 -0
  64. package/dist/e2e/wt/wt.e2e.test.js +217 -4
  65. package/dist/e2e/wt/wt.e2e.test.js.map +1 -1
  66. package/dist/integration/prs.integration.test.d.ts +8 -0
  67. package/dist/integration/prs.integration.test.d.ts.map +1 -0
  68. package/dist/integration/prs.integration.test.js +478 -0
  69. package/dist/integration/prs.integration.test.js.map +1 -0
  70. package/dist/lib/config-validation.d.ts.map +1 -1
  71. package/dist/lib/config-validation.js +56 -0
  72. package/dist/lib/config-validation.js.map +1 -1
  73. package/dist/lib/config.d.ts +34 -0
  74. package/dist/lib/config.d.ts.map +1 -1
  75. package/dist/lib/config.js +10 -0
  76. package/dist/lib/config.js.map +1 -1
  77. package/dist/lib/git.d.ts +32 -0
  78. package/dist/lib/git.d.ts.map +1 -1
  79. package/dist/lib/git.js +95 -1
  80. package/dist/lib/git.js.map +1 -1
  81. package/dist/lib/git.test.js +118 -1
  82. package/dist/lib/git.test.js.map +1 -1
  83. package/dist/lib/github.d.ts +41 -0
  84. package/dist/lib/github.d.ts.map +1 -1
  85. package/dist/lib/github.js +109 -0
  86. package/dist/lib/github.js.map +1 -1
  87. package/dist/lib/global-check.d.ts +2 -2
  88. package/dist/lib/global-check.js +3 -3
  89. package/dist/lib/global-check.js.map +1 -1
  90. package/dist/lib/global-check.test.js +3 -6
  91. package/dist/lib/global-check.test.js.map +1 -1
  92. package/dist/lib/json-output.d.ts +1 -0
  93. package/dist/lib/json-output.d.ts.map +1 -1
  94. package/dist/lib/json-output.js +2 -0
  95. package/dist/lib/json-output.js.map +1 -1
  96. package/dist/lib/lswt/action-executors.d.ts.map +1 -1
  97. package/dist/lib/lswt/action-executors.js +2 -1
  98. package/dist/lib/lswt/action-executors.js.map +1 -1
  99. package/dist/lib/lswt/action-executors.test.js +1 -0
  100. package/dist/lib/lswt/action-executors.test.js.map +1 -1
  101. package/dist/lib/lswt/actions.d.ts +1 -0
  102. package/dist/lib/lswt/actions.d.ts.map +1 -1
  103. package/dist/lib/lswt/actions.js +38 -10
  104. package/dist/lib/lswt/actions.js.map +1 -1
  105. package/dist/lib/lswt/actions.test.js +34 -22
  106. package/dist/lib/lswt/actions.test.js.map +1 -1
  107. package/dist/lib/lswt/interactive.js +8 -8
  108. package/dist/lib/lswt/interactive.js.map +1 -1
  109. package/dist/lib/prompts.d.ts.map +1 -1
  110. package/dist/lib/prompts.js +16 -12
  111. package/dist/lib/prompts.js.map +1 -1
  112. package/dist/lib/prs/actions.d.ts +70 -0
  113. package/dist/lib/prs/actions.d.ts.map +1 -0
  114. package/dist/lib/prs/actions.js +444 -0
  115. package/dist/lib/prs/actions.js.map +1 -0
  116. package/dist/lib/prs/actions.test.d.ts +5 -0
  117. package/dist/lib/prs/actions.test.d.ts.map +1 -0
  118. package/dist/lib/prs/actions.test.js +313 -0
  119. package/dist/lib/prs/actions.test.js.map +1 -0
  120. package/dist/lib/prs/data.d.ts +48 -0
  121. package/dist/lib/prs/data.d.ts.map +1 -0
  122. package/dist/lib/prs/data.js +171 -0
  123. package/dist/lib/prs/data.js.map +1 -0
  124. package/dist/lib/prs/data.test.d.ts +5 -0
  125. package/dist/lib/prs/data.test.d.ts.map +1 -0
  126. package/dist/lib/prs/data.test.js +417 -0
  127. package/dist/lib/prs/data.test.js.map +1 -0
  128. package/dist/lib/prs/details.d.ts +57 -0
  129. package/dist/lib/prs/details.d.ts.map +1 -0
  130. package/dist/lib/prs/details.js +246 -0
  131. package/dist/lib/prs/details.js.map +1 -0
  132. package/dist/lib/prs/details.test.d.ts +5 -0
  133. package/dist/lib/prs/details.test.d.ts.map +1 -0
  134. package/dist/lib/prs/details.test.js +325 -0
  135. package/dist/lib/prs/details.test.js.map +1 -0
  136. package/dist/lib/prs/filters.d.ts +56 -0
  137. package/dist/lib/prs/filters.d.ts.map +1 -0
  138. package/dist/lib/prs/filters.js +171 -0
  139. package/dist/lib/prs/filters.js.map +1 -0
  140. package/dist/lib/prs/filters.test.d.ts +5 -0
  141. package/dist/lib/prs/filters.test.d.ts.map +1 -0
  142. package/dist/lib/prs/filters.test.js +312 -0
  143. package/dist/lib/prs/filters.test.js.map +1 -0
  144. package/dist/lib/prs/formatters.d.ts +83 -0
  145. package/dist/lib/prs/formatters.d.ts.map +1 -0
  146. package/dist/lib/prs/formatters.js +389 -0
  147. package/dist/lib/prs/formatters.js.map +1 -0
  148. package/dist/lib/prs/formatters.test.d.ts +2 -0
  149. package/dist/lib/prs/formatters.test.d.ts.map +1 -0
  150. package/dist/lib/prs/formatters.test.js +387 -0
  151. package/dist/lib/prs/formatters.test.js.map +1 -0
  152. package/dist/lib/prs/interactive.d.ts +50 -0
  153. package/dist/lib/prs/interactive.d.ts.map +1 -0
  154. package/dist/lib/prs/interactive.js +453 -0
  155. package/dist/lib/prs/interactive.js.map +1 -0
  156. package/dist/lib/prs/interactive.test.d.ts +5 -0
  157. package/dist/lib/prs/interactive.test.d.ts.map +1 -0
  158. package/dist/lib/prs/interactive.test.js +364 -0
  159. package/dist/lib/prs/interactive.test.js.map +1 -0
  160. package/dist/lib/prs/types.d.ts +152 -0
  161. package/dist/lib/prs/types.d.ts.map +1 -0
  162. package/dist/lib/prs/types.js +17 -0
  163. package/dist/lib/prs/types.js.map +1 -0
  164. package/dist/lib/wtlink/config-manifest.d.ts +101 -0
  165. package/dist/lib/wtlink/config-manifest.d.ts.map +1 -0
  166. package/dist/lib/wtlink/config-manifest.js +219 -0
  167. package/dist/lib/wtlink/config-manifest.js.map +1 -0
  168. package/dist/lib/wtlink/config-manifest.test.d.ts +2 -0
  169. package/dist/lib/wtlink/config-manifest.test.d.ts.map +1 -0
  170. package/dist/lib/wtlink/config-manifest.test.js +460 -0
  171. package/dist/lib/wtlink/config-manifest.test.js.map +1 -0
  172. package/dist/lib/wtlink/link-configs.d.ts.map +1 -1
  173. package/dist/lib/wtlink/link-configs.js +36 -11
  174. package/dist/lib/wtlink/link-configs.js.map +1 -1
  175. package/dist/lib/wtlink/main-menu.d.ts.map +1 -1
  176. package/dist/lib/wtlink/main-menu.js +58 -50
  177. package/dist/lib/wtlink/main-menu.js.map +1 -1
  178. package/dist/lib/wtlink/main-menu.test.js +42 -40
  179. package/dist/lib/wtlink/main-menu.test.js.map +1 -1
  180. package/dist/lib/wtlink/manage-manifest.d.ts +9 -0
  181. package/dist/lib/wtlink/manage-manifest.d.ts.map +1 -1
  182. package/dist/lib/wtlink/manage-manifest.js +346 -25
  183. package/dist/lib/wtlink/manage-manifest.js.map +1 -1
  184. package/dist/lib/wtlink/manage-manifest.test.js +52 -1
  185. package/dist/lib/wtlink/manage-manifest.test.js.map +1 -1
  186. package/dist/lib/wtlink/validate-manifest.d.ts.map +1 -1
  187. package/dist/lib/wtlink/validate-manifest.js +27 -6
  188. package/dist/lib/wtlink/validate-manifest.js.map +1 -1
  189. package/package.json +1 -1
  190. package/schemas/worktreerc.schema.json +26 -1
@@ -0,0 +1,246 @@
1
+ /**
2
+ * PR detail view rendering
3
+ */
4
+ import * as colors from '../colors.js';
5
+ import { formatRelativeTime, formatStateBadge, formatDraftBadge } from './formatters.js';
6
+ /**
7
+ * Format the PR detail header box
8
+ */
9
+ export function formatDetailHeader(pr) {
10
+ const lines = [];
11
+ lines.push(colors.cyan(colors.bold('\n╔══════════════════════════════════════════════════════════════════╗')));
12
+ lines.push(colors.cyan(colors.bold('║')) +
13
+ colors.bold(` PR #${pr.number} Details`.padEnd(66)) +
14
+ colors.cyan(colors.bold('║')));
15
+ lines.push(colors.cyan(colors.bold('╚══════════════════════════════════════════════════════════════════╝\n')));
16
+ return lines.join('\n');
17
+ }
18
+ /**
19
+ * Format PR metadata section
20
+ */
21
+ export function formatDetailMetadata(pr) {
22
+ const lines = [];
23
+ // Title
24
+ lines.push(`${colors.bold('Title:')} ${pr.title}`);
25
+ // Author and timestamps
26
+ const created = formatRelativeTime(pr.createdAt);
27
+ const updated = formatRelativeTime(pr.updatedAt);
28
+ lines.push(`${colors.bold('Author:')} @${pr.author} · Created ${created} ago · Updated ${updated} ago`);
29
+ // Branch
30
+ lines.push(`${colors.bold('Branch:')} ${colors.cyan(pr.headBranch)} → ${pr.baseBranch}`);
31
+ // Status line
32
+ const statusParts = [formatStateBadge(pr.state)];
33
+ if (pr.isDraft) {
34
+ statusParts.push(formatDraftBadge(true));
35
+ }
36
+ else if (pr.state === 'OPEN') {
37
+ statusParts.push(colors.green('Ready for review'));
38
+ }
39
+ lines.push(`${colors.bold('Status:')} ${statusParts.join(' · ')}`);
40
+ return lines.join('\n');
41
+ }
42
+ /**
43
+ * Format labels section
44
+ */
45
+ export function formatDetailLabels(pr) {
46
+ if (pr.labels.length === 0) {
47
+ return `${colors.bold('Labels:')} ${colors.dim('none')}`;
48
+ }
49
+ const labelBadges = pr.labels.map((label) => colors.magenta(`[${label}]`)).join(' ');
50
+ return `${colors.bold('Labels:')} ${labelBadges}`;
51
+ }
52
+ /**
53
+ * Format review status section
54
+ */
55
+ export function formatDetailReviews(pr) {
56
+ const parts = [];
57
+ if (pr.reviewDecision === 'APPROVED') {
58
+ parts.push(colors.green(`✓ Approved (${pr.approvalCount} approval${pr.approvalCount !== 1 ? 's' : ''})`));
59
+ }
60
+ else if (pr.reviewDecision === 'CHANGES_REQUESTED') {
61
+ parts.push(colors.red('✗ Changes requested'));
62
+ }
63
+ else if (pr.reviewDecision === 'REVIEW_REQUIRED') {
64
+ parts.push(colors.yellow('○ Review required'));
65
+ }
66
+ else if (pr.reviewCount > 0) {
67
+ parts.push(colors.dim(`${pr.reviewCount} review${pr.reviewCount !== 1 ? 's' : ''}`));
68
+ }
69
+ else {
70
+ parts.push(colors.dim('No reviews yet'));
71
+ }
72
+ return `${colors.bold('Reviews:')} ${parts.join(' · ')}`;
73
+ }
74
+ /**
75
+ * Format CI status section
76
+ */
77
+ export function formatDetailCI(pr) {
78
+ let status;
79
+ switch (pr.checksStatus) {
80
+ case 'SUCCESS':
81
+ status = colors.green('● All checks passing');
82
+ break;
83
+ case 'FAILURE':
84
+ status = colors.red('● Some checks failing');
85
+ break;
86
+ case 'PENDING':
87
+ status = colors.yellow('○ Checks pending');
88
+ break;
89
+ default:
90
+ status = colors.dim('No CI checks');
91
+ }
92
+ return `${colors.bold('CI:')} ${status}`;
93
+ }
94
+ /**
95
+ * Format changes section
96
+ */
97
+ export function formatDetailChanges(pr) {
98
+ const added = colors.green(`+${pr.additions}`);
99
+ const removed = colors.red(`-${pr.deletions}`);
100
+ const files = `${pr.changedFiles} file${pr.changedFiles !== 1 ? 's' : ''}`;
101
+ return `${colors.bold('Changes:')} ${added} ${removed} across ${files}`;
102
+ }
103
+ /**
104
+ * Format worktree section
105
+ */
106
+ export function formatDetailWorktree(pr) {
107
+ if (pr.hasWorktree && pr.worktreePath) {
108
+ return `${colors.bold('Worktree:')} ${colors.cyan(pr.worktreePath)}`;
109
+ }
110
+ return `${colors.bold('Worktree:')} ${colors.dim('Not created')}`;
111
+ }
112
+ /**
113
+ * Format action menu for detail view
114
+ */
115
+ export function formatDetailActions(pr) {
116
+ const lines = [];
117
+ lines.push('');
118
+ lines.push(colors.bold('Actions:'));
119
+ // Left column
120
+ const leftCol = [];
121
+ if (pr.hasWorktree) {
122
+ leftCol.push(` ${colors.cyan('[w]')} Open worktree`);
123
+ leftCol.push(` ${colors.cyan('[e]')} Open in editor`);
124
+ leftCol.push(` ${colors.cyan('[t]')} Open terminal`);
125
+ }
126
+ else {
127
+ leftCol.push(` ${colors.cyan('[w]')} Create worktree`);
128
+ leftCol.push(` ${colors.dim('[e]')} ${colors.dim('Open in editor')}`);
129
+ leftCol.push(` ${colors.dim('[t]')} ${colors.dim('Open terminal')}`);
130
+ }
131
+ // Right column
132
+ const rightCol = [];
133
+ rightCol.push(` ${colors.cyan('[b]')} Open in browser`);
134
+ rightCol.push(` ${colors.cyan('[c]')} Copy PR URL`);
135
+ rightCol.push(` ${colors.cyan('[n]')} Copy PR number`);
136
+ // Combine columns
137
+ for (let i = 0; i < Math.max(leftCol.length, rightCol.length); i++) {
138
+ const left = (leftCol[i] || '').padEnd(32);
139
+ const right = rightCol[i] || '';
140
+ lines.push(left + right);
141
+ }
142
+ lines.push('');
143
+ lines.push(` ${colors.cyan('[←/q]')} Back to list`);
144
+ return lines.join('\n');
145
+ }
146
+ /**
147
+ * Format complete PR detail view
148
+ */
149
+ export function formatPrDetailView(pr) {
150
+ const sections = [];
151
+ sections.push(formatDetailHeader(pr));
152
+ sections.push(formatDetailMetadata(pr));
153
+ sections.push('');
154
+ sections.push(formatDetailLabels(pr));
155
+ sections.push(formatDetailReviews(pr));
156
+ sections.push(formatDetailCI(pr));
157
+ sections.push('');
158
+ sections.push(formatDetailChanges(pr));
159
+ sections.push(formatDetailWorktree(pr));
160
+ sections.push(formatDetailActions(pr));
161
+ sections.push('');
162
+ return sections.join('\n');
163
+ }
164
+ /**
165
+ * Create default detail view dependencies
166
+ */
167
+ export function createDefaultDetailDeps() {
168
+ return {
169
+ waitForKey: waitForKeypress,
170
+ };
171
+ }
172
+ /**
173
+ * Wait for a single keypress
174
+ * This function uses raw stdin keypress handling and is excluded from coverage.
175
+ */
176
+ /* c8 ignore start */
177
+ async function waitForKeypress() {
178
+ if (!process.stdin.isTTY) {
179
+ return 'q';
180
+ }
181
+ return new Promise((resolve) => {
182
+ const wasRaw = process.stdin.isRaw;
183
+ process.stdin.setRawMode(true);
184
+ process.stdin.resume();
185
+ const onData = (key) => {
186
+ const char = key.toString();
187
+ process.stdin.setRawMode(wasRaw ?? false);
188
+ process.stdin.removeListener('data', onData);
189
+ process.stdin.pause();
190
+ // Handle Ctrl+C
191
+ if (char === '\x03') {
192
+ process.exit(0);
193
+ }
194
+ // Handle escape sequences for arrow keys
195
+ if (char === '\x1b[D' || char === '\x1b') {
196
+ // Left arrow or Escape
197
+ resolve('back');
198
+ return;
199
+ }
200
+ resolve(char);
201
+ };
202
+ process.stdin.on('data', onData);
203
+ });
204
+ }
205
+ /* c8 ignore stop */
206
+ /**
207
+ * Show PR detail view and handle actions
208
+ * Returns the action to perform, or 'back' to return to list
209
+ */
210
+ export async function showPrDetail(pr, deps) {
211
+ const { waitForKey } = deps ?? createDefaultDetailDeps();
212
+ // Clear and show detail view
213
+ console.clear();
214
+ console.log(formatPrDetailView(pr));
215
+ // Wait for action key
216
+ while (true) {
217
+ const key = await waitForKey();
218
+ // Navigation
219
+ if (key === 'q' || key === 'back' || key === '\x1b') {
220
+ return 'back';
221
+ }
222
+ // Actions
223
+ switch (key) {
224
+ case 'w':
225
+ return pr.hasWorktree ? 'open_worktree' : 'create_worktree';
226
+ case 'b':
227
+ return 'open_browser';
228
+ case 'e':
229
+ if (pr.hasWorktree)
230
+ return 'open_editor';
231
+ break;
232
+ case 't':
233
+ if (pr.hasWorktree)
234
+ return 'open_terminal';
235
+ break;
236
+ case 'c':
237
+ return 'copy_url';
238
+ case 'n':
239
+ return 'copy_number';
240
+ case 'r':
241
+ return 'refresh';
242
+ }
243
+ // Unknown key - continue waiting
244
+ }
245
+ }
246
+ //# sourceMappingURL=details.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"details.js","sourceRoot":"","sources":["../../../src/lib/prs/details.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for PR detail view
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=details.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"details.test.d.ts","sourceRoot":"","sources":["../../../src/lib/prs/details.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,325 @@
1
+ /**
2
+ * Tests for PR detail view
3
+ */
4
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
5
+ import { formatDetailHeader, formatDetailMetadata, formatDetailLabels, formatDetailReviews, formatDetailCI, formatDetailChanges, formatDetailWorktree, formatDetailActions, formatPrDetailView, showPrDetail, createDefaultDetailDeps, } from './details.js';
6
+ // Helper to create mock PR display items
7
+ function createMockPr(overrides = {}) {
8
+ return {
9
+ number: 42,
10
+ title: 'Add dark mode toggle',
11
+ state: 'OPEN',
12
+ isDraft: false,
13
+ url: 'https://github.com/test/repo/pull/42',
14
+ headBranch: 'feat/dark-mode',
15
+ baseBranch: 'main',
16
+ author: 'testuser',
17
+ createdAt: new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString(), // 2 hours ago
18
+ updatedAt: new Date(Date.now() - 30 * 60 * 1000).toISOString(), // 30 mins ago
19
+ labels: ['enhancement', 'frontend'],
20
+ reviewDecision: 'APPROVED',
21
+ approvalCount: 2,
22
+ reviewCount: 2,
23
+ checksStatus: 'SUCCESS',
24
+ additions: 342,
25
+ deletions: 89,
26
+ changedFiles: 12,
27
+ hasWorktree: true,
28
+ worktreePath: '../repo.pr42',
29
+ ...overrides,
30
+ };
31
+ }
32
+ describe('details', () => {
33
+ describe('formatDetailHeader', () => {
34
+ it('should include PR number', () => {
35
+ const pr = createMockPr({ number: 123 });
36
+ const result = formatDetailHeader(pr);
37
+ expect(result).toContain('#123');
38
+ });
39
+ it('should include box characters', () => {
40
+ const pr = createMockPr();
41
+ const result = formatDetailHeader(pr);
42
+ expect(result).toContain('╔');
43
+ expect(result).toContain('╚');
44
+ });
45
+ });
46
+ describe('formatDetailMetadata', () => {
47
+ it('should include title', () => {
48
+ const pr = createMockPr({ title: 'My Amazing Feature' });
49
+ const result = formatDetailMetadata(pr);
50
+ expect(result).toContain('My Amazing Feature');
51
+ });
52
+ it('should include author', () => {
53
+ const pr = createMockPr({ author: 'alice' });
54
+ const result = formatDetailMetadata(pr);
55
+ expect(result).toContain('@alice');
56
+ });
57
+ it('should include branch info', () => {
58
+ const pr = createMockPr({ headBranch: 'feat/test', baseBranch: 'main' });
59
+ const result = formatDetailMetadata(pr);
60
+ expect(result).toContain('feat/test');
61
+ expect(result).toContain('main');
62
+ });
63
+ it('should show draft status', () => {
64
+ const pr = createMockPr({ isDraft: true });
65
+ const result = formatDetailMetadata(pr);
66
+ expect(result).toContain('DRAFT');
67
+ });
68
+ it('should show ready for review for open non-draft', () => {
69
+ const pr = createMockPr({ isDraft: false, state: 'OPEN' });
70
+ const result = formatDetailMetadata(pr);
71
+ expect(result).toContain('Ready for review');
72
+ });
73
+ });
74
+ describe('formatDetailLabels', () => {
75
+ it('should show none when no labels', () => {
76
+ const pr = createMockPr({ labels: [] });
77
+ const result = formatDetailLabels(pr);
78
+ expect(result).toContain('none');
79
+ });
80
+ it('should show labels in brackets', () => {
81
+ const pr = createMockPr({ labels: ['bug', 'urgent'] });
82
+ const result = formatDetailLabels(pr);
83
+ expect(result).toContain('[bug]');
84
+ expect(result).toContain('[urgent]');
85
+ });
86
+ });
87
+ describe('formatDetailReviews', () => {
88
+ it('should show approved with count', () => {
89
+ const pr = createMockPr({ reviewDecision: 'APPROVED', approvalCount: 3 });
90
+ const result = formatDetailReviews(pr);
91
+ expect(result).toContain('Approved');
92
+ expect(result).toContain('3 approvals');
93
+ });
94
+ it('should show singular for 1 approval', () => {
95
+ const pr = createMockPr({ reviewDecision: 'APPROVED', approvalCount: 1 });
96
+ const result = formatDetailReviews(pr);
97
+ expect(result).toContain('1 approval');
98
+ expect(result).not.toContain('approvals');
99
+ });
100
+ it('should show changes requested', () => {
101
+ const pr = createMockPr({ reviewDecision: 'CHANGES_REQUESTED' });
102
+ const result = formatDetailReviews(pr);
103
+ expect(result).toContain('Changes requested');
104
+ });
105
+ it('should show review required', () => {
106
+ const pr = createMockPr({ reviewDecision: 'REVIEW_REQUIRED' });
107
+ const result = formatDetailReviews(pr);
108
+ expect(result).toContain('Review required');
109
+ });
110
+ it('should show review count when no decision but has reviews', () => {
111
+ const pr = createMockPr({ reviewDecision: null, reviewCount: 2 });
112
+ const result = formatDetailReviews(pr);
113
+ expect(result).toContain('2 reviews');
114
+ });
115
+ it('should show no reviews yet', () => {
116
+ const pr = createMockPr({ reviewDecision: null, reviewCount: 0 });
117
+ const result = formatDetailReviews(pr);
118
+ expect(result).toContain('No reviews yet');
119
+ });
120
+ });
121
+ describe('formatDetailCI', () => {
122
+ it('should show all checks passing for SUCCESS', () => {
123
+ const pr = createMockPr({ checksStatus: 'SUCCESS' });
124
+ const result = formatDetailCI(pr);
125
+ expect(result).toContain('All checks passing');
126
+ });
127
+ it('should show checks failing for FAILURE', () => {
128
+ const pr = createMockPr({ checksStatus: 'FAILURE' });
129
+ const result = formatDetailCI(pr);
130
+ expect(result).toContain('checks failing');
131
+ });
132
+ it('should show checks pending for PENDING', () => {
133
+ const pr = createMockPr({ checksStatus: 'PENDING' });
134
+ const result = formatDetailCI(pr);
135
+ expect(result).toContain('Checks pending');
136
+ });
137
+ it('should show no CI checks for null', () => {
138
+ const pr = createMockPr({ checksStatus: null });
139
+ const result = formatDetailCI(pr);
140
+ expect(result).toContain('No CI checks');
141
+ });
142
+ });
143
+ describe('formatDetailChanges', () => {
144
+ it('should show additions and deletions', () => {
145
+ const pr = createMockPr({ additions: 100, deletions: 50 });
146
+ const result = formatDetailChanges(pr);
147
+ expect(result).toContain('+100');
148
+ expect(result).toContain('-50');
149
+ });
150
+ it('should show file count', () => {
151
+ const pr = createMockPr({ changedFiles: 5 });
152
+ const result = formatDetailChanges(pr);
153
+ expect(result).toContain('5 files');
154
+ });
155
+ it('should show singular for 1 file', () => {
156
+ const pr = createMockPr({ changedFiles: 1 });
157
+ const result = formatDetailChanges(pr);
158
+ expect(result).toContain('1 file');
159
+ expect(result).not.toContain('1 files');
160
+ });
161
+ });
162
+ describe('formatDetailWorktree', () => {
163
+ it('should show worktree path when exists', () => {
164
+ const pr = createMockPr({ hasWorktree: true, worktreePath: '/path/to/worktree' });
165
+ const result = formatDetailWorktree(pr);
166
+ expect(result).toContain('/path/to/worktree');
167
+ });
168
+ it('should show not created when no worktree', () => {
169
+ const pr = createMockPr({ hasWorktree: false, worktreePath: null });
170
+ const result = formatDetailWorktree(pr);
171
+ expect(result).toContain('Not created');
172
+ });
173
+ });
174
+ describe('formatDetailActions', () => {
175
+ it('should show open worktree when has worktree', () => {
176
+ const pr = createMockPr({ hasWorktree: true });
177
+ const result = formatDetailActions(pr);
178
+ expect(result).toContain('Open worktree');
179
+ expect(result).toContain('[e]');
180
+ expect(result).toContain('[t]');
181
+ });
182
+ it('should show create worktree when no worktree', () => {
183
+ const pr = createMockPr({ hasWorktree: false });
184
+ const result = formatDetailActions(pr);
185
+ expect(result).toContain('Create worktree');
186
+ });
187
+ it('should include browser and copy actions', () => {
188
+ const pr = createMockPr();
189
+ const result = formatDetailActions(pr);
190
+ expect(result).toContain('[b]');
191
+ expect(result).toContain('[c]');
192
+ expect(result).toContain('[n]');
193
+ });
194
+ });
195
+ describe('formatPrDetailView', () => {
196
+ it('should include all sections', () => {
197
+ const pr = createMockPr();
198
+ const result = formatPrDetailView(pr);
199
+ expect(result).toContain('#42'); // Header
200
+ expect(result).toContain('Add dark mode toggle'); // Title
201
+ expect(result).toContain('@testuser'); // Author
202
+ expect(result).toContain('enhancement'); // Labels
203
+ expect(result).toContain('Approved'); // Reviews
204
+ expect(result).toContain('passing'); // CI
205
+ expect(result).toContain('+342'); // Changes
206
+ expect(result).toContain('repo.pr42'); // Worktree
207
+ expect(result).toContain('[w]'); // Actions
208
+ });
209
+ });
210
+ describe('showPrDetail', () => {
211
+ let consoleSpy;
212
+ let clearSpy;
213
+ beforeEach(() => {
214
+ consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
215
+ clearSpy = vi.spyOn(console, 'clear').mockImplementation(() => { });
216
+ });
217
+ afterEach(() => {
218
+ consoleSpy.mockRestore();
219
+ clearSpy.mockRestore();
220
+ });
221
+ it('should return back action on q key', async () => {
222
+ const pr = createMockPr();
223
+ const deps = {
224
+ waitForKey: vi.fn().mockResolvedValue('q'),
225
+ };
226
+ const result = await showPrDetail(pr, deps);
227
+ expect(result).toBe('back');
228
+ });
229
+ it('should return back action on escape', async () => {
230
+ const pr = createMockPr();
231
+ const deps = {
232
+ waitForKey: vi.fn().mockResolvedValue('back'),
233
+ };
234
+ const result = await showPrDetail(pr, deps);
235
+ expect(result).toBe('back');
236
+ });
237
+ it('should return create_worktree for w key when no worktree', async () => {
238
+ const pr = createMockPr({ hasWorktree: false });
239
+ const deps = {
240
+ waitForKey: vi.fn().mockResolvedValue('w'),
241
+ };
242
+ const result = await showPrDetail(pr, deps);
243
+ expect(result).toBe('create_worktree');
244
+ });
245
+ it('should return open_worktree for w key when has worktree', async () => {
246
+ const pr = createMockPr({ hasWorktree: true });
247
+ const deps = {
248
+ waitForKey: vi.fn().mockResolvedValue('w'),
249
+ };
250
+ const result = await showPrDetail(pr, deps);
251
+ expect(result).toBe('open_worktree');
252
+ });
253
+ it('should return open_browser for b key', async () => {
254
+ const pr = createMockPr();
255
+ const deps = {
256
+ waitForKey: vi.fn().mockResolvedValue('b'),
257
+ };
258
+ const result = await showPrDetail(pr, deps);
259
+ expect(result).toBe('open_browser');
260
+ });
261
+ it('should return open_editor for e key when has worktree', async () => {
262
+ const pr = createMockPr({ hasWorktree: true });
263
+ const deps = {
264
+ waitForKey: vi.fn().mockResolvedValue('e'),
265
+ };
266
+ const result = await showPrDetail(pr, deps);
267
+ expect(result).toBe('open_editor');
268
+ });
269
+ it('should ignore e key when no worktree and wait for another key', async () => {
270
+ const pr = createMockPr({ hasWorktree: false });
271
+ let callCount = 0;
272
+ const deps = {
273
+ waitForKey: vi.fn().mockImplementation(() => {
274
+ callCount++;
275
+ if (callCount === 1)
276
+ return Promise.resolve('e');
277
+ return Promise.resolve('q');
278
+ }),
279
+ };
280
+ const result = await showPrDetail(pr, deps);
281
+ expect(callCount).toBe(2);
282
+ expect(result).toBe('back');
283
+ });
284
+ it('should return open_terminal for t key when has worktree', async () => {
285
+ const pr = createMockPr({ hasWorktree: true });
286
+ const deps = {
287
+ waitForKey: vi.fn().mockResolvedValue('t'),
288
+ };
289
+ const result = await showPrDetail(pr, deps);
290
+ expect(result).toBe('open_terminal');
291
+ });
292
+ it('should return copy_url for c key', async () => {
293
+ const pr = createMockPr();
294
+ const deps = {
295
+ waitForKey: vi.fn().mockResolvedValue('c'),
296
+ };
297
+ const result = await showPrDetail(pr, deps);
298
+ expect(result).toBe('copy_url');
299
+ });
300
+ it('should return copy_number for n key', async () => {
301
+ const pr = createMockPr();
302
+ const deps = {
303
+ waitForKey: vi.fn().mockResolvedValue('n'),
304
+ };
305
+ const result = await showPrDetail(pr, deps);
306
+ expect(result).toBe('copy_number');
307
+ });
308
+ it('should return refresh for r key', async () => {
309
+ const pr = createMockPr();
310
+ const deps = {
311
+ waitForKey: vi.fn().mockResolvedValue('r'),
312
+ };
313
+ const result = await showPrDetail(pr, deps);
314
+ expect(result).toBe('refresh');
315
+ });
316
+ });
317
+ describe('createDefaultDetailDeps', () => {
318
+ it('should return deps object with waitForKey function', () => {
319
+ const deps = createDefaultDetailDeps();
320
+ expect(deps).toHaveProperty('waitForKey');
321
+ expect(typeof deps.waitForKey).toBe('function');
322
+ });
323
+ });
324
+ });
325
+ //# sourceMappingURL=details.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"details.test.js","sourceRoot":"","sources":["../../../src/lib/prs/details.test.ts"],"names":[],"mappings":"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"}