@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.
- package/README.md +121 -105
- package/dist/__tests__/agent-spawn-coordination.test.js +451 -0
- package/dist/__tests__/commands/integrate.test.js +165 -0
- package/dist/__tests__/commands.test.js +75 -0
- package/dist/__tests__/doctor.test.js +510 -0
- package/dist/__tests__/gates-config.test.js +0 -1
- package/dist/__tests__/hooks/enforcement.test.js +279 -0
- package/dist/__tests__/init-greenfield.test.js +247 -0
- package/dist/__tests__/init-quick-ref.test.js +0 -1
- package/dist/__tests__/init-template-portability.test.js +0 -1
- package/dist/__tests__/init.test.js +249 -0
- package/dist/__tests__/initiative-e2e.test.js +442 -0
- package/dist/__tests__/initiative-plan-replacement.test.js +0 -1
- package/dist/__tests__/memory-integration.test.js +333 -0
- package/dist/__tests__/release.test.js +1 -1
- package/dist/__tests__/safe-git.test.js +0 -1
- package/dist/__tests__/state-doctor.test.js +54 -0
- package/dist/__tests__/sync-templates.test.js +255 -0
- package/dist/__tests__/wu-create-required-fields.test.js +121 -0
- package/dist/__tests__/wu-done-auto-cleanup.test.js +135 -0
- package/dist/__tests__/wu-lifecycle-integration.test.js +388 -0
- package/dist/backlog-prune.js +0 -1
- package/dist/cli-entry-point.js +0 -1
- package/dist/commands/integrate.js +229 -0
- package/dist/commands.js +171 -0
- package/dist/docs-sync.js +46 -0
- package/dist/doctor.js +479 -10
- package/dist/gates.js +0 -7
- package/dist/hooks/enforcement-checks.js +209 -0
- package/dist/hooks/enforcement-generator.js +365 -0
- package/dist/hooks/enforcement-sync.js +243 -0
- package/dist/hooks/index.js +7 -0
- package/dist/init.js +502 -17
- package/dist/initiative-add-wu.js +0 -2
- package/dist/initiative-create.js +0 -3
- package/dist/initiative-edit.js +0 -5
- package/dist/initiative-plan.js +0 -1
- package/dist/initiative-remove-wu.js +0 -2
- package/dist/lane-health.js +0 -2
- package/dist/lane-suggest.js +0 -1
- package/dist/mem-checkpoint.js +0 -2
- package/dist/mem-cleanup.js +0 -2
- package/dist/mem-context.js +0 -3
- package/dist/mem-create.js +0 -2
- package/dist/mem-delete.js +0 -3
- package/dist/mem-inbox.js +0 -2
- package/dist/mem-index.js +0 -1
- package/dist/mem-init.js +0 -2
- package/dist/mem-profile.js +0 -1
- package/dist/mem-promote.js +0 -1
- package/dist/mem-ready.js +0 -2
- package/dist/mem-signal.js +0 -2
- package/dist/mem-start.js +0 -2
- package/dist/mem-summarize.js +0 -2
- package/dist/metrics-cli.js +1 -1
- package/dist/metrics-snapshot.js +1 -1
- package/dist/onboarding-smoke-test.js +0 -5
- package/dist/orchestrate-init-status.js +0 -1
- package/dist/orchestrate-initiative.js +0 -1
- package/dist/orchestrate-monitor.js +0 -1
- package/dist/plan-create.js +0 -2
- package/dist/plan-edit.js +0 -2
- package/dist/plan-link.js +0 -2
- package/dist/plan-promote.js +0 -2
- package/dist/signal-cleanup.js +0 -4
- package/dist/state-bootstrap.js +0 -1
- package/dist/state-cleanup.js +0 -4
- package/dist/state-doctor-fix.js +5 -8
- package/dist/state-doctor.js +0 -11
- package/dist/sync-templates.js +188 -34
- package/dist/wu-block.js +100 -48
- package/dist/wu-claim.js +1 -22
- package/dist/wu-cleanup.js +0 -1
- package/dist/wu-create.js +0 -2
- package/dist/wu-done-auto-cleanup.js +139 -0
- package/dist/wu-done.js +11 -4
- package/dist/wu-edit.js +0 -12
- package/dist/wu-preflight.js +0 -1
- package/dist/wu-prep.js +0 -1
- package/dist/wu-proto.js +0 -1
- package/dist/wu-spawn.js +0 -3
- package/dist/wu-unblock.js +0 -2
- package/dist/wu-validate.js +0 -1
- 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
|
package/dist/wu-preflight.js
CHANGED
|
@@ -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
package/dist/wu-proto.js
CHANGED
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) {
|
package/dist/wu-unblock.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 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;
|
package/dist/wu-validate.js
CHANGED
|
@@ -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.
|
|
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.
|
|
153
|
-
"@lumenflow/
|
|
154
|
-
"@lumenflow/
|
|
155
|
-
"@lumenflow/
|
|
156
|
-
"@lumenflow/
|
|
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",
|