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