@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,440 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Initiative Edit Helper
4
+ *
5
+ * Race-safe Initiative editing using micro-worktree isolation (WU-1451).
6
+ *
7
+ * Enables editing Initiative YAML files with atomic commits, perfect for:
8
+ * - Updating initiative status
9
+ * - Setting blocked_by and blocked_reason
10
+ * - Unblocking initiatives
11
+ * - Adding lanes
12
+ * - Appending notes
13
+ * - Fixing malformed created dates (WU-2547)
14
+ *
15
+ * Uses the micro-worktree pattern with pushOnly mode (WU-1435):
16
+ * 1) Validate inputs (Initiative exists, status is valid enum)
17
+ * 2) Ensure main is clean and up-to-date with origin
18
+ * 3) Create temp branch WITHOUT switching (main checkout stays on main)
19
+ * 4) Create micro-worktree in /tmp pointing to temp branch
20
+ * 5) Apply edits in micro-worktree
21
+ * 6) Commit, push directly to origin/main
22
+ * 7) Cleanup temp branch and micro-worktree
23
+ *
24
+ * Usage:
25
+ * pnpm initiative:edit --id INIT-001 --status in_progress
26
+ * pnpm initiative:edit --id INIT-001 --blocked-by INIT-002 --blocked-reason "Waiting for Phase 1"
27
+ * pnpm initiative:edit --id INIT-001 --unblock
28
+ * pnpm initiative:edit --id INIT-001 --add-lane "Operations: Tooling"
29
+ * pnpm initiative:edit --id INIT-001 --notes "Phase 2 started"
30
+ *
31
+ * Part of WU-1451: Add initiative:edit command for updating initiative status and blockers
32
+ * @see {@link tools/lib/micro-worktree.mjs} - Shared micro-worktree logic
33
+ */
34
+ import { getGitForCwd } from '@lumenflow/core/dist/git-adapter.js';
35
+ import { die } from '@lumenflow/core/dist/error-handler.js';
36
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
37
+ import { join } from 'node:path';
38
+ import yaml from 'js-yaml';
39
+ import { createWUParser } from '@lumenflow/core/dist/arg-parser.js';
40
+ import { INIT_PATHS } from '@lumenflow/initiatives/dist/initiative-paths.js';
41
+ import { INIT_STATUSES, PHASE_STATUSES, INIT_PATTERNS, INIT_LOG_PREFIX, INIT_COMMIT_FORMATS, } from '@lumenflow/initiatives/dist/initiative-constants.js';
42
+ import { EXIT_CODES, FILE_SYSTEM, MICRO_WORKTREE_OPERATIONS, } from '@lumenflow/core/dist/wu-constants.js';
43
+ import { ensureOnMain, ensureMainUpToDate } from '@lumenflow/core/dist/wu-helpers.js';
44
+ import { withMicroWorktree } from '@lumenflow/core/dist/micro-worktree.js';
45
+ const PREFIX = INIT_LOG_PREFIX.EDIT;
46
+ /**
47
+ * Custom options for initiative-edit
48
+ */
49
+ const EDIT_OPTIONS = {
50
+ id: {
51
+ name: 'id',
52
+ flags: '-i, --id <initId>',
53
+ description: 'Initiative ID (e.g., INIT-001)',
54
+ },
55
+ status: {
56
+ name: 'status',
57
+ flags: '--status <status>',
58
+ description: `New status (${INIT_STATUSES.join(', ')})`,
59
+ },
60
+ blockedBy: {
61
+ name: 'blockedBy',
62
+ flags: '--blocked-by <initId>',
63
+ description: 'Initiative ID that blocks this initiative',
64
+ },
65
+ blockedReason: {
66
+ name: 'blockedReason',
67
+ flags: '--blocked-reason <text>',
68
+ description: 'Reason for blocking (required with --blocked-by)',
69
+ },
70
+ unblock: {
71
+ name: 'unblock',
72
+ flags: '--unblock',
73
+ description: 'Remove blocked_by and blocked_reason fields',
74
+ },
75
+ addLane: {
76
+ name: 'addLane',
77
+ flags: '--add-lane <lane>',
78
+ description: 'Lane to add (repeatable)',
79
+ isRepeatable: true,
80
+ },
81
+ removeLane: {
82
+ name: 'removeLane',
83
+ flags: '--remove-lane <lane>',
84
+ description: 'Lane to remove (repeatable)',
85
+ isRepeatable: true,
86
+ },
87
+ notes: {
88
+ name: 'notes',
89
+ flags: '--notes <text>',
90
+ description: 'Note to append to notes array',
91
+ },
92
+ // WU-1475: New planning field options
93
+ description: {
94
+ name: 'description',
95
+ flags: '--description <text>',
96
+ description: 'Replace the initiative description field',
97
+ },
98
+ addPhase: {
99
+ name: 'addPhase',
100
+ flags: '--add-phase <title>',
101
+ description: 'Append a new phase with auto-incremented id and pending status (repeatable)',
102
+ isRepeatable: true,
103
+ },
104
+ addSuccessMetric: {
105
+ name: 'addSuccessMetric',
106
+ flags: '--add-success-metric <text>',
107
+ description: 'Append to success_metrics array, avoiding duplicates (repeatable)',
108
+ isRepeatable: true,
109
+ },
110
+ // WU-1836: Phase status update options
111
+ phaseId: {
112
+ name: 'phaseId',
113
+ flags: '--phase-id <id>',
114
+ description: 'Phase ID to update (use with --phase-status)',
115
+ },
116
+ phaseStatus: {
117
+ name: 'phaseStatus',
118
+ flags: '--phase-status <status>',
119
+ description: `Update phase status (${PHASE_STATUSES.join(', ')})`,
120
+ },
121
+ // WU-2547: Created date field
122
+ created: {
123
+ name: 'created',
124
+ flags: '--created <date>',
125
+ description: 'Set created date (YYYY-MM-DD format)',
126
+ },
127
+ };
128
+ /**
129
+ * Parse command line arguments
130
+ */
131
+ function parseArgs() {
132
+ const opts = createWUParser({
133
+ name: 'initiative-edit',
134
+ description: 'Edit Initiative YAML files with micro-worktree isolation',
135
+ options: [
136
+ EDIT_OPTIONS.id,
137
+ EDIT_OPTIONS.status,
138
+ EDIT_OPTIONS.blockedBy,
139
+ EDIT_OPTIONS.blockedReason,
140
+ EDIT_OPTIONS.unblock,
141
+ EDIT_OPTIONS.addLane,
142
+ EDIT_OPTIONS.removeLane,
143
+ EDIT_OPTIONS.notes,
144
+ // WU-1475: New planning field options
145
+ EDIT_OPTIONS.description,
146
+ EDIT_OPTIONS.addPhase,
147
+ EDIT_OPTIONS.addSuccessMetric,
148
+ // WU-1836: Phase status update options
149
+ EDIT_OPTIONS.phaseId,
150
+ EDIT_OPTIONS.phaseStatus,
151
+ // WU-2547: Created date field
152
+ EDIT_OPTIONS.created,
153
+ ],
154
+ required: [], // Don't mark id as required - we handle it manually to support positional args
155
+ allowPositionalId: true,
156
+ });
157
+ // Validate id is provided (either via --id or positional argument)
158
+ if (!opts.id) {
159
+ die('Missing required option: --id <initId>\n\n' +
160
+ 'Usage:\n' +
161
+ ' pnpm initiative:edit --id INIT-001 --status in_progress\n' +
162
+ ' pnpm initiative:edit INIT-001 --status in_progress');
163
+ }
164
+ return opts;
165
+ }
166
+ /**
167
+ * Validate Initiative ID format
168
+ */
169
+ function validateInitIdFormat(id) {
170
+ if (!INIT_PATTERNS.INIT_ID.test(id)) {
171
+ die(`Invalid Initiative ID format: "${id}"\n\n` +
172
+ `Expected format: INIT-<number> (e.g., INIT-001) or INIT-<NAME> (e.g., INIT-SAFETY)`);
173
+ }
174
+ }
175
+ /**
176
+ * Validate status is a valid enum value
177
+ */
178
+ function validateStatus(status) {
179
+ if (!INIT_STATUSES.includes(status)) {
180
+ die(`Invalid status: "${status}"\n\n` + `Valid statuses: ${INIT_STATUSES.join(', ')}`);
181
+ }
182
+ }
183
+ /**
184
+ * Validate phase status is a valid enum value (WU-1836)
185
+ */
186
+ function validatePhaseStatus(status) {
187
+ if (!PHASE_STATUSES.includes(status)) {
188
+ die(`Invalid phase status: "${status}"\n\n` +
189
+ `Valid phase statuses: ${PHASE_STATUSES.join(', ')}`);
190
+ }
191
+ }
192
+ /**
193
+ * Validate phase ID exists in initiative (WU-1836)
194
+ */
195
+ function validatePhaseExists(initiative, phaseId) {
196
+ const numericId = Number(phaseId);
197
+ if (Number.isNaN(numericId)) {
198
+ die(`Invalid phase ID: "${phaseId}"\n\nPhase ID must be a number.`);
199
+ }
200
+ const phases = initiative.phases || [];
201
+ const phase = phases.find((p) => p.id === numericId);
202
+ if (!phase) {
203
+ const existingIds = phases.map((p) => p.id).join(', ') || 'none';
204
+ die(`Phase ${phaseId} not found in ${initiative.id}.\n\n` + `Existing phase IDs: ${existingIds}`);
205
+ }
206
+ return numericId;
207
+ }
208
+ /**
209
+ * Validate created date is in YYYY-MM-DD format (WU-2547)
210
+ *
211
+ * @param {string} date - Date string to validate
212
+ */
213
+ function validateCreatedDate(date) {
214
+ if (!INIT_PATTERNS.DATE.test(date)) {
215
+ die(`Invalid date format: "${date}"\n\n` + `Expected format: YYYY-MM-DD (e.g., 2026-01-14)`);
216
+ }
217
+ }
218
+ /**
219
+ * Check Initiative exists and load it
220
+ *
221
+ * @param {string} id - Initiative ID
222
+ * @returns {object} Initiative object
223
+ */
224
+ function loadInitiative(id) {
225
+ const initPath = INIT_PATHS.INITIATIVE(id);
226
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool validates init files
227
+ if (!existsSync(initPath)) {
228
+ die(`Initiative ${id} not found at ${initPath}\n\n` +
229
+ `Ensure the Initiative exists and you're in the repo root.`);
230
+ }
231
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool validates init files
232
+ const content = readFileSync(initPath, { encoding: FILE_SYSTEM.ENCODING });
233
+ return yaml.load(content);
234
+ }
235
+ /**
236
+ * Ensure working tree is clean
237
+ */
238
+ async function ensureCleanWorkingTree() {
239
+ const status = await getGitForCwd().getStatus();
240
+ if (status.trim()) {
241
+ die(`Working tree is not clean. Cannot edit Initiative.\n\n` +
242
+ `Uncommitted changes:\n${status}\n\n` +
243
+ `Commit or stash changes before editing:\n git add . && git commit -m "..."\n`);
244
+ }
245
+ }
246
+ /**
247
+ * Apply blocking edits to Initiative
248
+ */
249
+ function applyBlockingEdits(updated, opts) {
250
+ if (opts.blockedBy) {
251
+ if (!opts.blockedReason) {
252
+ die(`--blocked-reason is required when using --blocked-by.\n\n` +
253
+ `Usage: pnpm initiative:edit --id ${updated.id} --blocked-by ${opts.blockedBy} --blocked-reason "Reason text"`);
254
+ }
255
+ if (!INIT_PATTERNS.INIT_ID.test(opts.blockedBy)) {
256
+ die(`Invalid blocked-by Initiative ID format: "${opts.blockedBy}"\n\n` +
257
+ `Expected format: INIT-<number> (e.g., INIT-001)`);
258
+ }
259
+ updated.blocked_by = opts.blockedBy;
260
+ updated.blocked_reason = opts.blockedReason;
261
+ }
262
+ if (opts.unblock) {
263
+ delete updated.blocked_by;
264
+ delete updated.blocked_reason;
265
+ }
266
+ }
267
+ /**
268
+ * Apply lane edits (add and remove)
269
+ * Adds first, then removes (WU-2276)
270
+ */
271
+ function applyLaneEdits(updated, opts) {
272
+ if (opts.addLane && opts.addLane.length > 0) {
273
+ updated.lanes = updated.lanes || [];
274
+ for (const lane of opts.addLane) {
275
+ if (!updated.lanes.includes(lane)) {
276
+ updated.lanes.push(lane);
277
+ }
278
+ }
279
+ }
280
+ if (opts.removeLane && opts.removeLane.length > 0) {
281
+ updated.lanes = updated.lanes || [];
282
+ updated.lanes = updated.lanes.filter((lane) => !opts.removeLane.includes(lane));
283
+ }
284
+ }
285
+ /**
286
+ * Apply array append edits (notes, success metrics)
287
+ */
288
+ function applyArrayEdits(updated, opts) {
289
+ applyLaneEdits(updated, opts);
290
+ if (opts.notes) {
291
+ updated.notes = updated.notes || [];
292
+ updated.notes.push(opts.notes);
293
+ }
294
+ if (opts.addSuccessMetric && opts.addSuccessMetric.length > 0) {
295
+ updated.success_metrics = updated.success_metrics || [];
296
+ for (const metric of opts.addSuccessMetric) {
297
+ if (!updated.success_metrics.includes(metric)) {
298
+ updated.success_metrics.push(metric);
299
+ }
300
+ }
301
+ }
302
+ }
303
+ /**
304
+ * Apply phase edits with auto-incremented IDs
305
+ */
306
+ function applyPhaseEdits(updated, opts) {
307
+ if (!opts.addPhase || opts.addPhase.length === 0) {
308
+ return;
309
+ }
310
+ updated.phases = updated.phases || [];
311
+ for (const title of opts.addPhase) {
312
+ const existingIds = updated.phases.map((p) => (typeof p.id === 'number' ? p.id : 0));
313
+ const maxId = existingIds.length > 0 ? Math.max(...existingIds) : 0;
314
+ updated.phases.push({
315
+ id: maxId + 1,
316
+ title: title,
317
+ status: 'pending',
318
+ });
319
+ }
320
+ }
321
+ /**
322
+ * Apply phase status update (WU-1836)
323
+ */
324
+ function applyPhaseStatusEdit(updated, phaseId, phaseStatus) {
325
+ const numericId = Number(phaseId);
326
+ const phase = updated.phases.find((p) => p.id === numericId);
327
+ if (phase) {
328
+ phase.status = phaseStatus;
329
+ }
330
+ }
331
+ /**
332
+ * Apply edits to Initiative YAML
333
+ * Returns the updated Initiative object
334
+ */
335
+ function applyEdits(initiative, opts) {
336
+ const updated = { ...initiative };
337
+ if (opts.status) {
338
+ validateStatus(opts.status);
339
+ updated.status = opts.status;
340
+ }
341
+ applyBlockingEdits(updated, opts);
342
+ applyArrayEdits(updated, opts);
343
+ if (opts.description) {
344
+ updated.description = opts.description;
345
+ }
346
+ applyPhaseEdits(updated, opts);
347
+ // WU-1836: Phase status update
348
+ if (opts.phaseId && opts.phaseStatus) {
349
+ applyPhaseStatusEdit(updated, opts.phaseId, opts.phaseStatus);
350
+ }
351
+ // WU-2547: Created date update
352
+ if (opts.created) {
353
+ validateCreatedDate(opts.created);
354
+ updated.created = opts.created;
355
+ }
356
+ return updated;
357
+ }
358
+ /**
359
+ * Main entry point
360
+ */
361
+ async function main() {
362
+ const opts = parseArgs();
363
+ const { id } = opts;
364
+ console.log(`${PREFIX} Starting Initiative edit for ${id}`);
365
+ // Validate inputs
366
+ validateInitIdFormat(id);
367
+ const originalInit = loadInitiative(id);
368
+ // WU-1836: Validate --phase-id and --phase-status are used together
369
+ if (opts.phaseId && !opts.phaseStatus) {
370
+ die(`--phase-status is required when using --phase-id.\n\n` +
371
+ `Usage: pnpm initiative:edit --id ${id} --phase-id ${opts.phaseId} --phase-status done`);
372
+ }
373
+ if (opts.phaseStatus && !opts.phaseId) {
374
+ die(`--phase-id is required when using --phase-status.\n\n` +
375
+ `Usage: pnpm initiative:edit --id ${id} --phase-id 1 --phase-status ${opts.phaseStatus}`);
376
+ }
377
+ // WU-1836: Validate phase exists and status is valid enum before proceeding
378
+ if (opts.phaseId && opts.phaseStatus) {
379
+ validatePhaseExists(originalInit, opts.phaseId);
380
+ validatePhaseStatus(opts.phaseStatus);
381
+ }
382
+ // Check we have something to edit
383
+ const hasEdits = opts.status ||
384
+ opts.blockedBy ||
385
+ opts.unblock ||
386
+ (opts.addLane && opts.addLane.length > 0) ||
387
+ (opts.removeLane && opts.removeLane.length > 0) ||
388
+ opts.notes ||
389
+ opts.description ||
390
+ (opts.addPhase && opts.addPhase.length > 0) ||
391
+ (opts.addSuccessMetric && opts.addSuccessMetric.length > 0) ||
392
+ (opts.phaseId && opts.phaseStatus) ||
393
+ opts.created;
394
+ if (!hasEdits) {
395
+ die('No edits specified.\n\n' +
396
+ 'Provide one of:\n' +
397
+ ' --status <status> Update initiative status\n' +
398
+ ' --blocked-by <INIT-ID> Set blocking initiative (requires --blocked-reason)\n' +
399
+ ' --unblock Remove blocked_by and blocked_reason\n' +
400
+ ' --add-lane <lane> Add lane (repeatable)\n' +
401
+ ' --remove-lane <lane> Remove lane (repeatable)\n' +
402
+ ' --notes <text> Append note\n' +
403
+ ' --description <text> Replace description field\n' +
404
+ ' --add-phase <title> Add phase with auto-incremented id (repeatable)\n' +
405
+ ' --add-success-metric <text> Add success metric (repeatable, deduplicated)\n' +
406
+ ' --phase-id <id> --phase-status <status> Update specific phase status\n' +
407
+ ' --created <YYYY-MM-DD> Set created date');
408
+ }
409
+ // Apply edits to get updated Initiative
410
+ const updatedInit = applyEdits(originalInit, opts);
411
+ // Pre-flight checks for micro-worktree mode
412
+ await ensureOnMain(getGitForCwd());
413
+ await ensureCleanWorkingTree();
414
+ await ensureMainUpToDate(getGitForCwd(), 'initiative:edit');
415
+ console.log(`${PREFIX} Applying edits via micro-worktree...`);
416
+ await withMicroWorktree({
417
+ operation: MICRO_WORKTREE_OPERATIONS.INITIATIVE_EDIT,
418
+ id: id,
419
+ logPrefix: PREFIX,
420
+ pushOnly: true, // WU-1435: Push directly to origin/main without touching local main
421
+ execute: async ({ worktreePath }) => {
422
+ // Write updated Initiative to micro-worktree
423
+ const initPath = join(worktreePath, INIT_PATHS.INITIATIVE(id));
424
+ const yamlContent = yaml.dump(updatedInit, { lineWidth: 100 });
425
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool writes init files
426
+ writeFileSync(initPath, yamlContent, { encoding: FILE_SYSTEM.ENCODING });
427
+ console.log(`${PREFIX} Updated ${id}.yaml in micro-worktree`);
428
+ return {
429
+ commitMessage: INIT_COMMIT_FORMATS.EDIT(id),
430
+ files: [INIT_PATHS.INITIATIVE(id)],
431
+ };
432
+ },
433
+ });
434
+ console.log(`${PREFIX} Successfully edited ${id}`);
435
+ console.log(`${PREFIX} Changes pushed to origin/main`);
436
+ }
437
+ main().catch((err) => {
438
+ console.error(`${PREFIX} ${err.message}`);
439
+ process.exit(EXIT_CODES.ERROR);
440
+ });
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initiative-edit.js","sourceRoot":"","sources":["../src/initiative-edit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Initiative List Helper (WU-1247)
4
+ *
5
+ * Lists all initiatives with progress percentages.
6
+ *
7
+ * Usage:
8
+ * pnpm initiative:list # Table format
9
+ * pnpm initiative:list --format json # JSON format
10
+ * pnpm initiative:list --status open # Filter by status
11
+ */
12
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initiative-list.d.ts","sourceRoot":"","sources":["../src/initiative-list.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG"}
@@ -0,0 +1,101 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Initiative List Helper (WU-1247)
4
+ *
5
+ * Lists all initiatives with progress percentages.
6
+ *
7
+ * Usage:
8
+ * pnpm initiative:list # Table format
9
+ * pnpm initiative:list --format json # JSON format
10
+ * pnpm initiative:list --status open # Filter by status
11
+ */
12
+ import { createWUParser, WU_OPTIONS } from '@lumenflow/core/dist/arg-parser.js';
13
+ import { listInitiatives, getInitiativeProgress, } from '@lumenflow/initiatives/dist/initiative-yaml.js';
14
+ import { OUTPUT_FORMATS } from '@lumenflow/initiatives/dist/initiative-constants.js';
15
+ import Table from 'cli-table3';
16
+ function renderTable(initiatives, useColor) {
17
+ if (initiatives.length === 0) {
18
+ console.log('No initiatives found.');
19
+ return;
20
+ }
21
+ const table = new Table({
22
+ head: ['ID', 'Title', 'Status', 'Progress', 'WUs'],
23
+ colWidths: [12, 35, 15, 12, 12],
24
+ style: {
25
+ head: useColor ? ['cyan'] : [],
26
+ },
27
+ });
28
+ for (const { id, doc } of initiatives) {
29
+ const progress = getInitiativeProgress(id);
30
+ const progressPct = `${progress.percentage}%`;
31
+ const wuCount = `${progress.done}/${progress.total}`;
32
+ table.push([id, truncate(doc.title, 33), doc.status, progressPct, wuCount]);
33
+ }
34
+ console.log(table.toString());
35
+ // Summary
36
+ const statusCounts = {};
37
+ for (const { doc } of initiatives) {
38
+ statusCounts[doc.status] = (statusCounts[doc.status] || 0) + 1;
39
+ }
40
+ const summary = Object.entries(statusCounts)
41
+ .map(([status, count]) => `${count} ${status}`)
42
+ .join(', ');
43
+ console.log(`\nTotal: ${initiatives.length} initiatives (${summary})`);
44
+ }
45
+ function renderJSON(initiatives) {
46
+ const output = initiatives.map(({ id, doc }) => {
47
+ const progress = getInitiativeProgress(id);
48
+ return {
49
+ id,
50
+ slug: doc.slug,
51
+ title: doc.title,
52
+ status: doc.status,
53
+ priority: doc.priority,
54
+ progress: {
55
+ percentage: progress.percentage,
56
+ done: progress.done,
57
+ inProgress: progress.inProgress,
58
+ ready: progress.ready,
59
+ blocked: progress.blocked,
60
+ total: progress.total,
61
+ },
62
+ };
63
+ });
64
+ console.log(JSON.stringify(output, null, 2));
65
+ }
66
+ function truncate(str, maxLen) {
67
+ if (!str)
68
+ return '';
69
+ return str.length > maxLen ? `${str.substring(0, maxLen - 3)}...` : str;
70
+ }
71
+ async function main() {
72
+ const args = createWUParser({
73
+ name: 'initiative-list',
74
+ description: 'List all initiatives with progress percentages',
75
+ options: [WU_OPTIONS.format, WU_OPTIONS.status, WU_OPTIONS.color],
76
+ required: [],
77
+ allowPositionalId: false,
78
+ });
79
+ let initiatives = listInitiatives();
80
+ // Filter by status if specified
81
+ if (args.status) {
82
+ initiatives = initiatives.filter((i) => i.doc.status === args.status);
83
+ }
84
+ // Sort by ID
85
+ initiatives.sort((a, b) => a.id.localeCompare(b.id));
86
+ const format = args.format || OUTPUT_FORMATS.TABLE;
87
+ switch (format) {
88
+ case OUTPUT_FORMATS.JSON:
89
+ renderJSON(initiatives);
90
+ break;
91
+ case OUTPUT_FORMATS.TABLE:
92
+ default:
93
+ renderTable(initiatives, args.color);
94
+ break;
95
+ }
96
+ }
97
+ // Guard main() for testability (WU-1366)
98
+ import { fileURLToPath } from 'node:url';
99
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
100
+ main();
101
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initiative-list.js","sourceRoot":"","sources":["../src/initiative-list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Initiative Status Helper (WU-1247)
4
+ *
5
+ * Shows detailed initiative view with phases and WUs.
6
+ *
7
+ * Usage:
8
+ * pnpm initiative:status INIT-001
9
+ * pnpm initiative:status --id INIT-001 --format json
10
+ */
11
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initiative-status.d.ts","sourceRoot":"","sources":["../src/initiative-status.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG"}