@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.
Files changed (129) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +116 -0
  3. package/dist/gates.d.ts +41 -0
  4. package/dist/gates.d.ts.map +1 -0
  5. package/dist/gates.js +684 -0
  6. package/dist/gates.js.map +1 -0
  7. package/dist/initiative-add-wu.d.ts +22 -0
  8. package/dist/initiative-add-wu.d.ts.map +1 -0
  9. package/dist/initiative-add-wu.js +234 -0
  10. package/dist/initiative-add-wu.js.map +1 -0
  11. package/dist/initiative-create.d.ts +28 -0
  12. package/dist/initiative-create.d.ts.map +1 -0
  13. package/dist/initiative-create.js +172 -0
  14. package/dist/initiative-create.js.map +1 -0
  15. package/dist/initiative-edit.d.ts +34 -0
  16. package/dist/initiative-edit.d.ts.map +1 -0
  17. package/dist/initiative-edit.js +440 -0
  18. package/dist/initiative-edit.js.map +1 -0
  19. package/dist/initiative-list.d.ts +12 -0
  20. package/dist/initiative-list.d.ts.map +1 -0
  21. package/dist/initiative-list.js +101 -0
  22. package/dist/initiative-list.js.map +1 -0
  23. package/dist/initiative-status.d.ts +11 -0
  24. package/dist/initiative-status.d.ts.map +1 -0
  25. package/dist/initiative-status.js +221 -0
  26. package/dist/initiative-status.js.map +1 -0
  27. package/dist/mem-checkpoint.d.ts +16 -0
  28. package/dist/mem-checkpoint.d.ts.map +1 -0
  29. package/dist/mem-checkpoint.js +237 -0
  30. package/dist/mem-checkpoint.js.map +1 -0
  31. package/dist/mem-cleanup.d.ts +29 -0
  32. package/dist/mem-cleanup.d.ts.map +1 -0
  33. package/dist/mem-cleanup.js +267 -0
  34. package/dist/mem-cleanup.js.map +1 -0
  35. package/dist/mem-create.d.ts +17 -0
  36. package/dist/mem-create.d.ts.map +1 -0
  37. package/dist/mem-create.js +265 -0
  38. package/dist/mem-create.js.map +1 -0
  39. package/dist/mem-inbox.d.ts +35 -0
  40. package/dist/mem-inbox.d.ts.map +1 -0
  41. package/dist/mem-inbox.js +373 -0
  42. package/dist/mem-inbox.js.map +1 -0
  43. package/dist/mem-init.d.ts +15 -0
  44. package/dist/mem-init.d.ts.map +1 -0
  45. package/dist/mem-init.js +146 -0
  46. package/dist/mem-init.js.map +1 -0
  47. package/dist/mem-ready.d.ts +16 -0
  48. package/dist/mem-ready.d.ts.map +1 -0
  49. package/dist/mem-ready.js +224 -0
  50. package/dist/mem-ready.js.map +1 -0
  51. package/dist/mem-signal.d.ts +16 -0
  52. package/dist/mem-signal.d.ts.map +1 -0
  53. package/dist/mem-signal.js +204 -0
  54. package/dist/mem-signal.js.map +1 -0
  55. package/dist/mem-start.d.ts +16 -0
  56. package/dist/mem-start.d.ts.map +1 -0
  57. package/dist/mem-start.js +158 -0
  58. package/dist/mem-start.js.map +1 -0
  59. package/dist/mem-summarize.d.ts +22 -0
  60. package/dist/mem-summarize.d.ts.map +1 -0
  61. package/dist/mem-summarize.js +213 -0
  62. package/dist/mem-summarize.js.map +1 -0
  63. package/dist/mem-triage.d.ts +22 -0
  64. package/dist/mem-triage.d.ts.map +1 -0
  65. package/dist/mem-triage.js +328 -0
  66. package/dist/mem-triage.js.map +1 -0
  67. package/dist/spawn-list.d.ts +16 -0
  68. package/dist/spawn-list.d.ts.map +1 -0
  69. package/dist/spawn-list.js +140 -0
  70. package/dist/spawn-list.js.map +1 -0
  71. package/dist/wu-block.d.ts +16 -0
  72. package/dist/wu-block.d.ts.map +1 -0
  73. package/dist/wu-block.js +241 -0
  74. package/dist/wu-block.js.map +1 -0
  75. package/dist/wu-claim.d.ts +32 -0
  76. package/dist/wu-claim.d.ts.map +1 -0
  77. package/dist/wu-claim.js +1106 -0
  78. package/dist/wu-claim.js.map +1 -0
  79. package/dist/wu-cleanup.d.ts +17 -0
  80. package/dist/wu-cleanup.d.ts.map +1 -0
  81. package/dist/wu-cleanup.js +194 -0
  82. package/dist/wu-cleanup.js.map +1 -0
  83. package/dist/wu-create.d.ts +38 -0
  84. package/dist/wu-create.d.ts.map +1 -0
  85. package/dist/wu-create.js +520 -0
  86. package/dist/wu-create.js.map +1 -0
  87. package/dist/wu-deps.d.ts +13 -0
  88. package/dist/wu-deps.d.ts.map +1 -0
  89. package/dist/wu-deps.js +119 -0
  90. package/dist/wu-deps.js.map +1 -0
  91. package/dist/wu-done.d.ts +153 -0
  92. package/dist/wu-done.d.ts.map +1 -0
  93. package/dist/wu-done.js +2096 -0
  94. package/dist/wu-done.js.map +1 -0
  95. package/dist/wu-edit.d.ts +29 -0
  96. package/dist/wu-edit.d.ts.map +1 -0
  97. package/dist/wu-edit.js +852 -0
  98. package/dist/wu-edit.js.map +1 -0
  99. package/dist/wu-infer-lane.d.ts +17 -0
  100. package/dist/wu-infer-lane.d.ts.map +1 -0
  101. package/dist/wu-infer-lane.js +135 -0
  102. package/dist/wu-infer-lane.js.map +1 -0
  103. package/dist/wu-preflight.d.ts +47 -0
  104. package/dist/wu-preflight.d.ts.map +1 -0
  105. package/dist/wu-preflight.js +167 -0
  106. package/dist/wu-preflight.js.map +1 -0
  107. package/dist/wu-prune.d.ts +16 -0
  108. package/dist/wu-prune.d.ts.map +1 -0
  109. package/dist/wu-prune.js +259 -0
  110. package/dist/wu-prune.js.map +1 -0
  111. package/dist/wu-repair.d.ts +60 -0
  112. package/dist/wu-repair.d.ts.map +1 -0
  113. package/dist/wu-repair.js +226 -0
  114. package/dist/wu-repair.js.map +1 -0
  115. package/dist/wu-spawn-completion.d.ts +10 -0
  116. package/dist/wu-spawn-completion.js +30 -0
  117. package/dist/wu-spawn.d.ts +168 -0
  118. package/dist/wu-spawn.d.ts.map +1 -0
  119. package/dist/wu-spawn.js +1327 -0
  120. package/dist/wu-spawn.js.map +1 -0
  121. package/dist/wu-unblock.d.ts +16 -0
  122. package/dist/wu-unblock.d.ts.map +1 -0
  123. package/dist/wu-unblock.js +234 -0
  124. package/dist/wu-unblock.js.map +1 -0
  125. package/dist/wu-validate.d.ts +16 -0
  126. package/dist/wu-validate.d.ts.map +1 -0
  127. package/dist/wu-validate.js +193 -0
  128. package/dist/wu-validate.js.map +1 -0
  129. 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"}
@@ -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"}