@lumenflow/cli 3.1.3 → 3.2.1

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