@lumenflow/cli 2.18.2 → 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,316 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gates Utility Helpers
|
|
3
|
+
*
|
|
4
|
+
* WU-1647: Extracted utility functions used across gate runners,
|
|
5
|
+
* plan resolvers, and the gates orchestrator.
|
|
6
|
+
*
|
|
7
|
+
* @module gates-utils
|
|
8
|
+
*/
|
|
9
|
+
import { execSync, spawnSync } from 'node:child_process';
|
|
10
|
+
import { closeSync, mkdirSync, openSync, readSync, statSync, writeSync } from 'node:fs';
|
|
11
|
+
import { access } from 'node:fs/promises';
|
|
12
|
+
import path from 'node:path';
|
|
13
|
+
import { buildGatesLogPath } from '@lumenflow/core/gates-agent-mode';
|
|
14
|
+
import { createGitForPath } from '@lumenflow/core/git-adapter';
|
|
15
|
+
import { getCurrentWU } from '@lumenflow/core/telemetry';
|
|
16
|
+
import { createWuPaths } from '@lumenflow/core/wu-paths';
|
|
17
|
+
import { readWURaw } from '@lumenflow/core/wu-yaml';
|
|
18
|
+
import { PKG_MANAGER, SCRIPTS, FILE_SYSTEM, EXIT_CODES, PRETTIER_ARGS, PRETTIER_FLAGS, } from '@lumenflow/core/wu-constants';
|
|
19
|
+
// ── Shell command builders ─────────────────────────────────────────────
|
|
20
|
+
/**
|
|
21
|
+
* Build a pnpm command string
|
|
22
|
+
*/
|
|
23
|
+
export function pnpmCmd(...parts) {
|
|
24
|
+
return `${PKG_MANAGER} ${parts.join(' ')}`;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Build a pnpm run command string
|
|
28
|
+
*/
|
|
29
|
+
export function pnpmRun(script, ...args) {
|
|
30
|
+
const argsStr = args.length > 0 ? ` ${args.join(' ')}` : '';
|
|
31
|
+
return `${PKG_MANAGER} ${SCRIPTS.RUN} ${script}${argsStr}`;
|
|
32
|
+
}
|
|
33
|
+
// ── Path/string helpers ────────────────────────────────────────────────
|
|
34
|
+
export function normalizePath(filePath) {
|
|
35
|
+
return filePath.replace(/\\/g, '/');
|
|
36
|
+
}
|
|
37
|
+
export function getBasename(filePath) {
|
|
38
|
+
const normalized = normalizePath(filePath);
|
|
39
|
+
const parts = normalized.split('/');
|
|
40
|
+
return parts[parts.length - 1] || normalized;
|
|
41
|
+
}
|
|
42
|
+
export function quoteShellArgs(files) {
|
|
43
|
+
return files.map((file) => `"${file}"`).join(' ');
|
|
44
|
+
}
|
|
45
|
+
// ── Prettier helpers ───────────────────────────────────────────────────
|
|
46
|
+
export function parsePrettierListOutput(output) {
|
|
47
|
+
if (!output)
|
|
48
|
+
return [];
|
|
49
|
+
return output
|
|
50
|
+
.split(/\r?\n/)
|
|
51
|
+
.map((line) => line.trim())
|
|
52
|
+
.filter(Boolean)
|
|
53
|
+
.map((line) => line.replace(/^\[error\]\s*/i, '').trim())
|
|
54
|
+
.filter((line) => !line.toLowerCase().includes('code style issues found') &&
|
|
55
|
+
!line.toLowerCase().includes('all matched files use prettier') &&
|
|
56
|
+
!line.toLowerCase().includes('checking formatting'));
|
|
57
|
+
}
|
|
58
|
+
export function buildPrettierWriteCommand(files) {
|
|
59
|
+
const quotedFiles = files.map((file) => `"${file}"`).join(' ');
|
|
60
|
+
const base = pnpmCmd(SCRIPTS.PRETTIER, PRETTIER_FLAGS.WRITE);
|
|
61
|
+
return quotedFiles ? `${base} ${quotedFiles}` : base;
|
|
62
|
+
}
|
|
63
|
+
export function buildPrettierCheckCommand(files) {
|
|
64
|
+
const filesArg = files.length > 0 ? quoteShellArgs(files) : '.';
|
|
65
|
+
return pnpmCmd(SCRIPTS.PRETTIER, PRETTIER_ARGS.CHECK, filesArg);
|
|
66
|
+
}
|
|
67
|
+
export function formatFormatCheckGuidance(files) {
|
|
68
|
+
if (!files.length)
|
|
69
|
+
return [];
|
|
70
|
+
const command = buildPrettierWriteCommand(files);
|
|
71
|
+
return [
|
|
72
|
+
'',
|
|
73
|
+
'\u274C format:check failed',
|
|
74
|
+
'Fix with:',
|
|
75
|
+
` ${command}`,
|
|
76
|
+
'',
|
|
77
|
+
'Affected files:',
|
|
78
|
+
...files.map((file) => ` - ${file}`),
|
|
79
|
+
'',
|
|
80
|
+
];
|
|
81
|
+
}
|
|
82
|
+
export function collectPrettierListDifferent(cwd, files = []) {
|
|
83
|
+
const filesArg = files.length > 0 ? quoteShellArgs(files) : '.';
|
|
84
|
+
const cmd = pnpmCmd(SCRIPTS.PRETTIER, PRETTIER_ARGS.LIST_DIFFERENT, filesArg);
|
|
85
|
+
const result = spawnSync(cmd, [], {
|
|
86
|
+
shell: true,
|
|
87
|
+
cwd,
|
|
88
|
+
encoding: FILE_SYSTEM.ENCODING,
|
|
89
|
+
});
|
|
90
|
+
const output = `${result.stdout || ''}\n${result.stderr || ''}`;
|
|
91
|
+
return parsePrettierListOutput(output);
|
|
92
|
+
}
|
|
93
|
+
export function emitFormatCheckGuidance({ agentLog, useAgentMode, files, cwd, }) {
|
|
94
|
+
const formattedFiles = collectPrettierListDifferent(cwd, files ?? []);
|
|
95
|
+
if (!formattedFiles.length)
|
|
96
|
+
return;
|
|
97
|
+
const lines = formatFormatCheckGuidance(formattedFiles);
|
|
98
|
+
const logLine = useAgentMode && agentLog
|
|
99
|
+
? (line) => writeSync(agentLog.logFd, `${line}\n`)
|
|
100
|
+
: (line) => console.log(line);
|
|
101
|
+
for (const line of lines) {
|
|
102
|
+
logLine(line);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// ── Process execution ──────────────────────────────────────────────────
|
|
106
|
+
export function run(cmd, { agentLog, cwd = process.cwd(), } = {}) {
|
|
107
|
+
const start = Date.now();
|
|
108
|
+
if (!agentLog) {
|
|
109
|
+
console.log(`\n> ${cmd}\n`);
|
|
110
|
+
try {
|
|
111
|
+
// Pre-existing: execSync is intentional here for synchronous gate execution
|
|
112
|
+
execSync(cmd, {
|
|
113
|
+
stdio: 'inherit',
|
|
114
|
+
encoding: FILE_SYSTEM.ENCODING,
|
|
115
|
+
cwd,
|
|
116
|
+
});
|
|
117
|
+
return { ok: true, duration: Date.now() - start };
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return { ok: false, duration: Date.now() - start };
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
writeSync(agentLog.logFd, `\n> ${cmd}\n\n`);
|
|
124
|
+
const result = spawnSync(cmd, [], {
|
|
125
|
+
shell: true,
|
|
126
|
+
stdio: ['ignore', agentLog.logFd, agentLog.logFd],
|
|
127
|
+
cwd,
|
|
128
|
+
encoding: FILE_SYSTEM.ENCODING,
|
|
129
|
+
});
|
|
130
|
+
return { ok: result.status === EXIT_CODES.SUCCESS, duration: Date.now() - start };
|
|
131
|
+
}
|
|
132
|
+
// ── Logging ────────────────────────────────────────────────────────────
|
|
133
|
+
export function makeGateLogger({ agentLog, useAgentMode }) {
|
|
134
|
+
return (line) => {
|
|
135
|
+
if (!useAgentMode) {
|
|
136
|
+
console.log(line);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
if (agentLog) {
|
|
140
|
+
writeSync(agentLog.logFd, `${line}\n`);
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
export function readLogTail(logPath, { maxLines = 40, maxBytes = 64 * 1024 } = {}) {
|
|
145
|
+
try {
|
|
146
|
+
const stats = statSync(logPath);
|
|
147
|
+
const startPos = Math.max(0, stats.size - maxBytes);
|
|
148
|
+
const bytesToRead = stats.size - startPos;
|
|
149
|
+
const fd = openSync(logPath, 'r');
|
|
150
|
+
try {
|
|
151
|
+
const buffer = Buffer.alloc(bytesToRead);
|
|
152
|
+
readSync(fd, buffer, 0, bytesToRead, startPos);
|
|
153
|
+
const text = buffer.toString(FILE_SYSTEM.ENCODING);
|
|
154
|
+
const lines = text.split(/\r?\n/).filter(Boolean);
|
|
155
|
+
return lines.slice(-maxLines).join('\n');
|
|
156
|
+
}
|
|
157
|
+
finally {
|
|
158
|
+
closeSync(fd);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return '';
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
export function createAgentLogContext({ wuId, lane, cwd, }) {
|
|
166
|
+
const logPath = buildGatesLogPath({ cwd, env: process.env, wuId, lane });
|
|
167
|
+
mkdirSync(path.dirname(logPath), { recursive: true });
|
|
168
|
+
const logFd = openSync(logPath, 'a');
|
|
169
|
+
const header = `# gates log\n# lane: ${lane || 'unknown'}\n# wu: ${wuId || 'unknown'}\n# started: ${new Date().toISOString()}\n\n`;
|
|
170
|
+
writeSync(logFd, header);
|
|
171
|
+
// Ensure we close the FD even if gates exit via die().
|
|
172
|
+
process.on('exit', () => {
|
|
173
|
+
try {
|
|
174
|
+
closeSync(logFd);
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// ignore
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
return { logPath, logFd };
|
|
181
|
+
}
|
|
182
|
+
// ── File system helpers ────────────────────────────────────────────────
|
|
183
|
+
export async function filterExistingFiles(files) {
|
|
184
|
+
const existingFiles = await Promise.all(files.map(async (file) => {
|
|
185
|
+
try {
|
|
186
|
+
await access(file);
|
|
187
|
+
return file;
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
}));
|
|
193
|
+
return existingFiles.filter((file) => Boolean(file));
|
|
194
|
+
}
|
|
195
|
+
// ── Git helpers ────────────────────────────────────────────────────────
|
|
196
|
+
export async function getChangedFilesForIncremental({ git, baseBranch = 'origin/main', }) {
|
|
197
|
+
const mergeBase = await git.mergeBase('HEAD', baseBranch);
|
|
198
|
+
const committedOutput = await git.raw(['diff', '--name-only', `${mergeBase}...HEAD`]);
|
|
199
|
+
const committedFiles = committedOutput
|
|
200
|
+
.split('\n')
|
|
201
|
+
.map((f) => f.trim())
|
|
202
|
+
.filter(Boolean);
|
|
203
|
+
const unstagedOutput = await git.raw(['diff', '--name-only']);
|
|
204
|
+
const unstagedFiles = unstagedOutput
|
|
205
|
+
.split('\n')
|
|
206
|
+
.map((f) => f.trim())
|
|
207
|
+
.filter(Boolean);
|
|
208
|
+
const untrackedOutput = await git.raw(['ls-files', '--others', '--exclude-standard']);
|
|
209
|
+
const untrackedFiles = untrackedOutput
|
|
210
|
+
.split('\n')
|
|
211
|
+
.map((f) => f.trim())
|
|
212
|
+
.filter(Boolean);
|
|
213
|
+
return [...new Set([...committedFiles, ...unstagedFiles, ...untrackedFiles])];
|
|
214
|
+
}
|
|
215
|
+
export async function getAllChangedFiles(options = {}) {
|
|
216
|
+
const { git = createGitForPath(options.cwd ?? process.cwd()) } = options;
|
|
217
|
+
try {
|
|
218
|
+
return await getChangedFilesForIncremental({ git });
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
console.error('\u26A0\uFE0F Failed to get changed files:', error.message);
|
|
222
|
+
return [];
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// ── WU helpers ─────────────────────────────────────────────────────────
|
|
226
|
+
/**
|
|
227
|
+
* Parse a WU ID from a branch name.
|
|
228
|
+
* Returns canonical upper-case ID (e.g., WU-123) or null when not present.
|
|
229
|
+
*/
|
|
230
|
+
export function parseWUFromBranchName(branchName) {
|
|
231
|
+
if (!branchName) {
|
|
232
|
+
return null;
|
|
233
|
+
}
|
|
234
|
+
const match = branchName.match(/wu-(\d+)/i);
|
|
235
|
+
if (!match) {
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
return `WU-${match[1]}`.toUpperCase();
|
|
239
|
+
}
|
|
240
|
+
export async function detectCurrentWUForCwd(cwd) {
|
|
241
|
+
const workingDir = cwd ?? process.cwd();
|
|
242
|
+
try {
|
|
243
|
+
const branch = await createGitForPath(workingDir).getCurrentBranch();
|
|
244
|
+
const parsed = parseWUFromBranchName(branch);
|
|
245
|
+
if (parsed) {
|
|
246
|
+
return parsed;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
// Fall back to legacy process-cwd based resolver below.
|
|
251
|
+
}
|
|
252
|
+
return getCurrentWU();
|
|
253
|
+
}
|
|
254
|
+
// ── Package extraction (WU-1299) ──────────────────────────────────────
|
|
255
|
+
/**
|
|
256
|
+
* WU-1299: Extract package name from a single code path
|
|
257
|
+
*/
|
|
258
|
+
function extractPackageFromPath(codePath) {
|
|
259
|
+
if (!codePath || typeof codePath !== 'string') {
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
const normalized = codePath.replace(/\\/g, '/');
|
|
263
|
+
// Handle packages/@scope/name/... or packages/name/...
|
|
264
|
+
if (normalized.startsWith('packages/')) {
|
|
265
|
+
const parts = normalized.slice('packages/'.length).split('/');
|
|
266
|
+
// Scoped package (@scope/name)
|
|
267
|
+
if (parts[0]?.startsWith('@') && parts[1]) {
|
|
268
|
+
return `${parts[0]}/${parts[1]}`;
|
|
269
|
+
}
|
|
270
|
+
// Unscoped package
|
|
271
|
+
if (parts[0]) {
|
|
272
|
+
return parts[0];
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// WU-1415: Skip apps/ paths - they aren't valid turbo packages for test filtering
|
|
276
|
+
return null;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* WU-1299: Extract package/app names from code_paths
|
|
280
|
+
*/
|
|
281
|
+
export function extractPackagesFromCodePaths(codePaths) {
|
|
282
|
+
if (!codePaths || !Array.isArray(codePaths) || codePaths.length === 0) {
|
|
283
|
+
return [];
|
|
284
|
+
}
|
|
285
|
+
const packages = new Set();
|
|
286
|
+
for (const codePath of codePaths) {
|
|
287
|
+
const pkg = extractPackageFromPath(codePath);
|
|
288
|
+
if (pkg) {
|
|
289
|
+
packages.add(pkg);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return Array.from(packages);
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* WU-1299: Load code_paths from current WU YAML
|
|
296
|
+
*/
|
|
297
|
+
export function loadCurrentWUCodePaths(options = {}) {
|
|
298
|
+
const cwd = options.cwd ?? process.cwd();
|
|
299
|
+
const wuId = getCurrentWU();
|
|
300
|
+
if (!wuId) {
|
|
301
|
+
return [];
|
|
302
|
+
}
|
|
303
|
+
try {
|
|
304
|
+
const wuPaths = createWuPaths({ projectRoot: cwd });
|
|
305
|
+
const wuYamlPath = wuPaths.WU(wuId);
|
|
306
|
+
const wuDoc = readWURaw(wuYamlPath);
|
|
307
|
+
if (wuDoc && Array.isArray(wuDoc.code_paths)) {
|
|
308
|
+
return wuDoc.code_paths.filter((p) => typeof p === 'string');
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
// WU YAML not found or unreadable - return empty array
|
|
313
|
+
}
|
|
314
|
+
return [];
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=gates-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gates-utils.js","sourceRoot":"","sources":["../src/gates-utils.ts"],"names":[],"mappings":"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"}
|