@lumenflow/cli 2.12.0 → 2.14.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 (37) hide show
  1. package/README.md +105 -105
  2. package/dist/gates-graceful-degradation.js +151 -0
  3. package/dist/gates-graceful-degradation.js.map +1 -0
  4. package/dist/gates.js +90 -5
  5. package/dist/gates.js.map +1 -1
  6. package/dist/hooks/enforcement-checks.js +104 -37
  7. package/dist/hooks/enforcement-checks.js.map +1 -1
  8. package/dist/hooks/enforcement-generator.js +229 -28
  9. package/dist/hooks/enforcement-generator.js.map +1 -1
  10. package/dist/hooks/enforcement-sync.js +4 -1
  11. package/dist/hooks/enforcement-sync.js.map +1 -1
  12. package/dist/init.js +160 -13
  13. package/dist/init.js.map +1 -1
  14. package/dist/initiative-edit.js +3 -2
  15. package/dist/initiative-edit.js.map +1 -1
  16. package/dist/lifecycle-regression-harness.js +179 -0
  17. package/dist/lifecycle-regression-harness.js.map +1 -0
  18. package/dist/mem-recover.js +0 -0
  19. package/dist/public-manifest.js +7 -0
  20. package/dist/public-manifest.js.map +1 -1
  21. package/dist/wu-claim-mode.js +80 -0
  22. package/dist/wu-claim-mode.js.map +1 -0
  23. package/dist/wu-claim.js +163 -9
  24. package/dist/wu-claim.js.map +1 -1
  25. package/dist/wu-create.js +5 -1
  26. package/dist/wu-create.js.map +1 -1
  27. package/dist/wu-delete.js +196 -60
  28. package/dist/wu-delete.js.map +1 -1
  29. package/dist/wu-done.js +99 -17
  30. package/dist/wu-done.js.map +1 -1
  31. package/dist/wu-edit.js +5 -4
  32. package/dist/wu-edit.js.map +1 -1
  33. package/dist/wu-prep.js +122 -27
  34. package/dist/wu-prep.js.map +1 -1
  35. package/package.json +7 -6
  36. package/templates/vendors/claude/.claude/hooks/enforce-worktree.sh +78 -17
  37. package/templates/vendors/claude/.claude/hooks/session-start-recovery.sh +30 -0
package/dist/wu-prep.js CHANGED
@@ -9,12 +9,19 @@
9
9
  * (not caused by the current WU), prints a ready-to-copy wu:done --skip-gates
10
10
  * command with reason and fix-wu placeholders.
11
11
  *
12
+ * WU-1493: Adds branch-pr mode support. When a WU has claimed_mode: branch-pr,
13
+ * wu:prep reads the mode before rejecting non-worktree locations, validates that
14
+ * the current branch matches the expected lane branch, and outputs PR-based
15
+ * completion next steps on success.
16
+ *
12
17
  * Workflow:
13
- * 1. Verify we're in a worktree (error if in main checkout)
14
- * 2. Run gates in the worktree
15
- * 3. If gates fail, check if failures are pre-existing on main
16
- * 4. If pre-existing, print skip-gates command; otherwise, print fix guidance
17
- * 5. On success, print copy-paste instruction for wu:done from main
18
+ * 1. Read WU YAML to check claimed_mode
19
+ * 2. For worktree mode: verify we're in a worktree (error if in main checkout)
20
+ * For branch-pr mode: verify we're on the correct lane branch
21
+ * 3. Run gates
22
+ * 4. If gates fail, check if failures are pre-existing on main
23
+ * 5. If pre-existing, print skip-gates command; otherwise, print fix guidance
24
+ * 6. On success, print mode-appropriate next steps
18
25
  *
19
26
  * Usage:
20
27
  * pnpm wu:prep --id WU-XXX [--docs-only]
@@ -30,7 +37,9 @@ import { die } from '@lumenflow/core/dist/error-handler.js';
30
37
  import { resolveLocation } from '@lumenflow/core/dist/context/location-resolver.js';
31
38
  import { readWU } from '@lumenflow/core/dist/wu-yaml.js';
32
39
  import { WU_PATHS } from '@lumenflow/core/dist/wu-paths.js';
33
- import { CONTEXT_VALIDATION, PATTERNS, EXIT_CODES, WU_STATUS, EMOJI, } from '@lumenflow/core/dist/wu-constants.js';
40
+ import { CONTEXT_VALIDATION, PATTERNS, EXIT_CODES, WU_STATUS, EMOJI, CLAIMED_MODES, } from '@lumenflow/core/dist/wu-constants.js';
41
+ import { defaultBranchFrom } from '@lumenflow/core/dist/wu-done-paths.js';
42
+ import { getCurrentBranch } from '@lumenflow/core/dist/wu-helpers.js';
34
43
  import { runGates } from './gates.js';
35
44
  const { LOCATION_TYPES } = CONTEXT_VALIDATION;
36
45
  /**
@@ -205,6 +214,57 @@ export async function checkPreExistingFailures(options) {
205
214
  };
206
215
  }
207
216
  }
217
+ /**
218
+ * WU-1493: Check if a WU doc uses branch-pr claimed mode.
219
+ *
220
+ * @param doc - Partial WU YAML document (needs claimed_mode field)
221
+ * @returns true if claimed_mode is 'branch-pr'
222
+ */
223
+ export function isBranchPrMode(doc) {
224
+ return doc.claimed_mode === CLAIMED_MODES.BRANCH_PR;
225
+ }
226
+ /**
227
+ * WU-1493: Validate that the current git branch matches the expected lane branch
228
+ * for branch-pr mode.
229
+ *
230
+ * @param options - Branch comparison options
231
+ * @param options.currentBranch - The currently checked-out branch
232
+ * @param options.expectedBranch - The expected lane branch (e.g., lane/framework-cli/wu-1493)
233
+ * @returns Validation result with valid flag and optional error message
234
+ */
235
+ export function validateBranchPrBranch(options) {
236
+ const { currentBranch, expectedBranch } = options;
237
+ if (currentBranch === expectedBranch) {
238
+ return { valid: true };
239
+ }
240
+ return {
241
+ valid: false,
242
+ error: `Current branch '${currentBranch}' does not match expected lane branch '${expectedBranch}'.\n\n` +
243
+ `Switch to the lane branch first:\n` +
244
+ ` git checkout ${expectedBranch}`,
245
+ };
246
+ }
247
+ /**
248
+ * WU-1493: Format success message for branch-pr mode.
249
+ * Shows PR-based completion next steps instead of wu:done.
250
+ *
251
+ * @param options - Message options
252
+ * @param options.wuId - The WU ID
253
+ * @param options.laneBranch - The lane branch name
254
+ * @returns Formatted success message string
255
+ */
256
+ export function formatBranchPrSuccessMessage(options) {
257
+ const { wuId, laneBranch } = options;
258
+ return (`${PREP_PREFIX} ${EMOJI.SUCCESS} ${wuId}: Prep completed successfully!\n` +
259
+ `\n` +
260
+ `${PREP_PREFIX} Gates passed on branch ${laneBranch}.\n` +
261
+ `\n` +
262
+ `${PREP_PREFIX} Next steps for branch-pr mode:\n` +
263
+ `\n` +
264
+ ` 1. Push the branch: git push origin ${laneBranch}\n` +
265
+ ` 2. Create a PR: gh pr create --base main --head ${laneBranch}\n` +
266
+ ` 3. After PR merge: pnpm wu:cleanup --id ${wuId}\n`);
267
+ }
208
268
  /**
209
269
  * Print success message with copy-paste instruction.
210
270
  */
@@ -237,21 +297,8 @@ async function main() {
237
297
  }
238
298
  // Detect location
239
299
  const location = await resolveLocation();
240
- // WU-1223: wu:prep MUST be run from worktree, not main
241
- if (location.type !== LOCATION_TYPES.WORKTREE) {
242
- die(`${EMOJI.FAILURE} wu:prep must be run from a worktree, not ${location.type}.\n\n` +
243
- `Current location: ${location.cwd}\n\n` +
244
- `If you have a worktree for ${id}, navigate to it first:\n` +
245
- ` cd worktrees/<lane>-${id.toLowerCase()}\n\n` +
246
- `If you don't have a worktree yet, claim the WU first:\n` +
247
- ` pnpm wu:claim --id ${id} --lane "<lane>"`);
248
- }
249
- // Verify the worktree is for the correct WU
250
- if (location.worktreeWuId && location.worktreeWuId !== id) {
251
- console.warn(`${PREP_PREFIX} ${EMOJI.WARNING} Worktree is for ${location.worktreeWuId}, but you specified ${id}.`);
252
- console.warn(`${PREP_PREFIX} Proceeding with ${id} as specified.`);
253
- }
254
- // Read WU YAML to validate it exists and check status
300
+ // WU-1493: Read WU YAML early to check claimed_mode BEFORE location rejection.
301
+ // This allows branch-pr WUs to run from main checkout on the lane branch.
255
302
  const wuPath = WU_PATHS.WU(id);
256
303
  let doc;
257
304
  try {
@@ -263,6 +310,47 @@ async function main() {
263
310
  ` 1. Check if WU file exists: ls -la ${wuPath}\n` +
264
311
  ` 2. Validate YAML syntax: pnpm wu:validate --id ${id}`);
265
312
  }
313
+ const branchPr = isBranchPrMode(doc);
314
+ // WU-1223 + WU-1493: Location validation
315
+ // For branch-pr mode: allow running from main checkout on the correct lane branch
316
+ // For worktree mode: must be in a worktree (original behavior)
317
+ if (branchPr) {
318
+ // WU-1493: branch-pr mode - validate we're on the correct lane branch
319
+ const expectedBranch = defaultBranchFrom(doc);
320
+ const currentBranch = getCurrentBranch();
321
+ if (!expectedBranch) {
322
+ die(`${EMOJI.FAILURE} Cannot determine lane branch for ${id}.\n\n` +
323
+ `Check that the WU has a valid lane and id in its YAML spec.`);
324
+ }
325
+ if (!currentBranch) {
326
+ die(`${EMOJI.FAILURE} Cannot determine current git branch.\n\n` +
327
+ `Ensure you are in a git repository.`);
328
+ }
329
+ const branchCheck = validateBranchPrBranch({
330
+ currentBranch,
331
+ expectedBranch,
332
+ });
333
+ if (!branchCheck.valid) {
334
+ die(`${EMOJI.FAILURE} ${branchCheck.error}`);
335
+ }
336
+ console.log(`${PREP_PREFIX} branch-pr mode detected for ${id}`);
337
+ }
338
+ else {
339
+ // Original worktree-only behavior
340
+ if (location.type !== LOCATION_TYPES.WORKTREE) {
341
+ die(`${EMOJI.FAILURE} wu:prep must be run from a worktree, not ${location.type}.\n\n` +
342
+ `Current location: ${location.cwd}\n\n` +
343
+ `If you have a worktree for ${id}, navigate to it first:\n` +
344
+ ` cd worktrees/<lane>-${id.toLowerCase()}\n\n` +
345
+ `If you don't have a worktree yet, claim the WU first:\n` +
346
+ ` pnpm wu:claim --id ${id} --lane "<lane>"`);
347
+ }
348
+ // Verify the worktree is for the correct WU
349
+ if (location.worktreeWuId && location.worktreeWuId !== id) {
350
+ console.warn(`${PREP_PREFIX} ${EMOJI.WARNING} Worktree is for ${location.worktreeWuId}, but you specified ${id}.`);
351
+ console.warn(`${PREP_PREFIX} Proceeding with ${id} as specified.`);
352
+ }
353
+ }
266
354
  // Validate WU status is in_progress
267
355
  if (doc.status !== WU_STATUS.IN_PROGRESS) {
268
356
  die(`${EMOJI.FAILURE} WU ${id} status is '${doc.status}', expected '${WU_STATUS.IN_PROGRESS}'.\n\n` +
@@ -313,8 +401,8 @@ async function main() {
313
401
  console.log(`${PREP_PREFIX} No pre-existing failures on main.`);
314
402
  }
315
403
  console.log('');
316
- // Run gates in the worktree
317
- console.log(`${PREP_PREFIX} Running gates in worktree...`);
404
+ // Run gates
405
+ console.log(`${PREP_PREFIX} Running gates...`);
318
406
  const gatesResult = await runGates({
319
407
  cwd: location.cwd,
320
408
  docsOnly: args.docsOnly,
@@ -324,14 +412,21 @@ async function main() {
324
412
  // the exit handler above will print the skip-gates command.
325
413
  // Otherwise, tell the user to fix the failures.
326
414
  if (!hasPreExistingOnly) {
327
- die(`${EMOJI.FAILURE} Gates failed in worktree.\n\n` +
328
- `Fix the gate failures and run wu:prep again.`);
415
+ die(`${EMOJI.FAILURE} Gates failed.\n\n` + `Fix the gate failures and run wu:prep again.`);
329
416
  }
330
417
  // Pre-existing failures - exit with error, handler will print skip-gates command
331
418
  process.exit(EXIT_CODES.ERROR);
332
419
  }
333
- // Success - print copy-paste instruction
334
- printSuccessMessage(id, location.mainCheckout);
420
+ // WU-1493: Success - print mode-appropriate message
421
+ if (branchPr) {
422
+ const laneBranch = defaultBranchFrom(doc) ?? '';
423
+ const message = formatBranchPrSuccessMessage({ wuId: id, laneBranch });
424
+ console.log('');
425
+ console.log(message);
426
+ }
427
+ else {
428
+ printSuccessMessage(id, location.mainCheckout);
429
+ }
335
430
  }
336
431
  // WU-1181: Use import.meta.main instead of process.argv[1] comparison
337
432
  // The old pattern fails with pnpm symlinks because process.argv[1] is the symlink
@@ -1 +1 @@
1
- {"version":3,"file":"wu-prep.js","sourceRoot":"","sources":["../src/wu-prep.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wu-prep.js","sourceRoot":"","sources":["../src/wu-prep.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lumenflow/cli",
3
- "version": "2.12.0",
3
+ "version": "2.14.0",
4
4
  "description": "Command-line interface for LumenFlow workflow framework",
5
5
  "keywords": [
6
6
  "lumenflow",
@@ -69,6 +69,7 @@
69
69
  "mem-summarize": "./dist/mem-summarize.js",
70
70
  "mem-triage": "./dist/mem-triage.js",
71
71
  "mem-delete": "./dist/mem-delete.js",
72
+ "mem-recover": "./dist/mem-recover.js",
72
73
  "initiative-create": "./dist/initiative-create.js",
73
74
  "initiative-edit": "./dist/initiative-edit.js",
74
75
  "initiative-list": "./dist/initiative-list.js",
@@ -139,11 +140,11 @@
139
140
  "pretty-ms": "^9.2.0",
140
141
  "simple-git": "^3.30.0",
141
142
  "yaml": "^2.8.2",
142
- "@lumenflow/core": "2.12.0",
143
- "@lumenflow/metrics": "2.12.0",
144
- "@lumenflow/agent": "2.12.0",
145
- "@lumenflow/memory": "2.12.0",
146
- "@lumenflow/initiatives": "2.12.0"
143
+ "@lumenflow/agent": "2.14.0",
144
+ "@lumenflow/metrics": "2.14.0",
145
+ "@lumenflow/initiatives": "2.14.0",
146
+ "@lumenflow/memory": "2.14.0",
147
+ "@lumenflow/core": "2.14.0"
147
148
  },
148
149
  "devDependencies": {
149
150
  "@vitest/coverage-v8": "^4.0.17",
@@ -1,8 +1,9 @@
1
1
  #!/bin/bash
2
2
  #
3
- # enforce-worktree.sh
3
+ # enforce-worktree.sh (WU-1501)
4
4
  #
5
5
  # Claude PreToolUse hook that blocks Write/Edit operations on main branch.
6
+ # Fail-closed: blocks even when no worktrees exist (no unguarded main writes).
6
7
  #
7
8
  # This hook enforces worktree discipline for Claude Code specifically,
8
9
  # complementing the git pre-commit hook for stronger enforcement.
@@ -11,14 +12,17 @@
11
12
  # 0 = Allow operation
12
13
  # 2 = Block operation (stderr shown to Claude as guidance)
13
14
  #
14
- # Security: Fail-open design for this hook (branches can't always be detected)
15
- # - If branch detection fails, allow operation (git hooks will catch it)
16
- # - If JSON parse fails, allow operation (defensive, log warning)
15
+ # Security: Fail-closed on main when LumenFlow is configured
16
+ # - Allowlist: docs/04-operations/tasks/wu/, .lumenflow/, .claude/, plan/
17
+ # - Branch-PR claimed_mode permits writes from main checkout
18
+ # - Graceful degradation only when LumenFlow is NOT configured
17
19
  #
18
20
  # Blocking conditions:
19
21
  # - Current branch is main or master
20
22
  # - Tool is Write or Edit
21
23
  # - Target file is in the main repo (not a worktree)
24
+ # - No allowlisted path match
25
+ # - No branch-pr WU in progress
22
26
  #
23
27
 
24
28
  set -euo pipefail
@@ -34,6 +38,14 @@ else
34
38
  fi
35
39
  fi
36
40
 
41
+ WORKTREES_DIR="${MAIN_REPO_PATH}/worktrees"
42
+ LUMENFLOW_DIR="${MAIN_REPO_PATH}/.lumenflow"
43
+
44
+ # Graceful degradation: LumenFlow not configured
45
+ if [[ ! -d "$LUMENFLOW_DIR" ]]; then
46
+ exit 0
47
+ fi
48
+
37
49
  # Check if we're on main/master branch
38
50
  CURRENT_BRANCH=$(git -C "$MAIN_REPO_PATH" rev-parse --abbrev-ref HEAD 2>/dev/null || echo "")
39
51
 
@@ -96,25 +108,79 @@ if [[ "$TOOL_NAME" != "Write" && "$TOOL_NAME" != "Edit" ]]; then
96
108
  exit 0
97
109
  fi
98
110
 
99
- # Check if file path is in a worktree (allowed) or main repo (blocked)
100
- WORKTREES_DIR="${MAIN_REPO_PATH}/worktrees"
101
-
111
+ # Resolve file path
102
112
  if [[ -n "$FILE_PATH" ]]; then
103
113
  RESOLVED_PATH=$(realpath -m "$FILE_PATH" 2>/dev/null || echo "$FILE_PATH")
114
+ else
115
+ RESOLVED_PATH=""
116
+ fi
104
117
 
105
- # Allow if path is inside a worktree
106
- if [[ "$RESOLVED_PATH" == "${WORKTREES_DIR}/"* ]]; then
118
+ # Allow if path is outside repo entirely
119
+ if [[ -n "$RESOLVED_PATH" ]]; then
120
+ if [[ "$RESOLVED_PATH" != "${MAIN_REPO_PATH}/"* && "$RESOLVED_PATH" != "${MAIN_REPO_PATH}" ]]; then
107
121
  exit 0
108
122
  fi
109
123
  fi
110
124
 
111
- # Block: We're on main/master and trying to Write/Edit outside a worktree
125
+ # Allow if path is inside a worktree
126
+ if [[ -n "$RESOLVED_PATH" && "$RESOLVED_PATH" == "${WORKTREES_DIR}/"* ]]; then
127
+ exit 0
128
+ fi
129
+
130
+ # Check if any active worktrees exist
131
+ WORKTREE_COUNT=0
132
+ if [[ -d "$WORKTREES_DIR" ]]; then
133
+ WORKTREE_COUNT=$(find "$WORKTREES_DIR" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | wc -l)
134
+ fi
135
+
136
+ # If worktrees exist, block writes to main repo (original behavior)
137
+ if [[ "$WORKTREE_COUNT" -gt 0 ]]; then
138
+ echo "" >&2
139
+ echo "=== LumenFlow Worktree Enforcement ===" >&2
140
+ echo "" >&2
141
+ echo "BLOCKED: ${TOOL_NAME} operation on main branch" >&2
142
+ echo "" >&2
143
+ echo "You are on the '${CURRENT_BRANCH}' branch. Direct edits to main are not allowed." >&2
144
+ echo "" >&2
145
+ echo "WHAT TO DO:" >&2
146
+ echo " 1. cd to your worktree: cd worktrees/<lane>-wu-<id>/" >&2
147
+ echo " 2. Make your edits in the worktree" >&2
148
+ echo "" >&2
149
+ echo "See: LUMENFLOW.md for complete workflow documentation" >&2
150
+ echo "========================================" >&2
151
+ exit 2
152
+ fi
153
+
154
+ # WU-1501: Fail-closed on main when no worktrees exist
155
+ # Check allowlist: paths that are always safe to write on main
156
+ if [[ -n "$RESOLVED_PATH" ]]; then
157
+ RELATIVE_PATH="${RESOLVED_PATH#${MAIN_REPO_PATH}/}"
158
+
159
+ case "$RELATIVE_PATH" in
160
+ docs/04-operations/tasks/wu/*) exit 0 ;; # WU YAML specs
161
+ .lumenflow/*) exit 0 ;; # LumenFlow state/config
162
+ .claude/*) exit 0 ;; # Claude Code config
163
+ plan/*) exit 0 ;; # Plan/spec scaffolds
164
+ esac
165
+ fi
166
+
167
+ # Check for branch-pr claimed_mode (allows main writes without worktree)
168
+ STATE_FILE="${LUMENFLOW_DIR}/state/wu-events.jsonl"
169
+ if [[ -f "$STATE_FILE" ]]; then
170
+ if grep -q '"claimed_mode":"branch-pr"' "$STATE_FILE" 2>/dev/null; then
171
+ if grep -q '"status":"in_progress"' "$STATE_FILE" 2>/dev/null; then
172
+ exit 0 # Branch-PR WU active - allow main writes
173
+ fi
174
+ fi
175
+ fi
176
+
177
+ # Fail-closed: block the write
112
178
  echo "" >&2
113
179
  echo "=== LumenFlow Worktree Enforcement ===" >&2
114
180
  echo "" >&2
115
- echo "BLOCKED: ${TOOL_NAME} operation on main branch" >&2
181
+ echo "BLOCKED: ${TOOL_NAME} operation on main branch (no active WU claim)" >&2
116
182
  echo "" >&2
117
- echo "You are on the '${CURRENT_BRANCH}' branch. Direct edits to main are not allowed." >&2
183
+ echo "You are on the '${CURRENT_BRANCH}' branch with no active WU." >&2
118
184
  echo "" >&2
119
185
  echo "WHAT TO DO:" >&2
120
186
  echo " 1. Claim a WU to create a worktree:" >&2
@@ -125,11 +191,6 @@ echo " cd worktrees/<lane>-wu-xxxx" >&2
125
191
  echo "" >&2
126
192
  echo " 3. Make your edits in the worktree" >&2
127
193
  echo "" >&2
128
- echo "WHY THIS MATTERS:" >&2
129
- echo " - Worktrees isolate your changes from other work" >&2
130
- echo " - All changes are tracked through the WU workflow" >&2
131
- echo " - Parallel work across lanes stays independent" >&2
132
- echo "" >&2
133
194
  echo "See: LUMENFLOW.md for complete workflow documentation" >&2
134
195
  echo "========================================" >&2
135
196
  exit 2
@@ -28,6 +28,36 @@ else
28
28
  fi
29
29
  fi
30
30
 
31
+ # WU-1505: Early warning for dirty main checkout at SessionStart.
32
+ # Informational only (never blocks), helps agents catch polluted main state
33
+ # before any work begins.
34
+ CWD=$(pwd)
35
+ WORKTREES_DIR="${REPO_PATH}/worktrees"
36
+ CURRENT_BRANCH=$(git -C "$REPO_PATH" rev-parse --abbrev-ref HEAD 2>/dev/null || echo "")
37
+
38
+ # No-op in worktrees and non-main branches.
39
+ if [[ "$CWD" != "${WORKTREES_DIR}/"* ]] && [[ "$CURRENT_BRANCH" == "main" ]]; then
40
+ DIRTY_LINES=$(git -C "$REPO_PATH" status --porcelain --untracked-files=all 2>/dev/null || true)
41
+ if [[ -n "$DIRTY_LINES" ]]; then
42
+ echo "" >&2
43
+ echo "═══════════════════════════════════════════════════════" >&2
44
+ echo "⚠️ DIRTY MAIN CHECKOUT DETECTED" >&2
45
+ echo "═══════════════════════════════════════════════════════" >&2
46
+ echo "" >&2
47
+ echo "Uncommitted files in main checkout:" >&2
48
+ echo "$DIRTY_LINES" | head -20 | sed 's/^/ /' >&2
49
+ if [[ $(echo "$DIRTY_LINES" | wc -l | tr -d ' ') -gt 20 ]]; then
50
+ echo " ... (truncated)" >&2
51
+ fi
52
+ echo "" >&2
53
+ echo "Recommended next steps:" >&2
54
+ echo " 1. Inspect: git status --short" >&2
55
+ echo " 2. Move changes into a WU worktree or commit/discard intentionally" >&2
56
+ echo " 3. Keep main clean before starting new work" >&2
57
+ echo "" >&2
58
+ fi
59
+ fi
60
+
31
61
  RECOVERY_DIR="${REPO_PATH}/.lumenflow/state"
32
62
 
33
63
  # Check if recovery directory exists