@lumenflow/cli 2.7.0 → 2.9.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 (84) hide show
  1. package/README.md +121 -105
  2. package/dist/__tests__/agent-spawn-coordination.test.js +451 -0
  3. package/dist/__tests__/commands/integrate.test.js +165 -0
  4. package/dist/__tests__/commands.test.js +75 -0
  5. package/dist/__tests__/doctor.test.js +510 -0
  6. package/dist/__tests__/gates-config.test.js +0 -1
  7. package/dist/__tests__/hooks/enforcement.test.js +279 -0
  8. package/dist/__tests__/init-greenfield.test.js +247 -0
  9. package/dist/__tests__/init-quick-ref.test.js +0 -1
  10. package/dist/__tests__/init-template-portability.test.js +0 -1
  11. package/dist/__tests__/init.test.js +249 -0
  12. package/dist/__tests__/initiative-e2e.test.js +442 -0
  13. package/dist/__tests__/initiative-plan-replacement.test.js +0 -1
  14. package/dist/__tests__/memory-integration.test.js +333 -0
  15. package/dist/__tests__/release.test.js +1 -1
  16. package/dist/__tests__/safe-git.test.js +0 -1
  17. package/dist/__tests__/state-doctor.test.js +54 -0
  18. package/dist/__tests__/sync-templates.test.js +255 -0
  19. package/dist/__tests__/wu-create-required-fields.test.js +121 -0
  20. package/dist/__tests__/wu-done-auto-cleanup.test.js +135 -0
  21. package/dist/__tests__/wu-lifecycle-integration.test.js +388 -0
  22. package/dist/backlog-prune.js +0 -1
  23. package/dist/cli-entry-point.js +0 -1
  24. package/dist/commands/integrate.js +229 -0
  25. package/dist/commands.js +171 -0
  26. package/dist/docs-sync.js +46 -0
  27. package/dist/doctor.js +479 -10
  28. package/dist/gates.js +0 -7
  29. package/dist/hooks/enforcement-checks.js +209 -0
  30. package/dist/hooks/enforcement-generator.js +365 -0
  31. package/dist/hooks/enforcement-sync.js +243 -0
  32. package/dist/hooks/index.js +7 -0
  33. package/dist/init.js +502 -17
  34. package/dist/initiative-add-wu.js +0 -2
  35. package/dist/initiative-create.js +0 -3
  36. package/dist/initiative-edit.js +0 -5
  37. package/dist/initiative-plan.js +0 -1
  38. package/dist/initiative-remove-wu.js +0 -2
  39. package/dist/lane-health.js +0 -2
  40. package/dist/lane-suggest.js +0 -1
  41. package/dist/mem-checkpoint.js +0 -2
  42. package/dist/mem-cleanup.js +0 -2
  43. package/dist/mem-context.js +0 -3
  44. package/dist/mem-create.js +0 -2
  45. package/dist/mem-delete.js +0 -3
  46. package/dist/mem-inbox.js +0 -2
  47. package/dist/mem-index.js +0 -1
  48. package/dist/mem-init.js +0 -2
  49. package/dist/mem-profile.js +0 -1
  50. package/dist/mem-promote.js +0 -1
  51. package/dist/mem-ready.js +0 -2
  52. package/dist/mem-signal.js +0 -2
  53. package/dist/mem-start.js +0 -2
  54. package/dist/mem-summarize.js +0 -2
  55. package/dist/metrics-cli.js +1 -1
  56. package/dist/metrics-snapshot.js +1 -1
  57. package/dist/onboarding-smoke-test.js +0 -5
  58. package/dist/orchestrate-init-status.js +0 -1
  59. package/dist/orchestrate-initiative.js +0 -1
  60. package/dist/orchestrate-monitor.js +0 -1
  61. package/dist/plan-create.js +0 -2
  62. package/dist/plan-edit.js +0 -2
  63. package/dist/plan-link.js +0 -2
  64. package/dist/plan-promote.js +0 -2
  65. package/dist/signal-cleanup.js +0 -4
  66. package/dist/state-bootstrap.js +0 -1
  67. package/dist/state-cleanup.js +0 -4
  68. package/dist/state-doctor-fix.js +5 -8
  69. package/dist/state-doctor.js +0 -11
  70. package/dist/sync-templates.js +188 -34
  71. package/dist/wu-block.js +100 -48
  72. package/dist/wu-claim.js +1 -22
  73. package/dist/wu-cleanup.js +0 -1
  74. package/dist/wu-create.js +0 -2
  75. package/dist/wu-done-auto-cleanup.js +139 -0
  76. package/dist/wu-done.js +11 -4
  77. package/dist/wu-edit.js +0 -12
  78. package/dist/wu-preflight.js +0 -1
  79. package/dist/wu-prep.js +0 -1
  80. package/dist/wu-proto.js +0 -1
  81. package/dist/wu-spawn.js +0 -3
  82. package/dist/wu-unblock.js +0 -2
  83. package/dist/wu-validate.js +0 -1
  84. package/package.json +9 -7
@@ -0,0 +1,139 @@
1
+ /**
2
+ * WU-1366: Auto cleanup after wu:done success
3
+ *
4
+ * Provides functions to run state cleanup automatically after successful wu:done.
5
+ * Cleanup is non-fatal: errors are logged but do not block completion.
6
+ *
7
+ * The cleanup.trigger config option controls when cleanup runs:
8
+ * - 'on_done': Run after wu:done success (default)
9
+ * - 'on_init': Run during lumenflow init
10
+ * - 'manual': Only run via pnpm state:cleanup
11
+ *
12
+ * @see {@link packages/@lumenflow/core/src/state-cleanup-core.ts} - Core cleanup orchestration
13
+ * @see {@link packages/@lumenflow/core/src/lumenflow-config-schema.ts} - CleanupConfigSchema
14
+ */
15
+ import { getConfig } from '@lumenflow/core/dist/lumenflow-config.js';
16
+ import { cleanupState } from '@lumenflow/core/dist/state-cleanup-core.js';
17
+ import { cleanupSignals } from '@lumenflow/memory/dist/signal-cleanup-core.js';
18
+ import { cleanupMemory } from '@lumenflow/memory/dist/mem-cleanup-core.js';
19
+ import { archiveWuEvents } from '@lumenflow/core/dist/wu-events-cleanup.js';
20
+ import fg from 'fast-glob';
21
+ import { readFile } from 'node:fs/promises';
22
+ import { parse as parseYaml } from 'yaml';
23
+ import path from 'node:path';
24
+ import { LOG_PREFIX, EMOJI } from '@lumenflow/core/dist/wu-constants.js';
25
+ /**
26
+ * Active WU statuses that should protect signals
27
+ */
28
+ const ACTIVE_WU_STATUSES = ['in_progress', 'blocked'];
29
+ /**
30
+ * Get active WU IDs (in_progress or blocked) by scanning WU YAML files.
31
+ *
32
+ * @param baseDir - Base directory
33
+ * @returns Set of active WU IDs
34
+ */
35
+ async function getActiveWuIds(baseDir) {
36
+ const activeIds = new Set();
37
+ try {
38
+ const config = getConfig({ projectRoot: baseDir });
39
+ const wuDir = path.join(baseDir, config.directories.wuDir);
40
+ // Find all WU YAML files
41
+ const wuFiles = await fg('WU-*.yaml', { cwd: wuDir });
42
+ for (const file of wuFiles) {
43
+ try {
44
+ const filePath = path.join(wuDir, file);
45
+ const content = await readFile(filePath, 'utf-8');
46
+ const wu = parseYaml(content);
47
+ if (wu.id && wu.status && ACTIVE_WU_STATUSES.includes(wu.status)) {
48
+ activeIds.add(wu.id);
49
+ }
50
+ }
51
+ catch {
52
+ // Skip files that fail to parse
53
+ continue;
54
+ }
55
+ }
56
+ }
57
+ catch {
58
+ // If we can't read WU files, return empty set (safer to remove nothing)
59
+ }
60
+ return activeIds;
61
+ }
62
+ /**
63
+ * Check if auto cleanup should run based on config.
64
+ *
65
+ * @returns true if cleanup.trigger is 'on_done' or not set (default)
66
+ */
67
+ export function shouldRunAutoCleanup() {
68
+ try {
69
+ const config = getConfig();
70
+ const trigger = config.cleanup?.trigger;
71
+ // Default to 'on_done' if not set
72
+ if (!trigger) {
73
+ return true;
74
+ }
75
+ return trigger === 'on_done';
76
+ }
77
+ catch {
78
+ // If config can't be loaded, default to running cleanup
79
+ return true;
80
+ }
81
+ }
82
+ /**
83
+ * Run state cleanup automatically after wu:done success.
84
+ *
85
+ * This function is non-fatal: errors are logged as warnings but do not throw.
86
+ * Cleanup respects the config.cleanup.trigger setting.
87
+ *
88
+ * @param baseDir - Base directory for cleanup operations
89
+ * @returns Promise that resolves when cleanup completes (or is skipped)
90
+ */
91
+ export async function runAutoCleanupAfterDone(baseDir) {
92
+ // Check if cleanup should run
93
+ if (!shouldRunAutoCleanup()) {
94
+ return;
95
+ }
96
+ try {
97
+ console.log(`${LOG_PREFIX.DONE} ${EMOJI.INFO} Running auto state cleanup...`);
98
+ const result = await cleanupState(baseDir, {
99
+ dryRun: false,
100
+ // Inject real cleanup functions
101
+ cleanupSignals: async (dir, opts) => cleanupSignals(dir, {
102
+ dryRun: opts.dryRun,
103
+ getActiveWuIds: () => getActiveWuIds(dir),
104
+ }),
105
+ cleanupMemory: async (dir, opts) => cleanupMemory(dir, {
106
+ dryRun: opts.dryRun,
107
+ }),
108
+ archiveEvents: async (dir, opts) => archiveWuEvents(dir, {
109
+ dryRun: opts.dryRun,
110
+ }),
111
+ });
112
+ if (result.success) {
113
+ const typesStr = result.summary.typesExecuted.join(', ');
114
+ console.log(`${LOG_PREFIX.DONE} ${EMOJI.SUCCESS} State cleanup complete: ` +
115
+ `${formatBytes(result.summary.totalBytesFreed)} freed [${typesStr}]`);
116
+ }
117
+ else {
118
+ // Partial success - some cleanups failed
119
+ const errorMsgs = result.errors.map((e) => `${e.type}: ${e.message}`).join(', ');
120
+ console.warn(`${LOG_PREFIX.DONE} ${EMOJI.WARNING} State cleanup partial: ${errorMsgs}`);
121
+ }
122
+ }
123
+ catch (err) {
124
+ // Non-fatal: log warning but don't throw
125
+ const message = err instanceof Error ? err.message : String(err);
126
+ console.warn(`${LOG_PREFIX.DONE} ${EMOJI.WARNING} Could not run auto state cleanup: ${message}`);
127
+ }
128
+ }
129
+ /**
130
+ * Format bytes as human-readable string
131
+ */
132
+ function formatBytes(bytes) {
133
+ const BYTES_PER_KB = 1024;
134
+ if (bytes < BYTES_PER_KB) {
135
+ return `${bytes} B`;
136
+ }
137
+ const kb = (bytes / BYTES_PER_KB).toFixed(1);
138
+ return `${kb} KB`;
139
+ }
package/dist/wu-done.js CHANGED
@@ -95,6 +95,8 @@ import { SpawnStatus } from '@lumenflow/core/dist/spawn-registry-schema.js';
95
95
  // WU-2022: Feature accessibility validation (blocking)
96
96
  import { validateExposure, validateFeatureAccessibility, } from '@lumenflow/core/dist/wu-validation.js';
97
97
  import { ensureCleanWorktree } from './wu-done-check.js';
98
+ // WU-1366: Auto cleanup after wu:done success
99
+ import { runAutoCleanupAfterDone } from './wu-done-auto-cleanup.js';
98
100
  // WU-1588: Memory layer constants
99
101
  const MEMORY_SIGNAL_TYPES = {
100
102
  WU_COMPLETION: 'wu_completion',
@@ -1091,7 +1093,6 @@ function recordTransactionState(id, wuPath, stampPath, backlogPath, statusPath)
1091
1093
  * @param {string} backlogPath - Path to backlog.md (WU-1230)
1092
1094
  * @param {string} statusPath - Path to status.md (WU-1230)
1093
1095
  */
1094
- // eslint-disable-next-line sonarjs/cognitive-complexity -- Pre-existing complexity, refactor tracked separately
1095
1096
  async function rollbackTransaction(txState, wuPath, stampPath, backlogPath, statusPath) {
1096
1097
  console.error(`\n${LOG_PREFIX.DONE} ${EMOJI.WARNING} ROLLING BACK TRANSACTION (WU-755 + WU-1230 + WU-1255 + WU-1280)...`);
1097
1098
  // WU-1280: ATOMIC ROLLBACK - Clean git state FIRST, then restore files
@@ -1272,7 +1273,6 @@ function runWUValidator(doc, id, allowTodo = false, worktreePath = null) {
1272
1273
  * @param {string|null} overrideReason - Reason for override
1273
1274
  * @returns {{valid: boolean, error: string|null, auditEntry: object|null}}
1274
1275
  */
1275
- // eslint-disable-next-line sonarjs/cognitive-complexity -- Pre-existing complexity, refactor tracked separately
1276
1276
  async function checkOwnership(id, doc, worktreePath, overrideOwner = false, overrideReason = null) {
1277
1277
  // Missing worktree means WU was not claimed properly (unless escape hatch applies)
1278
1278
  if (!worktreePath || !existsSync(worktreePath)) {
@@ -2085,7 +2085,9 @@ async function main() {
2085
2085
  if (lane)
2086
2086
  releaseLaneLock(lane, { wuId: id });
2087
2087
  }
2088
- catch { }
2088
+ catch {
2089
+ // Intentionally ignore lock release errors during cleanup
2090
+ }
2089
2091
  process.exit(EXIT_CODES.SUCCESS);
2090
2092
  }
2091
2093
  }
@@ -2096,7 +2098,9 @@ async function main() {
2096
2098
  if (lane)
2097
2099
  releaseLaneLock(lane, { wuId: id });
2098
2100
  }
2099
- catch { }
2101
+ catch {
2102
+ // Intentionally ignore lock release errors during error handling
2103
+ }
2100
2104
  // WU-1811: Check if cleanup is safe before removing worktree
2101
2105
  // If cleanupSafe is false (or undefined), preserve worktree for recovery
2102
2106
  if (err.cleanupSafe === false) {
@@ -2180,6 +2184,9 @@ async function main() {
2180
2184
  // WU-1983: Migration deployment nudge - only if supabase paths in code_paths
2181
2185
  const codePaths = docMain.code_paths || [];
2182
2186
  await printMigrationDeploymentNudge(codePaths, mainCheckoutPath);
2187
+ // WU-1366: Auto state cleanup after successful completion
2188
+ // Non-fatal: errors are logged but do not block completion
2189
+ await runAutoCleanupAfterDone(mainCheckoutPath);
2183
2190
  }
2184
2191
  /**
2185
2192
  * WU-1983: Print migration deployment nudge when WU includes supabase changes.
package/dist/wu-edit.js CHANGED
@@ -59,7 +59,6 @@ import { normalizeWUSchema } from '@lumenflow/core/dist/wu-schema-normalization.
59
59
  import { lintWUSpec, formatLintErrors } from '@lumenflow/core/dist/wu-lint.js';
60
60
  // WU-1329: Import path existence validators for strict validation
61
61
  import { validateCodePathsExistence, validateTestPathsExistence, } from '@lumenflow/core/dist/wu-preflight-validators.js';
62
- /* eslint-disable security/detect-object-injection */
63
62
  const PREFIX = LOG_PREFIX.EDIT;
64
63
  /**
65
64
  * WU-1039: Validate which edits are allowed on done WUs
@@ -271,13 +270,11 @@ const EDIT_OPTIONS = {
271
270
  * @param {string} newInitId - New initiative ID
272
271
  * @returns {Array<string>} Array of relative file paths that were modified
273
272
  */
274
- // eslint-disable-next-line sonarjs/cognitive-complexity -- Pre-existing complexity, refactor tracked separately
275
273
  function updateInitiativeWusArrays(worktreePath, wuId, oldInitId, newInitId) {
276
274
  const modifiedFiles = [];
277
275
  // Remove from old initiative if it exists and is different from new
278
276
  if (oldInitId && oldInitId !== newInitId) {
279
277
  const oldInitPath = join(worktreePath, INIT_PATHS.INITIATIVE(oldInitId));
280
- // eslint-disable-next-line security/detect-non-literal-fs-filename
281
278
  if (existsSync(oldInitPath)) {
282
279
  try {
283
280
  const oldInit = readInitiative(oldInitPath, oldInitId);
@@ -296,7 +293,6 @@ function updateInitiativeWusArrays(worktreePath, wuId, oldInitId, newInitId) {
296
293
  }
297
294
  // Add to new initiative
298
295
  const newInitPath = join(worktreePath, INIT_PATHS.INITIATIVE(newInitId));
299
- // eslint-disable-next-line security/detect-non-literal-fs-filename
300
296
  if (existsSync(newInitPath)) {
301
297
  try {
302
298
  const newInit = readInitiative(newInitPath, newInitId);
@@ -333,7 +329,6 @@ function validateInitiativeFormat(initId) {
333
329
  */
334
330
  function validateInitiativeExists(initId) {
335
331
  const initPath = INIT_PATHS.INITIATIVE(initId);
336
- // eslint-disable-next-line security/detect-non-literal-fs-filename
337
332
  if (!existsSync(initPath)) {
338
333
  die(`Initiative not found: ${initId}\n\nFile does not exist: ${initPath}`);
339
334
  }
@@ -464,11 +459,9 @@ function normalizeWUDates(wu) {
464
459
  */
465
460
  function validateWUEditable(id) {
466
461
  const wuPath = WU_PATHS.WU(id);
467
- // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool validates WU files
468
462
  if (!existsSync(wuPath)) {
469
463
  die(`WU ${id} not found at ${wuPath}\n\nEnsure the WU exists and you're in the repo root.`);
470
464
  }
471
- // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool validates WU files
472
465
  const content = readFileSync(wuPath, { encoding: FILE_SYSTEM.ENCODING });
473
466
  const wu = parseYAML(content);
474
467
  // WU-1929: Done WUs allow initiative/phase edits only (metadata reassignment)
@@ -505,7 +498,6 @@ function validateWUEditable(id) {
505
498
  * @param {string} id - WU ID (for error messages)
506
499
  */
507
500
  function validateWorktreeExists(worktreePath, id) {
508
- // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool validates worktree paths
509
501
  if (!existsSync(worktreePath)) {
510
502
  die(`Cannot edit WU ${id}: worktree path missing from disk.\n\n` +
511
503
  `Expected worktree at: ${worktreePath}\n\n` +
@@ -580,7 +572,6 @@ async function applyEditsInWorktree({ worktreePath, id, updatedWU }) {
580
572
  normalizeWUDates(updatedWU);
581
573
  // Emergency fix Session 2: Use centralized stringifyYAML helper
582
574
  const yamlContent = stringifyYAML(updatedWU);
583
- // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool writes WU files
584
575
  writeFileSync(wuPath, yamlContent, { encoding: FILE_SYSTEM.ENCODING });
585
576
  console.log(`${PREFIX} ✅ Updated ${id}.yaml in worktree`);
586
577
  // Format the file
@@ -660,11 +651,9 @@ export function mergeStringField(existing, newValue, shouldReplace) {
660
651
  */
661
652
  function loadSpecFile(specPath, originalWU) {
662
653
  const resolvedPath = resolve(specPath);
663
- // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool validates spec files
664
654
  if (!existsSync(resolvedPath)) {
665
655
  die(`Spec file not found: ${resolvedPath}`);
666
656
  }
667
- // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool validates spec files
668
657
  const specContent = readFileSync(resolvedPath, {
669
658
  encoding: FILE_SYSTEM.ENCODING,
670
659
  });
@@ -1040,7 +1029,6 @@ async function main() {
1040
1029
  normalizeWUDates(normalizedWU);
1041
1030
  // Emergency fix Session 2: Use centralized stringifyYAML helper
1042
1031
  const yamlContent = stringifyYAML(normalizedWU);
1043
- // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool writes WU files
1044
1032
  writeFileSync(wuPath, yamlContent, { encoding: FILE_SYSTEM.ENCODING });
1045
1033
  console.log(`${PREFIX} ✅ Updated ${id}.yaml in micro-worktree`);
1046
1034
  // WU-1929: Handle bidirectional initiative updates
@@ -27,7 +27,6 @@ import { PATTERNS, EXIT_CODES, LOG_PREFIX, EMOJI } from '@lumenflow/core/dist/wu
27
27
  import { defaultWorktreeFrom, WU_PATHS } from '@lumenflow/core/dist/wu-paths.js';
28
28
  import { readWURaw } from '@lumenflow/core/dist/wu-yaml.js';
29
29
  import { die } from '@lumenflow/core/dist/error-handler.js';
30
- /* eslint-disable security/detect-non-literal-fs-filename */
31
30
  /**
32
31
  * Detect worktree path from WU YAML or calculate from lane
33
32
  * @param {string} id - WU ID
package/dist/wu-prep.js CHANGED
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env node
2
- /* eslint-disable no-console -- CLI command uses console for status output */
3
2
  /**
4
3
  * WU Prep Helper (WU-1223)
5
4
  *
package/dist/wu-proto.js CHANGED
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env node
2
- /* eslint-disable no-console -- CLI tool requires console output */
3
2
  /**
4
3
  * WU Proto Helper (WU-1359)
5
4
  *
package/dist/wu-spawn.js CHANGED
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env node
2
- /* eslint-disable no-console -- CLI tool requires console output */
3
2
  /**
4
3
  * WU Spawn Helper
5
4
  *
@@ -43,7 +42,6 @@ import { minimatch } from 'minimatch';
43
42
  // WU-2252: Import invariants loader for spawn output injection
44
43
  import { loadInvariants, INVARIANT_TYPES } from '@lumenflow/core/dist/invariants-runner.js';
45
44
  import { validateSpawnArgs, generateExecutionModeSection, generateThinkToolGuidance, recordSpawnToRegistry, formatSpawnRecordedMessage, } from '@lumenflow/core/dist/wu-spawn-helpers.js';
46
- // eslint-disable-next-line sonarjs/deprecation -- legacy factory used by CLI spawns
47
45
  import { SpawnStrategyFactory } from '@lumenflow/core/dist/spawn-strategy.js';
48
46
  import { getConfig } from '@lumenflow/core/dist/lumenflow-config.js';
49
47
  import { generateClientSkillsGuidance, generateSkillsSelectionSection, resolveClientConfig, } from '@lumenflow/core/dist/wu-spawn-skills.js';
@@ -1331,7 +1329,6 @@ async function main() {
1331
1329
  }
1332
1330
  }
1333
1331
  // Create strategy
1334
- // eslint-disable-next-line sonarjs/deprecation -- legacy factory used by CLI spawns
1335
1332
  const strategy = SpawnStrategyFactory.create(clientName);
1336
1333
  const clientContext = { name: clientName, config: resolveClientConfig(config, clientName) };
1337
1334
  if (clientName === 'codex-cli' || args.codex) {
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env node
2
- /* eslint-disable no-console -- CLI tool requires console output */
3
2
  /**
4
3
  * WU Unblock Helper
5
4
  *
@@ -55,7 +54,6 @@ function branchExists(branch) {
55
54
  function createWorktree(doc, worktreePath, branchName) {
56
55
  if (!worktreePath)
57
56
  die('Worktree path required to create a worktree');
58
- // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool checks worktree
59
57
  if (existsSync(worktreePath)) {
60
58
  console.warn(`${PREFIX} Worktree ${worktreePath} already exists; skipping creation.`);
61
59
  return;
@@ -112,7 +112,6 @@ function validateAllWUs({ strict = true } = {}) {
112
112
  /**
113
113
  * Main entry point
114
114
  */
115
- // eslint-disable-next-line sonarjs/cognitive-complexity -- Pre-existing complexity, refactor tracked separately
116
115
  async function main() {
117
116
  const args = createWUParser({
118
117
  name: 'wu-validate',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lumenflow/cli",
3
- "version": "2.7.0",
3
+ "version": "2.9.0",
4
4
  "description": "Command-line interface for LumenFlow workflow framework",
5
5
  "keywords": [
6
6
  "lumenflow",
@@ -99,6 +99,7 @@
99
99
  "lumenflow-init": "./dist/init.js",
100
100
  "lumenflow": "./dist/init.js",
101
101
  "lumenflow-doctor": "./dist/doctor.js",
102
+ "lumenflow-commands": "./dist/commands.js",
102
103
  "lumenflow-release": "./dist/release.js",
103
104
  "lumenflow-docs-sync": "./dist/docs-sync.js",
104
105
  "lumenflow-sync-templates": "./dist/sync-templates.js",
@@ -131,7 +132,8 @@
131
132
  "lane-health": "./dist/lane-health.js",
132
133
  "lane-suggest": "./dist/lane-suggest.js",
133
134
  "state-cleanup": "./dist/state-cleanup.js",
134
- "state-doctor": "./dist/state-doctor.js"
135
+ "state-doctor": "./dist/state-doctor.js",
136
+ "lumenflow-integrate": "./dist/commands/integrate.js"
135
137
  },
136
138
  "files": [
137
139
  "dist",
@@ -149,11 +151,11 @@
149
151
  "pretty-ms": "^9.2.0",
150
152
  "simple-git": "^3.30.0",
151
153
  "yaml": "^2.8.2",
152
- "@lumenflow/core": "2.7.0",
153
- "@lumenflow/memory": "2.7.0",
154
- "@lumenflow/metrics": "2.7.0",
155
- "@lumenflow/initiatives": "2.7.0",
156
- "@lumenflow/agent": "2.7.0"
154
+ "@lumenflow/core": "2.9.0",
155
+ "@lumenflow/metrics": "2.9.0",
156
+ "@lumenflow/memory": "2.9.0",
157
+ "@lumenflow/agent": "2.9.0",
158
+ "@lumenflow/initiatives": "2.9.0"
157
159
  },
158
160
  "devDependencies": {
159
161
  "@vitest/coverage-v8": "^4.0.17",