@lumenflow/cli 2.20.1 → 2.21.1
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 +8 -4
- package/dist/hooks/enforcement-checks.js +120 -0
- package/dist/hooks/enforcement-checks.js.map +1 -1
- package/dist/init-lane-validation.js +141 -0
- package/dist/init-lane-validation.js.map +1 -0
- package/dist/init-templates.js +36 -8
- package/dist/init-templates.js.map +1 -1
- package/dist/init.js +27 -58
- package/dist/init.js.map +1 -1
- package/dist/initiative-create.js +35 -4
- package/dist/initiative-create.js.map +1 -1
- package/dist/lane-lifecycle-process.js +364 -0
- package/dist/lane-lifecycle-process.js.map +1 -0
- package/dist/lane-lock.js +41 -0
- package/dist/lane-lock.js.map +1 -0
- package/dist/lane-setup.js +55 -0
- package/dist/lane-setup.js.map +1 -0
- package/dist/lane-status.js +38 -0
- package/dist/lane-status.js.map +1 -0
- package/dist/lane-validate.js +43 -0
- package/dist/lane-validate.js.map +1 -0
- package/dist/onboarding-smoke-test.js +17 -0
- package/dist/onboarding-smoke-test.js.map +1 -1
- package/dist/public-manifest.js +28 -0
- package/dist/public-manifest.js.map +1 -1
- package/dist/wu-claim-cloud.js +16 -0
- package/dist/wu-claim-cloud.js.map +1 -1
- package/dist/wu-claim.js +12 -2
- package/dist/wu-claim.js.map +1 -1
- package/dist/wu-create-content.js +8 -2
- package/dist/wu-create-content.js.map +1 -1
- package/dist/wu-create-validation.js +5 -3
- package/dist/wu-create-validation.js.map +1 -1
- package/dist/wu-create.js +21 -1
- package/dist/wu-create.js.map +1 -1
- package/dist/wu-done.js +57 -8
- package/dist/wu-done.js.map +1 -1
- package/dist/wu-prep.js +22 -0
- package/dist/wu-prep.js.map +1 -1
- package/package.json +15 -11
- package/dist/__tests__/agent-log-issue.test.js +0 -56
- package/dist/__tests__/agent-spawn-coordination.test.js +0 -451
- package/dist/__tests__/backlog-prune.test.js +0 -478
- package/dist/__tests__/cli-entry-point.test.js +0 -160
- package/dist/__tests__/cli-subprocess.test.js +0 -89
- package/dist/__tests__/commands/integrate.test.js +0 -165
- package/dist/__tests__/commands.test.js +0 -271
- package/dist/__tests__/deps-operations.test.js +0 -206
- package/dist/__tests__/doctor.test.js +0 -510
- package/dist/__tests__/file-operations.test.js +0 -906
- package/dist/__tests__/flow-report.test.js +0 -24
- package/dist/__tests__/gates-config.test.js +0 -303
- package/dist/__tests__/gates-integration-tests.test.js +0 -112
- package/dist/__tests__/git-operations.test.js +0 -668
- package/dist/__tests__/guard-main-branch.test.js +0 -79
- package/dist/__tests__/guards-validation.test.js +0 -416
- package/dist/__tests__/hooks/enforcement.test.js +0 -279
- package/dist/__tests__/init-config-lanes.test.js +0 -131
- package/dist/__tests__/init-docs-structure.test.js +0 -152
- package/dist/__tests__/init-greenfield.test.js +0 -247
- package/dist/__tests__/init-lane-inference.test.js +0 -125
- package/dist/__tests__/init-onboarding-docs.test.js +0 -132
- package/dist/__tests__/init-quick-ref.test.js +0 -144
- package/dist/__tests__/init-scripts.test.js +0 -207
- package/dist/__tests__/init-template-portability.test.js +0 -96
- package/dist/__tests__/init.test.js +0 -968
- package/dist/__tests__/initiative-add-wu.test.js +0 -490
- package/dist/__tests__/initiative-e2e.test.js +0 -442
- package/dist/__tests__/initiative-plan-replacement.test.js +0 -161
- package/dist/__tests__/initiative-plan.test.js +0 -340
- package/dist/__tests__/initiative-remove-wu.test.js +0 -458
- package/dist/__tests__/lumenflow-upgrade.test.js +0 -260
- package/dist/__tests__/mem-cleanup-execution.test.js +0 -19
- package/dist/__tests__/memory-integration.test.js +0 -333
- package/dist/__tests__/merge-block.test.js +0 -220
- package/dist/__tests__/metrics-cli.test.js +0 -619
- package/dist/__tests__/metrics-snapshot.test.js +0 -24
- package/dist/__tests__/no-beacon-references-docs.test.js +0 -30
- package/dist/__tests__/no-beacon-references.test.js +0 -39
- package/dist/__tests__/onboarding-smoke-test.test.js +0 -211
- package/dist/__tests__/path-centralization-cli.test.js +0 -234
- package/dist/__tests__/plan-create.test.js +0 -126
- package/dist/__tests__/plan-edit.test.js +0 -157
- package/dist/__tests__/plan-link.test.js +0 -239
- package/dist/__tests__/plan-promote.test.js +0 -181
- package/dist/__tests__/release.test.js +0 -372
- package/dist/__tests__/rotate-progress.test.js +0 -127
- package/dist/__tests__/safe-git.test.js +0 -190
- package/dist/__tests__/session-coordinator.test.js +0 -109
- package/dist/__tests__/state-bootstrap.test.js +0 -432
- package/dist/__tests__/state-doctor.test.js +0 -328
- package/dist/__tests__/sync-templates.test.js +0 -255
- package/dist/__tests__/templates-sync.test.js +0 -219
- package/dist/__tests__/trace-gen.test.js +0 -115
- package/dist/__tests__/wu-create-required-fields.test.js +0 -143
- package/dist/__tests__/wu-create-strict.test.js +0 -118
- package/dist/__tests__/wu-create.test.js +0 -121
- package/dist/__tests__/wu-done-auto-cleanup.test.js +0 -135
- package/dist/__tests__/wu-done-docs-only-policy.test.js +0 -20
- package/dist/__tests__/wu-done-staging-whitelist.test.js +0 -35
- package/dist/__tests__/wu-done.test.js +0 -36
- package/dist/__tests__/wu-edit-strict.test.js +0 -109
- package/dist/__tests__/wu-edit.test.js +0 -119
- package/dist/__tests__/wu-lifecycle-integration.test.js +0 -388
- package/dist/__tests__/wu-prep-default-exec.test.js +0 -35
- package/dist/__tests__/wu-prep.test.js +0 -140
- package/dist/__tests__/wu-proto.test.js +0 -97
- package/dist/__tests__/wu-validate-strict.test.js +0 -113
- package/dist/__tests__/wu-validate.test.js +0 -36
- package/dist/spawn-list.js +0 -143
- package/dist/spawn-list.js.map +0 -1
package/README.md
CHANGED
|
@@ -130,10 +130,14 @@ This package provides CLI commands for the LumenFlow workflow framework, includi
|
|
|
130
130
|
|
|
131
131
|
### Lane Tooling
|
|
132
132
|
|
|
133
|
-
| Command
|
|
134
|
-
|
|
|
135
|
-
| `lane-health`
|
|
136
|
-
| `lane-
|
|
133
|
+
| Command | Description |
|
|
134
|
+
| --------------- | ---------------------------------------- |
|
|
135
|
+
| `lane-health` | Check lane config health |
|
|
136
|
+
| `lane-lock` | Lock lane lifecycle for delivery WUs |
|
|
137
|
+
| `lane-setup` | Create/update draft lane artifacts |
|
|
138
|
+
| `lane-status` | Show lane lifecycle status and next step |
|
|
139
|
+
| `lane-suggest` | Suggest lane for code paths |
|
|
140
|
+
| `lane-validate` | Validate lane artifacts before lock |
|
|
137
141
|
|
|
138
142
|
### Verification & Gates
|
|
139
143
|
|
|
@@ -22,6 +22,126 @@ const MAIN_WRITE_ALLOWLIST_PREFIXES = [
|
|
|
22
22
|
'.claude/',
|
|
23
23
|
'plan/',
|
|
24
24
|
];
|
|
25
|
+
const GIT_STATUS_PREFIX_LENGTH = 3;
|
|
26
|
+
const GIT_STATUS_RENAME_SEPARATOR = ' -> ';
|
|
27
|
+
const GIT_STATUS_QUOTE = '"';
|
|
28
|
+
const PATH_PREFIX_CURRENT_DIR = './';
|
|
29
|
+
const PATH_SEPARATOR_WINDOWS = '\\';
|
|
30
|
+
const PATH_SEPARATOR_POSIX = '/';
|
|
31
|
+
const MAX_BLOCKED_PATHS_IN_MESSAGE = 10;
|
|
32
|
+
const DIRTY_MAIN_GUARD_REASONS = {
|
|
33
|
+
BRANCH_PR_MODE: 'branch-pr-mode',
|
|
34
|
+
NO_WORKTREE_CONTEXT: 'no-worktree-context',
|
|
35
|
+
CLEAN_OR_ALLOWLISTED: 'clean-or-allowlisted',
|
|
36
|
+
BLOCKED_NON_ALLOWLISTED_DIRTY_MAIN: 'blocked-non-allowlisted-dirty-main',
|
|
37
|
+
};
|
|
38
|
+
function stripWrappingQuotes(value) {
|
|
39
|
+
if (value.startsWith(GIT_STATUS_QUOTE) && value.endsWith(GIT_STATUS_QUOTE) && value.length >= 2) {
|
|
40
|
+
return value.slice(1, -1);
|
|
41
|
+
}
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
function normalizeRepoRelativePath(value) {
|
|
45
|
+
const withoutQuotes = stripWrappingQuotes(value.trim());
|
|
46
|
+
const normalizedSeparators = withoutQuotes
|
|
47
|
+
.split(PATH_SEPARATOR_WINDOWS)
|
|
48
|
+
.join(PATH_SEPARATOR_POSIX);
|
|
49
|
+
if (normalizedSeparators.startsWith(PATH_PREFIX_CURRENT_DIR)) {
|
|
50
|
+
return normalizedSeparators.slice(PATH_PREFIX_CURRENT_DIR.length);
|
|
51
|
+
}
|
|
52
|
+
return normalizedSeparators;
|
|
53
|
+
}
|
|
54
|
+
function parsePathFromStatusLine(line) {
|
|
55
|
+
if (line.length < GIT_STATUS_PREFIX_LENGTH) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
const pathField = line.slice(GIT_STATUS_PREFIX_LENGTH).trim();
|
|
59
|
+
if (pathField.length === 0) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
// For renames, git status emits "old -> new". We care about the destination path.
|
|
63
|
+
const renameSegments = pathField.split(GIT_STATUS_RENAME_SEPARATOR);
|
|
64
|
+
const destinationPath = renameSegments[renameSegments.length - 1];
|
|
65
|
+
const normalizedPath = normalizeRepoRelativePath(destinationPath);
|
|
66
|
+
return normalizedPath.length > 0 ? normalizedPath : null;
|
|
67
|
+
}
|
|
68
|
+
export function parseDirtyPathsFromStatus(mainStatus) {
|
|
69
|
+
const uniquePaths = new Set();
|
|
70
|
+
for (const line of mainStatus.split('\n')) {
|
|
71
|
+
const trimmed = line.trimEnd();
|
|
72
|
+
if (trimmed.length === 0) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const parsed = parsePathFromStatusLine(trimmed);
|
|
76
|
+
if (parsed) {
|
|
77
|
+
uniquePaths.add(parsed);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return Array.from(uniquePaths);
|
|
81
|
+
}
|
|
82
|
+
export function getNonAllowlistedDirtyPaths(mainStatus, allowlistPrefixes = MAIN_WRITE_ALLOWLIST_PREFIXES) {
|
|
83
|
+
return parseDirtyPathsFromStatus(mainStatus).filter((relativePath) => !allowlistPrefixes.some((prefix) => relativePath.startsWith(prefix)));
|
|
84
|
+
}
|
|
85
|
+
function formatBlockedPaths(paths) {
|
|
86
|
+
const displayed = paths.slice(0, MAX_BLOCKED_PATHS_IN_MESSAGE);
|
|
87
|
+
const lines = displayed.map((dirtyPath) => ` - ${dirtyPath}`);
|
|
88
|
+
const remainder = paths.length - displayed.length;
|
|
89
|
+
if (remainder > 0) {
|
|
90
|
+
lines.push(` - ... and ${remainder} more`);
|
|
91
|
+
}
|
|
92
|
+
return lines.join('\n');
|
|
93
|
+
}
|
|
94
|
+
export function formatMainDirtyMutationGuardMessage(options) {
|
|
95
|
+
const { commandName, mainCheckout, blockedPaths } = options;
|
|
96
|
+
return (`${commandName} blocked: main checkout has non-allowlisted dirty files while a worktree WU is active.\n\n` +
|
|
97
|
+
`Dirty paths:\n${formatBlockedPaths(blockedPaths)}\n\n` +
|
|
98
|
+
`Allowed dirty prefixes on main:\n` +
|
|
99
|
+
` - docs/04-operations/tasks/wu/\n` +
|
|
100
|
+
` - .lumenflow/\n` +
|
|
101
|
+
` - .claude/\n` +
|
|
102
|
+
` - plan/\n\n` +
|
|
103
|
+
`How to resolve:\n` +
|
|
104
|
+
` 1. Move edits into the active worktree (recommended)\n` +
|
|
105
|
+
` 2. Revert or commit unintended main edits\n` +
|
|
106
|
+
` 3. If writes came from MCP/tools, rerun them in the worktree path\n` +
|
|
107
|
+
` 4. Retry ${commandName}\n\n` +
|
|
108
|
+
`Main checkout: ${mainCheckout}`);
|
|
109
|
+
}
|
|
110
|
+
export function evaluateMainDirtyMutationGuard(options) {
|
|
111
|
+
const { commandName, mainCheckout, mainStatus, hasActiveWorktreeContext, isBranchPrMode } = options;
|
|
112
|
+
if (isBranchPrMode) {
|
|
113
|
+
return {
|
|
114
|
+
blocked: false,
|
|
115
|
+
blockedPaths: [],
|
|
116
|
+
reason: DIRTY_MAIN_GUARD_REASONS.BRANCH_PR_MODE,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
if (!hasActiveWorktreeContext) {
|
|
120
|
+
return {
|
|
121
|
+
blocked: false,
|
|
122
|
+
blockedPaths: [],
|
|
123
|
+
reason: DIRTY_MAIN_GUARD_REASONS.NO_WORKTREE_CONTEXT,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
const blockedPaths = getNonAllowlistedDirtyPaths(mainStatus);
|
|
127
|
+
if (blockedPaths.length === 0) {
|
|
128
|
+
return {
|
|
129
|
+
blocked: false,
|
|
130
|
+
blockedPaths: [],
|
|
131
|
+
reason: DIRTY_MAIN_GUARD_REASONS.CLEAN_OR_ALLOWLISTED,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
blocked: true,
|
|
136
|
+
blockedPaths,
|
|
137
|
+
reason: DIRTY_MAIN_GUARD_REASONS.BLOCKED_NON_ALLOWLISTED_DIRTY_MAIN,
|
|
138
|
+
message: formatMainDirtyMutationGuardMessage({
|
|
139
|
+
commandName,
|
|
140
|
+
mainCheckout,
|
|
141
|
+
blockedPaths,
|
|
142
|
+
}),
|
|
143
|
+
};
|
|
144
|
+
}
|
|
25
145
|
/**
|
|
26
146
|
* WU-1501: Check if a resolved path matches the main-write allowlist.
|
|
27
147
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enforcement-checks.js","sourceRoot":"","sources":["../../src/hooks/enforcement-checks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,8EAA8E;AAE9E,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC;;;;GAIG;AACH,MAAM,6BAA6B,GAAG;IACpC,8BAA8B;IAC9B,aAAa;IACb,UAAU;IACV,OAAO;CACC,CAAC;
|
|
1
|
+
{"version":3,"file":"enforcement-checks.js","sourceRoot":"","sources":["../../src/hooks/enforcement-checks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file init-lane-validation.ts
|
|
3
|
+
* Lane config validation against inference hierarchy.
|
|
4
|
+
*
|
|
5
|
+
* WU-1745: Validate lane config against inference hierarchy at init time
|
|
6
|
+
*
|
|
7
|
+
* Cross-checks lane definitions in .lumenflow.config.yaml against
|
|
8
|
+
* .lumenflow.lane-inference.yaml parents. Catches invalid parent names
|
|
9
|
+
* (e.g., "Foundation: Core" when "Foundation" is not a valid parent)
|
|
10
|
+
* at init time instead of deferring to wu:create.
|
|
11
|
+
*/
|
|
12
|
+
import * as fs from 'node:fs';
|
|
13
|
+
import * as path from 'node:path';
|
|
14
|
+
import * as yaml from 'yaml';
|
|
15
|
+
/** Separator between parent and sublane in lane names */
|
|
16
|
+
const LANE_NAME_SEPARATOR = ': ';
|
|
17
|
+
/**
|
|
18
|
+
* Extract the parent name from a "Parent: Sublane" lane name.
|
|
19
|
+
*
|
|
20
|
+
* @param laneName - Lane name in "Parent: Sublane" format
|
|
21
|
+
* @returns The parent portion, or null if no separator found
|
|
22
|
+
*/
|
|
23
|
+
function extractParentName(laneName) {
|
|
24
|
+
const separatorIndex = laneName.indexOf(LANE_NAME_SEPARATOR);
|
|
25
|
+
if (separatorIndex === -1) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
return laneName.substring(0, separatorIndex);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Validate lane definitions from config against valid inference hierarchy parents.
|
|
32
|
+
*
|
|
33
|
+
* Checks that each lane's parent (the part before ": ") exists as a top-level
|
|
34
|
+
* key in the lane inference hierarchy.
|
|
35
|
+
*
|
|
36
|
+
* @param configLanes - Lane definitions from .lumenflow.config.yaml
|
|
37
|
+
* @param inferenceParents - Valid parent names from .lumenflow.lane-inference.yaml
|
|
38
|
+
* @returns Validation result with warnings and invalid lane names
|
|
39
|
+
*/
|
|
40
|
+
export function validateLaneConfigAgainstInference(configLanes, inferenceParents) {
|
|
41
|
+
const warnings = [];
|
|
42
|
+
const invalidLanes = [];
|
|
43
|
+
if (configLanes.length === 0) {
|
|
44
|
+
return { warnings, invalidLanes };
|
|
45
|
+
}
|
|
46
|
+
const validParentSet = new Set(inferenceParents);
|
|
47
|
+
for (const lane of configLanes) {
|
|
48
|
+
const parent = extractParentName(lane.name);
|
|
49
|
+
if (parent === null) {
|
|
50
|
+
// Lane name doesn't use "Parent: Sublane" format
|
|
51
|
+
warnings.push(`Lane "${lane.name}" does not use the required "Parent: Sublane" format. ` +
|
|
52
|
+
`Valid parent names: ${inferenceParents.join(', ')}`);
|
|
53
|
+
invalidLanes.push(lane.name);
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (!validParentSet.has(parent)) {
|
|
57
|
+
warnings.push(`Lane "${lane.name}" uses invalid parent "${parent}". ` +
|
|
58
|
+
`Valid parent names in lane-inference hierarchy: ${inferenceParents.join(', ')}`);
|
|
59
|
+
invalidLanes.push(lane.name);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return { warnings, invalidLanes };
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Extract top-level parent names from a lane inference YAML file.
|
|
66
|
+
*
|
|
67
|
+
* The lane inference file uses hierarchical format:
|
|
68
|
+
* Parent:
|
|
69
|
+
* Sublane:
|
|
70
|
+
* code_paths: [...]
|
|
71
|
+
*
|
|
72
|
+
* This function returns the top-level keys (parent names).
|
|
73
|
+
*
|
|
74
|
+
* @param laneInferencePath - Path to .lumenflow.lane-inference.yaml
|
|
75
|
+
* @returns Array of parent names, or empty array if file doesn't exist/is invalid
|
|
76
|
+
*/
|
|
77
|
+
export function extractInferenceParents(laneInferencePath) {
|
|
78
|
+
if (!fs.existsSync(laneInferencePath)) {
|
|
79
|
+
return [];
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
const content = fs.readFileSync(laneInferencePath, 'utf-8');
|
|
83
|
+
const parsed = yaml.parse(content);
|
|
84
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
85
|
+
return [];
|
|
86
|
+
}
|
|
87
|
+
// Top-level keys are parent names
|
|
88
|
+
return Object.keys(parsed);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Extract lane definitions from a config YAML file.
|
|
96
|
+
*
|
|
97
|
+
* @param configPath - Path to .lumenflow.config.yaml
|
|
98
|
+
* @returns Array of lane definitions, or empty array if not found
|
|
99
|
+
*/
|
|
100
|
+
export function extractConfigLanes(configPath) {
|
|
101
|
+
if (!fs.existsSync(configPath)) {
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
106
|
+
const parsed = yaml.parse(content);
|
|
107
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
108
|
+
return [];
|
|
109
|
+
}
|
|
110
|
+
const lanes = parsed.lanes;
|
|
111
|
+
const definitions = lanes?.definitions;
|
|
112
|
+
if (!Array.isArray(definitions)) {
|
|
113
|
+
return [];
|
|
114
|
+
}
|
|
115
|
+
return definitions;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return [];
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Run lane validation for a project directory.
|
|
123
|
+
*
|
|
124
|
+
* Reads both .lumenflow.config.yaml and .lumenflow.lane-inference.yaml,
|
|
125
|
+
* then validates that all lane parents exist in the inference hierarchy.
|
|
126
|
+
*
|
|
127
|
+
* @param targetDir - Project root directory
|
|
128
|
+
* @returns Validation result with warnings and invalid lane names
|
|
129
|
+
*/
|
|
130
|
+
export function validateLanesForProject(targetDir) {
|
|
131
|
+
const configPath = path.join(targetDir, '.lumenflow.config.yaml');
|
|
132
|
+
const inferencePath = path.join(targetDir, '.lumenflow.lane-inference.yaml');
|
|
133
|
+
const configLanes = extractConfigLanes(configPath);
|
|
134
|
+
const inferenceParents = extractInferenceParents(inferencePath);
|
|
135
|
+
// If either file is missing or empty, skip validation
|
|
136
|
+
if (configLanes.length === 0 || inferenceParents.length === 0) {
|
|
137
|
+
return { warnings: [], invalidLanes: [] };
|
|
138
|
+
}
|
|
139
|
+
return validateLaneConfigAgainstInference(configLanes, inferenceParents);
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=init-lane-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-lane-validation.js","sourceRoot":"","sources":["../src/init-lane-validation.ts"],"names":[],"mappings":"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"}
|
package/dist/init-templates.js
CHANGED
|
@@ -52,6 +52,13 @@ This project uses LumenFlow workflow. For complete documentation, see [LUMENFLOW
|
|
|
52
52
|
|
|
53
53
|
## Quick Start
|
|
54
54
|
|
|
55
|
+
\`\`\`bash
|
|
56
|
+
# First-time lane setup (once per project)
|
|
57
|
+
pnpm lane:setup
|
|
58
|
+
pnpm lane:validate
|
|
59
|
+
pnpm lane:lock
|
|
60
|
+
\`\`\`
|
|
61
|
+
|
|
55
62
|
\`\`\`bash
|
|
56
63
|
# 1. Claim a WU
|
|
57
64
|
pnpm wu:claim --id WU-XXXX --lane <Lane>
|
|
@@ -106,7 +113,7 @@ This file provides universal guidance for all AI agents. Additional vendor-speci
|
|
|
106
113
|
// Template for LUMENFLOW.md (main entry point)
|
|
107
114
|
// WU-1309: Use <project-root> placeholder for portability
|
|
108
115
|
// WU-1364: Added initiative workflow section
|
|
109
|
-
export const LUMENFLOW_MD_TEMPLATE = `# LumenFlow Workflow Guide\n\n**Last updated:** {{DATE}}\n\nLumenFlow is a vendor-agnostic workflow framework for AI-native software development.\n\n---\n\n## Critical Rule: ALWAYS Run wu:done\n\n**After completing work on a WU, you MUST run \`pnpm wu:done --id WU-XXXX\` from the main checkout.**\n\nThis is the single most forgotten step. Do NOT:\n- Write "To Complete: pnpm wu:done" and stop\n- Ask if you should run wu:done\n- Forget to run wu:done\n\n**DO**: Run \`pnpm wu:done --id WU-XXXX\` immediately after gates pass.\n\n---\n\n## When to Use Initiatives\n\nUse **Initiatives** for multi-phase work spanning multiple WUs:\n\n- **Product visions**: "Build a task management app"\n- **Larger features**: Work requiring multiple WUs across lanes\n- **Complex projects**: Anything that needs phased delivery\n\n\`\`\`bash\n# Create an initiative for multi-phase work\npnpm initiative:create --id INIT-001 --title "Feature Name" \\\\\n --description "..." --phase "Phase 1: MVP" --phase "Phase 2: Polish"\n\n# Add WUs to the initiative\npnpm initiative:add-wu --initiative INIT-001 --wu WU-XXX --phase 1\n\n# Track progress\npnpm initiative:status --id INIT-001\n\`\`\`\n\n**Skip initiatives** for: single-file bug fixes, small docs updates, isolated refactoring.\n\n---\n\n## Quick Start\n\n\`\`\`bash\n# 1. Create a WU\npnpm wu:create --id WU-XXXX --lane <Lane> --title "Title"\n\n#
|
|
116
|
+
export const LUMENFLOW_MD_TEMPLATE = `# LumenFlow Workflow Guide\n\n**Last updated:** {{DATE}}\n\nLumenFlow is a vendor-agnostic workflow framework for AI-native software development.\n\n---\n\n## Critical Rule: ALWAYS Run wu:done\n\n**After completing work on a WU, you MUST run \`pnpm wu:done --id WU-XXXX\` from the main checkout.**\n\nThis is the single most forgotten step. Do NOT:\n- Write "To Complete: pnpm wu:done" and stop\n- Ask if you should run wu:done\n- Forget to run wu:done\n\n**DO**: Run \`pnpm wu:done --id WU-XXXX\` immediately after gates pass.\n\n---\n\n## When to Use Initiatives\n\nUse **Initiatives** for multi-phase work spanning multiple WUs:\n\n- **Product visions**: "Build a task management app"\n- **Larger features**: Work requiring multiple WUs across lanes\n- **Complex projects**: Anything that needs phased delivery\n\n\`\`\`bash\n# Create an initiative for multi-phase work\npnpm initiative:create --id INIT-001 --title "Feature Name" \\\\\n --description "..." --phase "Phase 1: MVP" --phase "Phase 2: Polish"\n\n# Add WUs to the initiative\npnpm initiative:add-wu --initiative INIT-001 --wu WU-XXX --phase 1\n\n# Track progress\npnpm initiative:status --id INIT-001\n\`\`\`\n\n**Skip initiatives** for: single-file bug fixes, small docs updates, isolated refactoring.\n\n---\n\n## Quick Start\n\n\`\`\`bash\n# 1. Configure lanes (once per project)\npnpm lane:setup\npnpm lane:validate\npnpm lane:lock\n\n# 2. Create a WU\npnpm wu:create --id WU-XXXX --lane <Lane> --title "Title"\n\n# 3. Edit WU spec with acceptance criteria, then claim:\npnpm wu:claim --id WU-XXXX --lane <Lane>\ncd worktrees/<lane>-wu-xxxx\n\n# 4. Implement in worktree\n\n# 5. Run gates\npnpm gates --docs-only # for docs changes\npnpm gates # for code changes\n\n# 6. Complete (from main checkout)\ncd <project-root>\npnpm wu:done --id WU-XXXX\n\`\`\`\n\n---\n\n## Core Principles\n\n1. **TDD**: Failing test -> implementation -> passing test (>=90% coverage on new code)\n2. **Library-First**: Search existing libraries before custom code\n3. **DRY/SOLID/KISS/YAGNI**: No magic numbers, no hardcoded strings\n4. **Worktree Discipline**: After \`wu:claim\`, work ONLY in the worktree\n5. **Gates Before Done**: All gates must pass before \`wu:done\`\n6. **Do Not Bypass Hooks**: No \`--no-verify\`, fix issues properly\n7. **Always wu:done**: Complete every WU by running \`pnpm wu:done\`\n\n---\n\n## Documentation Structure\n\n### Core (Vendor-Agnostic)\n\n- **LUMENFLOW.md** - This file, main entry point\n- **.lumenflow/constraints.md** - Non-negotiable workflow constraints\n- **.lumenflow/agents/** - Agent instructions (vendor-agnostic)\n- **.lumenflow.config.yaml** - Workflow configuration\n\n### Optional Overlays\n\n- **CLAUDE.md + .claude/agents/** - Claude Code overlay (auto if Claude Code detected)\n- **{{DOCS_TASKS_PATH}}** - Task boards and WU storage (\`lumenflow init --full\`)\n- **{{DOCS_ONBOARDING_PATH}}** - Agent onboarding docs\n- **.lumenflow.framework.yaml** - Framework hint file (created with \`--framework\`)\n\n---\n\n## Worktree Discipline (IMMUTABLE LAW)\n\nAfter claiming a WU, you MUST work in its worktree:\n\n\`\`\`bash\n# 1. Claim creates worktree\npnpm wu:claim --id WU-XXX --lane <lane>\n\n# 2. IMMEDIATELY cd to worktree\ncd worktrees/<lane>-wu-xxx\n\n# 3. ALL work happens here\n\n# 4. Return to main ONLY to complete\ncd <project-root>\npnpm wu:done --id WU-XXX\n\`\`\`\n\n---\n\n## Definition of Done\n\n- Acceptance criteria satisfied\n- Gates green (\`pnpm gates\` or \`pnpm gates --docs-only\`)\n- WU YAML status = \`done\`\n- \`wu:done\` has been run\n\n---\n\n## Commands Reference\n\n| Command | Description |\n| ----------------- | ----------------------------------- |\n| \`pnpm lane:status\` | Show lane lifecycle status |\n| \`pnpm lane:setup\` | Create/update draft lane artifacts |\n| \`pnpm lane:lock\` | Lock lane lifecycle for WU creation |\n| \`pnpm wu:create\` | Create new WU spec |\n| \`pnpm wu:claim\` | Claim WU and create worktree |\n| \`pnpm wu:done\` | Complete WU (merge, stamp, cleanup) |\n| \`pnpm gates\` | Run quality gates |\n| \`pnpm initiative:create\` | Create multi-phase initiative |\n| \`pnpm initiative:status\` | View initiative progress |\n\n---\n\n## Constraints\n\nSee [.lumenflow/constraints.md](.lumenflow/constraints.md) for the 6 non-negotiable rules.\n\n---\n\n## Agent Onboarding\n\n- Start with **CLAUDE.md** if present (Claude Code overlay).\n- Add vendor-agnostic guidance in **.lumenflow/agents/**.\n- Check the onboarding docs in **{{DOCS_ONBOARDING_PATH}}** for detailed guidance.\n`;
|
|
110
117
|
// Template for .lumenflow/constraints.md
|
|
111
118
|
export const CONSTRAINTS_MD_TEMPLATE = `# LumenFlow Constraints Capsule\n\n**Version:** 1.0\n**Last updated:** {{DATE}}\n\n## The 6 Non-Negotiable Constraints\n\n### 1. Worktree Discipline and Git Safety\nWork only in worktrees, treat main as read-only, never run destructive git commands on main.\n\n### 2. WUs Are Specs, Not Code\nRespect code_paths boundaries, no feature creep, no code blocks in WU YAML files.\n\n### 3. Docs-Only vs Code WUs\nDocumentation WUs use \`--docs-only\` gates, code WUs run full gates.\n\n### 4. LLM-First, Zero-Fallback Inference\nUse LLMs for semantic tasks, fall back to safe defaults (never regex/keywords).\n\n### 5. Gates and Skip-Gates\nComplete via \`pnpm wu:done\`; skip-gates only for pre-existing failures with \`--reason\` and \`--fix-wu\`.\n\n### 6. Safety and Governance\nRespect privacy rules, approved sources, security policies; when uncertain, choose safer path.\n\n---\n\n## Mini Audit Checklist\n\nBefore running \`wu:done\`, verify:\n\n- [ ] Working in worktree (not main)\n- [ ] Only modified files in \`code_paths\`\n- [ ] Gates pass\n- [ ] No forbidden git commands used\n- [ ] Acceptance criteria satisfied\n\n---\n\n## Escalation Triggers\n\nStop and ask a human when:\n- Same error repeats 3 times\n- Auth or permissions changes required\n- PII/safety issues discovered\n- Cloud spend or secrets involved\n`;
|
|
112
119
|
// Template for root CLAUDE.md
|
|
@@ -1459,14 +1466,18 @@ pnpm wu:infer-lane --paths "packages/@lumenflow/cli/**" --desc "Add CLI command"
|
|
|
1459
1466
|
|
|
1460
1467
|
---
|
|
1461
1468
|
|
|
1462
|
-
##
|
|
1469
|
+
## Lane Lifecycle Setup
|
|
1463
1470
|
|
|
1464
|
-
|
|
1471
|
+
Before creating delivery WUs, complete lane lifecycle:
|
|
1465
1472
|
|
|
1466
1473
|
\`\`\`bash
|
|
1467
|
-
pnpm lane:
|
|
1474
|
+
pnpm lane:setup
|
|
1475
|
+
pnpm lane:validate
|
|
1476
|
+
pnpm lane:lock
|
|
1468
1477
|
\`\`\`
|
|
1469
1478
|
|
|
1479
|
+
Use \`pnpm lane:status\` to inspect current state.
|
|
1480
|
+
|
|
1470
1481
|
---
|
|
1471
1482
|
|
|
1472
1483
|
## Common Issues
|
|
@@ -1479,12 +1490,14 @@ pnpm lane:suggest --output .lumenflow.lane-inference.yaml
|
|
|
1479
1490
|
|
|
1480
1491
|
### "Sub-lane validation failed"
|
|
1481
1492
|
|
|
1482
|
-
**Cause:**
|
|
1493
|
+
**Cause:** Lane lifecycle is not locked or taxonomy is missing.
|
|
1483
1494
|
|
|
1484
|
-
**Fix:**
|
|
1495
|
+
**Fix:** Run lane lifecycle setup:
|
|
1485
1496
|
|
|
1486
1497
|
\`\`\`bash
|
|
1487
|
-
pnpm lane:
|
|
1498
|
+
pnpm lane:setup
|
|
1499
|
+
pnpm lane:validate
|
|
1500
|
+
pnpm lane:lock
|
|
1488
1501
|
\`\`\`
|
|
1489
1502
|
|
|
1490
1503
|
---
|
|
@@ -1792,8 +1805,12 @@ pnpm typecheck # Check types
|
|
|
1792
1805
|
export const GITIGNORE_TEMPLATE = `# Dependencies
|
|
1793
1806
|
node_modules/
|
|
1794
1807
|
|
|
1795
|
-
# LumenFlow
|
|
1808
|
+
# LumenFlow runtime state (local only, not shared)
|
|
1796
1809
|
.lumenflow/telemetry/
|
|
1810
|
+
.lumenflow/flow.log
|
|
1811
|
+
.lumenflow/commands.log
|
|
1812
|
+
.lumenflow/sessions/
|
|
1813
|
+
.lumenflow/memory/
|
|
1797
1814
|
|
|
1798
1815
|
# Worktrees (isolated parallel work directories)
|
|
1799
1816
|
worktrees/
|
|
@@ -1802,6 +1819,9 @@ worktrees/
|
|
|
1802
1819
|
dist/
|
|
1803
1820
|
*.tsbuildinfo
|
|
1804
1821
|
|
|
1822
|
+
# Turbo
|
|
1823
|
+
.turbo/
|
|
1824
|
+
|
|
1805
1825
|
# Environment files
|
|
1806
1826
|
.env
|
|
1807
1827
|
.env.local
|
|
@@ -1827,6 +1847,9 @@ dist/
|
|
|
1827
1847
|
# Coverage reports
|
|
1828
1848
|
coverage/
|
|
1829
1849
|
|
|
1850
|
+
# Turbo
|
|
1851
|
+
.turbo/
|
|
1852
|
+
|
|
1830
1853
|
# LumenFlow state (local only)
|
|
1831
1854
|
.lumenflow/state/
|
|
1832
1855
|
|
|
@@ -1924,5 +1947,10 @@ export const GATE_STUB_SCRIPTS = {
|
|
|
1924
1947
|
'spec:linter': 'echo "[lumenflow] spec:linter stub -- install a WU spec linter or replace this script" && exit 0',
|
|
1925
1948
|
lint: 'echo "[lumenflow] lint stub -- add ESLint or your preferred linter to enable this gate (e.g. eslint .)" && exit 0',
|
|
1926
1949
|
typecheck: 'echo "[lumenflow] typecheck stub -- add TypeScript or your type checker to enable this gate (e.g. tsc --noEmit)" && exit 0',
|
|
1950
|
+
// WU-1747: format and format:check stubs that auto-detect prettier availability.
|
|
1951
|
+
// When prettier is installed (after pnpm install), they run prettier directly.
|
|
1952
|
+
// When prettier is not installed, they exit 0 with guidance -- matching other gate stubs.
|
|
1953
|
+
format: 'if command -v prettier >/dev/null 2>&1; then prettier --write .; else echo "[lumenflow] format stub -- install prettier to enable formatting (pnpm install)"; fi',
|
|
1954
|
+
'format:check': 'if command -v prettier >/dev/null 2>&1; then prettier --check .; else echo "[lumenflow] format:check stub -- install prettier to enable this gate (pnpm install)"; fi',
|
|
1927
1955
|
};
|
|
1928
1956
|
//# sourceMappingURL=init-templates.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-templates.js","sourceRoot":"","sources":["../src/init-templates.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,mEAAmE;AACnE,sEAAsE;AACtE,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC;QACE,IAAI,EAAE,iBAAiB;QACvB,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC,qBAAqB,EAAE,aAAa,EAAE,QAAQ,CAAC;KAC7D;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC,oBAAoB,EAAE,YAAY,EAAE,QAAQ,CAAC;KAC3D;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC,aAAa,EAAE,QAAQ,EAAE,mBAAmB,EAAE,cAAc,EAAE,YAAY,CAAC;KACzF;IACD;QACE,IAAI,EAAE,4BAA4B;QAClC,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC,mBAAmB,EAAE,WAAW,CAAC;KAC/C;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC,sBAAsB,EAAE,oBAAoB,EAAE,cAAc,CAAC;KAC3E;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC;KAChC;CACF,CAAC;AAEF,0DAA0D;AAC1D,kDAAkD;AAClD,iFAAiF;AACjF,MAAM,CAAC,MAAM,kBAAkB,GAAG
|
|
1
|
+
{"version":3,"file":"init-templates.js","sourceRoot":"","sources":["../src/init-templates.ts"],"names":[],"mappings":"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"}
|
package/dist/init.js
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* WU-1643: Extracted template constants into init-templates.ts
|
|
11
11
|
* WU-1644: Extracted detection helpers into init-detection.ts,
|
|
12
12
|
* scaffolding helpers into init-scaffolding.ts
|
|
13
|
+
* WU-1748: Deferred lane lifecycle - init no longer finalizes lane artifacts
|
|
13
14
|
*/
|
|
14
15
|
import * as fs from 'node:fs';
|
|
15
16
|
import * as path from 'node:path';
|
|
@@ -29,8 +30,9 @@ import { integrateClaudeCode } from './commands/integrate.js';
|
|
|
29
30
|
// WU-1433: Import public manifest to derive scripts (no hardcoded subset)
|
|
30
31
|
import { getPublicManifest } from './public-manifest.js';
|
|
31
32
|
import { runCLI } from './cli-entry-point.js';
|
|
33
|
+
import { buildInitLaneLifecycleMessage, LANE_LIFECYCLE_STATUS } from './lane-lifecycle-process.js';
|
|
32
34
|
// WU-1643: Import template constants from dedicated data module
|
|
33
|
-
import {
|
|
35
|
+
import { AGENTS_MD_TEMPLATE, LUMENFLOW_MD_TEMPLATE, CONSTRAINTS_MD_TEMPLATE, CLAUDE_MD_TEMPLATE, CLAUDE_SETTINGS_TEMPLATE, CURSOR_RULES_TEMPLATE, WINDSURF_RULES_TEMPLATE, CLINE_RULES_TEMPLATE, AIDER_CONF_TEMPLATE, MCP_JSON_TEMPLATE, BACKLOG_TEMPLATE, STATUS_TEMPLATE, WU_TEMPLATE_YAML, FRAMEWORK_HINT_TEMPLATE, FRAMEWORK_OVERLAY_TEMPLATE, QUICK_REF_COMMANDS_TEMPLATE, FIRST_WU_MISTAKES_TEMPLATE, TROUBLESHOOTING_WU_DONE_TEMPLATE, AGENT_SAFETY_CARD_TEMPLATE, STARTING_PROMPT_TEMPLATE, WU_CREATE_CHECKLIST_TEMPLATE, FIRST_15_MINS_TEMPLATE, LOCAL_ONLY_TEMPLATE, LANE_INFERENCE_DOC_TEMPLATE, WU_SIZING_GUIDE_TEMPLATE, WU_LIFECYCLE_SKILL_TEMPLATE, WORKTREE_DISCIPLINE_SKILL_TEMPLATE, LUMENFLOW_GATES_SKILL_TEMPLATE, GITIGNORE_TEMPLATE, PRETTIERIGNORE_TEMPLATE, SAFE_GIT_TEMPLATE, PRE_COMMIT_TEMPLATE, GATE_STUB_SCRIPTS, SCRIPT_ARG_OVERRIDES, } from './init-templates.js';
|
|
34
36
|
// WU-1644: Import detection helpers from dedicated module
|
|
35
37
|
import { checkPrerequisites, getDocsPath, detectDocsStructure, detectDefaultClient, isGitRepo, hasGitCommits, detectGitStateConfig, } from './init-detection.js';
|
|
36
38
|
// WU-1644: Re-export detection functions for backwards compatibility
|
|
@@ -163,7 +165,7 @@ async function checkBranchGuard(targetDir, result) {
|
|
|
163
165
|
* WU-1364: Supports git config overrides (requireRemote)
|
|
164
166
|
* WU-1383: Adds enforcement hooks config for Claude client by default
|
|
165
167
|
*/
|
|
166
|
-
function generateLumenflowConfigYaml(gatePreset, gitConfigOverride, client) {
|
|
168
|
+
function generateLumenflowConfigYaml(gatePreset, gitConfigOverride, client, docsPaths) {
|
|
167
169
|
// WU-1382: Add managed file header to prevent manual edits
|
|
168
170
|
const header = `# ============================================================================
|
|
169
171
|
# LUMENFLOW MANAGED FILE - DO NOT EDIT MANUALLY
|
|
@@ -181,6 +183,16 @@ function generateLumenflowConfigYaml(gatePreset, gitConfigOverride, client) {
|
|
|
181
183
|
`;
|
|
182
184
|
const config = getDefaultConfig();
|
|
183
185
|
config.directories.agentsDir = LUMENFLOW_AGENTS_DIR;
|
|
186
|
+
// WU-1755: Override directory paths to match detected docs structure.
|
|
187
|
+
// Without this, schema defaults (arc42 paths) diverge from scaffolded structure (simple paths).
|
|
188
|
+
if (docsPaths) {
|
|
189
|
+
config.directories.wuDir = `${docsPaths.tasks}/wu`;
|
|
190
|
+
config.directories.initiativesDir = `${docsPaths.tasks}/initiatives`;
|
|
191
|
+
config.directories.backlogPath = `${docsPaths.tasks}/backlog.md`;
|
|
192
|
+
config.directories.statusPath = `${docsPaths.tasks}/status.md`;
|
|
193
|
+
config.directories.plansDir = `${docsPaths.operations}/plans`;
|
|
194
|
+
config.directories.onboardingDir = docsPaths.onboarding;
|
|
195
|
+
}
|
|
184
196
|
// WU-1067: Add gates.execution section with preset if specified
|
|
185
197
|
if (gatePreset && GATE_PRESETS[gatePreset]) {
|
|
186
198
|
const presetConfig = GATE_PRESETS[gatePreset];
|
|
@@ -189,9 +201,11 @@ function generateLumenflowConfigYaml(gatePreset, gitConfigOverride, client) {
|
|
|
189
201
|
...presetConfig,
|
|
190
202
|
};
|
|
191
203
|
}
|
|
192
|
-
// WU-
|
|
204
|
+
// WU-1748: Initialize explicit lifecycle status without final lane artifacts
|
|
193
205
|
config.lanes = {
|
|
194
|
-
|
|
206
|
+
lifecycle: {
|
|
207
|
+
status: LANE_LIFECYCLE_STATUS.UNCONFIGURED,
|
|
208
|
+
},
|
|
195
209
|
};
|
|
196
210
|
// WU-1364: Add git config overrides (e.g., requireRemote: false for local-only)
|
|
197
211
|
if (gitConfigOverride) {
|
|
@@ -411,7 +425,7 @@ export async function scaffoldProject(targetDir, options) {
|
|
|
411
425
|
'To modify configuration, use CLI commands (e.g., pnpm lumenflow:init --force) ' +
|
|
412
426
|
'instead of manual editing.');
|
|
413
427
|
}
|
|
414
|
-
await createFile(configPath, generateLumenflowConfigYaml(options.gatePreset, gitConfigOverride, client), options.force ? 'force' : 'skip', result, targetDir);
|
|
428
|
+
await createFile(configPath, generateLumenflowConfigYaml(options.gatePreset, gitConfigOverride, client, docsPaths), options.force ? 'force' : 'skip', result, targetDir);
|
|
415
429
|
// WU-1171: Create AGENTS.md (universal entry point for all agents)
|
|
416
430
|
try {
|
|
417
431
|
const agentsTemplate = loadTemplate('core/AGENTS.md.template');
|
|
@@ -582,22 +596,16 @@ async function scaffoldSafetyScripts(targetDir, options, result) {
|
|
|
582
596
|
const PRETTIER_VERSION = '^3.8.0';
|
|
583
597
|
/** WU-1517: Prettier package name constant */
|
|
584
598
|
const PRETTIER_PACKAGE_NAME = 'prettier';
|
|
585
|
-
/** WU-1517: Format script names */
|
|
586
|
-
const FORMAT_SCRIPT_NAME = 'format';
|
|
587
|
-
const FORMAT_CHECK_SCRIPT_NAME = 'format:check';
|
|
588
|
-
/** WU-1517: Format script commands using prettier */
|
|
589
|
-
const FORMAT_SCRIPT_COMMAND = 'prettier --write .';
|
|
590
|
-
const FORMAT_CHECK_SCRIPT_COMMAND = 'prettier --check .';
|
|
591
599
|
/**
|
|
592
600
|
* WU-1300: Inject LumenFlow scripts into package.json
|
|
593
|
-
* WU-1517: Also adds prettier devDependency
|
|
601
|
+
* WU-1517: Also adds prettier devDependency
|
|
594
602
|
* WU-1518: Also adds gate stub scripts (spec:linter, lint, typecheck)
|
|
603
|
+
* WU-1747: format and format:check are now part of GATE_STUB_SCRIPTS
|
|
595
604
|
* - Creates package.json if it doesn't exist
|
|
596
605
|
* - Preserves existing scripts (doesn't overwrite unless --force)
|
|
597
606
|
* - Adds missing LumenFlow scripts
|
|
598
607
|
* - Adds prettier to devDependencies
|
|
599
|
-
* - Adds
|
|
600
|
-
* - Adds gate stub scripts for spec:linter, lint, typecheck
|
|
608
|
+
* - Adds gate stub scripts for spec:linter, lint, typecheck, format, format:check
|
|
601
609
|
*/
|
|
602
610
|
async function injectPackageJsonScripts(targetDir, options, result) {
|
|
603
611
|
const packageJsonPath = path.join(targetDir, 'package.json');
|
|
@@ -631,20 +639,9 @@ async function injectPackageJsonScripts(targetDir, options, result) {
|
|
|
631
639
|
}
|
|
632
640
|
}
|
|
633
641
|
}
|
|
634
|
-
// WU-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
[FORMAT_CHECK_SCRIPT_NAME]: FORMAT_CHECK_SCRIPT_COMMAND,
|
|
638
|
-
};
|
|
639
|
-
for (const [scriptName, scriptCommand] of Object.entries(formatScripts)) {
|
|
640
|
-
if (options.force || !(scriptName in scripts)) {
|
|
641
|
-
if (!(scriptName in scripts)) {
|
|
642
|
-
scripts[scriptName] = scriptCommand;
|
|
643
|
-
modified = true;
|
|
644
|
-
}
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
// WU-1518: Add gate stub scripts (spec:linter, lint, typecheck)
|
|
642
|
+
// WU-1518: Add gate stub scripts (spec:linter, lint, typecheck, format, format:check)
|
|
643
|
+
// WU-1747: format and format:check are now part of GATE_STUB_SCRIPTS with
|
|
644
|
+
// auto-detection of prettier availability, so they pass immediately after init.
|
|
648
645
|
// These stubs let `pnpm gates` pass on a fresh project without manual script additions.
|
|
649
646
|
// Projects replace them with real tooling when ready.
|
|
650
647
|
for (const [scriptName, scriptCommand] of Object.entries(GATE_STUB_SCRIPTS)) {
|
|
@@ -685,39 +682,9 @@ async function scaffoldFullDocs(targetDir, options, result, tokens) {
|
|
|
685
682
|
await createFile(path.join(tasksDir, 'backlog.md'), BACKLOG_TEMPLATE, options.force, result, targetDir);
|
|
686
683
|
await createFile(path.join(tasksDir, 'status.md'), STATUS_TEMPLATE, options.force, result, targetDir);
|
|
687
684
|
await createFile(path.join(templatesDir, 'wu-template.yaml'), processTemplate(WU_TEMPLATE_YAML, tokens), options.force, result, targetDir);
|
|
688
|
-
// WU-1300: Scaffold lane inference configuration
|
|
689
|
-
await scaffoldLaneInference(targetDir, options, result, tokens);
|
|
690
685
|
// WU-1083: Scaffold agent onboarding docs with --full
|
|
691
686
|
await scaffoldAgentOnboardingDocs(targetDir, options, result, tokens);
|
|
692
687
|
}
|
|
693
|
-
/**
|
|
694
|
-
* WU-1307: Scaffold lane inference configuration
|
|
695
|
-
* Uses hierarchical Parent->Sublane format required by lane-inference.ts
|
|
696
|
-
*/
|
|
697
|
-
async function scaffoldLaneInference(targetDir, options, result, tokens) {
|
|
698
|
-
// WU-1307: Add framework-specific lanes in hierarchical format if framework is provided
|
|
699
|
-
let frameworkLanes = '';
|
|
700
|
-
if (options.framework) {
|
|
701
|
-
const { name, slug } = normalizeFrameworkName(options.framework);
|
|
702
|
-
// Add framework lanes in hierarchical format (indentation matters in YAML)
|
|
703
|
-
frameworkLanes = `
|
|
704
|
-
# Framework-specific lanes (added with --framework ${name})
|
|
705
|
-
${name}:
|
|
706
|
-
description: '${name} framework-specific code'
|
|
707
|
-
code_paths:
|
|
708
|
-
- 'src/${slug}/**'
|
|
709
|
-
- 'packages/${slug}/**'
|
|
710
|
-
keywords:
|
|
711
|
-
- '${slug}'
|
|
712
|
-
- '${name.toLowerCase()}'
|
|
713
|
-
`;
|
|
714
|
-
}
|
|
715
|
-
const laneInferenceContent = processTemplate(LANE_INFERENCE_TEMPLATE, {
|
|
716
|
-
...tokens,
|
|
717
|
-
FRAMEWORK_LANES: frameworkLanes,
|
|
718
|
-
});
|
|
719
|
-
await createFile(path.join(targetDir, '.lumenflow.lane-inference.yaml'), laneInferenceContent, options.force ? 'force' : 'skip', result, targetDir);
|
|
720
|
-
}
|
|
721
688
|
/**
|
|
722
689
|
* WU-1083: Scaffold agent onboarding documentation
|
|
723
690
|
* WU-1300: Added starting-prompt.md
|
|
@@ -950,6 +917,8 @@ export async function main() {
|
|
|
950
917
|
console.log('\n[lumenflow init] Done! Next steps:');
|
|
951
918
|
console.log(' 1. Review AGENTS.md and LUMENFLOW.md for workflow documentation');
|
|
952
919
|
console.log(` 2. Edit ${CONFIG_FILE_NAME} to match your project structure`);
|
|
920
|
+
console.log('');
|
|
921
|
+
console.log(` ${buildInitLaneLifecycleMessage(LANE_LIFECYCLE_STATUS.UNCONFIGURED)}`);
|
|
953
922
|
if (result.integrationFiles && result.integrationFiles.length > 0) {
|
|
954
923
|
console.log(' \u2713 Enforcement hooks installed -- regenerate with: pnpm lumenflow:integrate');
|
|
955
924
|
}
|