@lumenflow/cli 1.0.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.
- package/LICENSE +190 -0
- package/README.md +116 -0
- package/dist/gates.d.ts +41 -0
- package/dist/gates.d.ts.map +1 -0
- package/dist/gates.js +684 -0
- package/dist/gates.js.map +1 -0
- package/dist/initiative-add-wu.d.ts +22 -0
- package/dist/initiative-add-wu.d.ts.map +1 -0
- package/dist/initiative-add-wu.js +234 -0
- package/dist/initiative-add-wu.js.map +1 -0
- package/dist/initiative-create.d.ts +28 -0
- package/dist/initiative-create.d.ts.map +1 -0
- package/dist/initiative-create.js +172 -0
- package/dist/initiative-create.js.map +1 -0
- package/dist/initiative-edit.d.ts +34 -0
- package/dist/initiative-edit.d.ts.map +1 -0
- package/dist/initiative-edit.js +440 -0
- package/dist/initiative-edit.js.map +1 -0
- package/dist/initiative-list.d.ts +12 -0
- package/dist/initiative-list.d.ts.map +1 -0
- package/dist/initiative-list.js +101 -0
- package/dist/initiative-list.js.map +1 -0
- package/dist/initiative-status.d.ts +11 -0
- package/dist/initiative-status.d.ts.map +1 -0
- package/dist/initiative-status.js +221 -0
- package/dist/initiative-status.js.map +1 -0
- package/dist/mem-checkpoint.d.ts +16 -0
- package/dist/mem-checkpoint.d.ts.map +1 -0
- package/dist/mem-checkpoint.js +237 -0
- package/dist/mem-checkpoint.js.map +1 -0
- package/dist/mem-cleanup.d.ts +29 -0
- package/dist/mem-cleanup.d.ts.map +1 -0
- package/dist/mem-cleanup.js +267 -0
- package/dist/mem-cleanup.js.map +1 -0
- package/dist/mem-create.d.ts +17 -0
- package/dist/mem-create.d.ts.map +1 -0
- package/dist/mem-create.js +265 -0
- package/dist/mem-create.js.map +1 -0
- package/dist/mem-inbox.d.ts +35 -0
- package/dist/mem-inbox.d.ts.map +1 -0
- package/dist/mem-inbox.js +373 -0
- package/dist/mem-inbox.js.map +1 -0
- package/dist/mem-init.d.ts +15 -0
- package/dist/mem-init.d.ts.map +1 -0
- package/dist/mem-init.js +146 -0
- package/dist/mem-init.js.map +1 -0
- package/dist/mem-ready.d.ts +16 -0
- package/dist/mem-ready.d.ts.map +1 -0
- package/dist/mem-ready.js +224 -0
- package/dist/mem-ready.js.map +1 -0
- package/dist/mem-signal.d.ts +16 -0
- package/dist/mem-signal.d.ts.map +1 -0
- package/dist/mem-signal.js +204 -0
- package/dist/mem-signal.js.map +1 -0
- package/dist/mem-start.d.ts +16 -0
- package/dist/mem-start.d.ts.map +1 -0
- package/dist/mem-start.js +158 -0
- package/dist/mem-start.js.map +1 -0
- package/dist/mem-summarize.d.ts +22 -0
- package/dist/mem-summarize.d.ts.map +1 -0
- package/dist/mem-summarize.js +213 -0
- package/dist/mem-summarize.js.map +1 -0
- package/dist/mem-triage.d.ts +22 -0
- package/dist/mem-triage.d.ts.map +1 -0
- package/dist/mem-triage.js +328 -0
- package/dist/mem-triage.js.map +1 -0
- package/dist/spawn-list.d.ts +16 -0
- package/dist/spawn-list.d.ts.map +1 -0
- package/dist/spawn-list.js +140 -0
- package/dist/spawn-list.js.map +1 -0
- package/dist/wu-block.d.ts +16 -0
- package/dist/wu-block.d.ts.map +1 -0
- package/dist/wu-block.js +241 -0
- package/dist/wu-block.js.map +1 -0
- package/dist/wu-claim.d.ts +32 -0
- package/dist/wu-claim.d.ts.map +1 -0
- package/dist/wu-claim.js +1106 -0
- package/dist/wu-claim.js.map +1 -0
- package/dist/wu-cleanup.d.ts +17 -0
- package/dist/wu-cleanup.d.ts.map +1 -0
- package/dist/wu-cleanup.js +194 -0
- package/dist/wu-cleanup.js.map +1 -0
- package/dist/wu-create.d.ts +38 -0
- package/dist/wu-create.d.ts.map +1 -0
- package/dist/wu-create.js +520 -0
- package/dist/wu-create.js.map +1 -0
- package/dist/wu-deps.d.ts +13 -0
- package/dist/wu-deps.d.ts.map +1 -0
- package/dist/wu-deps.js +119 -0
- package/dist/wu-deps.js.map +1 -0
- package/dist/wu-done.d.ts +153 -0
- package/dist/wu-done.d.ts.map +1 -0
- package/dist/wu-done.js +2096 -0
- package/dist/wu-done.js.map +1 -0
- package/dist/wu-edit.d.ts +29 -0
- package/dist/wu-edit.d.ts.map +1 -0
- package/dist/wu-edit.js +852 -0
- package/dist/wu-edit.js.map +1 -0
- package/dist/wu-infer-lane.d.ts +17 -0
- package/dist/wu-infer-lane.d.ts.map +1 -0
- package/dist/wu-infer-lane.js +135 -0
- package/dist/wu-infer-lane.js.map +1 -0
- package/dist/wu-preflight.d.ts +47 -0
- package/dist/wu-preflight.d.ts.map +1 -0
- package/dist/wu-preflight.js +167 -0
- package/dist/wu-preflight.js.map +1 -0
- package/dist/wu-prune.d.ts +16 -0
- package/dist/wu-prune.d.ts.map +1 -0
- package/dist/wu-prune.js +259 -0
- package/dist/wu-prune.js.map +1 -0
- package/dist/wu-repair.d.ts +60 -0
- package/dist/wu-repair.d.ts.map +1 -0
- package/dist/wu-repair.js +226 -0
- package/dist/wu-repair.js.map +1 -0
- package/dist/wu-spawn-completion.d.ts +10 -0
- package/dist/wu-spawn-completion.js +30 -0
- package/dist/wu-spawn.d.ts +168 -0
- package/dist/wu-spawn.d.ts.map +1 -0
- package/dist/wu-spawn.js +1327 -0
- package/dist/wu-spawn.js.map +1 -0
- package/dist/wu-unblock.d.ts +16 -0
- package/dist/wu-unblock.d.ts.map +1 -0
- package/dist/wu-unblock.js +234 -0
- package/dist/wu-unblock.js.map +1 -0
- package/dist/wu-validate.d.ts +16 -0
- package/dist/wu-validate.d.ts.map +1 -0
- package/dist/wu-validate.js +193 -0
- package/dist/wu-validate.js.map +1 -0
- package/package.json +92 -0
package/dist/wu-prune.js
ADDED
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* WU Prune Utility
|
|
4
|
+
*
|
|
5
|
+
* Maintains worktree hygiene by:
|
|
6
|
+
* - Running git worktree prune to clean stale metadata
|
|
7
|
+
* - Validating worktree ↔ WU ↔ lane mappings
|
|
8
|
+
* - Warning on orphaned worktrees (no matching WU YAML)
|
|
9
|
+
* - Warning on stale worktrees (WU status is done/blocked)
|
|
10
|
+
* - Warning on invalid branch naming conventions
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* pnpm wu:prune # Dry-run mode (shows what would be done)
|
|
14
|
+
* pnpm wu:prune --execute # Actually run cleanup
|
|
15
|
+
*/
|
|
16
|
+
import { existsSync } from 'node:fs';
|
|
17
|
+
import path from 'node:path';
|
|
18
|
+
import { readWUYaml, validateBranchName, extractWUFromBranch, } from '@lumenflow/core/dist/wu-helpers.js';
|
|
19
|
+
import { WU_PATHS } from '@lumenflow/core/dist/wu-paths.js';
|
|
20
|
+
import { die } from '@lumenflow/core/dist/error-handler.js';
|
|
21
|
+
import { getGitForCwd } from '@lumenflow/core/dist/git-adapter.js';
|
|
22
|
+
import { detectOrphanWorktrees, removeOrphanDirectory, } from '@lumenflow/core/dist/orphan-detector.js';
|
|
23
|
+
import { BRANCHES, WU_STATUS, CLI_FLAGS, EXIT_CODES, STRING_LITERALS, EMOJI, LOG_PREFIX, } from '@lumenflow/core/dist/wu-constants.js';
|
|
24
|
+
function parseArgs(argv) {
|
|
25
|
+
const args = { dryRun: true }; // Default to dry-run for safety
|
|
26
|
+
for (let i = 2; i < argv.length; i++) {
|
|
27
|
+
const a = argv[i];
|
|
28
|
+
if (a === CLI_FLAGS.EXECUTE)
|
|
29
|
+
args.dryRun = false;
|
|
30
|
+
else if (a === CLI_FLAGS.DRY_RUN)
|
|
31
|
+
args.dryRun = true;
|
|
32
|
+
else if (a === CLI_FLAGS.HELP || a === CLI_FLAGS.HELP_SHORT)
|
|
33
|
+
args.help = true;
|
|
34
|
+
else
|
|
35
|
+
die(`Unknown argument: ${a}`);
|
|
36
|
+
}
|
|
37
|
+
return args;
|
|
38
|
+
}
|
|
39
|
+
async function listWorktrees() {
|
|
40
|
+
const output = await getGitForCwd().worktreeList();
|
|
41
|
+
if (!output)
|
|
42
|
+
return [];
|
|
43
|
+
const worktrees = [];
|
|
44
|
+
const lines = output.split(STRING_LITERALS.NEWLINE);
|
|
45
|
+
let current = {};
|
|
46
|
+
for (const line of lines) {
|
|
47
|
+
if (line.startsWith('worktree ')) {
|
|
48
|
+
if (current.path)
|
|
49
|
+
worktrees.push(current);
|
|
50
|
+
current = { path: line.substring(9).trim() };
|
|
51
|
+
}
|
|
52
|
+
else if (line.startsWith('HEAD ')) {
|
|
53
|
+
current.head = line.substring(5).trim();
|
|
54
|
+
}
|
|
55
|
+
else if (line.startsWith('branch ')) {
|
|
56
|
+
const fullRef = line.substring(7).trim();
|
|
57
|
+
// Extract branch name from refs/heads/...
|
|
58
|
+
current.branch = fullRef.replace(/^refs\/heads\//, '');
|
|
59
|
+
}
|
|
60
|
+
else if (line === '') {
|
|
61
|
+
if (current.path)
|
|
62
|
+
worktrees.push(current);
|
|
63
|
+
current = {};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (current.path)
|
|
67
|
+
worktrees.push(current);
|
|
68
|
+
return worktrees;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Validate a single worktree
|
|
72
|
+
* @returns {Promise<{valid: boolean, warnings: string[], errors: string[]}>}
|
|
73
|
+
*/
|
|
74
|
+
async function validateWorktree(wt) {
|
|
75
|
+
const warnings = [];
|
|
76
|
+
const errors = [];
|
|
77
|
+
// Skip main worktree
|
|
78
|
+
if (wt.branch === BRANCHES.MAIN) {
|
|
79
|
+
return { valid: true, warnings, errors };
|
|
80
|
+
}
|
|
81
|
+
// Check branch naming convention
|
|
82
|
+
const branchValidation = validateBranchName(wt.branch);
|
|
83
|
+
if (!branchValidation.valid) {
|
|
84
|
+
errors.push(`Invalid branch name: ${wt.branch}\n Expected: lane/<lane>/<wu-id>\n ${branchValidation.error}`);
|
|
85
|
+
return { valid: false, warnings, errors }; // Can't continue validation without WU ID
|
|
86
|
+
}
|
|
87
|
+
const wuid = extractWUFromBranch(wt.branch);
|
|
88
|
+
if (!wuid) {
|
|
89
|
+
errors.push(`Could not extract WU ID from branch: ${wt.branch}`);
|
|
90
|
+
return { valid: false, warnings, errors };
|
|
91
|
+
}
|
|
92
|
+
// Check if WU YAML exists
|
|
93
|
+
const repoRoot = await getGitForCwd().raw(['rev-parse', '--show-toplevel']);
|
|
94
|
+
const wuPath = path.join(repoRoot.trim(), WU_PATHS.WU(wuid));
|
|
95
|
+
if (!existsSync(wuPath)) {
|
|
96
|
+
errors.push(`Orphaned worktree: WU ${wuid} not found\n Worktree: ${wt.path}\n Branch: ${wt.branch}\n Expected: ${wuPath}`);
|
|
97
|
+
return { valid: false, warnings, errors };
|
|
98
|
+
}
|
|
99
|
+
// Read WU YAML and check status
|
|
100
|
+
const wu = readWUYaml(wuid);
|
|
101
|
+
if (!wu) {
|
|
102
|
+
errors.push(`Failed to parse WU YAML: ${wuPath}`);
|
|
103
|
+
return { valid: false, warnings, errors };
|
|
104
|
+
}
|
|
105
|
+
// Check for status mismatches
|
|
106
|
+
const status = wu.status;
|
|
107
|
+
if (status === WU_STATUS.DONE) {
|
|
108
|
+
warnings.push(`Stale worktree: WU ${wuid} is marked '${WU_STATUS.DONE}'\n Worktree: ${wt.path}\n Branch: ${wt.branch}\n Action: Remove with 'git worktree remove ${wt.path}'`);
|
|
109
|
+
}
|
|
110
|
+
else if (status === WU_STATUS.BLOCKED) {
|
|
111
|
+
warnings.push(`Blocked worktree: WU ${wuid} is marked '${WU_STATUS.BLOCKED}'\n Worktree: ${wt.path}\n Branch: ${wt.branch}\n Consider: Keep if resuming soon, otherwise remove`);
|
|
112
|
+
}
|
|
113
|
+
else if (status === WU_STATUS.READY) {
|
|
114
|
+
warnings.push(`Unclaimed worktree: WU ${wuid} is marked '${WU_STATUS.READY}'\n Worktree: ${wt.path}\n Branch: ${wt.branch}\n Expected: Status should be '${WU_STATUS.IN_PROGRESS}' for active worktrees`);
|
|
115
|
+
}
|
|
116
|
+
// Check lane consistency
|
|
117
|
+
const laneName = branchValidation.lane;
|
|
118
|
+
const wuLane = wu.lane;
|
|
119
|
+
if (wuLane && laneName && laneName !== wuLane.toLowerCase()) {
|
|
120
|
+
warnings.push(`Lane mismatch: Branch lane '${laneName}' doesn't match WU lane '${wuLane}'\n Worktree: ${wt.path}\n WU: ${wuid}`);
|
|
121
|
+
}
|
|
122
|
+
return { valid: true, warnings, errors };
|
|
123
|
+
}
|
|
124
|
+
async function main() {
|
|
125
|
+
const args = parseArgs(process.argv);
|
|
126
|
+
const PREFIX = LOG_PREFIX.PRUNE;
|
|
127
|
+
if (args.help) {
|
|
128
|
+
console.log(`
|
|
129
|
+
WU Prune Utility - Maintain worktree hygiene
|
|
130
|
+
|
|
131
|
+
Usage:
|
|
132
|
+
pnpm wu:prune # Dry-run mode (default, shows issues but doesn't change anything)
|
|
133
|
+
pnpm wu:prune --execute # Execute cleanup (runs git worktree prune)
|
|
134
|
+
|
|
135
|
+
This tool:
|
|
136
|
+
${EMOJI.SUCCESS} Runs 'git worktree prune' to clean stale worktree metadata
|
|
137
|
+
${EMOJI.SUCCESS} Detects orphan directories (exist on disk but not tracked by git)
|
|
138
|
+
${EMOJI.SUCCESS} Validates worktree to WU to lane mappings
|
|
139
|
+
${EMOJI.SUCCESS} Warns on orphaned worktrees (no matching WU YAML)
|
|
140
|
+
${EMOJI.SUCCESS} Warns on stale worktrees (WU status is 'done' or 'blocked')
|
|
141
|
+
${EMOJI.SUCCESS} Warns on invalid branch naming (not lane/<lane>/<wu-id>)
|
|
142
|
+
${EMOJI.SUCCESS} Safe to run regularly (doesn't break active work)
|
|
143
|
+
`);
|
|
144
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
145
|
+
}
|
|
146
|
+
console.log(`${PREFIX} Worktree Hygiene Check`);
|
|
147
|
+
console.log(`${PREFIX} =====================\n`);
|
|
148
|
+
if (args.dryRun) {
|
|
149
|
+
console.log(`${PREFIX} ${EMOJI.INFO} DRY-RUN MODE (use --execute to apply changes)\n`);
|
|
150
|
+
}
|
|
151
|
+
// Get all worktrees
|
|
152
|
+
const worktrees = await listWorktrees();
|
|
153
|
+
console.log(`${PREFIX} Found ${worktrees.length} tracked worktree(s)\n`);
|
|
154
|
+
let totalWarnings = 0;
|
|
155
|
+
let totalErrors = 0;
|
|
156
|
+
let orphansRemoved = 0;
|
|
157
|
+
// Layer 2: Detect orphan directories (WU-1476)
|
|
158
|
+
console.log(`${PREFIX} Checking for orphan directories...`);
|
|
159
|
+
const orphanResult = await detectOrphanWorktrees(process.cwd());
|
|
160
|
+
if (orphanResult.errors.length > 0) {
|
|
161
|
+
console.log(`${PREFIX} ${EMOJI.WARNING} Orphan detection errors:`);
|
|
162
|
+
orphanResult.errors.forEach((e) => console.log(` ${e}`));
|
|
163
|
+
totalErrors += orphanResult.errors.length;
|
|
164
|
+
}
|
|
165
|
+
if (orphanResult.orphans.length > 0) {
|
|
166
|
+
console.log(`${PREFIX} ${EMOJI.WARNING} Found ${orphanResult.orphans.length} orphan director${orphanResult.orphans.length === 1 ? 'y' : 'ies'} (not tracked by git):`);
|
|
167
|
+
for (const orphanPath of orphanResult.orphans) {
|
|
168
|
+
console.log(` - ${orphanPath}`);
|
|
169
|
+
if (!args.dryRun) {
|
|
170
|
+
const removeResult = await removeOrphanDirectory(orphanPath);
|
|
171
|
+
if (removeResult.removed) {
|
|
172
|
+
console.log(` ${EMOJI.SUCCESS} Removed`);
|
|
173
|
+
orphansRemoved++;
|
|
174
|
+
}
|
|
175
|
+
else if (removeResult.error) {
|
|
176
|
+
console.log(` ${EMOJI.FAILURE} Failed: ${removeResult.error}`);
|
|
177
|
+
totalErrors++;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (args.dryRun && orphanResult.orphans.length > 0) {
|
|
182
|
+
console.log(`${PREFIX} (use --execute to remove orphan directories)`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
console.log(`${PREFIX} ${EMOJI.SUCCESS} No orphan directories found`);
|
|
187
|
+
}
|
|
188
|
+
console.log('');
|
|
189
|
+
// Validate each tracked worktree
|
|
190
|
+
for (const wt of worktrees) {
|
|
191
|
+
const { warnings, errors } = await validateWorktree(wt);
|
|
192
|
+
if (warnings.length > 0) {
|
|
193
|
+
console.log(`${PREFIX} ${EMOJI.WARNING} Warnings for ${wt.path}:`);
|
|
194
|
+
warnings.forEach((w) => console.log(` ${w}\n`));
|
|
195
|
+
totalWarnings += warnings.length;
|
|
196
|
+
}
|
|
197
|
+
if (errors.length > 0) {
|
|
198
|
+
console.log(`${PREFIX} ${EMOJI.FAILURE} Errors for ${wt.path}:`);
|
|
199
|
+
errors.forEach((e) => console.log(` ${e}\n`));
|
|
200
|
+
totalErrors += errors.length;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// Run git worktree prune
|
|
204
|
+
console.log(`${PREFIX} Running git worktree prune...`);
|
|
205
|
+
if (args.dryRun) {
|
|
206
|
+
console.log(`${PREFIX} (skipped in dry-run mode)`);
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
try {
|
|
210
|
+
const output = await getGitForCwd().raw(['worktree', 'prune', '-v']);
|
|
211
|
+
if (output) {
|
|
212
|
+
console.log(output);
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
console.log(`${PREFIX} ${EMOJI.SUCCESS} No stale worktree metadata to prune`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
catch (e) {
|
|
219
|
+
console.error(`${PREFIX} ${EMOJI.WARNING} Failed to run git worktree prune: ${e.message}`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// Summary
|
|
223
|
+
console.log(`\n${PREFIX} Summary`);
|
|
224
|
+
console.log(`${PREFIX} ========`);
|
|
225
|
+
console.log(`${PREFIX} Tracked worktrees: ${worktrees.length}`);
|
|
226
|
+
console.log(`${PREFIX} Orphan directories: ${orphanResult.orphans.length}`);
|
|
227
|
+
if (!args.dryRun && orphansRemoved > 0) {
|
|
228
|
+
console.log(`${PREFIX} Orphans removed: ${orphansRemoved}`);
|
|
229
|
+
}
|
|
230
|
+
console.log(`${PREFIX} Warnings: ${totalWarnings}`);
|
|
231
|
+
console.log(`${PREFIX} Errors: ${totalErrors}`);
|
|
232
|
+
if (totalWarnings > 0 || totalErrors > 0 || orphanResult.orphans.length > 0) {
|
|
233
|
+
console.log(`\n${PREFIX} ${EMOJI.INFO} Recommendations:`);
|
|
234
|
+
if (orphanResult.orphans.length > 0 && args.dryRun) {
|
|
235
|
+
console.log(`${PREFIX} - Run 'pnpm wu:prune --execute' to remove orphan directories`);
|
|
236
|
+
}
|
|
237
|
+
if (totalErrors > 0) {
|
|
238
|
+
console.log(`${PREFIX} - Fix errors above (orphaned/invalid worktrees)`);
|
|
239
|
+
console.log(`${PREFIX} - Remove orphaned worktrees: git worktree remove <path>`);
|
|
240
|
+
}
|
|
241
|
+
if (totalWarnings > 0) {
|
|
242
|
+
console.log(`${PREFIX} - Review warnings and clean up stale worktrees`);
|
|
243
|
+
console.log(`${PREFIX} - For done WUs: Use pnpm wu:done to clean up properly`);
|
|
244
|
+
console.log(`${PREFIX} - For blocked WUs: Use pnpm wu:block to clean up if not resuming`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
console.log(`\n${PREFIX} ${EMOJI.SUCCESS} All worktrees are valid and up-to-date!`);
|
|
249
|
+
}
|
|
250
|
+
if (args.dryRun) {
|
|
251
|
+
console.log(`\n${PREFIX} ${EMOJI.INFO} This was a dry-run. Use --execute to apply changes.`);
|
|
252
|
+
}
|
|
253
|
+
process.exit(totalErrors > 0 ? EXIT_CODES.ERROR : EXIT_CODES.SUCCESS);
|
|
254
|
+
}
|
|
255
|
+
// Guard main() for testability (WU-1366)
|
|
256
|
+
import { fileURLToPath } from 'node:url';
|
|
257
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
258
|
+
main();
|
|
259
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wu-prune.js","sourceRoot":"","sources":["../src/wu-prune.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* WU State Repair Tool (Unified - WU-1826, WU-2240)
|
|
4
|
+
*
|
|
5
|
+
* Layer 2 defense-in-depth: detect and repair WU state inconsistencies.
|
|
6
|
+
*
|
|
7
|
+
* This unified tool consolidates four repair modes:
|
|
8
|
+
* - Consistency mode (default): detect/repair state inconsistencies
|
|
9
|
+
* - Claim mode (--claim): repair missing claim metadata in worktrees
|
|
10
|
+
* - Admin mode (--admin): administrative fixes for done WUs
|
|
11
|
+
* - State mode (--repair-state): repair corrupted wu-events.jsonl (WU-2240)
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
* # Consistency mode (default)
|
|
15
|
+
* pnpm wu:repair --id WU-123 # Repair single WU
|
|
16
|
+
* pnpm wu:repair --id WU-123 --check # Audit only, no changes
|
|
17
|
+
* pnpm wu:repair --all # Batch repair all WUs
|
|
18
|
+
* pnpm wu:repair --all --check # Audit all WUs
|
|
19
|
+
*
|
|
20
|
+
* # Claim mode
|
|
21
|
+
* pnpm wu:repair --claim --id WU-123 # Repair claim metadata
|
|
22
|
+
* pnpm wu:repair --claim --id WU-123 --check # Check only
|
|
23
|
+
* pnpm wu:repair --claim --id WU-123 --worktree /path/to/worktree
|
|
24
|
+
*
|
|
25
|
+
* # Admin mode
|
|
26
|
+
* pnpm wu:repair --admin --id WU-123 --lane "Operations: Tooling"
|
|
27
|
+
* pnpm wu:repair --admin --id WU-123 --status cancelled
|
|
28
|
+
* pnpm wu:repair --admin --id WU-123 --notes "Administrative fix"
|
|
29
|
+
* pnpm wu:repair --admin --id WU-123 --initiative INIT-001
|
|
30
|
+
*
|
|
31
|
+
* # State mode (WU-2240)
|
|
32
|
+
* pnpm wu:repair --repair-state # Repair default state file
|
|
33
|
+
* pnpm wu:repair --repair-state --path /path/to/wu-events.jsonl # Repair specific file
|
|
34
|
+
*
|
|
35
|
+
* Exit codes:
|
|
36
|
+
* 0: Success (no issues or all repaired)
|
|
37
|
+
* 1: Issues detected (--check mode)
|
|
38
|
+
* 2: Repair failed
|
|
39
|
+
*
|
|
40
|
+
* DEPRECATION NOTICE:
|
|
41
|
+
* - pnpm wu:repair-claim is deprecated. Use: pnpm wu:repair --claim
|
|
42
|
+
* - pnpm wu:admin-repair is deprecated. Use: pnpm wu:repair --admin
|
|
43
|
+
*
|
|
44
|
+
* @see {@link tools/lib/wu-repair-core.mjs} - Core repair logic
|
|
45
|
+
* @see {@link tools/lib/wu-consistency-checker.mjs} - Consistency detection/repair
|
|
46
|
+
* @see {@link tools/lib/wu-state-store.mjs} - State file repair (repairStateFile)
|
|
47
|
+
*/
|
|
48
|
+
/**
|
|
49
|
+
* Normalise WU ID to uppercase with WU- prefix
|
|
50
|
+
* @param {string} id - Raw WU ID
|
|
51
|
+
* @returns {string} Normalised WU ID
|
|
52
|
+
*/
|
|
53
|
+
declare function normaliseWUId(id: any): any;
|
|
54
|
+
/**
|
|
55
|
+
* Validate WU ID format
|
|
56
|
+
* @param {string} id - WU ID to validate
|
|
57
|
+
* @returns {boolean} True if valid
|
|
58
|
+
*/
|
|
59
|
+
declare function isValidWUId(id: any): boolean;
|
|
60
|
+
export { normaliseWUId, isValidWUId };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wu-repair.d.ts","sourceRoot":"","sources":["../src/wu-repair.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAcH;;;;GAIG;AACH,iBAAS,aAAa,CAAC,EAAE,KAAA,OAOxB;AAED;;;;GAIG;AACH,iBAAS,WAAW,CAAC,EAAE,KAAA,OAEtB;AAmLD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* WU State Repair Tool (Unified - WU-1826, WU-2240)
|
|
4
|
+
*
|
|
5
|
+
* Layer 2 defense-in-depth: detect and repair WU state inconsistencies.
|
|
6
|
+
*
|
|
7
|
+
* This unified tool consolidates four repair modes:
|
|
8
|
+
* - Consistency mode (default): detect/repair state inconsistencies
|
|
9
|
+
* - Claim mode (--claim): repair missing claim metadata in worktrees
|
|
10
|
+
* - Admin mode (--admin): administrative fixes for done WUs
|
|
11
|
+
* - State mode (--repair-state): repair corrupted wu-events.jsonl (WU-2240)
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
* # Consistency mode (default)
|
|
15
|
+
* pnpm wu:repair --id WU-123 # Repair single WU
|
|
16
|
+
* pnpm wu:repair --id WU-123 --check # Audit only, no changes
|
|
17
|
+
* pnpm wu:repair --all # Batch repair all WUs
|
|
18
|
+
* pnpm wu:repair --all --check # Audit all WUs
|
|
19
|
+
*
|
|
20
|
+
* # Claim mode
|
|
21
|
+
* pnpm wu:repair --claim --id WU-123 # Repair claim metadata
|
|
22
|
+
* pnpm wu:repair --claim --id WU-123 --check # Check only
|
|
23
|
+
* pnpm wu:repair --claim --id WU-123 --worktree /path/to/worktree
|
|
24
|
+
*
|
|
25
|
+
* # Admin mode
|
|
26
|
+
* pnpm wu:repair --admin --id WU-123 --lane "Operations: Tooling"
|
|
27
|
+
* pnpm wu:repair --admin --id WU-123 --status cancelled
|
|
28
|
+
* pnpm wu:repair --admin --id WU-123 --notes "Administrative fix"
|
|
29
|
+
* pnpm wu:repair --admin --id WU-123 --initiative INIT-001
|
|
30
|
+
*
|
|
31
|
+
* # State mode (WU-2240)
|
|
32
|
+
* pnpm wu:repair --repair-state # Repair default state file
|
|
33
|
+
* pnpm wu:repair --repair-state --path /path/to/wu-events.jsonl # Repair specific file
|
|
34
|
+
*
|
|
35
|
+
* Exit codes:
|
|
36
|
+
* 0: Success (no issues or all repaired)
|
|
37
|
+
* 1: Issues detected (--check mode)
|
|
38
|
+
* 2: Repair failed
|
|
39
|
+
*
|
|
40
|
+
* DEPRECATION NOTICE:
|
|
41
|
+
* - pnpm wu:repair-claim is deprecated. Use: pnpm wu:repair --claim
|
|
42
|
+
* - pnpm wu:admin-repair is deprecated. Use: pnpm wu:repair --admin
|
|
43
|
+
*
|
|
44
|
+
* @see {@link tools/lib/wu-repair-core.mjs} - Core repair logic
|
|
45
|
+
* @see {@link tools/lib/wu-consistency-checker.mjs} - Consistency detection/repair
|
|
46
|
+
* @see {@link tools/lib/wu-state-store.mjs} - State file repair (repairStateFile)
|
|
47
|
+
*/
|
|
48
|
+
import { Command } from 'commander';
|
|
49
|
+
import path from 'node:path';
|
|
50
|
+
import { EXIT_CODES, LOG_PREFIX, PATTERNS } from '@lumenflow/core/dist/wu-constants.js';
|
|
51
|
+
import { runConsistencyRepairMode, runClaimRepairMode, runAdminRepairMode, } from '@lumenflow/core/dist/wu-repair-core.js';
|
|
52
|
+
import { repairStateFile, WU_EVENTS_FILE_NAME } from '@lumenflow/core/dist/wu-state-store.js';
|
|
53
|
+
const PREFIX = LOG_PREFIX.REPAIR;
|
|
54
|
+
/**
|
|
55
|
+
* Normalise WU ID to uppercase with WU- prefix
|
|
56
|
+
* @param {string} id - Raw WU ID
|
|
57
|
+
* @returns {string} Normalised WU ID
|
|
58
|
+
*/
|
|
59
|
+
function normaliseWUId(id) {
|
|
60
|
+
if (!id)
|
|
61
|
+
return id;
|
|
62
|
+
let normalised = id.toUpperCase();
|
|
63
|
+
if (!normalised.startsWith('WU-')) {
|
|
64
|
+
normalised = `WU-${normalised}`;
|
|
65
|
+
}
|
|
66
|
+
return normalised;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Validate WU ID format
|
|
70
|
+
* @param {string} id - WU ID to validate
|
|
71
|
+
* @returns {boolean} True if valid
|
|
72
|
+
*/
|
|
73
|
+
function isValidWUId(id) {
|
|
74
|
+
return PATTERNS.WU_ID.test(id);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Create and configure the CLI program
|
|
78
|
+
*/
|
|
79
|
+
function createProgram() {
|
|
80
|
+
const program = new Command();
|
|
81
|
+
program
|
|
82
|
+
.name('wu-repair')
|
|
83
|
+
.description('Unified WU repair tool - detect and fix WU state issues\n\n' +
|
|
84
|
+
'Modes:\n' +
|
|
85
|
+
' (default) Consistency repair - detect/repair state inconsistencies\n' +
|
|
86
|
+
' --claim Claim repair - fix missing claim metadata in worktrees\n' +
|
|
87
|
+
' --admin Admin repair - fix done WUs (lane, status, notes, initiative)\n' +
|
|
88
|
+
' --repair-state State repair - fix corrupted wu-events.jsonl (WU-2240)')
|
|
89
|
+
// Mode selection flags
|
|
90
|
+
.option('--claim', 'Claim repair mode: fix missing claim metadata in worktrees')
|
|
91
|
+
.option('--admin', 'Admin repair mode: fix done WUs (lane, status, notes, initiative)')
|
|
92
|
+
.option('--repair-state', 'State repair mode: fix corrupted wu-events.jsonl (WU-2240)')
|
|
93
|
+
// Common flags
|
|
94
|
+
.option('--id <wuId>', 'WU ID to check/repair (e.g., WU-123)')
|
|
95
|
+
.option('--check', 'Audit only, no changes (exits 1 if issues found)')
|
|
96
|
+
// Consistency mode flags
|
|
97
|
+
.option('--all', 'Check/repair all WUs (consistency mode only)')
|
|
98
|
+
// Claim mode flags
|
|
99
|
+
.option('--worktree <path>', 'Override worktree path (claim mode only)')
|
|
100
|
+
// Admin mode flags
|
|
101
|
+
.option('--lane <lane>', 'New lane assignment (admin mode only)')
|
|
102
|
+
.option('--status <status>', 'New status value (admin mode only)')
|
|
103
|
+
.option('--notes <text>', 'Add/update notes (admin mode only)')
|
|
104
|
+
.option('--initiative <ref>', 'New initiative reference (admin mode only)')
|
|
105
|
+
// State repair mode flags
|
|
106
|
+
.option('--path <path>', 'Path to state file to repair (state mode only)')
|
|
107
|
+
.parse(process.argv);
|
|
108
|
+
return program.opts();
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Validate options and exit with error if invalid
|
|
112
|
+
*/
|
|
113
|
+
function validateOptions(options) {
|
|
114
|
+
// Validate mode selection - only one mode at a time
|
|
115
|
+
const modes = [options.claim, options.admin, options.repairState].filter(Boolean);
|
|
116
|
+
if (modes.length > 1) {
|
|
117
|
+
console.error(`${PREFIX} Error: Cannot specify multiple modes (--claim, --admin, --repair-state are mutually exclusive)`);
|
|
118
|
+
process.exit(EXIT_CODES.FAILURE);
|
|
119
|
+
}
|
|
120
|
+
// Normalise and validate WU ID if provided
|
|
121
|
+
if (options.id) {
|
|
122
|
+
options.id = normaliseWUId(options.id);
|
|
123
|
+
if (!isValidWUId(options.id)) {
|
|
124
|
+
console.error(`${PREFIX} Error: Invalid WU ID format '${options.id}'`);
|
|
125
|
+
console.error(`${PREFIX} Expected format: WU-123`);
|
|
126
|
+
process.exit(EXIT_CODES.FAILURE);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Validate mode-specific requirements
|
|
132
|
+
*/
|
|
133
|
+
function validateModeRequirements(options) {
|
|
134
|
+
if (options.claim && !options.id) {
|
|
135
|
+
console.error(`${PREFIX} Error: --id is required for claim mode`);
|
|
136
|
+
console.error(`${PREFIX} Usage: pnpm wu:repair --claim --id WU-123`);
|
|
137
|
+
process.exit(EXIT_CODES.FAILURE);
|
|
138
|
+
}
|
|
139
|
+
if (options.admin && !options.id) {
|
|
140
|
+
console.error(`${PREFIX} Error: --id is required for admin mode`);
|
|
141
|
+
console.error(`${PREFIX} Usage: pnpm wu:repair --admin --id WU-123 --lane "Operations: Tooling"`);
|
|
142
|
+
process.exit(EXIT_CODES.FAILURE);
|
|
143
|
+
}
|
|
144
|
+
// State repair mode has no required options (uses default path if not specified)
|
|
145
|
+
if (options.repairState) {
|
|
146
|
+
return; // No additional validation needed
|
|
147
|
+
}
|
|
148
|
+
if (!options.claim && !options.admin) {
|
|
149
|
+
// Consistency mode requirements
|
|
150
|
+
if (!options.id && !options.all) {
|
|
151
|
+
console.error(`${PREFIX} Error: Must specify either --id <WU-ID> or --all`);
|
|
152
|
+
process.exit(EXIT_CODES.FAILURE);
|
|
153
|
+
}
|
|
154
|
+
if (options.id && options.all) {
|
|
155
|
+
console.error(`${PREFIX} Error: Cannot specify both --id and --all`);
|
|
156
|
+
process.exit(EXIT_CODES.FAILURE);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Run state file repair mode (WU-2240)
|
|
162
|
+
*
|
|
163
|
+
* @param {object} options - CLI options
|
|
164
|
+
* @param {string} [options.path] - Path to state file (defaults to .beacon/state/wu-events.jsonl)
|
|
165
|
+
* @returns {Promise<{success: boolean, exitCode: number}>}
|
|
166
|
+
*/
|
|
167
|
+
async function runStateRepairMode(options) {
|
|
168
|
+
// Default path is .beacon/state/wu-events.jsonl relative to cwd
|
|
169
|
+
const defaultPath = path.join(process.cwd(), '.beacon', 'state', WU_EVENTS_FILE_NAME);
|
|
170
|
+
const filePath = options.path || defaultPath;
|
|
171
|
+
console.log(`${PREFIX} Repairing state file: ${filePath}`);
|
|
172
|
+
try {
|
|
173
|
+
const result = await repairStateFile(filePath);
|
|
174
|
+
if (result.linesRemoved === 0 && result.linesKept === 0 && result.backupPath === null) {
|
|
175
|
+
// File didn't exist
|
|
176
|
+
console.log(`${PREFIX} File does not exist, nothing to repair`);
|
|
177
|
+
return { success: true, exitCode: EXIT_CODES.SUCCESS };
|
|
178
|
+
}
|
|
179
|
+
console.log(`${PREFIX} Repair complete:`);
|
|
180
|
+
console.log(`${PREFIX} Lines kept: ${result.linesKept}`);
|
|
181
|
+
console.log(`${PREFIX} Lines removed: ${result.linesRemoved}`);
|
|
182
|
+
if (result.backupPath) {
|
|
183
|
+
console.log(`${PREFIX} Backup created: ${result.backupPath}`);
|
|
184
|
+
}
|
|
185
|
+
if (result.warnings.length > 0) {
|
|
186
|
+
console.log(`${PREFIX} Warnings:`);
|
|
187
|
+
for (const warning of result.warnings) {
|
|
188
|
+
console.log(`${PREFIX} - ${warning}`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return { success: true, exitCode: EXIT_CODES.SUCCESS };
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
console.error(`${PREFIX} Error repairing state file: ${error.message}`);
|
|
195
|
+
return { success: false, exitCode: EXIT_CODES.FAILURE };
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Route to appropriate repair mode
|
|
200
|
+
*/
|
|
201
|
+
async function routeToRepairMode(options) {
|
|
202
|
+
if (options.claim) {
|
|
203
|
+
return runClaimRepairMode(options);
|
|
204
|
+
}
|
|
205
|
+
if (options.admin) {
|
|
206
|
+
return runAdminRepairMode(options);
|
|
207
|
+
}
|
|
208
|
+
if (options.repairState) {
|
|
209
|
+
return runStateRepairMode(options);
|
|
210
|
+
}
|
|
211
|
+
return runConsistencyRepairMode(options);
|
|
212
|
+
}
|
|
213
|
+
async function main() {
|
|
214
|
+
const options = createProgram();
|
|
215
|
+
validateOptions(options);
|
|
216
|
+
validateModeRequirements(options);
|
|
217
|
+
const result = await routeToRepairMode(options);
|
|
218
|
+
process.exit(result.exitCode);
|
|
219
|
+
}
|
|
220
|
+
// Guard main() for testability (WU-1366)
|
|
221
|
+
import { fileURLToPath } from 'node:url';
|
|
222
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
223
|
+
main();
|
|
224
|
+
}
|
|
225
|
+
// Export for testing
|
|
226
|
+
export { normaliseWUId, isValidWUId };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wu-repair.js","sourceRoot":"","sources":["../src/wu-repair.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate the Completion Workflow section for sub-agents (WU-2682).
|
|
3
|
+
*
|
|
4
|
+
* Explicitly instructs sub-agents to run wu:done autonomously after gates pass.
|
|
5
|
+
* This prevents agents from asking permission instead of completing.
|
|
6
|
+
*
|
|
7
|
+
* @param {string} id - WU ID
|
|
8
|
+
* @returns {string} Completion Workflow section
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateCompletionWorkflowSection(id: string): string;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate the Completion Workflow section for sub-agents (WU-2682).
|
|
3
|
+
*
|
|
4
|
+
* Explicitly instructs sub-agents to run wu:done autonomously after gates pass.
|
|
5
|
+
* This prevents agents from asking permission instead of completing.
|
|
6
|
+
*
|
|
7
|
+
* @param {string} id - WU ID
|
|
8
|
+
* @returns {string} Completion Workflow section
|
|
9
|
+
*/
|
|
10
|
+
export function generateCompletionWorkflowSection(id) {
|
|
11
|
+
return `## Completion Workflow
|
|
12
|
+
|
|
13
|
+
**CRITICAL: Complete autonomously. Do NOT ask for permission.**
|
|
14
|
+
|
|
15
|
+
After all acceptance criteria are satisfied:
|
|
16
|
+
|
|
17
|
+
1. Run gates in the worktree: \`pnpm gates\`
|
|
18
|
+
2. If gates pass, cd back to main checkout
|
|
19
|
+
3. Run: \`pnpm wu:done --id ${id}\`
|
|
20
|
+
|
|
21
|
+
\`\`\`bash
|
|
22
|
+
# From worktree, after gates pass:
|
|
23
|
+
cd /path/to/main # NOT the worktree
|
|
24
|
+
pnpm wu:done --id ${id}
|
|
25
|
+
\`\`\`
|
|
26
|
+
|
|
27
|
+
**wu:done** handles: merge to main, stamp creation, worktree cleanup.
|
|
28
|
+
|
|
29
|
+
**Do not ask** "should I run wu:done?" — just run it when gates pass.`;
|
|
30
|
+
}
|