@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
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Spawn List Command (WU-1950)
|
|
4
|
+
*
|
|
5
|
+
* Displays spawn trees for WUs or initiatives.
|
|
6
|
+
* Shows parent-child relationships with status indicators.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* pnpm spawn:list --wu WU-XXX # Spawns for a specific WU
|
|
10
|
+
* pnpm spawn:list --initiative INIT-XXX # All spawns in an initiative
|
|
11
|
+
* pnpm spawn:list --json # JSON output
|
|
12
|
+
*
|
|
13
|
+
* @see {@link tools/lib/spawn-tree.mjs} - Tree builder
|
|
14
|
+
* @see {@link tools/__tests__/spawn-list.test.mjs} - Tests
|
|
15
|
+
*/
|
|
16
|
+
import { createWUParser, WU_OPTIONS } from '@lumenflow/core/dist/arg-parser.js';
|
|
17
|
+
import { die } from '@lumenflow/core/dist/error-handler.js';
|
|
18
|
+
import { PATTERNS } from '@lumenflow/core/dist/wu-constants.js';
|
|
19
|
+
/** Local EMOJI constants for spawn-list output */
|
|
20
|
+
const EMOJI = {
|
|
21
|
+
WARNING: '⚠️',
|
|
22
|
+
ERROR: '❌',
|
|
23
|
+
};
|
|
24
|
+
/** Custom options for spawn-list command */
|
|
25
|
+
const SPAWN_LIST_OPTIONS = {
|
|
26
|
+
initiative: {
|
|
27
|
+
name: 'initiative',
|
|
28
|
+
flags: '--initiative <initId>',
|
|
29
|
+
description: 'Initiative ID to show all spawns for (e.g., INIT-001)',
|
|
30
|
+
},
|
|
31
|
+
json: {
|
|
32
|
+
name: 'json',
|
|
33
|
+
flags: '--json',
|
|
34
|
+
description: 'Output as JSON',
|
|
35
|
+
default: false,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
import { buildSpawnTree, formatSpawnTree, getSpawnsByWU, getSpawnsByInitiative, treeToJSON, STATUS_INDICATORS, } from '@lumenflow/core/dist/spawn-tree.js';
|
|
39
|
+
import { SpawnStatus } from '@lumenflow/core/dist/spawn-registry-schema.js';
|
|
40
|
+
const LOG_PREFIX = '[spawn:list]';
|
|
41
|
+
/** Default paths for spawn registry and WU files */
|
|
42
|
+
const DEFAULT_PATHS = Object.freeze({
|
|
43
|
+
REGISTRY_DIR: '.beacon/state',
|
|
44
|
+
WU_DIR: 'docs/04-operations/tasks/wu',
|
|
45
|
+
});
|
|
46
|
+
/** Initiative ID pattern */
|
|
47
|
+
const INIT_PATTERN = /^INIT-\d+$/;
|
|
48
|
+
/**
|
|
49
|
+
* Prints the legend for status indicators
|
|
50
|
+
*/
|
|
51
|
+
function printLegend() {
|
|
52
|
+
console.log('\nLegend:');
|
|
53
|
+
console.log(` ${STATUS_INDICATORS[SpawnStatus.PENDING]} pending`);
|
|
54
|
+
console.log(` ${STATUS_INDICATORS[SpawnStatus.COMPLETED]} completed`);
|
|
55
|
+
console.log(` ${STATUS_INDICATORS[SpawnStatus.TIMEOUT]} timeout`);
|
|
56
|
+
console.log(` ${STATUS_INDICATORS[SpawnStatus.CRASHED]} crashed`);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Main entry point
|
|
60
|
+
*/
|
|
61
|
+
async function main() {
|
|
62
|
+
const args = createWUParser({
|
|
63
|
+
name: 'spawn-list',
|
|
64
|
+
description: 'Display spawn trees for WUs or initiatives',
|
|
65
|
+
options: [WU_OPTIONS.wu, SPAWN_LIST_OPTIONS.initiative, SPAWN_LIST_OPTIONS.json],
|
|
66
|
+
required: [],
|
|
67
|
+
allowPositionalId: false,
|
|
68
|
+
});
|
|
69
|
+
const { wu, initiative, json } = args;
|
|
70
|
+
// Validate: exactly one of --wu or --initiative required
|
|
71
|
+
if (!wu && !initiative) {
|
|
72
|
+
die('Either --wu or --initiative is required.\n\nUsage:\n pnpm spawn:list --wu WU-XXX\n pnpm spawn:list --initiative INIT-XXX');
|
|
73
|
+
}
|
|
74
|
+
if (wu && initiative) {
|
|
75
|
+
die('Cannot specify both --wu and --initiative. Choose one.');
|
|
76
|
+
}
|
|
77
|
+
// Handle --wu
|
|
78
|
+
if (wu) {
|
|
79
|
+
const wuId = wu.toUpperCase();
|
|
80
|
+
if (!PATTERNS.WU_ID.test(wuId)) {
|
|
81
|
+
die(`Invalid WU ID format: ${wu}. Expected format: WU-XXX`);
|
|
82
|
+
}
|
|
83
|
+
const spawns = await getSpawnsByWU(wuId, DEFAULT_PATHS.REGISTRY_DIR);
|
|
84
|
+
if (json) {
|
|
85
|
+
const tree = buildSpawnTree(spawns, wuId);
|
|
86
|
+
console.log(JSON.stringify(treeToJSON(tree), null, 2));
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (spawns.length === 0) {
|
|
90
|
+
console.log(`${LOG_PREFIX} ${EMOJI.WARNING} No spawns found for ${wuId}`);
|
|
91
|
+
console.log(`\n${wuId} (root)`);
|
|
92
|
+
console.log(' (no spawns)');
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
console.log(`${LOG_PREFIX} Spawn tree for ${wuId}:\n`);
|
|
96
|
+
const tree = buildSpawnTree(spawns, wuId);
|
|
97
|
+
console.log(formatSpawnTree(tree));
|
|
98
|
+
printLegend();
|
|
99
|
+
console.log(`\nTotal: ${spawns.length} spawn(s)`);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
// Handle --initiative
|
|
103
|
+
if (initiative) {
|
|
104
|
+
const initId = initiative.toUpperCase();
|
|
105
|
+
if (!INIT_PATTERN.test(initId)) {
|
|
106
|
+
die(`Invalid initiative ID format: ${initiative}. Expected format: INIT-XXX`);
|
|
107
|
+
}
|
|
108
|
+
const spawns = await getSpawnsByInitiative(initId, DEFAULT_PATHS.REGISTRY_DIR, DEFAULT_PATHS.WU_DIR);
|
|
109
|
+
if (json) {
|
|
110
|
+
// For initiative, output flat list since there may be multiple root WUs
|
|
111
|
+
console.log(JSON.stringify(spawns, null, 2));
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (spawns.length === 0) {
|
|
115
|
+
console.log(`${LOG_PREFIX} ${EMOJI.WARNING} No spawns found for ${initId}`);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
// Group spawns by parent WU and display trees
|
|
119
|
+
console.log(`${LOG_PREFIX} Spawns for ${initId}:\n`);
|
|
120
|
+
// Find unique root WUs (parents that are not targets of other spawns)
|
|
121
|
+
const typedSpawns = spawns;
|
|
122
|
+
const targetWuIds = new Set(typedSpawns.map((s) => s.targetWuId));
|
|
123
|
+
const rootWuIds = [...new Set(typedSpawns.map((s) => s.parentWuId))].filter((id) => !targetWuIds.has(id));
|
|
124
|
+
for (const rootWuId of rootWuIds) {
|
|
125
|
+
const tree = buildSpawnTree(spawns, rootWuId);
|
|
126
|
+
console.log(formatSpawnTree(tree));
|
|
127
|
+
console.log('');
|
|
128
|
+
}
|
|
129
|
+
printLegend();
|
|
130
|
+
console.log(`\nTotal: ${spawns.length} spawn(s) across ${rootWuIds.length} root WU(s)`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Guard main() for testability
|
|
134
|
+
import { fileURLToPath } from 'node:url';
|
|
135
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
136
|
+
main().catch((err) => {
|
|
137
|
+
console.error(`${LOG_PREFIX} ${EMOJI.ERROR} ${err.message}`);
|
|
138
|
+
process.exit(1);
|
|
139
|
+
});
|
|
140
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawn-list.js","sourceRoot":"","sources":["../src/spawn-list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* WU Block Helper
|
|
4
|
+
*
|
|
5
|
+
* Sequence (micro-worktree pattern):
|
|
6
|
+
* 1) Create micro-worktree from main
|
|
7
|
+
* 2) Auto-update WU YAML/backlog/status to Blocked in micro-worktree
|
|
8
|
+
* 3) Commit in micro-worktree, push directly to origin/main
|
|
9
|
+
* 4) Optionally remove work worktree (default: keep)
|
|
10
|
+
*
|
|
11
|
+
* Uses micro-worktree pattern to avoid pre-commit hook blocking commits to main.
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
* pnpm wu:block --id WU-334 [--reason "Waiting on policy"] [--worktree ...] [--remove-worktree] [--no-auto]
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wu-block.d.ts","sourceRoot":"","sources":["../src/wu-block.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;GAaG"}
|
package/dist/wu-block.js
ADDED
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* WU Block Helper
|
|
4
|
+
*
|
|
5
|
+
* Sequence (micro-worktree pattern):
|
|
6
|
+
* 1) Create micro-worktree from main
|
|
7
|
+
* 2) Auto-update WU YAML/backlog/status to Blocked in micro-worktree
|
|
8
|
+
* 3) Commit in micro-worktree, push directly to origin/main
|
|
9
|
+
* 4) Optionally remove work worktree (default: keep)
|
|
10
|
+
*
|
|
11
|
+
* Uses micro-worktree pattern to avoid pre-commit hook blocking commits to main.
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
* pnpm wu:block --id WU-334 [--reason "Waiting on policy"] [--worktree ...] [--remove-worktree] [--no-auto]
|
|
15
|
+
*/
|
|
16
|
+
import { readFile, writeFile, access } from 'node:fs/promises';
|
|
17
|
+
import path from 'node:path';
|
|
18
|
+
import { assertTransition } from '@lumenflow/core/dist/state-machine.js';
|
|
19
|
+
// WU-1574: Removed parseBacklogFrontmatter, getSectionHeadings (no longer needed with generator)
|
|
20
|
+
import { getGitForCwd } from '@lumenflow/core/dist/git-adapter.js';
|
|
21
|
+
import { die } from '@lumenflow/core/dist/error-handler.js';
|
|
22
|
+
// WU-1574: Import backlog generator to replace BacklogManager
|
|
23
|
+
import { generateBacklog } from '@lumenflow/core/dist/backlog-generator.js';
|
|
24
|
+
import { todayISO } from '@lumenflow/core/dist/date-utils.js';
|
|
25
|
+
import { createWUParser, WU_OPTIONS } from '@lumenflow/core/dist/arg-parser.js';
|
|
26
|
+
import { WU_PATHS, defaultWorktreeFrom, getStateStoreDirFromBacklog, } from '@lumenflow/core/dist/wu-paths.js';
|
|
27
|
+
import { readWU, writeWU, appendNote } from '@lumenflow/core/dist/wu-yaml.js';
|
|
28
|
+
import { BRANCHES, REMOTES, WU_STATUS, STATUS_SECTIONS, PATTERNS, LOG_PREFIX, FILE_SYSTEM, EXIT_CODES, STRING_LITERALS, MICRO_WORKTREE_OPERATIONS, } from '@lumenflow/core/dist/wu-constants.js';
|
|
29
|
+
import { ensureOnMain } from '@lumenflow/core/dist/wu-helpers.js';
|
|
30
|
+
import { ensureStaged } from '@lumenflow/core/dist/git-staged-validator.js';
|
|
31
|
+
import { withMicroWorktree } from '@lumenflow/core/dist/micro-worktree.js';
|
|
32
|
+
import { WUStateStore } from '@lumenflow/core/dist/wu-state-store.js';
|
|
33
|
+
// WU-1603: Atomic lane locking - release lock when WU is blocked
|
|
34
|
+
import { releaseLaneLock } from '@lumenflow/core/dist/lane-lock.js';
|
|
35
|
+
// ensureOnMain() moved to wu-helpers.mjs (WU-1256)
|
|
36
|
+
// ensureStaged() moved to git-staged-validator.mjs (WU-1341)
|
|
37
|
+
// defaultWorktreeFrom() moved to wu-paths.mjs (WU-1341)
|
|
38
|
+
/**
|
|
39
|
+
* Remove WU entry from in-progress section of lines array
|
|
40
|
+
*/
|
|
41
|
+
function removeFromInProgressSection(lines, inProgIdx, rel, id) {
|
|
42
|
+
if (inProgIdx === -1)
|
|
43
|
+
return;
|
|
44
|
+
let endIdx = lines.slice(inProgIdx + 1).findIndex((l) => l.startsWith('## '));
|
|
45
|
+
endIdx = endIdx === -1 ? lines.length : inProgIdx + 1 + endIdx;
|
|
46
|
+
for (let i = inProgIdx + 1; i < endIdx; i++) {
|
|
47
|
+
// eslint-disable-next-line security/detect-object-injection -- array index loop
|
|
48
|
+
if (lines[i] && (lines[i].includes(rel) || lines[i].includes(`[${id}`))) {
|
|
49
|
+
lines.splice(i, 1);
|
|
50
|
+
endIdx--;
|
|
51
|
+
i--; // adjust
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const section = lines.slice(inProgIdx + 1, endIdx).filter((l) => l.trim() !== '');
|
|
55
|
+
if (section.length === 0)
|
|
56
|
+
lines.splice(endIdx, 0, '', '(No items currently in progress)', '');
|
|
57
|
+
}
|
|
58
|
+
async function moveFromInProgressToBlocked(statusPath, id, title, reason) {
|
|
59
|
+
// Check file exists
|
|
60
|
+
const fileExists = await access(statusPath)
|
|
61
|
+
.then(() => true)
|
|
62
|
+
.catch(() => false);
|
|
63
|
+
if (!fileExists)
|
|
64
|
+
die(`Missing ${statusPath}`);
|
|
65
|
+
const rel = `wu/${id}.yaml`;
|
|
66
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool validates status file
|
|
67
|
+
const content = await readFile(statusPath, { encoding: FILE_SYSTEM.UTF8 });
|
|
68
|
+
const lines = content.split(/\r?\n/);
|
|
69
|
+
const findHeader = (h) => lines.findIndex((l) => l.trim().toLowerCase() === h.toLowerCase());
|
|
70
|
+
const inProgIdx = findHeader(STATUS_SECTIONS.IN_PROGRESS);
|
|
71
|
+
const blockedIdx = findHeader(STATUS_SECTIONS.BLOCKED);
|
|
72
|
+
if (blockedIdx === -1)
|
|
73
|
+
die(`Could not find "${STATUS_SECTIONS.BLOCKED}" in status.md`);
|
|
74
|
+
removeFromInProgressSection(lines, inProgIdx, rel, id);
|
|
75
|
+
// Add bullet to blocked
|
|
76
|
+
const reasonSuffix = reason ? ` — ${reason}` : '';
|
|
77
|
+
const bullet = `- [${id} — ${title}](${rel})${reasonSuffix}`;
|
|
78
|
+
const sectionStart = blockedIdx + 1;
|
|
79
|
+
if (lines.slice(sectionStart).some((l) => l.includes(rel)))
|
|
80
|
+
return; // already listed
|
|
81
|
+
lines.splice(sectionStart, 0, '', bullet);
|
|
82
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool writes status file
|
|
83
|
+
await writeFile(statusPath, lines.join(STRING_LITERALS.NEWLINE), {
|
|
84
|
+
encoding: FILE_SYSTEM.UTF8,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
// WU-1574: Regenerate backlog.md from state store (replaces BacklogManager manipulation)
|
|
88
|
+
async function regenerateBacklogFromState(backlogPath) {
|
|
89
|
+
const stateDir = getStateStoreDirFromBacklog(backlogPath);
|
|
90
|
+
const store = new WUStateStore(stateDir);
|
|
91
|
+
await store.load();
|
|
92
|
+
const content = await generateBacklog(store);
|
|
93
|
+
await writeFile(backlogPath, content, { encoding: FILE_SYSTEM.UTF8 });
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Handle worktree removal if requested
|
|
97
|
+
*/
|
|
98
|
+
async function handleWorktreeRemoval(args, doc) {
|
|
99
|
+
if (!args.removeWorktree)
|
|
100
|
+
return;
|
|
101
|
+
const wt = args.worktree || defaultWorktreeFrom(doc);
|
|
102
|
+
// Check if worktree exists
|
|
103
|
+
const wtExists = wt &&
|
|
104
|
+
(await access(wt)
|
|
105
|
+
.then(() => true)
|
|
106
|
+
.catch(() => false));
|
|
107
|
+
if (wtExists) {
|
|
108
|
+
try {
|
|
109
|
+
await getGitForCwd().worktreeRemove(wt);
|
|
110
|
+
}
|
|
111
|
+
catch (e) {
|
|
112
|
+
console.warn(`${LOG_PREFIX.BLOCK} Could not remove worktree ${wt}: ${e.message}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else if (wt) {
|
|
116
|
+
console.warn(`${LOG_PREFIX.BLOCK} Worktree path not found; skipping removal`);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
console.warn(`${LOG_PREFIX.BLOCK} No worktree path specified; skipping removal`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async function main() {
|
|
123
|
+
const args = createWUParser({
|
|
124
|
+
name: 'wu-block',
|
|
125
|
+
description: 'Block a work unit and move it from in-progress to blocked status',
|
|
126
|
+
options: [
|
|
127
|
+
WU_OPTIONS.id,
|
|
128
|
+
WU_OPTIONS.reason,
|
|
129
|
+
WU_OPTIONS.worktree,
|
|
130
|
+
WU_OPTIONS.removeWorktree,
|
|
131
|
+
WU_OPTIONS.noAuto,
|
|
132
|
+
],
|
|
133
|
+
required: ['id'],
|
|
134
|
+
allowPositionalId: true,
|
|
135
|
+
});
|
|
136
|
+
const id = args.id.toUpperCase();
|
|
137
|
+
if (!PATTERNS.WU_ID.test(id))
|
|
138
|
+
die(`Invalid WU id '${args.id}'. Expected format WU-123`);
|
|
139
|
+
await ensureOnMain(getGitForCwd());
|
|
140
|
+
// Read WU doc from main to get title and validate state transition
|
|
141
|
+
const mainWUPath = WU_PATHS.WU(id);
|
|
142
|
+
let doc;
|
|
143
|
+
try {
|
|
144
|
+
doc = readWU(mainWUPath, id);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
die(`Failed to read WU ${id}: ${error.message}\n\n` +
|
|
148
|
+
`Options:\n` +
|
|
149
|
+
` 1. Check if WU file exists: ls -la ${mainWUPath}\n` +
|
|
150
|
+
` 2. Validate YAML syntax: pnpm wu:validate --id ${id}\n` +
|
|
151
|
+
` 3. Create WU if missing: pnpm wu:create --id ${id} --lane "<lane>" --title "..."`);
|
|
152
|
+
}
|
|
153
|
+
const title = doc.title || '';
|
|
154
|
+
// Validate state transition before micro-worktree
|
|
155
|
+
const currentStatus = doc.status || WU_STATUS.IN_PROGRESS;
|
|
156
|
+
try {
|
|
157
|
+
assertTransition(currentStatus, WU_STATUS.BLOCKED, id);
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
die(`State transition validation failed: ${error.message}\n\n` +
|
|
161
|
+
`Options:\n` +
|
|
162
|
+
` 1. Check WU current status: grep status ${mainWUPath}\n` +
|
|
163
|
+
` 2. Only in_progress or waiting WUs can be blocked\n` +
|
|
164
|
+
` 3. If WU is done, it cannot be blocked`);
|
|
165
|
+
}
|
|
166
|
+
const baseMsg = `wu(${id.toLowerCase()}): block`;
|
|
167
|
+
const commitMsg = args.reason ? `${baseMsg} — ${args.reason}` : baseMsg;
|
|
168
|
+
if (!args.noAuto) {
|
|
169
|
+
// Use micro-worktree pattern to avoid pre-commit hook blocking commits to main
|
|
170
|
+
await withMicroWorktree({
|
|
171
|
+
operation: MICRO_WORKTREE_OPERATIONS.WU_BLOCK,
|
|
172
|
+
id,
|
|
173
|
+
logPrefix: LOG_PREFIX.BLOCK,
|
|
174
|
+
pushOnly: true, // Push directly to origin/main without touching local main
|
|
175
|
+
execute: async ({ worktreePath }) => {
|
|
176
|
+
// Build paths relative to micro-worktree
|
|
177
|
+
const microWUPath = path.join(worktreePath, WU_PATHS.WU(id));
|
|
178
|
+
const microStatusPath = path.join(worktreePath, WU_PATHS.STATUS());
|
|
179
|
+
const microBacklogPath = path.join(worktreePath, WU_PATHS.BACKLOG());
|
|
180
|
+
// Update WU YAML in micro-worktree
|
|
181
|
+
const microDoc = readWU(microWUPath, id);
|
|
182
|
+
microDoc.status = WU_STATUS.BLOCKED;
|
|
183
|
+
const noteLine = args.reason
|
|
184
|
+
? `Blocked (${todayISO()}): ${args.reason}`
|
|
185
|
+
: `Blocked (${todayISO()})`;
|
|
186
|
+
appendNote(microDoc, noteLine);
|
|
187
|
+
writeWU(microWUPath, microDoc);
|
|
188
|
+
// Update status.md in micro-worktree
|
|
189
|
+
await moveFromInProgressToBlocked(microStatusPath, id, title, args.reason);
|
|
190
|
+
// Update backlog.md in micro-worktree (WU-1574: regenerate from state store)
|
|
191
|
+
await regenerateBacklogFromState(microBacklogPath);
|
|
192
|
+
// Append block event to WUStateStore (WU-1573)
|
|
193
|
+
const stateDir = path.join(worktreePath, '.beacon', 'state');
|
|
194
|
+
const store = new WUStateStore(stateDir);
|
|
195
|
+
await store.load();
|
|
196
|
+
await store.block(id, args.reason || 'No reason provided');
|
|
197
|
+
return {
|
|
198
|
+
commitMessage: commitMsg,
|
|
199
|
+
files: [
|
|
200
|
+
WU_PATHS.WU(id),
|
|
201
|
+
WU_PATHS.STATUS(),
|
|
202
|
+
WU_PATHS.BACKLOG(),
|
|
203
|
+
'.beacon/state/wu-events.jsonl',
|
|
204
|
+
],
|
|
205
|
+
};
|
|
206
|
+
},
|
|
207
|
+
});
|
|
208
|
+
// Fetch to update local main tracking
|
|
209
|
+
await getGitForCwd().fetch(REMOTES.ORIGIN, BRANCHES.MAIN);
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
// Manual mode: expect files already staged
|
|
213
|
+
ensureStaged([mainWUPath, WU_PATHS.STATUS(), WU_PATHS.BACKLOG()]);
|
|
214
|
+
await getGitForCwd().commit(commitMsg);
|
|
215
|
+
await getGitForCwd().push(REMOTES.ORIGIN, BRANCHES.MAIN);
|
|
216
|
+
}
|
|
217
|
+
await handleWorktreeRemoval(args, doc);
|
|
218
|
+
// WU-1603: Release lane lock when WU is blocked
|
|
219
|
+
// This allows another WU to be claimed in the same lane
|
|
220
|
+
try {
|
|
221
|
+
const lane = doc.lane;
|
|
222
|
+
if (lane) {
|
|
223
|
+
const releaseResult = releaseLaneLock(lane, { wuId: id });
|
|
224
|
+
if (releaseResult.released && !releaseResult.notFound) {
|
|
225
|
+
console.log(`${LOG_PREFIX.BLOCK} Lane lock released for "${lane}"`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
catch (err) {
|
|
230
|
+
// Non-blocking: lock release failure should not block the blocking operation
|
|
231
|
+
console.warn(`${LOG_PREFIX.BLOCK} Warning: Could not release lane lock: ${err.message}`);
|
|
232
|
+
}
|
|
233
|
+
console.log(`${STRING_LITERALS.NEWLINE}${LOG_PREFIX.BLOCK} Marked blocked and pushed.`);
|
|
234
|
+
console.log(`- WU: ${id} — ${title}`);
|
|
235
|
+
if (args.reason)
|
|
236
|
+
console.log(`- Reason: ${args.reason}`);
|
|
237
|
+
}
|
|
238
|
+
main().catch((e) => {
|
|
239
|
+
console.error(e.message);
|
|
240
|
+
process.exit(EXIT_CODES.ERROR);
|
|
241
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wu-block.js","sourceRoot":"","sources":["../src/wu-block.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* WU Claim Helper
|
|
4
|
+
*
|
|
5
|
+
* Canonical sequence:
|
|
6
|
+
* 1) Auto-update backlog/status/WU YAML (safe parsing) unless `--no-auto`
|
|
7
|
+
* 2) Commit and push to `main`
|
|
8
|
+
* 3) Create a dedicated worktree+branch for the WU
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* node tools/wu-claim.mjs --id WU-334 --lane Intelligence \
|
|
12
|
+
* [--worktree worktrees/intelligence-wu-334] [--branch lane/intelligence/wu-334]
|
|
13
|
+
*
|
|
14
|
+
* WU-2542: This script imports utilities from @lumenflow/core package.
|
|
15
|
+
* Full migration to thin shim pending @lumenflow/core CLI export implementation.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* WU-1746: Get list of files to commit in worktree mode
|
|
19
|
+
* Excludes backlog.md and status.md to prevent merge conflicts.
|
|
20
|
+
* These generated files should only be updated on main during wu:done.
|
|
21
|
+
*
|
|
22
|
+
* @param {string} wuId - WU ID (e.g., 'WU-1746')
|
|
23
|
+
* @returns {string[]} List of files to commit
|
|
24
|
+
*/
|
|
25
|
+
export declare function getWorktreeCommitFiles(wuId: any): string[];
|
|
26
|
+
/**
|
|
27
|
+
* WU-1763: Print a single concise tips line to improve tool adoption.
|
|
28
|
+
* Non-blocking, single-line output to avoid flooding the console.
|
|
29
|
+
*
|
|
30
|
+
* @param {string} _id - WU ID being claimed (unused, kept for future use)
|
|
31
|
+
*/
|
|
32
|
+
export declare function printLifecycleNudge(_id: any): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wu-claim.d.ts","sourceRoot":"","sources":["../src/wu-claim.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AA0ZH;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,KAAA,YAS1C;AA6hBD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,KAAA,QAKtC"}
|