@lumenflow/cli 2.18.3 → 2.19.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 +42 -41
- package/dist/delegation-list.js +140 -0
- package/dist/delegation-list.js.map +1 -0
- package/dist/doctor.js +35 -99
- package/dist/doctor.js.map +1 -1
- package/dist/gates-plan-resolvers.js +150 -0
- package/dist/gates-plan-resolvers.js.map +1 -0
- package/dist/gates-runners.js +533 -0
- package/dist/gates-runners.js.map +1 -0
- package/dist/gates-types.js +3 -0
- package/dist/gates-types.js.map +1 -1
- package/dist/gates-utils.js +316 -0
- package/dist/gates-utils.js.map +1 -0
- package/dist/gates.js +44 -1016
- package/dist/gates.js.map +1 -1
- package/dist/hooks/enforcement-generator.js +16 -880
- package/dist/hooks/enforcement-generator.js.map +1 -1
- package/dist/hooks/enforcement-sync.js +1 -4
- package/dist/hooks/enforcement-sync.js.map +1 -1
- package/dist/hooks/generators/auto-checkpoint.js +123 -0
- package/dist/hooks/generators/auto-checkpoint.js.map +1 -0
- package/dist/hooks/generators/enforce-worktree.js +188 -0
- package/dist/hooks/generators/enforce-worktree.js.map +1 -0
- package/dist/hooks/generators/index.js +16 -0
- package/dist/hooks/generators/index.js.map +1 -0
- package/dist/hooks/generators/pre-compact-checkpoint.js +134 -0
- package/dist/hooks/generators/pre-compact-checkpoint.js.map +1 -0
- package/dist/hooks/generators/require-wu.js +115 -0
- package/dist/hooks/generators/require-wu.js.map +1 -0
- package/dist/hooks/generators/session-start-recovery.js +101 -0
- package/dist/hooks/generators/session-start-recovery.js.map +1 -0
- package/dist/hooks/generators/signal-utils.js +52 -0
- package/dist/hooks/generators/signal-utils.js.map +1 -0
- package/dist/hooks/generators/warn-incomplete.js +65 -0
- package/dist/hooks/generators/warn-incomplete.js.map +1 -0
- package/dist/init-detection.js +228 -0
- package/dist/init-detection.js.map +1 -0
- package/dist/init-scaffolding.js +146 -0
- package/dist/init-scaffolding.js.map +1 -0
- package/dist/init-templates.js +1928 -0
- package/dist/init-templates.js.map +1 -0
- package/dist/init.js +136 -2425
- package/dist/init.js.map +1 -1
- package/dist/initiative-edit.js +42 -11
- package/dist/initiative-edit.js.map +1 -1
- package/dist/initiative-remove-wu.js +0 -0
- package/dist/initiative-status.js +29 -2
- package/dist/initiative-status.js.map +1 -1
- package/dist/mem-context.js +22 -9
- package/dist/mem-context.js.map +1 -1
- package/dist/orchestrate-init-status.js +32 -1
- package/dist/orchestrate-init-status.js.map +1 -1
- package/dist/orchestrate-monitor.js +38 -38
- package/dist/orchestrate-monitor.js.map +1 -1
- package/dist/public-manifest.js +12 -5
- package/dist/public-manifest.js.map +1 -1
- package/dist/shared-validators.js +1 -0
- package/dist/shared-validators.js.map +1 -1
- package/dist/spawn-list.js +0 -0
- package/dist/wu-claim-branch.js +121 -0
- package/dist/wu-claim-branch.js.map +1 -0
- package/dist/wu-claim-output.js +83 -0
- package/dist/wu-claim-output.js.map +1 -0
- package/dist/wu-claim-resume-handler.js +85 -0
- package/dist/wu-claim-resume-handler.js.map +1 -0
- package/dist/wu-claim-state.js +572 -0
- package/dist/wu-claim-state.js.map +1 -0
- package/dist/wu-claim-validation.js +439 -0
- package/dist/wu-claim-validation.js.map +1 -0
- package/dist/wu-claim-worktree.js +221 -0
- package/dist/wu-claim-worktree.js.map +1 -0
- package/dist/wu-claim.js +54 -1402
- package/dist/wu-claim.js.map +1 -1
- package/dist/wu-create-content.js +254 -0
- package/dist/wu-create-content.js.map +1 -0
- package/dist/wu-create-readiness.js +57 -0
- package/dist/wu-create-readiness.js.map +1 -0
- package/dist/wu-create-validation.js +149 -0
- package/dist/wu-create-validation.js.map +1 -0
- package/dist/wu-create.js +39 -441
- package/dist/wu-create.js.map +1 -1
- package/dist/wu-done.js +144 -249
- package/dist/wu-done.js.map +1 -1
- package/dist/wu-edit-operations.js +432 -0
- package/dist/wu-edit-operations.js.map +1 -0
- package/dist/wu-edit-validators.js +280 -0
- package/dist/wu-edit-validators.js.map +1 -0
- package/dist/wu-edit.js +27 -713
- package/dist/wu-edit.js.map +1 -1
- package/dist/wu-prep.js +32 -2
- package/dist/wu-prep.js.map +1 -1
- package/dist/wu-repair.js +1 -1
- package/dist/wu-repair.js.map +1 -1
- package/dist/wu-spawn-prompt-builders.js +1123 -0
- package/dist/wu-spawn-prompt-builders.js.map +1 -0
- package/dist/wu-spawn-strategy-resolver.js +314 -0
- package/dist/wu-spawn-strategy-resolver.js.map +1 -0
- package/dist/wu-spawn.js +9 -1398
- package/dist/wu-spawn.js.map +1 -1
- package/package.json +10 -7
- package/templates/core/LUMENFLOW.md.template +29 -99
- package/templates/core/ai/onboarding/agent-invocation-guide.md.template +1 -1
- package/templates/core/ai/onboarding/quick-ref-commands.md.template +29 -4
- package/templates/vendors/claude/.claude/skills/orchestration/SKILL.md.template +8 -8
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file init-scaffolding.ts
|
|
3
|
+
* File-system scaffolding helpers for LumenFlow init command (WU-1644)
|
|
4
|
+
*
|
|
5
|
+
* Extracted from init.ts -- file creation, directory creation,
|
|
6
|
+
* template loading/processing, and merge-mode handling.
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from 'node:fs';
|
|
9
|
+
import * as path from 'node:path';
|
|
10
|
+
import { fileURLToPath } from 'node:url';
|
|
11
|
+
// WU-1171: Import merge block utilities
|
|
12
|
+
import { updateMergeBlock } from './merge-block.js';
|
|
13
|
+
/**
|
|
14
|
+
* Process template content by replacing placeholders
|
|
15
|
+
*/
|
|
16
|
+
export function processTemplate(content, tokens) {
|
|
17
|
+
let output = content;
|
|
18
|
+
for (const [key, value] of Object.entries(tokens)) {
|
|
19
|
+
// eslint-disable-next-line security/detect-non-literal-regexp -- key is from internal token map, not user input
|
|
20
|
+
output = output.replace(new RegExp(`\\{\\{${key}\\}\\}`, 'g'), value);
|
|
21
|
+
}
|
|
22
|
+
return output;
|
|
23
|
+
}
|
|
24
|
+
export function getRelativePath(targetDir, filePath) {
|
|
25
|
+
return path.relative(targetDir, filePath).split(path.sep).join('/');
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* WU-1171: Get templates directory path
|
|
29
|
+
*/
|
|
30
|
+
export function getTemplatesDir() {
|
|
31
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
32
|
+
const __dirname = path.dirname(__filename);
|
|
33
|
+
// Check for dist/templates (production) or ../templates (development)
|
|
34
|
+
const distTemplates = path.join(__dirname, '..', 'templates');
|
|
35
|
+
if (fs.existsSync(distTemplates)) {
|
|
36
|
+
return distTemplates;
|
|
37
|
+
}
|
|
38
|
+
throw new Error(`Templates directory not found at ${distTemplates}`);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* WU-1171: Load a template file
|
|
42
|
+
*/
|
|
43
|
+
export function loadTemplate(templatePath) {
|
|
44
|
+
const templatesDir = getTemplatesDir();
|
|
45
|
+
const fullPath = path.join(templatesDir, templatePath);
|
|
46
|
+
if (!fs.existsSync(fullPath)) {
|
|
47
|
+
throw new Error(`Template not found: ${templatePath}`);
|
|
48
|
+
}
|
|
49
|
+
return fs.readFileSync(fullPath, 'utf-8');
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Convert boolean or FileMode to FileMode
|
|
53
|
+
*/
|
|
54
|
+
export function resolveBooleanToFileMode(mode) {
|
|
55
|
+
if (typeof mode === 'boolean') {
|
|
56
|
+
return mode ? 'force' : 'skip';
|
|
57
|
+
}
|
|
58
|
+
return mode;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Handle merge mode file update
|
|
62
|
+
*/
|
|
63
|
+
export function handleMergeMode(filePath, content, result, relativePath) {
|
|
64
|
+
const existingContent = fs.readFileSync(filePath, 'utf-8');
|
|
65
|
+
const mergeResult = updateMergeBlock(existingContent, content);
|
|
66
|
+
if (mergeResult.unchanged) {
|
|
67
|
+
result.skipped.push(relativePath);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (mergeResult.warning) {
|
|
71
|
+
result.warnings?.push(`${relativePath}: ${mergeResult.warning}`);
|
|
72
|
+
}
|
|
73
|
+
fs.writeFileSync(filePath, mergeResult.content);
|
|
74
|
+
result.merged?.push(relativePath);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Write a new file, creating parent directories if needed
|
|
78
|
+
*/
|
|
79
|
+
export function writeNewFile(filePath, content, result, relativePath) {
|
|
80
|
+
const parentDir = path.dirname(filePath);
|
|
81
|
+
if (!fs.existsSync(parentDir)) {
|
|
82
|
+
fs.mkdirSync(parentDir, { recursive: true });
|
|
83
|
+
}
|
|
84
|
+
fs.writeFileSync(filePath, content);
|
|
85
|
+
result.created.push(relativePath);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Create a directory if missing
|
|
89
|
+
*/
|
|
90
|
+
export async function createDirectory(dirPath, result, targetDir) {
|
|
91
|
+
if (!fs.existsSync(dirPath)) {
|
|
92
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
93
|
+
result.created.push(getRelativePath(targetDir, dirPath));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* WU-1171: Create a file with support for skip, merge, and force modes
|
|
98
|
+
*
|
|
99
|
+
* @param filePath - Path to the file to create
|
|
100
|
+
* @param content - Content to write (or merge block content in merge mode)
|
|
101
|
+
* @param mode - 'skip' (default), 'merge', or 'force'
|
|
102
|
+
* @param result - ScaffoldResult to track created/skipped/merged files
|
|
103
|
+
* @param targetDir - Target directory for relative path calculation
|
|
104
|
+
*/
|
|
105
|
+
export async function createFile(filePath, content, mode, result, targetDir) {
|
|
106
|
+
const relativePath = getRelativePath(targetDir, filePath);
|
|
107
|
+
// Handle boolean for backwards compatibility (true = force, false = skip)
|
|
108
|
+
const resolvedMode = resolveBooleanToFileMode(mode);
|
|
109
|
+
// Ensure merged/warnings arrays exist
|
|
110
|
+
result.merged = result.merged ?? [];
|
|
111
|
+
result.warnings = result.warnings ?? [];
|
|
112
|
+
const fileExists = fs.existsSync(filePath);
|
|
113
|
+
if (fileExists && resolvedMode === 'skip') {
|
|
114
|
+
result.skipped.push(relativePath);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (fileExists && resolvedMode === 'merge') {
|
|
118
|
+
handleMergeMode(filePath, content, result, relativePath);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
// Force mode or file doesn't exist: write new content
|
|
122
|
+
writeNewFile(filePath, content, result, relativePath);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* WU-1394: Create an executable script file with proper permissions
|
|
126
|
+
* Similar to createFile but sets 0o755 mode for shell scripts
|
|
127
|
+
*/
|
|
128
|
+
export async function createExecutableScript(filePath, content, mode, result, targetDir) {
|
|
129
|
+
const relativePath = getRelativePath(targetDir, filePath);
|
|
130
|
+
const resolvedMode = resolveBooleanToFileMode(mode);
|
|
131
|
+
result.merged = result.merged ?? [];
|
|
132
|
+
result.warnings = result.warnings ?? [];
|
|
133
|
+
const fileExists = fs.existsSync(filePath);
|
|
134
|
+
if (fileExists && resolvedMode === 'skip') {
|
|
135
|
+
result.skipped.push(relativePath);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
// Write file with executable permissions
|
|
139
|
+
const parentDir = path.dirname(filePath);
|
|
140
|
+
if (!fs.existsSync(parentDir)) {
|
|
141
|
+
fs.mkdirSync(parentDir, { recursive: true });
|
|
142
|
+
}
|
|
143
|
+
fs.writeFileSync(filePath, content, { mode: 0o755 });
|
|
144
|
+
result.created.push(relativePath);
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=init-scaffolding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-scaffolding.js","sourceRoot":"","sources":["../src/init-scaffolding.ts"],"names":[],"mappings":"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"}
|