@camaradesuk/git-worktree-tools 1.0.4 → 1.1.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 (168) hide show
  1. package/README.md +4 -0
  2. package/dist/cli/cleanpr.d.ts +1 -6
  3. package/dist/cli/cleanpr.d.ts.map +1 -1
  4. package/dist/cli/cleanpr.js +110 -302
  5. package/dist/cli/cleanpr.js.map +1 -1
  6. package/dist/cli/cleanpr.test.d.ts +2 -0
  7. package/dist/cli/cleanpr.test.d.ts.map +1 -0
  8. package/dist/cli/cleanpr.test.js +225 -0
  9. package/dist/cli/cleanpr.test.js.map +1 -0
  10. package/dist/cli/lswt.d.ts +1 -4
  11. package/dist/cli/lswt.d.ts.map +1 -1
  12. package/dist/cli/lswt.js +32 -251
  13. package/dist/cli/lswt.js.map +1 -1
  14. package/dist/cli/lswt.test.d.ts +2 -0
  15. package/dist/cli/lswt.test.d.ts.map +1 -0
  16. package/dist/cli/lswt.test.js +165 -0
  17. package/dist/cli/lswt.test.js.map +1 -0
  18. package/dist/cli/newpr.d.ts +1 -4
  19. package/dist/cli/newpr.d.ts.map +1 -1
  20. package/dist/cli/newpr.js +98 -493
  21. package/dist/cli/newpr.js.map +1 -1
  22. package/dist/cli/newpr.test.d.ts +2 -0
  23. package/dist/cli/newpr.test.d.ts.map +1 -0
  24. package/dist/cli/newpr.test.js +329 -0
  25. package/dist/cli/newpr.test.js.map +1 -0
  26. package/dist/cli/wtlink.test.d.ts +2 -0
  27. package/dist/cli/wtlink.test.d.ts.map +1 -0
  28. package/dist/cli/wtlink.test.js +148 -0
  29. package/dist/cli/wtlink.test.js.map +1 -0
  30. package/dist/e2e/cli.e2e.test.js +44 -1
  31. package/dist/e2e/cli.e2e.test.js.map +1 -1
  32. package/dist/integration/git.integration.test.js.map +1 -1
  33. package/dist/lib/cleanpr/args.d.ts +14 -0
  34. package/dist/lib/cleanpr/args.d.ts.map +1 -0
  35. package/dist/lib/cleanpr/args.js +82 -0
  36. package/dist/lib/cleanpr/args.js.map +1 -0
  37. package/dist/lib/cleanpr/args.test.d.ts +2 -0
  38. package/dist/lib/cleanpr/args.test.d.ts.map +1 -0
  39. package/dist/lib/cleanpr/args.test.js +192 -0
  40. package/dist/lib/cleanpr/args.test.js.map +1 -0
  41. package/dist/lib/cleanpr/cleanup.d.ts +61 -0
  42. package/dist/lib/cleanpr/cleanup.d.ts.map +1 -0
  43. package/dist/lib/cleanpr/cleanup.js +97 -0
  44. package/dist/lib/cleanpr/cleanup.js.map +1 -0
  45. package/dist/lib/cleanpr/cleanup.test.d.ts +2 -0
  46. package/dist/lib/cleanpr/cleanup.test.d.ts.map +1 -0
  47. package/dist/lib/cleanpr/cleanup.test.js +264 -0
  48. package/dist/lib/cleanpr/cleanup.test.js.map +1 -0
  49. package/dist/lib/cleanpr/index.d.ts +10 -0
  50. package/dist/lib/cleanpr/index.d.ts.map +1 -0
  51. package/dist/lib/cleanpr/index.js +8 -0
  52. package/dist/lib/cleanpr/index.js.map +1 -0
  53. package/dist/lib/cleanpr/types.d.ts +49 -0
  54. package/dist/lib/cleanpr/types.d.ts.map +1 -0
  55. package/dist/lib/cleanpr/types.js +5 -0
  56. package/dist/lib/cleanpr/types.js.map +1 -0
  57. package/dist/lib/cleanpr/worktree-info.d.ts +27 -0
  58. package/dist/lib/cleanpr/worktree-info.d.ts.map +1 -0
  59. package/dist/lib/cleanpr/worktree-info.js +95 -0
  60. package/dist/lib/cleanpr/worktree-info.js.map +1 -0
  61. package/dist/lib/cleanpr/worktree-info.test.d.ts +2 -0
  62. package/dist/lib/cleanpr/worktree-info.test.d.ts.map +1 -0
  63. package/dist/lib/cleanpr/worktree-info.test.js +160 -0
  64. package/dist/lib/cleanpr/worktree-info.test.js.map +1 -0
  65. package/dist/lib/colors.test.js +73 -0
  66. package/dist/lib/colors.test.js.map +1 -1
  67. package/dist/lib/config.test.js +79 -2
  68. package/dist/lib/config.test.js.map +1 -1
  69. package/dist/lib/git.d.ts.map +1 -1
  70. package/dist/lib/git.js +4 -3
  71. package/dist/lib/git.js.map +1 -1
  72. package/dist/lib/git.test.js +7 -7
  73. package/dist/lib/git.test.js.map +1 -1
  74. package/dist/lib/github.d.ts.map +1 -1
  75. package/dist/lib/github.js +4 -3
  76. package/dist/lib/github.js.map +1 -1
  77. package/dist/lib/github.test.js +2 -2
  78. package/dist/lib/github.test.js.map +1 -1
  79. package/dist/lib/lswt/args.d.ts +14 -0
  80. package/dist/lib/lswt/args.d.ts.map +1 -0
  81. package/dist/lib/lswt/args.js +67 -0
  82. package/dist/lib/lswt/args.js.map +1 -0
  83. package/dist/lib/lswt/args.test.d.ts +2 -0
  84. package/dist/lib/lswt/args.test.d.ts.map +1 -0
  85. package/dist/lib/lswt/args.test.js +135 -0
  86. package/dist/lib/lswt/args.test.js.map +1 -0
  87. package/dist/lib/lswt/formatters.d.ts +29 -0
  88. package/dist/lib/lswt/formatters.d.ts.map +1 -0
  89. package/dist/lib/lswt/formatters.js +113 -0
  90. package/dist/lib/lswt/formatters.js.map +1 -0
  91. package/dist/lib/lswt/formatters.test.d.ts +2 -0
  92. package/dist/lib/lswt/formatters.test.d.ts.map +1 -0
  93. package/dist/lib/lswt/formatters.test.js +233 -0
  94. package/dist/lib/lswt/formatters.test.js.map +1 -0
  95. package/dist/lib/lswt/index.d.ts +9 -0
  96. package/dist/lib/lswt/index.d.ts.map +1 -0
  97. package/dist/lib/lswt/index.js +9 -0
  98. package/dist/lib/lswt/index.js.map +1 -0
  99. package/dist/lib/lswt/types.d.ts +44 -0
  100. package/dist/lib/lswt/types.d.ts.map +1 -0
  101. package/dist/lib/lswt/types.js +5 -0
  102. package/dist/lib/lswt/types.js.map +1 -0
  103. package/dist/lib/lswt/worktree-info.d.ts +23 -0
  104. package/dist/lib/lswt/worktree-info.d.ts.map +1 -0
  105. package/dist/lib/lswt/worktree-info.js +81 -0
  106. package/dist/lib/lswt/worktree-info.js.map +1 -0
  107. package/dist/lib/lswt/worktree-info.test.d.ts +2 -0
  108. package/dist/lib/lswt/worktree-info.test.d.ts.map +1 -0
  109. package/dist/lib/lswt/worktree-info.test.js +190 -0
  110. package/dist/lib/lswt/worktree-info.test.js.map +1 -0
  111. package/dist/lib/newpr/actions.d.ts +56 -0
  112. package/dist/lib/newpr/actions.d.ts.map +1 -0
  113. package/dist/lib/newpr/actions.js +130 -0
  114. package/dist/lib/newpr/actions.js.map +1 -0
  115. package/dist/lib/newpr/actions.test.d.ts +2 -0
  116. package/dist/lib/newpr/actions.test.d.ts.map +1 -0
  117. package/dist/lib/newpr/actions.test.js +254 -0
  118. package/dist/lib/newpr/actions.test.js.map +1 -0
  119. package/dist/lib/newpr/args.d.ts +17 -0
  120. package/dist/lib/newpr/args.d.ts.map +1 -0
  121. package/dist/lib/newpr/args.js +123 -0
  122. package/dist/lib/newpr/args.js.map +1 -0
  123. package/dist/lib/newpr/args.test.d.ts +2 -0
  124. package/dist/lib/newpr/args.test.d.ts.map +1 -0
  125. package/dist/lib/newpr/args.test.js +271 -0
  126. package/dist/lib/newpr/args.test.js.map +1 -0
  127. package/dist/lib/newpr/index.d.ts +10 -0
  128. package/dist/lib/newpr/index.d.ts.map +1 -0
  129. package/dist/lib/newpr/index.js +8 -0
  130. package/dist/lib/newpr/index.js.map +1 -0
  131. package/dist/lib/newpr/scenario-handler.d.ts +40 -0
  132. package/dist/lib/newpr/scenario-handler.d.ts.map +1 -0
  133. package/dist/lib/newpr/scenario-handler.js +261 -0
  134. package/dist/lib/newpr/scenario-handler.js.map +1 -0
  135. package/dist/lib/newpr/scenario-handler.test.d.ts +2 -0
  136. package/dist/lib/newpr/scenario-handler.test.d.ts.map +1 -0
  137. package/dist/lib/newpr/scenario-handler.test.js +250 -0
  138. package/dist/lib/newpr/scenario-handler.test.js.map +1 -0
  139. package/dist/lib/newpr/types.d.ts +76 -0
  140. package/dist/lib/newpr/types.d.ts.map +1 -0
  141. package/dist/lib/newpr/types.js +5 -0
  142. package/dist/lib/newpr/types.js.map +1 -0
  143. package/dist/lib/state-detection.d.ts.map +1 -1
  144. package/dist/lib/state-detection.js +12 -3
  145. package/dist/lib/state-detection.js.map +1 -1
  146. package/dist/lib/state-detection.test.js +253 -2
  147. package/dist/lib/state-detection.test.js.map +1 -1
  148. package/dist/lib/wtlink/link-configs.d.ts +40 -0
  149. package/dist/lib/wtlink/link-configs.d.ts.map +1 -1
  150. package/dist/lib/wtlink/link-configs.js +126 -11
  151. package/dist/lib/wtlink/link-configs.js.map +1 -1
  152. package/dist/lib/wtlink/link-configs.test.js +237 -84
  153. package/dist/lib/wtlink/link-configs.test.js.map +1 -1
  154. package/dist/lib/wtlink/manage-manifest.d.ts +86 -0
  155. package/dist/lib/wtlink/manage-manifest.d.ts.map +1 -1
  156. package/dist/lib/wtlink/manage-manifest.js +18 -15
  157. package/dist/lib/wtlink/manage-manifest.js.map +1 -1
  158. package/dist/lib/wtlink/manage-manifest.test.d.ts +2 -0
  159. package/dist/lib/wtlink/manage-manifest.test.d.ts.map +1 -0
  160. package/dist/lib/wtlink/manage-manifest.test.js +383 -0
  161. package/dist/lib/wtlink/manage-manifest.test.js.map +1 -0
  162. package/dist/lib/wtlink/validate-manifest.d.ts +27 -0
  163. package/dist/lib/wtlink/validate-manifest.d.ts.map +1 -1
  164. package/dist/lib/wtlink/validate-manifest.js +103 -28
  165. package/dist/lib/wtlink/validate-manifest.js.map +1 -1
  166. package/dist/lib/wtlink/validate-manifest.test.js +170 -65
  167. package/dist/lib/wtlink/validate-manifest.test.js.map +1 -1
  168. package/package.json +1 -1
@@ -0,0 +1,383 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { getAllFiles, getAllDirectories, getFileDecision, getFolderStates, getFolderStateBreakdown, isItemVisible, buildFileTree, findNodeByPath, getHierarchicalViewItems, getFlatViewItems, getVisibleItems, getDisplayItems, isCommonIgnoreDir, COMMON_IGNORE_DIRS, } from './manage-manifest.js';
3
+ describe('wtlink/manage-manifest pure functions', () => {
4
+ // Helper to create a simple file tree
5
+ const createSimpleTree = () => ({
6
+ path: '',
7
+ isDirectory: true,
8
+ children: [
9
+ {
10
+ path: 'src',
11
+ isDirectory: true,
12
+ children: [
13
+ { path: 'src/index.ts', isDirectory: false, children: [] },
14
+ { path: 'src/utils.ts', isDirectory: false, children: [] },
15
+ ],
16
+ },
17
+ { path: 'config.json', isDirectory: false, children: [] },
18
+ ],
19
+ });
20
+ describe('getAllFiles', () => {
21
+ it('returns single file for non-directory node', () => {
22
+ const node = { path: 'file.ts', isDirectory: false, children: [] };
23
+ expect(getAllFiles(node)).toEqual(['file.ts']);
24
+ });
25
+ it('returns all nested files for directory', () => {
26
+ const tree = createSimpleTree();
27
+ const files = getAllFiles(tree);
28
+ expect(files).toContain('src/index.ts');
29
+ expect(files).toContain('src/utils.ts');
30
+ expect(files).toContain('config.json');
31
+ expect(files).toHaveLength(3);
32
+ });
33
+ it('returns empty array for empty directory', () => {
34
+ const node = { path: 'empty', isDirectory: true, children: [] };
35
+ expect(getAllFiles(node)).toEqual([]);
36
+ });
37
+ });
38
+ describe('getAllDirectories', () => {
39
+ it('returns empty array for file node', () => {
40
+ const node = { path: 'file.ts', isDirectory: false, children: [] };
41
+ expect(getAllDirectories(node)).toEqual([]);
42
+ });
43
+ it('returns all nested directories', () => {
44
+ const tree = {
45
+ path: '',
46
+ isDirectory: true,
47
+ children: [
48
+ {
49
+ path: 'src',
50
+ isDirectory: true,
51
+ children: [{ path: 'src/lib', isDirectory: true, children: [] }],
52
+ },
53
+ { path: 'config', isDirectory: true, children: [] },
54
+ ],
55
+ };
56
+ const dirs = getAllDirectories(tree);
57
+ expect(dirs.map((d) => d.path)).toContain('src');
58
+ expect(dirs.map((d) => d.path)).toContain('src/lib');
59
+ expect(dirs.map((d) => d.path)).toContain('config');
60
+ expect(dirs).toHaveLength(3);
61
+ });
62
+ });
63
+ describe('getFileDecision', () => {
64
+ it('returns decision from map when present', () => {
65
+ const decisions = new Map([['file.ts', 'add']]);
66
+ expect(getFileDecision(decisions, 'file.ts')).toBe('add');
67
+ });
68
+ it('returns undecided when file not in map', () => {
69
+ const decisions = new Map();
70
+ expect(getFileDecision(decisions, 'unknown.ts')).toBe('undecided');
71
+ });
72
+ it('handles all decision types', () => {
73
+ const decisions = new Map([
74
+ ['add.ts', 'add'],
75
+ ['comment.ts', 'comment'],
76
+ ['skip.ts', 'skip'],
77
+ ]);
78
+ expect(getFileDecision(decisions, 'add.ts')).toBe('add');
79
+ expect(getFileDecision(decisions, 'comment.ts')).toBe('comment');
80
+ expect(getFileDecision(decisions, 'skip.ts')).toBe('skip');
81
+ });
82
+ });
83
+ describe('getFolderStates', () => {
84
+ it('returns single state for file', () => {
85
+ const node = { path: 'file.ts', isDirectory: false, children: [] };
86
+ const decisions = new Map([['file.ts', 'add']]);
87
+ expect(getFolderStates(node, decisions)).toEqual(new Set(['add']));
88
+ });
89
+ it('returns undecided for file not in decisions', () => {
90
+ const node = { path: 'file.ts', isDirectory: false, children: [] };
91
+ const decisions = new Map();
92
+ expect(getFolderStates(node, decisions)).toEqual(new Set(['undecided']));
93
+ });
94
+ it('returns all states for mixed folder', () => {
95
+ const tree = createSimpleTree();
96
+ const srcNode = tree.children[0];
97
+ const decisions = new Map([
98
+ ['src/index.ts', 'add'],
99
+ ['src/utils.ts', 'skip'],
100
+ ]);
101
+ const states = getFolderStates(srcNode, decisions);
102
+ expect(states.has('add')).toBe(true);
103
+ expect(states.has('skip')).toBe(true);
104
+ expect(states.has('undecided')).toBe(false);
105
+ });
106
+ it('includes undecided for partially decided folder', () => {
107
+ const tree = createSimpleTree();
108
+ const srcNode = tree.children[0];
109
+ const decisions = new Map([['src/index.ts', 'add']]);
110
+ const states = getFolderStates(srcNode, decisions);
111
+ expect(states.has('add')).toBe(true);
112
+ expect(states.has('undecided')).toBe(true);
113
+ });
114
+ });
115
+ describe('getFolderStateBreakdown', () => {
116
+ it('returns correct counts for folder', () => {
117
+ const tree = createSimpleTree();
118
+ const decisions = new Map([
119
+ ['src/index.ts', 'add'],
120
+ ['src/utils.ts', 'comment'],
121
+ ['config.json', 'skip'],
122
+ ]);
123
+ const breakdown = getFolderStateBreakdown(tree, decisions);
124
+ expect(breakdown).toEqual({ add: 1, comment: 1, skip: 1, undecided: 0 });
125
+ });
126
+ it('counts undecided files', () => {
127
+ const tree = createSimpleTree();
128
+ const decisions = new Map([['src/index.ts', 'add']]);
129
+ const breakdown = getFolderStateBreakdown(tree, decisions);
130
+ expect(breakdown.add).toBe(1);
131
+ expect(breakdown.undecided).toBe(2);
132
+ });
133
+ });
134
+ describe('isItemVisible', () => {
135
+ it('returns false when no filters active', () => {
136
+ const item = {
137
+ path: 'file.ts',
138
+ isDirectory: false,
139
+ states: new Set(['add']),
140
+ };
141
+ expect(isItemVisible(item, new Set())).toBe(false);
142
+ });
143
+ it('returns true when item state matches filter', () => {
144
+ const item = {
145
+ path: 'file.ts',
146
+ isDirectory: false,
147
+ states: new Set(['add']),
148
+ };
149
+ expect(isItemVisible(item, new Set(['add']))).toBe(true);
150
+ });
151
+ it('returns true when any state matches', () => {
152
+ const item = {
153
+ path: 'folder',
154
+ isDirectory: true,
155
+ states: new Set(['add', 'skip']),
156
+ };
157
+ expect(isItemVisible(item, new Set(['add']))).toBe(true);
158
+ expect(isItemVisible(item, new Set(['skip']))).toBe(true);
159
+ });
160
+ it('returns false when no state matches', () => {
161
+ const item = {
162
+ path: 'file.ts',
163
+ isDirectory: false,
164
+ states: new Set(['add']),
165
+ };
166
+ expect(isItemVisible(item, new Set(['skip', 'comment']))).toBe(false);
167
+ });
168
+ });
169
+ describe('buildFileTree', () => {
170
+ it('builds tree from flat file list', () => {
171
+ const files = ['src/index.ts', 'src/lib/utils.ts', 'config.json'];
172
+ const tree = buildFileTree(files);
173
+ expect(tree.path).toBe('');
174
+ expect(tree.isDirectory).toBe(true);
175
+ expect(tree.children).toHaveLength(2); // src, config.json
176
+ });
177
+ it('handles empty file list', () => {
178
+ const tree = buildFileTree([]);
179
+ expect(tree.path).toBe('');
180
+ expect(tree.isDirectory).toBe(true);
181
+ expect(tree.children).toHaveLength(0);
182
+ });
183
+ it('creates proper hierarchy', () => {
184
+ const files = ['a/b/c/file.ts'];
185
+ const tree = buildFileTree(files);
186
+ // Navigate down the tree
187
+ expect(tree.children).toHaveLength(1);
188
+ const a = tree.children[0];
189
+ expect(a.path).toBe('a');
190
+ expect(a.isDirectory).toBe(true);
191
+ const b = a.children[0];
192
+ expect(b.path).toBe('a/b');
193
+ expect(b.isDirectory).toBe(true);
194
+ const c = b.children[0];
195
+ expect(c.path).toBe('a/b/c');
196
+ expect(c.isDirectory).toBe(true);
197
+ const file = c.children[0];
198
+ expect(file.path).toBe('a/b/c/file.ts');
199
+ expect(file.isDirectory).toBe(false);
200
+ });
201
+ });
202
+ describe('findNodeByPath', () => {
203
+ it('finds root node', () => {
204
+ const tree = createSimpleTree();
205
+ const found = findNodeByPath(tree, '');
206
+ expect(found).toBe(tree);
207
+ });
208
+ it('finds nested directory', () => {
209
+ const tree = createSimpleTree();
210
+ const found = findNodeByPath(tree, 'src');
211
+ expect(found?.path).toBe('src');
212
+ expect(found?.isDirectory).toBe(true);
213
+ });
214
+ it('finds nested file', () => {
215
+ const tree = createSimpleTree();
216
+ const found = findNodeByPath(tree, 'src/index.ts');
217
+ expect(found?.path).toBe('src/index.ts');
218
+ expect(found?.isDirectory).toBe(false);
219
+ });
220
+ it('returns null for non-existent path', () => {
221
+ const tree = createSimpleTree();
222
+ expect(findNodeByPath(tree, 'nonexistent')).toBeNull();
223
+ });
224
+ });
225
+ describe('getHierarchicalViewItems', () => {
226
+ it('returns root children when navigation stack empty', () => {
227
+ const tree = createSimpleTree();
228
+ const decisions = new Map();
229
+ const items = getHierarchicalViewItems(tree, [], decisions);
230
+ expect(items).toHaveLength(2); // src folder and config.json
231
+ });
232
+ it('returns folder children when navigated', () => {
233
+ const tree = createSimpleTree();
234
+ const decisions = new Map();
235
+ const items = getHierarchicalViewItems(tree, ['src'], decisions);
236
+ expect(items).toHaveLength(2); // index.ts and utils.ts
237
+ expect(items.every((i) => i.path.startsWith('src/'))).toBe(true);
238
+ });
239
+ it('sorts folders before files', () => {
240
+ const tree = createSimpleTree();
241
+ const decisions = new Map();
242
+ const items = getHierarchicalViewItems(tree, [], decisions);
243
+ // src folder should come before config.json file
244
+ const srcIndex = items.findIndex((i) => i.path === 'src');
245
+ const configIndex = items.findIndex((i) => i.path === 'config.json');
246
+ expect(srcIndex).toBeLessThan(configIndex);
247
+ });
248
+ });
249
+ describe('getFlatViewItems', () => {
250
+ it('returns all directories and files', () => {
251
+ const tree = createSimpleTree();
252
+ const decisions = new Map();
253
+ const items = getFlatViewItems(tree, decisions);
254
+ // Should have 1 directory (src) and 3 files
255
+ expect(items.some((i) => i.path === 'src' && i.isDirectory)).toBe(true);
256
+ expect(items.some((i) => i.path === 'src/index.ts')).toBe(true);
257
+ expect(items.some((i) => i.path === 'src/utils.ts')).toBe(true);
258
+ expect(items.some((i) => i.path === 'config.json')).toBe(true);
259
+ });
260
+ it('sorts alphabetically', () => {
261
+ const tree = createSimpleTree();
262
+ const decisions = new Map();
263
+ const items = getFlatViewItems(tree, decisions);
264
+ const paths = items.map((i) => i.path);
265
+ const sorted = [...paths].sort();
266
+ expect(paths).toEqual(sorted);
267
+ });
268
+ });
269
+ describe('getVisibleItems', () => {
270
+ it('filters items based on active filters', () => {
271
+ const tree = createSimpleTree();
272
+ const decisions = new Map([
273
+ ['src/index.ts', 'add'],
274
+ ['src/utils.ts', 'skip'],
275
+ ['config.json', 'add'],
276
+ ]);
277
+ const state = {
278
+ fileTree: tree,
279
+ decisions,
280
+ viewMode: 'flat',
281
+ activeFilters: new Set(['add']),
282
+ showHelp: false,
283
+ navigationStack: [],
284
+ cursorIndex: 0,
285
+ scrollOffset: 0,
286
+ };
287
+ const items = getVisibleItems(state);
288
+ // Should show items with 'add' state - src folder (contains add), src/index.ts, config.json
289
+ expect(items.some((i) => i.path === 'src/index.ts')).toBe(true);
290
+ expect(items.some((i) => i.path === 'config.json')).toBe(true);
291
+ expect(items.some((i) => i.path === 'src/utils.ts')).toBe(false);
292
+ });
293
+ it('shows nothing when no filters active', () => {
294
+ const tree = createSimpleTree();
295
+ const state = {
296
+ fileTree: tree,
297
+ decisions: new Map(),
298
+ viewMode: 'flat',
299
+ activeFilters: new Set(),
300
+ showHelp: false,
301
+ navigationStack: [],
302
+ cursorIndex: 0,
303
+ scrollOffset: 0,
304
+ };
305
+ const items = getVisibleItems(state);
306
+ expect(items).toHaveLength(0);
307
+ });
308
+ });
309
+ describe('getDisplayItems', () => {
310
+ it('adds back navigation in hierarchical mode when navigated', () => {
311
+ const tree = createSimpleTree();
312
+ const state = {
313
+ fileTree: tree,
314
+ decisions: new Map(),
315
+ viewMode: 'hierarchical',
316
+ activeFilters: new Set(['undecided']),
317
+ showHelp: false,
318
+ navigationStack: ['src'],
319
+ cursorIndex: 0,
320
+ scrollOffset: 0,
321
+ };
322
+ const items = getDisplayItems(state);
323
+ expect(items[0].path).toBe('..');
324
+ });
325
+ it('does not add back navigation at root', () => {
326
+ const tree = createSimpleTree();
327
+ const state = {
328
+ fileTree: tree,
329
+ decisions: new Map(),
330
+ viewMode: 'hierarchical',
331
+ activeFilters: new Set(['undecided']),
332
+ showHelp: false,
333
+ navigationStack: [],
334
+ cursorIndex: 0,
335
+ scrollOffset: 0,
336
+ };
337
+ const items = getDisplayItems(state);
338
+ expect(items[0]?.path).not.toBe('..');
339
+ });
340
+ it('does not add back navigation in flat mode', () => {
341
+ const tree = createSimpleTree();
342
+ const state = {
343
+ fileTree: tree,
344
+ decisions: new Map(),
345
+ viewMode: 'flat',
346
+ activeFilters: new Set(['undecided']),
347
+ showHelp: false,
348
+ navigationStack: ['src'],
349
+ cursorIndex: 0,
350
+ scrollOffset: 0,
351
+ };
352
+ const items = getDisplayItems(state);
353
+ expect(items.every((i) => i.path !== '..')).toBe(true);
354
+ });
355
+ });
356
+ describe('isCommonIgnoreDir', () => {
357
+ it('returns true for common ignore directories', () => {
358
+ expect(isCommonIgnoreDir('node_modules')).toBe(true);
359
+ expect(isCommonIgnoreDir('.git')).toBe(true);
360
+ expect(isCommonIgnoreDir('dist')).toBe(true);
361
+ expect(isCommonIgnoreDir('coverage')).toBe(true);
362
+ });
363
+ it('returns true for nested ignore directories', () => {
364
+ expect(isCommonIgnoreDir('src/node_modules')).toBe(true);
365
+ expect(isCommonIgnoreDir('packages/lib/dist')).toBe(true);
366
+ });
367
+ it('returns false for regular directories', () => {
368
+ expect(isCommonIgnoreDir('src')).toBe(false);
369
+ expect(isCommonIgnoreDir('lib')).toBe(false);
370
+ expect(isCommonIgnoreDir('components')).toBe(false);
371
+ });
372
+ });
373
+ describe('COMMON_IGNORE_DIRS', () => {
374
+ it('contains expected directories', () => {
375
+ expect(COMMON_IGNORE_DIRS).toContain('node_modules');
376
+ expect(COMMON_IGNORE_DIRS).toContain('.git');
377
+ expect(COMMON_IGNORE_DIRS).toContain('dist');
378
+ expect(COMMON_IGNORE_DIRS).toContain('build');
379
+ expect(COMMON_IGNORE_DIRS).toContain('coverage');
380
+ });
381
+ });
382
+ });
383
+ //# sourceMappingURL=manage-manifest.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manage-manifest.test.js","sourceRoot":"","sources":["../../../src/lib/wtlink/manage-manifest.test.ts"],"names":[],"mappings":"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"}
@@ -2,5 +2,32 @@ export interface ValidateArgv {
2
2
  manifestFile: string;
3
3
  source?: string;
4
4
  }
5
+ export interface ValidationResult {
6
+ problems: string[];
7
+ checkedCount: number;
8
+ duplicates: string[];
9
+ missingFiles: string[];
10
+ notIgnored: string[];
11
+ }
12
+ /**
13
+ * Find duplicate entries in manifest content
14
+ */
15
+ export declare function findDuplicates(manifestContent: string): string[];
16
+ /**
17
+ * Count active (non-comment) entries in manifest content
18
+ */
19
+ export declare function countActiveEntries(manifestContent: string): number;
20
+ /**
21
+ * Get active entries from manifest content (non-comment, non-empty lines)
22
+ */
23
+ export declare function getActiveEntries(manifestContent: string): string[];
24
+ /**
25
+ * Find files that are missing from the source directory
26
+ */
27
+ export declare function findMissingFiles(entries: string[], sourceDir: string, fileExists?: (path: string) => boolean): string[];
28
+ /**
29
+ * Validate manifest content and return validation results
30
+ */
31
+ export declare function validateManifestContent(manifestContent: string, sourceDir: string, fileExists?: (path: string) => boolean, isGitIgnored?: (path: string, cwd?: string) => boolean): ValidationResult;
5
32
  export declare function run(argv: ValidateArgv): void;
6
33
  //# sourceMappingURL=validate-manifest.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate-manifest.d.ts","sourceRoot":"","sources":["../../../src/lib/wtlink/validate-manifest.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CA2D5C"}
1
+ {"version":3,"file":"validate-manifest.d.ts","sourceRoot":"","sources":["../../../src/lib/wtlink/validate-manifest.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,EAAE,CAoBhE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAelE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,EAAE,CAelE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,EAAE,MAAM,EACjB,UAAU,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAuB,GACpD,MAAM,EAAE,CAWV;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,UAAU,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAuB,EACrD,YAAY,GAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,OAA0B,GACvE,gBAAgB,CAoClB;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CA6B5C"}
@@ -2,50 +2,125 @@ import fs from 'fs';
2
2
  import path from 'path';
3
3
  import * as colors from '../colors.js';
4
4
  import * as git from '../git.js';
5
- export function run(argv) {
6
- const gitRoot = git.getRepoRoot(); // Current worktree root
7
- const mainWorktreeRoot = git.getMainWorktreeRoot(); // Main worktree root (for manifest location)
8
- const manifestPath = path.join(mainWorktreeRoot, argv.manifestFile);
9
- if (!fs.existsSync(manifestPath)) {
10
- throw new Error(`Manifest file not found at ${manifestPath}`);
11
- }
12
- const sourceDir = argv.source ? path.resolve(argv.source) : gitRoot;
13
- if (!fs.existsSync(sourceDir) || !fs.statSync(sourceDir).isDirectory()) {
14
- throw new Error(`Source directory does not exist or is not a directory: ${sourceDir}`);
15
- }
16
- const manifestLines = fs
17
- .readFileSync(manifestPath, 'utf-8')
18
- .split('\n')
19
- .map((line) => line.trim());
5
+ /**
6
+ * Find duplicate entries in manifest content
7
+ */
8
+ export function findDuplicates(manifestContent) {
20
9
  const seen = new Set();
21
- const problems = [];
22
- let checkedCount = 0;
23
- for (const line of manifestLines) {
10
+ const duplicates = [];
11
+ for (const rawLine of manifestContent.split('\n')) {
12
+ const line = rawLine.trim();
13
+ // Skip empty lines and comments
24
14
  if (!line || line.startsWith('#')) {
25
15
  continue;
26
16
  }
27
17
  if (seen.has(line)) {
28
- problems.push(`Duplicate entry found in manifest: ${line}`);
18
+ duplicates.push(line);
19
+ }
20
+ else {
21
+ seen.add(line);
22
+ }
23
+ }
24
+ return duplicates;
25
+ }
26
+ /**
27
+ * Count active (non-comment) entries in manifest content
28
+ */
29
+ export function countActiveEntries(manifestContent) {
30
+ let count = 0;
31
+ for (const rawLine of manifestContent.split('\n')) {
32
+ const line = rawLine.trim();
33
+ // Skip empty lines and comments
34
+ if (!line || line.startsWith('#')) {
35
+ continue;
36
+ }
37
+ count++;
38
+ }
39
+ return count;
40
+ }
41
+ /**
42
+ * Get active entries from manifest content (non-comment, non-empty lines)
43
+ */
44
+ export function getActiveEntries(manifestContent) {
45
+ const entries = [];
46
+ for (const rawLine of manifestContent.split('\n')) {
47
+ const line = rawLine.trim();
48
+ // Skip empty lines and comments
49
+ if (!line || line.startsWith('#')) {
29
50
  continue;
30
51
  }
31
- seen.add(line);
52
+ entries.push(line);
53
+ }
54
+ return entries;
55
+ }
56
+ /**
57
+ * Find files that are missing from the source directory
58
+ */
59
+ export function findMissingFiles(entries, sourceDir, fileExists = fs.existsSync) {
60
+ const missing = [];
61
+ for (const entry of entries) {
62
+ const absolutePath = path.join(sourceDir, entry);
63
+ if (!fileExists(absolutePath)) {
64
+ missing.push(entry);
65
+ }
66
+ }
67
+ return missing;
68
+ }
69
+ /**
70
+ * Validate manifest content and return validation results
71
+ */
72
+ export function validateManifestContent(manifestContent, sourceDir, fileExists = fs.existsSync, isGitIgnored = git.isGitIgnored) {
73
+ const problems = [];
74
+ const duplicates = findDuplicates(manifestContent);
75
+ const entries = getActiveEntries(manifestContent);
76
+ const seen = new Set();
77
+ const missingFiles = [];
78
+ const notIgnored = [];
79
+ let checkedCount = 0;
80
+ // Add duplicate problems
81
+ for (const dup of duplicates) {
82
+ problems.push(`Duplicate entry found in manifest: ${dup}`);
83
+ }
84
+ // Check each entry
85
+ for (const entry of entries) {
86
+ if (seen.has(entry)) {
87
+ continue; // Skip duplicates, already reported
88
+ }
89
+ seen.add(entry);
32
90
  checkedCount++;
33
- const absolutePath = path.join(sourceDir, line);
34
- if (!fs.existsSync(absolutePath)) {
91
+ const absolutePath = path.join(sourceDir, entry);
92
+ if (!fileExists(absolutePath)) {
35
93
  problems.push(`Missing source file: ${absolutePath}`);
94
+ missingFiles.push(entry);
36
95
  continue;
37
96
  }
38
- if (!git.isGitIgnored(absolutePath)) {
39
- problems.push(`File is not ignored by git: ${line}`);
97
+ if (!isGitIgnored(absolutePath, sourceDir)) {
98
+ problems.push(`File is not ignored by git: ${entry}`);
99
+ notIgnored.push(entry);
40
100
  }
41
101
  }
42
- if (problems.length > 0) {
102
+ return { problems, checkedCount, duplicates, missingFiles, notIgnored };
103
+ }
104
+ export function run(argv) {
105
+ const gitRoot = git.getRepoRoot(); // Current worktree root
106
+ const mainWorktreeRoot = git.getMainWorktreeRoot(); // Main worktree root (for manifest location)
107
+ const manifestPath = path.join(mainWorktreeRoot, argv.manifestFile);
108
+ if (!fs.existsSync(manifestPath)) {
109
+ throw new Error(`Manifest file not found at ${manifestPath}`);
110
+ }
111
+ const sourceDir = argv.source ? path.resolve(argv.source) : gitRoot;
112
+ if (!fs.existsSync(sourceDir) || !fs.statSync(sourceDir).isDirectory()) {
113
+ throw new Error(`Source directory does not exist or is not a directory: ${sourceDir}`);
114
+ }
115
+ const manifestContent = fs.readFileSync(manifestPath, 'utf-8');
116
+ const result = validateManifestContent(manifestContent, sourceDir);
117
+ if (result.problems.length > 0) {
43
118
  console.error(colors.red(colors.bold('Manifest validation failed:')));
44
- for (const issue of problems) {
119
+ for (const issue of result.problems) {
45
120
  console.error(colors.red(` - ${issue}`));
46
121
  }
47
- throw new Error(`${problems.length} validation issue(s) detected.`);
122
+ throw new Error(`${result.problems.length} validation issue(s) detected.`);
48
123
  }
49
- console.log(colors.green(`Manifest ${argv.manifestFile} is valid. Checked ${checkedCount} entries.`));
124
+ console.log(colors.green(`Manifest ${argv.manifestFile} is valid. Checked ${result.checkedCount} entries.`));
50
125
  }
51
126
  //# sourceMappingURL=validate-manifest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate-manifest.js","sourceRoot":"","sources":["../../../src/lib/wtlink/validate-manifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validate-manifest.js","sourceRoot":"","sources":["../../../src/lib/wtlink/validate-manifest.ts"],"names":[],"mappings":"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"}