@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,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 @@
|
|
|
1
|
+
{"version":3,"file":"initiative-status.d.ts","sourceRoot":"","sources":["../src/initiative-status.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG"}
|