@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,439 @@
1
+ /**
2
+ * @file wu-claim-validation.ts
3
+ * @description Pre-flight validation, schema validation, lane/spec checks for wu:claim.
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 { existsSync, readFileSync } from 'node:fs';
9
+ import { access, readFile } from 'node:fs/promises';
10
+ import { parseYAML } from '@lumenflow/core/wu-yaml';
11
+ import { assertTransition } from '@lumenflow/core/state-machine';
12
+ import { checkLaneFree, validateLaneFormat, checkWipJustification, } from '@lumenflow/core/lane-checker';
13
+ import { validateLaneCodePaths, logLaneValidationWarnings, } from '@lumenflow/core/code-path-validator';
14
+ import { detectConflicts } from '@lumenflow/core/code-paths-overlap';
15
+ import { getGitForCwd } from '@lumenflow/core/git-adapter';
16
+ import { die, getErrorMessage } from '@lumenflow/core/error-handler';
17
+ import { CLAIMED_MODES, LOG_PREFIX, WU_STATUS, STATUS_SECTIONS, STRING_LITERALS, FILE_SYSTEM, resolveWUStatus, } from '@lumenflow/core/wu-constants';
18
+ import { emitWUFlowEvent } from '@lumenflow/core/telemetry';
19
+ import { checkLaneForOrphanDoneWU, repairWUInconsistency, } from '@lumenflow/core/wu-consistency-checker';
20
+ import { validateWU } from '@lumenflow/core/wu-schema';
21
+ import { WU_PATHS } from '@lumenflow/core/wu-paths';
22
+ import { withMicroWorktree } from '@lumenflow/core/micro-worktree';
23
+ import { validateSpecCompleteness } from '@lumenflow/core/wu-done-validators';
24
+ import { hasManualTests, isDocsOrProcessType } from '@lumenflow/core/wu-type-helpers';
25
+ import { detectFixableIssues, applyFixes, formatIssues } from '@lumenflow/core/wu-yaml-fixer';
26
+ import { getConfig } from '@lumenflow/core/config';
27
+ import { MICRO_WORKTREE_OPERATIONS, LUMENFLOW_PATHS } from '@lumenflow/core/wu-constants';
28
+ const PREFIX = LOG_PREFIX.CLAIM;
29
+ export function resolveClaimStatus(status) {
30
+ return resolveWUStatus(status, WU_STATUS.READY);
31
+ }
32
+ /**
33
+ * Pre-flight validation: Check WU file exists and is valid BEFORE any git operations
34
+ * Prevents zombie worktrees when WU YAML is missing or malformed
35
+ */
36
+ export function preflightValidateWU(WU_PATH, id) {
37
+ // Check file exists
38
+ if (!existsSync(WU_PATH)) {
39
+ die(`WU file not found: ${WU_PATH}\n\n` +
40
+ `Cannot claim a WU that doesn't exist.\n\n` +
41
+ `Options:\n` +
42
+ ` 1. Create the WU first: pnpm wu:create --id ${id} --lane <lane> --title "..."\n` +
43
+ ` 2. Check if the WU ID is correct\n` +
44
+ ` 3. Check if the WU file was moved or deleted`);
45
+ }
46
+ // Parse and validate YAML structure
47
+ const text = readFileSync(WU_PATH, { encoding: FILE_SYSTEM.UTF8 });
48
+ let doc;
49
+ try {
50
+ doc = parseYAML(text);
51
+ }
52
+ catch (e) {
53
+ die(`Failed to parse WU YAML ${WU_PATH}\n\n` +
54
+ `YAML parsing error: ${getErrorMessage(e)}\n\n` +
55
+ `Fix the YAML syntax errors before claiming.`);
56
+ }
57
+ // Validate ID matches
58
+ if (!doc || doc.id !== id) {
59
+ die(`WU YAML id mismatch in ${WU_PATH}\n\n` +
60
+ `Expected: ${id}\n` +
61
+ `Found: ${doc?.id || 'missing'}\n\n` +
62
+ `Fix the id field in the WU YAML before claiming.`);
63
+ }
64
+ // Validate state transition is allowed
65
+ const currentStatus = resolveClaimStatus(doc.status);
66
+ try {
67
+ assertTransition(currentStatus, WU_STATUS.IN_PROGRESS, id);
68
+ }
69
+ catch (error) {
70
+ die(`Cannot claim ${id} - invalid state transition\n\n` +
71
+ `Current status: ${currentStatus}\n` +
72
+ `Attempted transition: ${currentStatus} → in_progress\n\n` +
73
+ `Reason: ${getErrorMessage(error)}`);
74
+ }
75
+ return doc;
76
+ }
77
+ /**
78
+ * WU-1361: Validate YAML schema at claim time
79
+ *
80
+ * Validates WU YAML against Zod schema AFTER git pull.
81
+ * Detects fixable issues BEFORE schema validation (so --fix can run even if schema fails).
82
+ * Returns fixable issues for application in worktree (WU-1361 fix).
83
+ *
84
+ * @param {string} WU_PATH - Path to WU YAML file
85
+ * @param {object} doc - Parsed WU YAML data
86
+ * @param {object} args - CLI arguments
87
+ * @param {boolean} args.fix - If true, issues will be fixed in worktree
88
+ * @returns {Array} Array of fixable issues to apply in worktree
89
+ */
90
+ export function validateYAMLSchema(WU_PATH, doc, args) {
91
+ // WU-1361: Detect fixable issues BEFORE schema validation
92
+ // This allows --fix to work even when schema would fail
93
+ const fixableIssues = detectFixableIssues(doc);
94
+ if (fixableIssues.length > 0) {
95
+ if (args.fix) {
96
+ // WU-1425: Apply fixes to in-memory doc so validation passes
97
+ // Note: This does NOT modify the file on disk - only the in-memory object
98
+ // The actual file fix happens when the doc is written to the worktree
99
+ applyFixes(doc, fixableIssues);
100
+ console.log(`${PREFIX} Detected ${fixableIssues.length} fixable YAML issue(s) (will fix in worktree):`);
101
+ console.log(formatIssues(fixableIssues));
102
+ }
103
+ else {
104
+ // Report issues and suggest --fix
105
+ console.warn(`${PREFIX} Detected ${fixableIssues.length} fixable YAML issue(s):`);
106
+ console.warn(formatIssues(fixableIssues));
107
+ console.warn(`${PREFIX} Run with --fix to auto-repair these issues.`);
108
+ // Continue - Zod validation will provide the detailed error
109
+ }
110
+ }
111
+ // Now run Zod schema validation
112
+ const schemaResult = validateWU(doc);
113
+ if (!schemaResult.success) {
114
+ const issueList = schemaResult.error.issues
115
+ .map((i) => ` - ${i.path.join('.')}: ${i.message}`)
116
+ .join(STRING_LITERALS.NEWLINE);
117
+ const tip = fixableIssues.length > 0 ? 'Tip: Run with --fix to auto-repair common issues.\n' : '';
118
+ die(`WU YAML schema validation failed for ${WU_PATH}:\n\n${issueList}\n\nFix these issues before claiming.\n${tip}`);
119
+ }
120
+ // WU-1361: Return fixable issues for application in worktree
121
+ return args.fix ? fixableIssues : [];
122
+ }
123
+ /**
124
+ * WU-1508: Enforce tests.manual at claim time for non-doc/process WUs.
125
+ * This is non-bypassable (independent of --allow-incomplete) to fail early.
126
+ */
127
+ export function validateManualTestsForClaim(doc, id) {
128
+ if (isDocsOrProcessType(doc?.type)) {
129
+ return { valid: true };
130
+ }
131
+ if (hasManualTests(doc?.tests)) {
132
+ return { valid: true };
133
+ }
134
+ return {
135
+ valid: false,
136
+ error: `${id}: Missing required tests.manual for non-documentation WU.\n` +
137
+ `Add at least one manual verification step under tests.manual before claiming.`,
138
+ };
139
+ }
140
+ /**
141
+ * Handle orphan WU check and auto-repair (WU-1276)
142
+ * WU-1426: Commits repair changes to avoid dirty working tree blocking claim
143
+ * WU-1437: Use pushOnly micro-worktree to keep local main pristine
144
+ */
145
+ export async function handleOrphanCheck(lane, id) {
146
+ const orphanCheck = await checkLaneForOrphanDoneWU(lane, id);
147
+ if (orphanCheck.valid)
148
+ return;
149
+ // Try auto-repair for single orphan
150
+ if (orphanCheck.orphans.length === 1) {
151
+ const orphanId = orphanCheck.orphans[0];
152
+ console.log(`${PREFIX} Auto-repairing orphan: ${orphanId}`);
153
+ // WU-1437: Use micro-worktree with pushOnly to keep main pristine
154
+ await withMicroWorktree({
155
+ operation: MICRO_WORKTREE_OPERATIONS.ORPHAN_REPAIR,
156
+ id: orphanId,
157
+ logPrefix: PREFIX,
158
+ pushOnly: true,
159
+ execute: async ({ worktreePath }) => {
160
+ // Run repair inside micro-worktree using projectRoot option
161
+ const repairResult = await repairWUInconsistency(orphanCheck.reports[0], {
162
+ projectRoot: worktreePath,
163
+ });
164
+ if (repairResult.failed > 0) {
165
+ throw new Error(`Lane ${lane} has orphan done WU: ${orphanId}\n` +
166
+ `Auto-repair failed. Fix manually with: pnpm wu:repair --id ${orphanId}`);
167
+ }
168
+ if (repairResult.repaired === 0) {
169
+ // Nothing to repair - return empty result
170
+ return { commitMessage: null, files: [] };
171
+ }
172
+ // Return files for commit
173
+ // WU-1740: Include wu-events.jsonl to persist state store events
174
+ return {
175
+ commitMessage: `chore(repair): auto-repair orphan ${orphanId.toLowerCase()}`,
176
+ files: [
177
+ WU_PATHS.BACKLOG(),
178
+ WU_PATHS.STATUS(),
179
+ WU_PATHS.STAMP(orphanId),
180
+ LUMENFLOW_PATHS.WU_EVENTS,
181
+ ],
182
+ };
183
+ },
184
+ });
185
+ console.log(`${PREFIX} Auto-repair successful`);
186
+ return;
187
+ }
188
+ die(`Lane ${lane} has ${orphanCheck.orphans.length} orphan done WUs: ${orphanCheck.orphans.join(', ')}\n` +
189
+ `Fix with: pnpm wu:repair --id <WU-ID> for each, or pnpm wu:repair --all`);
190
+ }
191
+ /**
192
+ * Validate lane format with user-friendly error messages
193
+ */
194
+ export function validateLaneFormatWithError(lane) {
195
+ try {
196
+ validateLaneFormat(lane);
197
+ }
198
+ catch (error) {
199
+ die(`Invalid lane format: ${getErrorMessage(error)}\n\n` +
200
+ `Valid formats:\n` +
201
+ ` - Parent-only: "Operations", "Intelligence", "Experience", etc.\n` +
202
+ ` - Sub-lane: "Operations: Tooling", "Intelligence: Prompts", etc.\n\n` +
203
+ `Format rules:\n` +
204
+ ` - Single colon with EXACTLY one space after (e.g., "Parent: Subdomain")\n` +
205
+ ` - No spaces before colon\n` +
206
+ ` - No multiple colons\n\n` +
207
+ `See .lumenflow.config.yaml for valid parent lanes.`);
208
+ }
209
+ }
210
+ /**
211
+ * Handle lane occupancy check and enforce WIP limit policy
212
+ *
213
+ * WU-1016: Updated to support configurable WIP limits per lane.
214
+ * The WIP limit is read from .lumenflow.config.yaml and defaults to 1.
215
+ */
216
+ export function handleLaneOccupancy(laneCheck, lane, id, force) {
217
+ if (laneCheck.free)
218
+ return;
219
+ if (laneCheck.error) {
220
+ die(`Lane check failed: ${laneCheck.error}`);
221
+ }
222
+ if (!laneCheck.occupiedBy)
223
+ return;
224
+ // WU-1016: Include WIP limit info in messages
225
+ const wipLimit = laneCheck.wipLimit ?? 1;
226
+ const currentCount = laneCheck.currentCount ?? 0;
227
+ const inProgressList = laneCheck.inProgressWUs?.join(', ') || laneCheck.occupiedBy;
228
+ if (force) {
229
+ console.warn(`${PREFIX} ⚠️ WARNING: Lane "${lane}" has ${currentCount}/${wipLimit} WUs in progress`);
230
+ console.warn(`${PREFIX} ⚠️ In progress: ${inProgressList}`);
231
+ console.warn(`${PREFIX} ⚠️ Forcing WIP limit override. Risk of worktree collision!`);
232
+ console.warn(`${PREFIX} ⚠️ Use only for P0 emergencies or manual recovery.`);
233
+ return;
234
+ }
235
+ die(`Lane "${lane}" is at WIP limit (${currentCount}/${wipLimit}).\n\n` +
236
+ `In progress: ${inProgressList}\n\n` +
237
+ `LumenFlow enforces WIP limits per lane to maintain focus.\n` +
238
+ `Current limit for "${lane}": ${wipLimit} (configure in .lumenflow.config.yaml)\n\n` +
239
+ `Options:\n` +
240
+ ` 1. Wait for a WU to complete or block\n` +
241
+ ` 2. Choose a different lane\n` +
242
+ ` 3. Increase wip_limit in .lumenflow.config.yaml\n` +
243
+ ` 4. Use --force to override (P0 emergencies only)\n\n` +
244
+ // WU-1311: Use config-based status path
245
+ `To check lane status: grep "${STATUS_SECTIONS.IN_PROGRESS}" ${getConfig().directories.statusPath}`);
246
+ }
247
+ /**
248
+ * Handle code path overlap detection (WU-901)
249
+ */
250
+ export function handleCodePathOverlap(WU_PATH, STATUS_PATH, id, args) {
251
+ if (!existsSync(WU_PATH))
252
+ return;
253
+ const wuContent = readFileSync(WU_PATH, { encoding: FILE_SYSTEM.UTF8 });
254
+ const wuDoc = parseYAML(wuContent);
255
+ const codePaths = wuDoc.code_paths || [];
256
+ if (codePaths.length === 0)
257
+ return;
258
+ const overlapCheck = detectConflicts(STATUS_PATH, codePaths, id);
259
+ emitWUFlowEvent({
260
+ script: 'wu-claim',
261
+ wu_id: id,
262
+ step: 'overlap_check',
263
+ conflicts_count: overlapCheck.conflicts.length,
264
+ forced: args.forceOverlap || false,
265
+ });
266
+ if (overlapCheck.hasBlocker && !args.forceOverlap) {
267
+ const conflictList = overlapCheck.conflicts
268
+ .map((c) => {
269
+ const displayedOverlaps = c.overlaps.slice(0, 3).join(', ');
270
+ const remainingCount = c.overlaps.length - 3;
271
+ const suffix = remainingCount > 0 ? ` (+${remainingCount} more)` : '';
272
+ return ` - ${c.wuid}: ${displayedOverlaps}${suffix}`;
273
+ })
274
+ .join(STRING_LITERALS.NEWLINE);
275
+ // WU-1311: Use config-based status path in error message
276
+ die(`Code path overlap detected with in-progress WUs:\n\n${conflictList}\n\n` +
277
+ `Merge conflicts are guaranteed if both WUs proceed.\n\n` +
278
+ `Options:\n` +
279
+ ` 1. Wait for conflicting WU(s) to complete\n` +
280
+ ` 2. Coordinate with agent working on conflicting WU\n` +
281
+ ` 3. Use --force-overlap --reason "..." (emits telemetry for audit)\n\n` +
282
+ `To check WU status: grep "${STATUS_SECTIONS.IN_PROGRESS}" ${getConfig().directories.statusPath}`);
283
+ }
284
+ if (args.forceOverlap) {
285
+ if (!args.reason) {
286
+ die('--force-overlap requires --reason "explanation" for audit trail');
287
+ }
288
+ emitWUFlowEvent({
289
+ script: 'wu-claim',
290
+ wu_id: id,
291
+ event: 'overlap_forced',
292
+ reason: args.reason,
293
+ conflicts: overlapCheck.conflicts.map((c) => ({ wuid: c.wuid, files: c.overlaps })),
294
+ });
295
+ console.warn(`${PREFIX} ⚠️ WARNING: Overlap forced with reason: ${args.reason}`);
296
+ }
297
+ }
298
+ /**
299
+ * Validate branch-only mode can be used
300
+ */
301
+ export async function validateBranchOnlyMode(STATUS_PATH, id) {
302
+ const branchOnlyCheck = await checkExistingBranchOnlyWU(STATUS_PATH, id);
303
+ if (branchOnlyCheck.hasBranchOnly) {
304
+ die(`Branch-Only mode does not support parallel WUs.\n\n` +
305
+ `Another Branch-Only WU is already in progress: ${branchOnlyCheck.existingWU}\n\n` +
306
+ `Options:\n` +
307
+ ` 1. Complete ${branchOnlyCheck.existingWU} first (pnpm wu:done --id ${branchOnlyCheck.existingWU})\n` +
308
+ ` 2. Block ${branchOnlyCheck.existingWU} (pnpm wu:block --id ${branchOnlyCheck.existingWU} --reason "...")\n` +
309
+ ` 3. Use Worktree mode instead (omit --branch-only flag)\n\n` +
310
+ `Branch-Only mode works in the main checkout and cannot isolate parallel WUs.`);
311
+ }
312
+ // Ensure working directory is clean for Branch-Only mode
313
+ const status = await getGitForCwd().getStatus();
314
+ if (status) {
315
+ die(`Branch-Only mode requires a clean working directory.\n\n` +
316
+ `Uncommitted changes detected:\n${status}\n\n` +
317
+ `Options:\n` +
318
+ ` 1. Commit or stash your changes\n` +
319
+ ` 2. Use Worktree mode instead (omit --branch-only flag for isolated workspace)`);
320
+ }
321
+ }
322
+ /**
323
+ * Check if there's already a Branch-Only WU in progress
324
+ * Branch-Only mode doesn't support parallel WUs (only one WU at a time in main checkout)
325
+ * @param {string} statusPath - Path to status.md
326
+ * @param {string} currentWU - Current WU ID being claimed
327
+ * @returns {Promise<{hasBranchOnly: boolean, existingWU: string|null}>}
328
+ */
329
+ async function checkExistingBranchOnlyWU(statusPath, currentWU) {
330
+ // Check file exists
331
+ try {
332
+ await access(statusPath);
333
+ }
334
+ catch {
335
+ return { hasBranchOnly: false, existingWU: null };
336
+ }
337
+ // Read file
338
+ const content = await readFile(statusPath, { encoding: FILE_SYSTEM.UTF8 });
339
+ const lines = content.split(STRING_LITERALS.NEWLINE);
340
+ // Find "In Progress" section
341
+ const startIdx = lines.findIndex((l) => l.trim().toLowerCase() === '## in progress');
342
+ if (startIdx === -1)
343
+ return { hasBranchOnly: false, existingWU: null };
344
+ let endIdx = lines.slice(startIdx + 1).findIndex((l) => l.startsWith('## '));
345
+ if (endIdx === -1)
346
+ endIdx = lines.length - startIdx - 1;
347
+ else
348
+ endIdx = startIdx + 1 + endIdx;
349
+ // Extract WU IDs from In Progress section
350
+ // Use RegExp.exec for sonarjs/prefer-regexp-exec compliance
351
+ const wuPattern = /\[?(WU-\d+)/i;
352
+ const inProgressWUs = lines
353
+ .slice(startIdx + 1, endIdx)
354
+ .map((line) => {
355
+ const match = wuPattern.exec(line);
356
+ return match ? match[1].toUpperCase() : null;
357
+ })
358
+ .filter(Boolean)
359
+ .filter((wuid) => wuid !== currentWU); // exclude the WU we're claiming
360
+ // Check each in-progress WU for claimed_mode: branch-only
361
+ for (const wuid of inProgressWUs) {
362
+ const wuPath = WU_PATHS.WU(wuid);
363
+ // Check file exists
364
+ try {
365
+ await access(wuPath);
366
+ }
367
+ catch {
368
+ continue; // File doesn't exist, skip
369
+ }
370
+ try {
371
+ // Read file
372
+ const text = await readFile(wuPath, { encoding: FILE_SYSTEM.UTF8 });
373
+ const doc = parseYAML(text);
374
+ if (doc && doc.claimed_mode === CLAIMED_MODES.BRANCH_ONLY) {
375
+ return { hasBranchOnly: true, existingWU: wuid };
376
+ }
377
+ }
378
+ catch {
379
+ // ignore parse errors
380
+ }
381
+ }
382
+ return { hasBranchOnly: false, existingWU: null };
383
+ }
384
+ /**
385
+ * Run all pre-flight validations on the WU.
386
+ * Called from main() after git fetch/pull but before lane lock acquisition.
387
+ *
388
+ * Returns the validated doc and fixable issues for worktree application.
389
+ */
390
+ export async function runPreflightValidations(args, id, WU_PATH, STATUS_PATH) {
391
+ // PRE-FLIGHT VALIDATION (on post-pull data)
392
+ const doc = preflightValidateWU(WU_PATH, id);
393
+ const manualTestsCheck = validateManualTestsForClaim(doc, id);
394
+ if (!manualTestsCheck.valid) {
395
+ die(manualTestsCheck.error);
396
+ }
397
+ await handleOrphanCheck(args.lane, id);
398
+ validateLaneFormatWithError(args.lane);
399
+ // WU-1187: Check for WIP justification when WIP > 1 (soft enforcement - warning only)
400
+ const wipJustificationCheck = checkWipJustification(args.lane);
401
+ if (wipJustificationCheck.warning) {
402
+ console.warn(`${PREFIX} ${wipJustificationCheck.warning}`);
403
+ }
404
+ // WU-1372: Lane-to-code_paths consistency check (advisory only, never blocks)
405
+ const laneValidation = validateLaneCodePaths(doc, args.lane);
406
+ logLaneValidationWarnings(laneValidation, PREFIX);
407
+ // WU-1361: YAML schema validation at claim time
408
+ // Returns fixable issues for application in worktree (not on main)
409
+ const fixableIssues = validateYAMLSchema(WU_PATH, doc, args);
410
+ // WU-1362: Spec completeness validation (fail-fast before expensive operations)
411
+ // Two-tier validation: Schema errors (above) are never bypassable; spec completeness is bypassable
412
+ const specResult = validateSpecCompleteness(doc, id);
413
+ if (!specResult.valid) {
414
+ const errorList = specResult.errors.map((e) => ` - ${e}`).join(STRING_LITERALS.NEWLINE);
415
+ if (args.allowIncomplete) {
416
+ console.warn(`${PREFIX} ⚠️ Spec completeness warnings (bypassed with --allow-incomplete):`);
417
+ console.warn(errorList);
418
+ console.warn(`${PREFIX} Proceeding with incomplete spec. Fix before wu:done.`);
419
+ }
420
+ else {
421
+ die(`Spec completeness validation failed for ${WU_PATH}:\n\n${errorList}\n\n` +
422
+ `Fix these issues before claiming, or use --allow-incomplete to bypass.\n` +
423
+ `Note: Schema errors (placeholders, invalid structure) cannot be bypassed.`);
424
+ }
425
+ }
426
+ // Check lane occupancy (WIP=1 per sub-lane)
427
+ const laneCheck = checkLaneFree(STATUS_PATH, args.lane, id);
428
+ emitWUFlowEvent({
429
+ script: 'wu-claim',
430
+ wu_id: id,
431
+ lane: args.lane,
432
+ step: 'lane_check',
433
+ occupied: !laneCheck.free,
434
+ occupiedBy: laneCheck.occupiedBy,
435
+ });
436
+ handleLaneOccupancy(laneCheck, args.lane, id, args.force);
437
+ return { doc, fixableIssues };
438
+ }
439
+ //# sourceMappingURL=wu-claim-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wu-claim-validation.js","sourceRoot":"","sources":["../src/wu-claim-validation.ts"],"names":[],"mappings":"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"}