@lumenflow/cli 2.18.3 → 2.19.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 (104) hide show
  1. package/README.md +42 -41
  2. package/dist/delegation-list.js +140 -0
  3. package/dist/delegation-list.js.map +1 -0
  4. package/dist/doctor.js +35 -99
  5. package/dist/doctor.js.map +1 -1
  6. package/dist/gates-plan-resolvers.js +150 -0
  7. package/dist/gates-plan-resolvers.js.map +1 -0
  8. package/dist/gates-runners.js +533 -0
  9. package/dist/gates-runners.js.map +1 -0
  10. package/dist/gates-types.js +3 -0
  11. package/dist/gates-types.js.map +1 -1
  12. package/dist/gates-utils.js +316 -0
  13. package/dist/gates-utils.js.map +1 -0
  14. package/dist/gates.js +44 -1016
  15. package/dist/gates.js.map +1 -1
  16. package/dist/hooks/enforcement-generator.js +16 -880
  17. package/dist/hooks/enforcement-generator.js.map +1 -1
  18. package/dist/hooks/enforcement-sync.js +1 -4
  19. package/dist/hooks/enforcement-sync.js.map +1 -1
  20. package/dist/hooks/generators/auto-checkpoint.js +123 -0
  21. package/dist/hooks/generators/auto-checkpoint.js.map +1 -0
  22. package/dist/hooks/generators/enforce-worktree.js +188 -0
  23. package/dist/hooks/generators/enforce-worktree.js.map +1 -0
  24. package/dist/hooks/generators/index.js +16 -0
  25. package/dist/hooks/generators/index.js.map +1 -0
  26. package/dist/hooks/generators/pre-compact-checkpoint.js +134 -0
  27. package/dist/hooks/generators/pre-compact-checkpoint.js.map +1 -0
  28. package/dist/hooks/generators/require-wu.js +115 -0
  29. package/dist/hooks/generators/require-wu.js.map +1 -0
  30. package/dist/hooks/generators/session-start-recovery.js +101 -0
  31. package/dist/hooks/generators/session-start-recovery.js.map +1 -0
  32. package/dist/hooks/generators/signal-utils.js +52 -0
  33. package/dist/hooks/generators/signal-utils.js.map +1 -0
  34. package/dist/hooks/generators/warn-incomplete.js +65 -0
  35. package/dist/hooks/generators/warn-incomplete.js.map +1 -0
  36. package/dist/init-detection.js +228 -0
  37. package/dist/init-detection.js.map +1 -0
  38. package/dist/init-scaffolding.js +146 -0
  39. package/dist/init-scaffolding.js.map +1 -0
  40. package/dist/init-templates.js +1928 -0
  41. package/dist/init-templates.js.map +1 -0
  42. package/dist/init.js +136 -2425
  43. package/dist/init.js.map +1 -1
  44. package/dist/initiative-edit.js +42 -11
  45. package/dist/initiative-edit.js.map +1 -1
  46. package/dist/initiative-remove-wu.js +0 -0
  47. package/dist/initiative-status.js +29 -2
  48. package/dist/initiative-status.js.map +1 -1
  49. package/dist/mem-context.js +22 -9
  50. package/dist/mem-context.js.map +1 -1
  51. package/dist/orchestrate-init-status.js +32 -1
  52. package/dist/orchestrate-init-status.js.map +1 -1
  53. package/dist/orchestrate-monitor.js +38 -38
  54. package/dist/orchestrate-monitor.js.map +1 -1
  55. package/dist/public-manifest.js +12 -5
  56. package/dist/public-manifest.js.map +1 -1
  57. package/dist/shared-validators.js +1 -0
  58. package/dist/shared-validators.js.map +1 -1
  59. package/dist/spawn-list.js +0 -0
  60. package/dist/wu-claim-branch.js +121 -0
  61. package/dist/wu-claim-branch.js.map +1 -0
  62. package/dist/wu-claim-output.js +83 -0
  63. package/dist/wu-claim-output.js.map +1 -0
  64. package/dist/wu-claim-resume-handler.js +85 -0
  65. package/dist/wu-claim-resume-handler.js.map +1 -0
  66. package/dist/wu-claim-state.js +572 -0
  67. package/dist/wu-claim-state.js.map +1 -0
  68. package/dist/wu-claim-validation.js +439 -0
  69. package/dist/wu-claim-validation.js.map +1 -0
  70. package/dist/wu-claim-worktree.js +221 -0
  71. package/dist/wu-claim-worktree.js.map +1 -0
  72. package/dist/wu-claim.js +54 -1402
  73. package/dist/wu-claim.js.map +1 -1
  74. package/dist/wu-create-content.js +254 -0
  75. package/dist/wu-create-content.js.map +1 -0
  76. package/dist/wu-create-readiness.js +57 -0
  77. package/dist/wu-create-readiness.js.map +1 -0
  78. package/dist/wu-create-validation.js +149 -0
  79. package/dist/wu-create-validation.js.map +1 -0
  80. package/dist/wu-create.js +39 -441
  81. package/dist/wu-create.js.map +1 -1
  82. package/dist/wu-done.js +144 -249
  83. package/dist/wu-done.js.map +1 -1
  84. package/dist/wu-edit-operations.js +432 -0
  85. package/dist/wu-edit-operations.js.map +1 -0
  86. package/dist/wu-edit-validators.js +280 -0
  87. package/dist/wu-edit-validators.js.map +1 -0
  88. package/dist/wu-edit.js +27 -713
  89. package/dist/wu-edit.js.map +1 -1
  90. package/dist/wu-prep.js +32 -2
  91. package/dist/wu-prep.js.map +1 -1
  92. package/dist/wu-repair.js +1 -1
  93. package/dist/wu-repair.js.map +1 -1
  94. package/dist/wu-spawn-prompt-builders.js +1123 -0
  95. package/dist/wu-spawn-prompt-builders.js.map +1 -0
  96. package/dist/wu-spawn-strategy-resolver.js +314 -0
  97. package/dist/wu-spawn-strategy-resolver.js.map +1 -0
  98. package/dist/wu-spawn.js +9 -1398
  99. package/dist/wu-spawn.js.map +1 -1
  100. package/package.json +10 -7
  101. package/templates/core/LUMENFLOW.md.template +29 -99
  102. package/templates/core/ai/onboarding/agent-invocation-guide.md.template +1 -1
  103. package/templates/core/ai/onboarding/quick-ref-commands.md.template +29 -4
  104. package/templates/vendors/claude/.claude/skills/orchestration/SKILL.md.template +8 -8
@@ -0,0 +1,432 @@
1
+ /**
2
+ * WU-1650: Apply/edit operations for wu:edit command
3
+ *
4
+ * Extracted from wu-edit.ts to dedicated module.
5
+ * All field-application, merge, and write operations live here.
6
+ */
7
+ import { die } from '@lumenflow/core/error-handler';
8
+ import { createGitForPath } from '@lumenflow/core/git-adapter';
9
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
10
+ import { join, resolve } from 'node:path';
11
+ import { parseYAML, stringifyYAML, readWU } from '@lumenflow/core/wu-yaml';
12
+ import { WU_PATHS, getStateStoreDirFromBacklog } from '@lumenflow/core/wu-paths';
13
+ import { generateBacklog } from '@lumenflow/core/backlog-generator';
14
+ import { WUStateStore } from '@lumenflow/core/wu-state-store';
15
+ import { FILE_SYSTEM, LOG_PREFIX, COMMIT_FORMATS, PKG_MANAGER, SCRIPTS, PRETTIER_FLAGS, READINESS_UI, } from '@lumenflow/core/wu-constants';
16
+ import { validateLaneFormat } from '@lumenflow/core/lane-checker';
17
+ // WU-1442: Import date normalization to fix date corruption from js-yaml
18
+ import { normalizeToDateString } from '@lumenflow/core/date-utils';
19
+ // WU-1929: Import initiative-related modules for bidirectional initiative updates
20
+ import { INIT_PATHS } from '@lumenflow/initiatives/paths';
21
+ import { readInitiative, writeInitiative } from '@lumenflow/initiatives/yaml';
22
+ import { validateSpecCompleteness } from '@lumenflow/core/wu-done-validators';
23
+ import { execSync } from 'node:child_process';
24
+ import { checkCodePathCoverageBeforeGates, formatCodePathCoverageFailure } from './wu-prep.js';
25
+ import { validateInitiativeFormat, validateInitiativeExists, validateExposureValue, hasScopeRelevantBranchChanges, } from './wu-edit-validators.js';
26
+ const PREFIX = LOG_PREFIX.EDIT;
27
+ /**
28
+ * WU-1039: Apply exposure edit to WU object
29
+ *
30
+ * Returns a new WU object with updated exposure (immutable pattern).
31
+ *
32
+ * @param wu - Original WU object
33
+ * @param exposure - New exposure value
34
+ * @returns Updated WU object (does not mutate original)
35
+ */
36
+ export function applyExposureEdit(wu, exposure) {
37
+ return {
38
+ ...wu,
39
+ exposure,
40
+ };
41
+ }
42
+ /**
43
+ * WU-1929: Update initiative wus: arrays bidirectionally
44
+ *
45
+ * When a WU's initiative field changes, this function:
46
+ * 1. Removes the WU ID from the old initiative's wus: array (if exists)
47
+ * 2. Adds the WU ID to the new initiative's wus: array
48
+ *
49
+ * @param worktreePath - Path to the worktree (for file operations)
50
+ * @param wuId - WU ID being updated
51
+ * @param oldInitId - Previous initiative ID (may be undefined)
52
+ * @param newInitId - New initiative ID
53
+ * @returns Array of relative file paths that were modified
54
+ */
55
+ export function updateInitiativeWusArrays(worktreePath, wuId, oldInitId, newInitId) {
56
+ const modifiedFiles = [];
57
+ // Remove from old initiative if it exists and is different from new
58
+ if (oldInitId && oldInitId !== newInitId) {
59
+ const oldInitPath = join(worktreePath, INIT_PATHS.INITIATIVE(oldInitId));
60
+ if (existsSync(oldInitPath)) {
61
+ try {
62
+ const oldInit = readInitiative(oldInitPath, oldInitId);
63
+ if (Array.isArray(oldInit.wus) && oldInit.wus.includes(wuId)) {
64
+ oldInit.wus = oldInit.wus.filter((id) => id !== wuId);
65
+ writeInitiative(oldInitPath, oldInit);
66
+ modifiedFiles.push(INIT_PATHS.INITIATIVE(oldInitId));
67
+ console.log(`${PREFIX} Removed ${wuId} from ${oldInitId} wus: array`);
68
+ }
69
+ }
70
+ catch (err) {
71
+ // Old initiative may not exist or be invalid - log warning but continue
72
+ console.warn(`${PREFIX} Could not update old initiative ${oldInitId}: ${err.message}`);
73
+ }
74
+ }
75
+ }
76
+ // Add to new initiative
77
+ const newInitPath = join(worktreePath, INIT_PATHS.INITIATIVE(newInitId));
78
+ if (existsSync(newInitPath)) {
79
+ try {
80
+ const newInit = readInitiative(newInitPath, newInitId);
81
+ if (!Array.isArray(newInit.wus)) {
82
+ newInit.wus = [];
83
+ }
84
+ if (!newInit.wus.includes(wuId)) {
85
+ newInit.wus.push(wuId);
86
+ writeInitiative(newInitPath, newInit);
87
+ modifiedFiles.push(INIT_PATHS.INITIATIVE(newInitId));
88
+ console.log(`${PREFIX} Added ${wuId} to ${newInitId} wus: array`);
89
+ }
90
+ }
91
+ catch (err) {
92
+ die(`Failed to update new initiative ${newInitId}: ${err.message}`);
93
+ }
94
+ }
95
+ return modifiedFiles;
96
+ }
97
+ /**
98
+ * Normalize date fields in WU object to prevent date corruption
99
+ *
100
+ * WU-1442: js-yaml parses unquoted YYYY-MM-DD dates as Date objects.
101
+ * When yaml.dump() serializes them back, it outputs ISO timestamps.
102
+ * This function normalizes Date objects back to YYYY-MM-DD strings.
103
+ */
104
+ export function normalizeWUDates(wu) {
105
+ if (wu.created !== undefined) {
106
+ wu.created = normalizeToDateString(wu.created);
107
+ }
108
+ return wu;
109
+ }
110
+ /**
111
+ * Merge array values: replace by default, append if --append flag is set (WU-1388)
112
+ */
113
+ export function mergeArrayField(existing, newValues, shouldAppend) {
114
+ if (!shouldAppend) {
115
+ return newValues;
116
+ }
117
+ const existingArray = Array.isArray(existing) ? existing : [];
118
+ return [...existingArray, ...newValues];
119
+ }
120
+ /**
121
+ * WU-1144: Merge string field values with append-by-default behavior
122
+ *
123
+ * Notes and acceptance criteria should append by default (preserving original),
124
+ * with explicit --replace-notes and --replace-acceptance flags for overwrite.
125
+ */
126
+ export function mergeStringField(existing, newValue, shouldReplace) {
127
+ // If replace mode or no existing value, just use new value
128
+ if (shouldReplace || !existing || existing.trim() === '') {
129
+ return newValue;
130
+ }
131
+ // Append with double newline separator
132
+ return `${existing}\n\n${newValue}`;
133
+ }
134
+ /**
135
+ * WU-1594: Ensure wu:edit commits always include regenerated backlog projection.
136
+ */
137
+ export function getWuEditCommitFiles(id, extraFiles = []) {
138
+ return [...new Set([WU_PATHS.WU(id), ...extraFiles, WU_PATHS.BACKLOG()])];
139
+ }
140
+ /**
141
+ * WU-1594: Regenerate backlog.md from state store after wu:edit updates.
142
+ */
143
+ export async function regenerateBacklogFromState(backlogPath) {
144
+ const stateDir = getStateStoreDirFromBacklog(backlogPath);
145
+ const store = new WUStateStore(stateDir);
146
+ await store.load();
147
+ const content = await generateBacklog(store);
148
+ writeFileSync(backlogPath, content, { encoding: FILE_SYSTEM.ENCODING });
149
+ }
150
+ /**
151
+ * Load spec file and merge with original WU (preserving id and status)
152
+ */
153
+ function loadSpecFile(specPath, originalWU) {
154
+ const resolvedPath = resolve(specPath);
155
+ if (!existsSync(resolvedPath)) {
156
+ die(`Spec file not found: ${resolvedPath}`);
157
+ }
158
+ const specContent = readFileSync(resolvedPath, {
159
+ encoding: FILE_SYSTEM.ENCODING,
160
+ });
161
+ const newSpec = parseYAML(specContent);
162
+ // Preserve id and status from original (cannot be changed via edit)
163
+ return {
164
+ ...newSpec,
165
+ id: originalWU.id,
166
+ status: originalWU.status,
167
+ };
168
+ }
169
+ /**
170
+ * Apply edits to WU YAML
171
+ * Returns the updated WU object
172
+ */
173
+ // eslint-disable-next-line sonarjs/cognitive-complexity -- Pre-existing complexity, refactor tracked separately
174
+ export function applyEdits(wu, opts) {
175
+ // Full spec replacement from file
176
+ if (opts.specFile) {
177
+ return loadSpecFile(opts.specFile, wu);
178
+ }
179
+ const updated = { ...wu };
180
+ // Field-level updates
181
+ if (opts.description) {
182
+ updated.description = opts.description;
183
+ }
184
+ // WU-1144: Handle --acceptance with append-by-default behavior
185
+ // Appends to existing acceptance criteria unless --replace-acceptance is set
186
+ if (opts.acceptance && opts.acceptance.length > 0) {
187
+ // Invert the logic: append by default, replace with --replace-acceptance
188
+ const shouldAppend = !opts.replaceAcceptance;
189
+ updated.acceptance = mergeArrayField(wu.acceptance, opts.acceptance, shouldAppend);
190
+ }
191
+ // WU-1144: Handle --notes with append-by-default behavior
192
+ // Appends to existing notes unless --replace-notes is set
193
+ if (opts.notes) {
194
+ updated.notes = mergeStringField(wu.notes, opts.notes, opts.replaceNotes ?? false);
195
+ }
196
+ // WU-1456: Handle lane reassignment
197
+ if (opts.lane) {
198
+ validateLaneFormat(opts.lane);
199
+ updated.lane = opts.lane;
200
+ }
201
+ // WU-1620: Handle type and priority updates
202
+ if (opts.type) {
203
+ updated.type = opts.type;
204
+ }
205
+ if (opts.priority) {
206
+ updated.priority = opts.priority;
207
+ }
208
+ // WU-1929: Handle initiative and phase updates
209
+ // Note: Initiative bidirectional updates (initiative wus: arrays) are handled separately
210
+ // in the main function after applyEdits, since they require file I/O
211
+ if (opts.initiative) {
212
+ validateInitiativeFormat(opts.initiative);
213
+ validateInitiativeExists(opts.initiative);
214
+ updated.initiative = opts.initiative;
215
+ }
216
+ if (opts.phase !== undefined && opts.phase !== null) {
217
+ const phaseNum = parseInt(opts.phase, 10);
218
+ if (isNaN(phaseNum) || phaseNum < 1) {
219
+ die(`Invalid phase number: "${opts.phase}"\n\nPhase must be a positive integer (e.g., 1, 2, 3)`);
220
+ }
221
+ updated.phase = phaseNum;
222
+ }
223
+ // Handle repeatable --code-paths flags (WU-1225: append by default, replace with --replace-code-paths)
224
+ // WU-1816: Split comma-separated string into array (same pattern as test paths)
225
+ // WU-1870: Fix to split comma-separated values WITHIN array elements (Commander passes ['a,b'] not 'a,b')
226
+ if (opts.codePaths && opts.codePaths.length > 0) {
227
+ const rawCodePaths = opts.codePaths;
228
+ const codePaths = Array.isArray(rawCodePaths)
229
+ ? rawCodePaths
230
+ .flatMap((p) => p.split(','))
231
+ .map((p) => p.trim())
232
+ .filter(Boolean)
233
+ : rawCodePaths
234
+ .split(',')
235
+ .map((p) => p.trim())
236
+ .filter(Boolean);
237
+ // WU-1225: Invert logic - append by default, replace with --replace-code-paths
238
+ // Also support legacy --append flag for backwards compatibility
239
+ const shouldAppend = !opts.replaceCodePaths || opts.append;
240
+ updated.code_paths = mergeArrayField(wu.code_paths, codePaths, shouldAppend);
241
+ }
242
+ // WU-1225: Handle repeatable --risks flags (append by default, replace with --replace-risks)
243
+ // Split comma-separated values within each entry for consistency with other list fields
244
+ if (opts.risks && opts.risks.length > 0) {
245
+ const rawRisks = opts.risks;
246
+ const risks = Array.isArray(rawRisks)
247
+ ? rawRisks
248
+ .flatMap((risk) => risk.split(','))
249
+ .map((risk) => risk.trim())
250
+ .filter(Boolean)
251
+ : rawRisks
252
+ .split(',')
253
+ .map((risk) => risk.trim())
254
+ .filter(Boolean);
255
+ // WU-1225: Invert logic - append by default
256
+ const shouldAppend = !opts.replaceRisks || opts.append;
257
+ updated.risks = mergeArrayField(wu.risks, risks, shouldAppend);
258
+ }
259
+ // WU-1390: Handle test path flags (DRY refactor)
260
+ // WU-1225: Test paths now append by default (consistent with --acceptance and --code-paths)
261
+ const testPathMappings = [
262
+ { optKey: 'testPathsManual', field: 'manual' },
263
+ { optKey: 'testPathsUnit', field: 'unit' },
264
+ { optKey: 'testPathsE2e', field: 'e2e' },
265
+ ];
266
+ for (const { optKey, field } of testPathMappings) {
267
+ const rawPaths = opts[optKey];
268
+ if (rawPaths && rawPaths.length > 0) {
269
+ // Split comma-separated string into array (options are comma-separated per description)
270
+ // WU-1870: Fix to split comma-separated values WITHIN array elements
271
+ const paths = Array.isArray(rawPaths)
272
+ ? rawPaths
273
+ .flatMap((p) => p.split(','))
274
+ .map((p) => p.trim())
275
+ .filter(Boolean)
276
+ : rawPaths
277
+ .split(',')
278
+ .map((p) => p.trim())
279
+ .filter(Boolean);
280
+ updated.tests = updated.tests || {};
281
+ // WU-1225: Append by default (no individual replace flags for test paths yet)
282
+ const shouldAppend = true;
283
+ updated.tests[field] = mergeArrayField(wu.tests?.[field], paths, shouldAppend);
284
+ }
285
+ }
286
+ // WU-2564: Handle --blocked-by flag
287
+ // WU-1225: Append by default, replace with --replace-blocked-by
288
+ if (opts.blockedBy) {
289
+ const rawBlockedBy = opts.blockedBy;
290
+ const blockedByIds = rawBlockedBy
291
+ .split(',')
292
+ .map((id) => id.trim())
293
+ .filter(Boolean);
294
+ const shouldAppend = !opts.replaceBlockedBy || opts.append;
295
+ updated.blocked_by = mergeArrayField(wu.blocked_by, blockedByIds, shouldAppend);
296
+ }
297
+ // WU-2564: Handle --add-dep flag
298
+ // WU-1225: Append by default, replace with --replace-dependencies
299
+ if (opts.addDep) {
300
+ const rawAddDep = opts.addDep;
301
+ const depIds = rawAddDep
302
+ .split(',')
303
+ .map((id) => id.trim())
304
+ .filter(Boolean);
305
+ const shouldAppend = !opts.replaceDependencies || opts.append;
306
+ updated.dependencies = mergeArrayField(wu.dependencies, depIds, shouldAppend);
307
+ }
308
+ // WU-1039: Handle --exposure flag with validation
309
+ if (opts.exposure) {
310
+ const exposureResult = validateExposureValue(opts.exposure);
311
+ if (!exposureResult.valid) {
312
+ die(exposureResult.error);
313
+ }
314
+ updated.exposure = opts.exposure;
315
+ }
316
+ return updated;
317
+ }
318
+ /**
319
+ * Apply edits directly in an active worktree (WU-1365)
320
+ * Used for in_progress WUs with claimed_mode=worktree
321
+ */
322
+ export async function applyEditsInWorktree({ worktreePath, id, updatedWU }) {
323
+ const wuPath = join(worktreePath, WU_PATHS.WU(id));
324
+ // WU-1442: Normalize dates before dumping to prevent ISO timestamp corruption
325
+ normalizeWUDates(updatedWU);
326
+ // Emergency fix Session 2: Use centralized stringifyYAML helper
327
+ const yamlContent = stringifyYAML(updatedWU);
328
+ writeFileSync(wuPath, yamlContent, { encoding: FILE_SYSTEM.ENCODING });
329
+ console.log(`${PREFIX} Updated ${id}.yaml in worktree`);
330
+ // Format the file
331
+ try {
332
+ execSync(`${PKG_MANAGER} ${SCRIPTS.PRETTIER} ${PRETTIER_FLAGS.WRITE} "${wuPath}"`, {
333
+ cwd: worktreePath,
334
+ encoding: FILE_SYSTEM.ENCODING,
335
+ stdio: 'pipe',
336
+ });
337
+ console.log(`${PREFIX} Formatted ${id}.yaml`);
338
+ }
339
+ catch (err) {
340
+ console.warn(`${PREFIX} Could not format file: ${err.message}`);
341
+ }
342
+ // Stage and commit using git adapter (library-first)
343
+ const commitMsg = COMMIT_FORMATS.SPEC_UPDATE(id);
344
+ try {
345
+ const gitAdapter = createGitForPath(worktreePath);
346
+ await gitAdapter.add(wuPath);
347
+ await gitAdapter.commit(commitMsg);
348
+ console.log(`${PREFIX} Committed: ${commitMsg}`);
349
+ }
350
+ catch (err) {
351
+ die(`Failed to commit edit in worktree.\n\n` +
352
+ `Error: ${err.message}\n\n` +
353
+ `The WU file was updated but could not be committed.\n` +
354
+ `You may need to commit manually in the worktree.`);
355
+ }
356
+ }
357
+ /**
358
+ * WU-1618: Enforce code path coverage for in-progress WUs during spec edits.
359
+ */
360
+ export function enforceInProgressCodePathCoverage(options) {
361
+ const { id, editOpts, codePaths = [], cwd } = options;
362
+ const hasCodePathEdit = Array.isArray(editOpts.codePaths)
363
+ ? editOpts.codePaths.length > 0
364
+ : Boolean(editOpts.codePaths);
365
+ if (!hasCodePathEdit) {
366
+ return;
367
+ }
368
+ if (!Array.isArray(codePaths) || codePaths.length === 0) {
369
+ return;
370
+ }
371
+ const coverage = checkCodePathCoverageBeforeGates({
372
+ wuId: id,
373
+ codePaths,
374
+ cwd,
375
+ });
376
+ if (coverage.valid) {
377
+ return;
378
+ }
379
+ if (!hasScopeRelevantBranchChanges(coverage.changedFiles)) {
380
+ console.warn(`${PREFIX} code_paths coverage check deferred (no scope-relevant branch changes yet).`);
381
+ return;
382
+ }
383
+ die(`${formatCodePathCoverageFailure({
384
+ wuId: id,
385
+ missingCodePaths: coverage.missingCodePaths,
386
+ changedFiles: coverage.changedFiles,
387
+ error: coverage.error,
388
+ })}\n\n` +
389
+ `${PREFIX} Tip: if you're still defining scope before code changes, run wu:edit again after your first scope-relevant commit.`);
390
+ }
391
+ /**
392
+ * WU-1620: Display readiness summary after edit
393
+ *
394
+ * Shows whether WU is ready for wu:claim based on spec completeness.
395
+ * Non-blocking - just informational to help agents understand what's missing.
396
+ */
397
+ export function displayReadinessSummary(id) {
398
+ try {
399
+ const wuPath = WU_PATHS.WU(id);
400
+ const wuDoc = readWU(wuPath, id);
401
+ const { valid, errors } = validateSpecCompleteness(wuDoc, id);
402
+ const { BOX, BOX_WIDTH, MESSAGES, ERROR_MAX_LENGTH, ERROR_TRUNCATE_LENGTH, TRUNCATION_SUFFIX, PADDING, } = READINESS_UI;
403
+ console.log(`\n${BOX.TOP_LEFT}${BOX.HORIZONTAL.repeat(BOX_WIDTH)}${BOX.TOP_RIGHT}`);
404
+ if (valid) {
405
+ console.log(`${BOX.VERTICAL} ${MESSAGES.READY_YES}${''.padEnd(PADDING.READY_YES)}${BOX.VERTICAL}`);
406
+ console.log(`${BOX.VERTICAL}${''.padEnd(BOX_WIDTH)}${BOX.VERTICAL}`);
407
+ const claimCmd = `Run: pnpm wu:claim --id ${id}`;
408
+ console.log(`${BOX.VERTICAL} ${claimCmd}${''.padEnd(BOX_WIDTH - claimCmd.length - 1)}${BOX.VERTICAL}`);
409
+ }
410
+ else {
411
+ console.log(`${BOX.VERTICAL} ${MESSAGES.READY_NO}${''.padEnd(PADDING.READY_NO)}${BOX.VERTICAL}`);
412
+ console.log(`${BOX.VERTICAL}${''.padEnd(BOX_WIDTH)}${BOX.VERTICAL}`);
413
+ console.log(`${BOX.VERTICAL} ${MESSAGES.MISSING_HEADER}${''.padEnd(PADDING.MISSING_HEADER)}${BOX.VERTICAL}`);
414
+ for (const error of errors) {
415
+ // Truncate long error messages to fit box
416
+ const truncated = error.length > ERROR_MAX_LENGTH
417
+ ? `${error.substring(0, ERROR_TRUNCATE_LENGTH)}${TRUNCATION_SUFFIX}`
418
+ : error;
419
+ console.log(`${BOX.VERTICAL} ${MESSAGES.BULLET} ${truncated}${''.padEnd(Math.max(0, PADDING.ERROR_BULLET - truncated.length))}${BOX.VERTICAL}`);
420
+ }
421
+ console.log(`${BOX.VERTICAL}${''.padEnd(BOX_WIDTH)}${BOX.VERTICAL}`);
422
+ const editCmd = `Run: pnpm wu:edit --id ${id} --help`;
423
+ console.log(`${BOX.VERTICAL} ${editCmd}${''.padEnd(BOX_WIDTH - editCmd.length - 1)}${BOX.VERTICAL}`);
424
+ }
425
+ console.log(`${BOX.BOTTOM_LEFT}${BOX.HORIZONTAL.repeat(BOX_WIDTH)}${BOX.BOTTOM_RIGHT}`);
426
+ }
427
+ catch (err) {
428
+ // Non-blocking - if validation fails, just warn
429
+ console.warn(`${PREFIX} Could not validate readiness: ${err.message}`);
430
+ }
431
+ }
432
+ //# sourceMappingURL=wu-edit-operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wu-edit-operations.js","sourceRoot":"","sources":["../src/wu-edit-operations.ts"],"names":[],"mappings":"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"}