@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,572 @@
1
+ /**
2
+ * @file wu-claim-state.ts
3
+ * @description State update helpers for wu:claim - WU YAML, backlog, status updates.
4
+ *
5
+ * WU-1649: Extracted from wu-claim.ts to reduce orchestration complexity.
6
+ * All functions are mechanical extractions preserving original behavior.
7
+ */
8
+ import { rmSync } from 'node:fs';
9
+ import { access, readFile, writeFile, mkdir } from 'node:fs/promises';
10
+ import path from 'node:path';
11
+ import { parseYAML, stringifyYAML } from '@lumenflow/core/wu-yaml';
12
+ import { assertTransition } from '@lumenflow/core/state-machine';
13
+ import { getGitForCwd, createGitForPath } from '@lumenflow/core/git-adapter';
14
+ import { die, getErrorMessage } from '@lumenflow/core/error-handler';
15
+ import { BRANCHES, WU_STATUS, CLAIMED_MODES, STATUS_SECTIONS, STRING_LITERALS, LOG_PREFIX, GIT_REFS, MICRO_WORKTREE_OPERATIONS, COMMIT_FORMATS, LUMENFLOW_PATHS, FILE_SYSTEM, } from '@lumenflow/core/wu-constants';
16
+ import { WU_PATHS, getStateStoreDirFromBacklog } from '@lumenflow/core/wu-paths';
17
+ import { withMicroWorktree, shouldSkipRemoteOperations } from '@lumenflow/core/micro-worktree';
18
+ import { generateAutoApproval } from '@lumenflow/core/wu-schema';
19
+ import { WUStateStore } from '@lumenflow/core/wu-state-store';
20
+ import { DelegationRegistryStore } from '@lumenflow/core/delegation-registry-store';
21
+ import { generateBacklog, generateStatus } from '@lumenflow/core/backlog-generator';
22
+ import { getConfig } from '@lumenflow/core/config';
23
+ import { autoFixWUYaml } from '@lumenflow/core/wu-yaml-fixer';
24
+ import { getAssignedEmail } from '@lumenflow/core/wu-claim-helpers';
25
+ import { shouldProgressInitiativeStatus, findInitiative, writeInitiative, getInitiativeWUs, } from '@lumenflow/initiatives';
26
+ import { resolveClaimStatus } from './wu-claim-validation.js';
27
+ const PREFIX = LOG_PREFIX.CLAIM;
28
+ /**
29
+ * Decide whether wu:claim should update canonical state on origin/main.
30
+ *
31
+ * Cloud branch-pr claims run on platform-managed branches and should not mutate
32
+ * canonical state on main during claim; they commit claim metadata on their own branch.
33
+ */
34
+ export function shouldApplyCanonicalClaimUpdate(input) {
35
+ // WU-1653: Skip canonical update when no remote (requireRemote=false)
36
+ if (input.noPush || shouldSkipRemoteOperations()) {
37
+ return false;
38
+ }
39
+ return !(input.isCloud && input.claimedMode === CLAIMED_MODES.BRANCH_PR);
40
+ }
41
+ /**
42
+ * Decide whether wu:claim should write claim metadata directly to the active branch.
43
+ */
44
+ export function shouldPersistClaimMetadataOnBranch(input) {
45
+ return (input.noPush === true ||
46
+ input.claimedMode === CLAIMED_MODES.BRANCH_PR ||
47
+ input.skipRemote === true);
48
+ }
49
+ /**
50
+ * Resolve which main reference should be used for claim baseline SHA.
51
+ *
52
+ * In local-only mode (git.requireRemote=false), origin/main may not exist.
53
+ */
54
+ export function resolveClaimBaselineRef(input = {}) {
55
+ return input.skipRemote === true ? BRANCHES.MAIN : GIT_REFS.ORIGIN_MAIN;
56
+ }
57
+ /**
58
+ * WU-1521: Build a rolled-back version of a WU YAML doc by stripping claim metadata.
59
+ *
60
+ * When wu:claim fails after pushing YAML changes to origin/main but before
61
+ * worktree creation succeeds, this function produces a clean doc that can be
62
+ * written back to reset the WU to 'ready' state, enabling a clean retry.
63
+ *
64
+ * Pure function: does not mutate the input doc.
65
+ *
66
+ * @param doc - The claimed WU YAML document to roll back
67
+ * @returns A new document with status=ready and claim metadata removed
68
+ */
69
+ export function buildRollbackYamlDoc(doc) {
70
+ // Shallow-copy to avoid mutating the original
71
+ const rolled = { ...doc };
72
+ // Reset status back to ready
73
+ rolled.status = WU_STATUS.READY;
74
+ // Remove claim-specific metadata fields
75
+ delete rolled.claimed_mode;
76
+ delete rolled.claimed_branch; // WU-1589: Clear claimed_branch on rollback
77
+ delete rolled.claimed_at;
78
+ delete rolled.worktree_path;
79
+ delete rolled.baseline_main_sha;
80
+ delete rolled.session_id;
81
+ delete rolled.assigned_to;
82
+ return rolled;
83
+ }
84
+ /**
85
+ * Returns true when a spawn record includes claim-time pickup evidence.
86
+ */
87
+ export function hasClaimPickupEvidence(entry) {
88
+ const pickedUpAt = typeof entry?.pickedUpAt === 'string' && entry.pickedUpAt.trim().length > 0
89
+ ? entry.pickedUpAt
90
+ : '';
91
+ const pickedUpBy = typeof entry?.pickedUpBy === 'string' && entry.pickedUpBy.trim().length > 0
92
+ ? entry.pickedUpBy
93
+ : '';
94
+ return pickedUpAt.length > 0 && pickedUpBy.length > 0;
95
+ }
96
+ /**
97
+ * WU-1605: Record delegated pickup evidence at wu:claim time when a spawn/delegate
98
+ * provenance record already exists for this target WU.
99
+ */
100
+ export async function recordClaimPickupEvidence(id, options = {}) {
101
+ const baseDir = options.baseDir ?? process.cwd();
102
+ const claimedBy = typeof options.claimedBy === 'string' && options.claimedBy.trim().length > 0
103
+ ? options.claimedBy.trim()
104
+ : 'unknown';
105
+ const store = new DelegationRegistryStore(path.join(baseDir, '.lumenflow', 'state'));
106
+ await store.load();
107
+ const spawnEntry = store.getByTarget(id);
108
+ if (!spawnEntry) {
109
+ return { matchedSpawn: false, recorded: false, alreadyRecorded: false };
110
+ }
111
+ if (hasClaimPickupEvidence(spawnEntry)) {
112
+ return {
113
+ matchedSpawn: true,
114
+ recorded: false,
115
+ alreadyRecorded: true,
116
+ spawnId: spawnEntry.id,
117
+ };
118
+ }
119
+ await store.recordPickup(spawnEntry.id, claimedBy);
120
+ return {
121
+ matchedSpawn: true,
122
+ recorded: true,
123
+ alreadyRecorded: false,
124
+ spawnId: spawnEntry.id,
125
+ };
126
+ }
127
+ export async function updateWUYaml(WU_PATH, id, lane, claimedMode = 'worktree', worktreePath = null, sessionId = null, gitAdapter = null, claimedBranch = null) {
128
+ // Check file exists
129
+ try {
130
+ await access(WU_PATH);
131
+ }
132
+ catch {
133
+ die(`WU file not found: ${WU_PATH}\n\n` +
134
+ `Options:\n` +
135
+ ` 1. Create the WU first: pnpm wu:create --id ${id} --lane "${lane}" --title "..."\n` +
136
+ ` 2. Check if the WU ID is correct`);
137
+ }
138
+ // Read file
139
+ let text;
140
+ try {
141
+ text = await readFile(WU_PATH, { encoding: FILE_SYSTEM.UTF8 });
142
+ }
143
+ catch (e) {
144
+ die(`Failed to read WU file: ${WU_PATH}\n\n` +
145
+ `Error: ${getErrorMessage(e)}\n\n` +
146
+ `Options:\n` +
147
+ ` 1. Check file permissions: ls -la ${WU_PATH}\n` +
148
+ ` 2. Ensure you have read access to the repository`);
149
+ }
150
+ let doc;
151
+ try {
152
+ doc = parseYAML(text);
153
+ }
154
+ catch (e) {
155
+ die(`Failed to parse YAML ${WU_PATH}\n\n` +
156
+ `Error: ${getErrorMessage(e)}\n\n` +
157
+ `Options:\n` +
158
+ ` 1. Validate YAML syntax: pnpm wu:validate --id ${id}\n` +
159
+ ` 2. Fix YAML errors manually and retry`);
160
+ }
161
+ if (!doc || doc.id !== id) {
162
+ die(`WU YAML id mismatch. Expected ${id}, found ${doc && doc.id}\n\n` +
163
+ `Options:\n` +
164
+ ` 1. Check the WU file has correct id field\n` +
165
+ ` 2. Verify you're claiming the right WU`);
166
+ }
167
+ // Validate state transition before updating
168
+ const currentStatus = resolveClaimStatus(doc.status);
169
+ try {
170
+ assertTransition(currentStatus, WU_STATUS.IN_PROGRESS, id);
171
+ }
172
+ catch (error) {
173
+ die(`State transition validation failed: ${getErrorMessage(error)}`);
174
+ }
175
+ // Update status and lane (lane only if provided and different)
176
+ doc.status = WU_STATUS.IN_PROGRESS;
177
+ if (lane)
178
+ doc.lane = lane;
179
+ // Record claimed mode (worktree or branch-only)
180
+ doc.claimed_mode = claimedMode;
181
+ // WU-1590: Persist claimed_branch for branch-pr cloud agents so downstream commands
182
+ // (wu:prep, wu:done, wu:cleanup) can resolve the actual branch via defaultBranchFrom()
183
+ if (claimedBranch) {
184
+ doc.claimed_branch = claimedBranch;
185
+ }
186
+ // WU-1226: Record worktree path to prevent resolution failures if lane field changes
187
+ if (worktreePath) {
188
+ doc.worktree_path = worktreePath;
189
+ }
190
+ const git = gitAdapter || getGitForCwd();
191
+ // WU-1423: Record owner using validated email (no silent username fallback)
192
+ // Fallback chain: git config user.email > GIT_AUTHOR_EMAIL > error
193
+ // WU-1427: getAssignedEmail is now async to properly await gitAdapter.getConfigValue
194
+ doc.assigned_to = await getAssignedEmail(git);
195
+ // Record claim timestamp for duration tracking (WU-637)
196
+ doc.claimed_at = new Date().toISOString();
197
+ // WU-1382: Store baseline main SHA for parallel agent detection
198
+ // wu:done will compare against this to detect if other WUs were merged during work
199
+ const baselineRef = resolveClaimBaselineRef({ skipRemote: shouldSkipRemoteOperations() });
200
+ doc.baseline_main_sha = await git.getCommitHash(baselineRef);
201
+ // WU-1438: Store agent session ID for tracking
202
+ if (sessionId) {
203
+ doc.session_id = sessionId;
204
+ }
205
+ // WU-2080: Agent-first auto-approval
206
+ // Agents auto-approve on claim. Human escalation only for detected triggers.
207
+ const autoApproval = generateAutoApproval(doc, doc.assigned_to);
208
+ doc.approved_by = autoApproval.approved_by;
209
+ doc.approved_at = autoApproval.approved_at;
210
+ doc.escalation_triggers = autoApproval.escalation_triggers;
211
+ doc.requires_human_escalation = autoApproval.requires_human_escalation;
212
+ // Log escalation triggers if any detected
213
+ if (autoApproval.requires_human_escalation) {
214
+ console.log(`[wu-claim] ⚠️ Escalation triggers detected: ${autoApproval.escalation_triggers.join(', ')}`);
215
+ console.log(`[wu-claim] ℹ️ Human resolution required before wu:done can complete.`);
216
+ }
217
+ else {
218
+ console.log(`[wu-claim] ✅ Agent auto-approved (no escalation triggers)`);
219
+ }
220
+ // WU-1352: Use centralized stringify for consistent output
221
+ const out = stringifyYAML(doc);
222
+ // Write file
223
+ await writeFile(WU_PATH, out, { encoding: FILE_SYSTEM.UTF8 });
224
+ // WU-1211: Return both title and initiative for status progression check
225
+ return { title: doc.title || '', initiative: doc.initiative || null };
226
+ }
227
+ /**
228
+ * WU-1211: Check and progress initiative status from draft/open to in_progress.
229
+ *
230
+ * Called when a WU with an initiative field is claimed. If this is the first
231
+ * WU being claimed for the initiative, progress the initiative status.
232
+ *
233
+ * @param {string} worktreePath - Path to micro-worktree (or main)
234
+ * @param {string} initiativeRef - Initiative ID or slug
235
+ * @param {string} wuId - WU ID being claimed
236
+ * @returns {Promise<{updated: boolean, initPath: string|null}>} Result
237
+ */
238
+ export async function maybeProgressInitiativeStatus(worktreePath, initiativeRef, wuId) {
239
+ try {
240
+ // Find the initiative
241
+ const initiative = findInitiative(initiativeRef);
242
+ if (!initiative) {
243
+ console.log(`${PREFIX} Initiative ${initiativeRef} not found (may be created later)`);
244
+ return { updated: false, initPath: null };
245
+ }
246
+ // Get all WUs for this initiative to check if any are in_progress
247
+ const wus = getInitiativeWUs(initiativeRef);
248
+ // Include the WU we're currently claiming as in_progress
249
+ const wusWithCurrent = wus.map((wu) => wu.id === wuId ? { ...wu, doc: { ...wu.doc, status: 'in_progress' } } : wu);
250
+ const wuDocs = wusWithCurrent.map((wu) => wu.doc);
251
+ // Check if initiative status should progress
252
+ const progressCheck = shouldProgressInitiativeStatus(initiative.doc, wuDocs);
253
+ if (!progressCheck.shouldProgress || !progressCheck.newStatus) {
254
+ return { updated: false, initPath: null };
255
+ }
256
+ // Update initiative status in worktree
257
+ const initRelativePath = initiative.path.replace(process.cwd() + '/', '');
258
+ const initAbsPath = path.join(worktreePath, initRelativePath);
259
+ // Read, update, write
260
+ const initDoc = { ...initiative.doc, status: progressCheck.newStatus };
261
+ writeInitiative(initAbsPath, initDoc);
262
+ console.log(`${PREFIX} ✅ Initiative ${initiativeRef} status progressed: ${initiative.doc.status} → ${progressCheck.newStatus}`);
263
+ return { updated: true, initPath: initRelativePath };
264
+ }
265
+ catch (error) {
266
+ // Non-fatal: log warning and continue
267
+ console.warn(`${PREFIX} ⚠️ Could not check initiative status progression: ${getErrorMessage(error)}`);
268
+ return { updated: false, initPath: null };
269
+ }
270
+ }
271
+ export async function addOrReplaceInProgressStatus(statusPath, id, title) {
272
+ // Check file exists
273
+ try {
274
+ await access(statusPath);
275
+ }
276
+ catch {
277
+ die(`Missing ${statusPath}`);
278
+ }
279
+ const rel = `wu/${id}.yaml`;
280
+ const bullet = `- [${id} — ${title}](${rel})`;
281
+ // Read file
282
+ const content = await readFile(statusPath, { encoding: FILE_SYSTEM.UTF8 });
283
+ const lines = content.split(STRING_LITERALS.NEWLINE);
284
+ const findHeader = (h) => lines.findIndex((l) => l.trim().toLowerCase() === h.toLowerCase());
285
+ const startIdx = findHeader(STATUS_SECTIONS.IN_PROGRESS);
286
+ if (startIdx === -1)
287
+ die(`Could not find "${STATUS_SECTIONS.IN_PROGRESS}" section in status.md`);
288
+ let endIdx = lines.slice(startIdx + 1).findIndex((l) => l.startsWith('## '));
289
+ if (endIdx === -1)
290
+ endIdx = lines.length - startIdx - 1;
291
+ else
292
+ endIdx = startIdx + 1 + endIdx;
293
+ // Check if already present
294
+ const section = lines.slice(startIdx + 1, endIdx).join(STRING_LITERALS.NEWLINE);
295
+ if (section.includes(rel) || section.includes(`[${id}`))
296
+ return; // already listed
297
+ // Remove "No items" marker if present
298
+ for (let i = startIdx + 1; i < endIdx; i++) {
299
+ if (lines[i] && lines[i].includes('No items currently in progress')) {
300
+ lines.splice(i, 1);
301
+ endIdx--;
302
+ break;
303
+ }
304
+ }
305
+ // Insert bullet right after header
306
+ lines.splice(startIdx + 1, 0, '', bullet);
307
+ // Write file
308
+ await writeFile(statusPath, lines.join(STRING_LITERALS.NEWLINE), {
309
+ encoding: FILE_SYSTEM.UTF8,
310
+ });
311
+ }
312
+ export async function removeFromReadyAndAddToInProgressBacklog(backlogPath, id, title, lane) {
313
+ // WU-1574: Use WUStateStore as single source of truth, generate backlog.md from state
314
+ // WU-1593: Use centralized path helper to correctly resolve state dir from backlog path
315
+ const stateDir = getStateStoreDirFromBacklog(backlogPath);
316
+ // Append claim event to state store
317
+ const store = new WUStateStore(stateDir);
318
+ await store.load();
319
+ await store.claim(id, lane, title);
320
+ console.log(`${PREFIX} Claim event appended to state store`);
321
+ // Regenerate backlog.md from state store
322
+ const backlogContent = await generateBacklog(store);
323
+ await writeFile(backlogPath, backlogContent, { encoding: FILE_SYSTEM.UTF8 });
324
+ console.log(`${PREFIX} backlog.md regenerated from state store`);
325
+ // Regenerate status.md from state store
326
+ const statusPath = path.join(path.dirname(backlogPath), 'status.md');
327
+ const statusContent = await generateStatus(store);
328
+ await writeFile(statusPath, statusContent, { encoding: FILE_SYSTEM.UTF8 });
329
+ console.log(`${PREFIX} status.md regenerated from state store`);
330
+ }
331
+ /**
332
+ * WU-1746: Append claim event without regenerating backlog.md/status.md
333
+ * For worktree mode, we only need to record the claim event in the state store.
334
+ * Generated files (backlog.md, status.md) cause merge conflicts when committed
335
+ * to worktrees because they change on main as other WUs complete.
336
+ *
337
+ * @param {string} stateDir - Path to state store directory
338
+ * @param {string} id - WU ID
339
+ * @param {string} title - WU title
340
+ * @param {string} lane - Lane name
341
+ */
342
+ export async function appendClaimEventOnly(stateDir, id, title, lane) {
343
+ const store = new WUStateStore(stateDir);
344
+ await store.load();
345
+ await store.claim(id, lane, title);
346
+ console.log(`${PREFIX} Claim event appended to state store`);
347
+ }
348
+ /**
349
+ * WU-1746: Get list of files to commit in worktree mode
350
+ * Excludes backlog.md and status.md to prevent merge conflicts.
351
+ * These generated files should only be updated on main during wu:done.
352
+ *
353
+ * @param {string} wuId - WU ID (e.g., 'WU-1746')
354
+ * @returns {string[]} List of files to commit
355
+ */
356
+ export function getWorktreeCommitFiles(wuId) {
357
+ // WU-1311: Use config-based paths instead of hardcoded docs/04-operations paths
358
+ const config = getConfig();
359
+ return [
360
+ `${config.directories.wuDir}/${wuId}.yaml`,
361
+ LUMENFLOW_PATHS.WU_EVENTS, // WU-1740: Event store is source of truth
362
+ // WU-1746: Explicitly NOT including backlog.md and status.md
363
+ // These generated files cause merge conflicts when main advances
364
+ ];
365
+ }
366
+ export async function readWUTitle(id) {
367
+ const p = WU_PATHS.WU(id);
368
+ // Check file exists
369
+ try {
370
+ await access(p);
371
+ }
372
+ catch {
373
+ return null;
374
+ }
375
+ // Read file
376
+ const text = await readFile(p, { encoding: FILE_SYSTEM.UTF8 });
377
+ // Match title field - use RegExp.exec for sonarjs/prefer-regexp-exec compliance
378
+ // Regex is safe: runs on trusted WU YAML files with bounded input
379
+ const titlePattern = /^title:\s*"?([^"\n]+)"?$/m;
380
+ const m = titlePattern.exec(text);
381
+ return m ? m[1] : null;
382
+ }
383
+ export function parseStagedChangeLine(line) {
384
+ const parts = line.trim().split(/\s+/);
385
+ const status = parts[0];
386
+ if (!status)
387
+ return null;
388
+ if (status.startsWith('R') || status.startsWith('C')) {
389
+ return { status, from: parts[1], filePath: parts[2] };
390
+ }
391
+ return { status, filePath: parts.slice(1).join(' ') };
392
+ }
393
+ export async function getStagedChanges() {
394
+ const diff = await getGitForCwd().raw(['diff', '--cached', '--name-status']);
395
+ if (!diff.trim())
396
+ return [];
397
+ return diff
398
+ .split(STRING_LITERALS.NEWLINE)
399
+ .filter(Boolean)
400
+ .map(parseStagedChangeLine)
401
+ .filter(Boolean);
402
+ }
403
+ export async function applyStagedChangesToMicroWorktree(worktreePath, stagedChanges) {
404
+ for (const change of stagedChanges) {
405
+ const filePath = change.filePath;
406
+ if (!filePath)
407
+ continue;
408
+ const targetPath = path.join(worktreePath, filePath);
409
+ if (change.status.startsWith('D')) {
410
+ rmSync(targetPath, { recursive: true, force: true });
411
+ continue;
412
+ }
413
+ const sourcePath = path.join(process.cwd(), filePath);
414
+ const contents = await readFile(sourcePath, { encoding: FILE_SYSTEM.UTF8 });
415
+ await mkdir(path.dirname(targetPath), { recursive: true });
416
+ await writeFile(targetPath, contents, { encoding: FILE_SYSTEM.UTF8 });
417
+ }
418
+ }
419
+ export async function ensureCleanOrClaimOnlyWhenNoAuto() {
420
+ // Require staged claim edits only if running with --no-auto
421
+ const status = await getGitForCwd().getStatus();
422
+ if (!status)
423
+ die('No staged changes detected. Stage backlog/status/WU YAML claim edits first or omit --no-auto.');
424
+ const staged = status
425
+ .split(STRING_LITERALS.NEWLINE)
426
+ .filter(Boolean)
427
+ .filter((l) => l.startsWith('A ') || l.startsWith('M ') || l.startsWith('R '));
428
+ // WU-1311: Use config-based paths instead of hardcoded docs/04-operations paths
429
+ const config = getConfig();
430
+ const wuDirPattern = config.directories.wuDir.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
431
+ // eslint-disable-next-line security/detect-non-literal-regexp -- config path escaped for regex; not user input
432
+ const wuYamlRegex = new RegExp(`${wuDirPattern}/WU-\\d+\\.yaml`);
433
+ const hasClaimFiles = staged.some((l) => l.includes(config.directories.statusPath) ||
434
+ l.includes(config.directories.backlogPath) ||
435
+ wuYamlRegex.test(l));
436
+ if (!hasClaimFiles) {
437
+ console.error(status);
438
+ die('Stage claim-related files (status/backlog/WU YAML) before running with --no-auto.');
439
+ }
440
+ }
441
+ /**
442
+ * Update canonical claim state on origin/main using push-only micro-worktree.
443
+ * Ensures canonical state stays global while local main remains unchanged.
444
+ */
445
+ export async function applyCanonicalClaimUpdate(ctx, sessionId) {
446
+ const { args, id, laneK, worktree, WU_PATH, STATUS_PATH, BACKLOG_PATH, claimedMode, fixableIssues, stagedChanges, currentBranchForCloud, // WU-1590: For persisting claimed_branch
447
+ } = ctx;
448
+ const commitMsg = COMMIT_FORMATS.CLAIM(id.toLowerCase(), laneK);
449
+ const worktreePathForYaml = claimedMode === CLAIMED_MODES.BRANCH_ONLY ? null : path.resolve(worktree);
450
+ let updatedTitle = '';
451
+ const filesToCommit = args.noAuto && stagedChanges.length > 0
452
+ ? stagedChanges.map((change) => change.filePath).filter(Boolean)
453
+ : [WU_PATHS.WU(id), WU_PATHS.STATUS(), WU_PATHS.BACKLOG(), LUMENFLOW_PATHS.WU_EVENTS];
454
+ console.log(`${PREFIX} Updating canonical claim state (push-only)...`);
455
+ await withMicroWorktree({
456
+ operation: MICRO_WORKTREE_OPERATIONS.WU_CLAIM,
457
+ id,
458
+ logPrefix: PREFIX,
459
+ pushOnly: true,
460
+ execute: async ({ worktreePath }) => {
461
+ const microWUPath = path.join(worktreePath, WU_PATH);
462
+ const microStatusPath = path.join(worktreePath, STATUS_PATH);
463
+ const microBacklogPath = path.join(worktreePath, BACKLOG_PATH);
464
+ if (args.noAuto) {
465
+ await applyStagedChangesToMicroWorktree(worktreePath, stagedChanges);
466
+ }
467
+ else {
468
+ if (fixableIssues && fixableIssues.length > 0) {
469
+ console.log(`${PREFIX} Applying ${fixableIssues.length} YAML fix(es)...`);
470
+ autoFixWUYaml(microWUPath);
471
+ console.log(`${PREFIX} YAML fixes applied successfully`);
472
+ }
473
+ const microGit = createGitForPath(worktreePath);
474
+ // WU-1211: updateWUYaml now returns {title, initiative}
475
+ const updateResult = await updateWUYaml(microWUPath, id, args.lane, claimedMode, worktreePathForYaml, sessionId, microGit, currentBranchForCloud || null);
476
+ updatedTitle = updateResult.title || updatedTitle;
477
+ await addOrReplaceInProgressStatus(microStatusPath, id, updatedTitle);
478
+ await removeFromReadyAndAddToInProgressBacklog(microBacklogPath, id, updatedTitle, args.lane);
479
+ // WU-1211: Check and progress initiative status
480
+ let initPath = null;
481
+ if (updateResult.initiative) {
482
+ const initProgress = await maybeProgressInitiativeStatus(worktreePath, updateResult.initiative, id);
483
+ initPath = initProgress.initPath;
484
+ }
485
+ // Include initiative path in files to commit if updated
486
+ const allFilesToCommit = initPath ? [...filesToCommit, initPath] : filesToCommit;
487
+ return {
488
+ commitMessage: commitMsg,
489
+ files: allFilesToCommit,
490
+ };
491
+ }
492
+ return {
493
+ commitMessage: commitMsg,
494
+ files: filesToCommit,
495
+ };
496
+ },
497
+ });
498
+ console.log(`${PREFIX} Canonical claim state updated on origin/main`);
499
+ return updatedTitle;
500
+ }
501
+ /**
502
+ * WU-1521: Rollback canonical claim state on origin/main after partial failure.
503
+ *
504
+ * When wu:claim pushes YAML changes to origin/main (via applyCanonicalClaimUpdate)
505
+ * but then fails to create the worktree or branch, this function reverses the claim
506
+ * by writing the WU YAML back to 'ready' status and emitting a 'release' event
507
+ * to the state store. This ensures re-running wu:claim succeeds without wu:repair.
508
+ *
509
+ * Uses a push-only micro-worktree to atomically update origin/main.
510
+ *
511
+ * @param id - WU ID (e.g., 'WU-1521')
512
+ * @param lane - Lane name for the release event
513
+ * @param title - WU title for the release event
514
+ */
515
+ export async function rollbackCanonicalClaim(id, _lane, _title) {
516
+ console.log(`${PREFIX} Rolling back canonical claim for ${id}...`);
517
+ try {
518
+ await withMicroWorktree({
519
+ operation: MICRO_WORKTREE_OPERATIONS.WU_CLAIM,
520
+ id,
521
+ logPrefix: PREFIX,
522
+ pushOnly: true,
523
+ execute: async ({ worktreePath }) => {
524
+ const microWUPath = path.join(worktreePath, WU_PATHS.WU(id));
525
+ // Read the current (claimed) YAML from the micro-worktree
526
+ const text = await readFile(microWUPath, {
527
+ encoding: FILE_SYSTEM.UTF8,
528
+ });
529
+ const doc = parseYAML(text);
530
+ // Build the rolled-back doc and write it
531
+ const rolledBackDoc = buildRollbackYamlDoc(doc);
532
+ const out = stringifyYAML(rolledBackDoc);
533
+ await writeFile(microWUPath, out, {
534
+ encoding: FILE_SYSTEM.UTF8,
535
+ });
536
+ // Emit a release event to the state store so the claim event is reversed
537
+ const microBacklogPath = path.join(worktreePath, WU_PATHS.BACKLOG());
538
+ const stateDir = getStateStoreDirFromBacklog(microBacklogPath);
539
+ const store = new WUStateStore(stateDir);
540
+ await store.load();
541
+ await store.release(id, `Rollback: wu:claim failed after canonical update`);
542
+ // Regenerate backlog.md and status.md from the corrected state
543
+ const backlogContent = await generateBacklog(store);
544
+ await writeFile(microBacklogPath, backlogContent, {
545
+ encoding: FILE_SYSTEM.UTF8,
546
+ });
547
+ const microStatusPath = path.join(worktreePath, WU_PATHS.STATUS());
548
+ const statusContent = await generateStatus(store);
549
+ await writeFile(microStatusPath, statusContent, {
550
+ encoding: FILE_SYSTEM.UTF8,
551
+ });
552
+ return {
553
+ commitMessage: `wu(${id.toLowerCase()}): rollback claim after partial failure`,
554
+ files: [
555
+ WU_PATHS.WU(id),
556
+ WU_PATHS.STATUS(),
557
+ WU_PATHS.BACKLOG(),
558
+ LUMENFLOW_PATHS.WU_EVENTS,
559
+ ],
560
+ };
561
+ },
562
+ });
563
+ console.log(`${PREFIX} Canonical claim rolled back for ${id}`);
564
+ }
565
+ catch (rollbackErr) {
566
+ // Rollback failure should not mask the original error.
567
+ // Log the rollback failure but let the original error propagate.
568
+ console.error(`${PREFIX} WARNING: Failed to rollback canonical claim for ${id}: ${rollbackErr.message}`);
569
+ console.error(`${PREFIX} Manual recovery required: pnpm wu:repair --id ${id} --claim`);
570
+ }
571
+ }
572
+ //# sourceMappingURL=wu-claim-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wu-claim-state.js","sourceRoot":"","sources":["../src/wu-claim-state.ts"],"names":[],"mappings":"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"}