@lumenflow/cli 2.18.3 → 2.20.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 +44 -42
- package/dist/agent-session.js +1 -1
- package/dist/agent-session.js.map +1 -1
- package/dist/commands/integrate.js +1 -0
- package/dist/commands/integrate.js.map +1 -1
- package/dist/commands.js +1 -0
- package/dist/commands.js.map +1 -1
- package/dist/delegation-list.js +140 -0
- package/dist/delegation-list.js.map +1 -0
- package/dist/docs-sync.js +1 -0
- package/dist/docs-sync.js.map +1 -1
- package/dist/doctor.js +36 -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 +6 -5
- 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 +137 -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-initiative.js +2 -2
- package/dist/orchestrate-initiative.js.map +1 -1
- package/dist/orchestrate-monitor.js +38 -38
- package/dist/orchestrate-monitor.js.map +1 -1
- package/dist/plan-link.js +7 -14
- package/dist/plan-link.js.map +1 -1
- package/dist/public-manifest.js +19 -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/sync-templates.js +2 -1
- package/dist/sync-templates.js.map +1 -1
- 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 +96 -1394
- package/dist/wu-claim.js.map +1 -1
- package/dist/wu-code-path-coverage.js +81 -0
- package/dist/wu-code-path-coverage.js.map +1 -0
- package/dist/wu-create-content.js +256 -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 +124 -0
- package/dist/wu-create-validation.js.map +1 -0
- package/dist/wu-create.js +45 -442
- package/dist/wu-create.js.map +1 -1
- package/dist/wu-done.js +151 -249
- package/dist/wu-done.js.map +1 -1
- package/dist/wu-edit-operations.js +401 -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 +43 -759
- package/dist/wu-edit.js.map +1 -1
- package/dist/wu-prep.js +43 -127
- 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-sandbox.js +253 -0
- package/dist/wu-sandbox.js.map +1 -0
- package/dist/wu-spawn-prompt-builders.js +1124 -0
- package/dist/wu-spawn-prompt-builders.js.map +1 -0
- package/dist/wu-spawn-strategy-resolver.js +319 -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/dist/wu-status.js +4 -0
- package/dist/wu-status.js.map +1 -1
- package/dist/wu-validate.js +1 -1
- package/dist/wu-validate.js.map +1 -1
- package/package.json +15 -11
- package/templates/core/LUMENFLOW.md.template +29 -99
- package/templates/core/UPGRADING.md.template +2 -2
- 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/core/ai/onboarding/release-process.md.template +1 -1
- package/templates/vendors/claude/.claude/skills/orchestration/SKILL.md.template +8 -8
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file wu-create-validation.ts
|
|
3
|
+
* @description Validation logic for wu:create command (WU-1651)
|
|
4
|
+
*
|
|
5
|
+
* Extracted from wu-create.ts to isolate spec validation, strict mode checks,
|
|
6
|
+
* and field-level error aggregation into a focused module.
|
|
7
|
+
*/
|
|
8
|
+
import { todayISO } from '@lumenflow/core/date-utils';
|
|
9
|
+
import { hasSpecRefs } from '@lumenflow/core/wu-create-validators';
|
|
10
|
+
import { WU_TYPES } from '@lumenflow/core/wu-constants';
|
|
11
|
+
import { validateWU } from '@lumenflow/core/wu-schema';
|
|
12
|
+
import { validateSpecCompleteness } from '@lumenflow/core/wu-done-validators';
|
|
13
|
+
import { validateWURulesSync } from '@lumenflow/core/wu-rules-engine';
|
|
14
|
+
import { validateNoPlaceholders, buildPlaceholderErrorMessage } from '@lumenflow/core/wu-validator';
|
|
15
|
+
import { isCodeFile } from '@lumenflow/core/manual-test-validator';
|
|
16
|
+
import { isDocsOrProcessType } from '@lumenflow/core/wu-type-helpers';
|
|
17
|
+
import { buildWUContent } from './wu-create-content.js';
|
|
18
|
+
/** Log prefix for console output */
|
|
19
|
+
const LOG_PREFIX = '[wu:create]';
|
|
20
|
+
/** Default WU type */
|
|
21
|
+
const DEFAULT_TYPE = WU_TYPES.FEATURE;
|
|
22
|
+
export function containsCodeFiles(codePaths) {
|
|
23
|
+
if (!codePaths || codePaths.length === 0)
|
|
24
|
+
return false;
|
|
25
|
+
return codePaths.some((filePath) => isCodeFile(filePath));
|
|
26
|
+
}
|
|
27
|
+
export function hasAnyItems(value) {
|
|
28
|
+
return Array.isArray(value) && value.length > 0;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Validate WU spec for creation
|
|
32
|
+
*
|
|
33
|
+
* WU-1329: Strict mode (default) validates that code_paths and test_paths exist on disk.
|
|
34
|
+
* Use opts.strict = false to bypass path existence checks.
|
|
35
|
+
*
|
|
36
|
+
* @param params - Validation parameters
|
|
37
|
+
* @returns {{ valid: boolean, errors: string[] }}
|
|
38
|
+
*/
|
|
39
|
+
export function validateCreateSpec({ id, lane, title, priority, type, opts, }) {
|
|
40
|
+
const errors = [];
|
|
41
|
+
const effectiveType = type || DEFAULT_TYPE;
|
|
42
|
+
// WU-1329: Strict mode flag retained for backwards compatibility in CLI UX.
|
|
43
|
+
// Reality checks now run in wu:prep/wu:done; create/edit enforce intent only.
|
|
44
|
+
const strict = opts.strict !== false;
|
|
45
|
+
// Keep advisory log for callers that explicitly opt out.
|
|
46
|
+
if (!strict) {
|
|
47
|
+
console.warn(`${LOG_PREFIX} WARNING: strict validation bypassed (--no-strict). ` +
|
|
48
|
+
`Reality-phase checks run at wu:prep/wu:done.`);
|
|
49
|
+
}
|
|
50
|
+
if (!opts.description) {
|
|
51
|
+
errors.push('--description is required');
|
|
52
|
+
}
|
|
53
|
+
if (!opts.acceptance || opts.acceptance.length === 0) {
|
|
54
|
+
errors.push('--acceptance is required (repeatable)');
|
|
55
|
+
}
|
|
56
|
+
if (!opts.exposure) {
|
|
57
|
+
errors.push('--exposure is required');
|
|
58
|
+
}
|
|
59
|
+
if (!isDocsOrProcessType(effectiveType)) {
|
|
60
|
+
const codePaths = opts.codePaths ?? [];
|
|
61
|
+
if (codePaths.length === 0) {
|
|
62
|
+
errors.push('--code-paths is required for non-documentation WUs');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (effectiveType === WU_TYPES.FEATURE && !hasSpecRefs(opts.specRefs)) {
|
|
66
|
+
errors.push('--spec-refs is required for type: feature WUs\n' +
|
|
67
|
+
' Tip: Create a plan first with: pnpm plan:create --id <WU-ID> --title "..."\n' +
|
|
68
|
+
' Then use --plan flag or --spec-refs lumenflow://plans/<WU-ID>-plan.md');
|
|
69
|
+
}
|
|
70
|
+
// WU-1530: Single-pass validation -- collect all errors before returning.
|
|
71
|
+
// Always build WU content and run all validation stages, even when early fields are missing.
|
|
72
|
+
// buildWUContent handles undefined gracefully; Zod catches missing required fields.
|
|
73
|
+
// Stage 2b: Placeholder check (only meaningful if fields exist)
|
|
74
|
+
if (opts.description && opts.acceptance && opts.acceptance.length > 0) {
|
|
75
|
+
const placeholderResult = validateNoPlaceholders({
|
|
76
|
+
description: opts.description,
|
|
77
|
+
acceptance: opts.acceptance,
|
|
78
|
+
});
|
|
79
|
+
if (!placeholderResult.valid) {
|
|
80
|
+
errors.push(buildPlaceholderErrorMessage('wu:create', placeholderResult));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Stage 2c-2d: Schema + completeness -- always run to catch enum/format errors
|
|
84
|
+
// even when required fields are missing (Zod reports both)
|
|
85
|
+
const today = todayISO();
|
|
86
|
+
const wuContent = buildWUContent({
|
|
87
|
+
id,
|
|
88
|
+
lane,
|
|
89
|
+
title,
|
|
90
|
+
priority,
|
|
91
|
+
type: effectiveType,
|
|
92
|
+
created: today,
|
|
93
|
+
opts,
|
|
94
|
+
});
|
|
95
|
+
const schemaResult = validateWU(wuContent);
|
|
96
|
+
if (!schemaResult.success) {
|
|
97
|
+
// Deduplicate: skip schema errors already covered by field-level checks above
|
|
98
|
+
const fieldErrorFields = new Set(['description', 'acceptance', 'code_paths', 'tests']);
|
|
99
|
+
const schemaErrors = schemaResult.error.issues
|
|
100
|
+
.filter((issue) => !fieldErrorFields.has(issue.path[0]) || errors.length === 0)
|
|
101
|
+
.map((issue) => `${issue.path.join('.')}: ${issue.message}`);
|
|
102
|
+
errors.push(...schemaErrors);
|
|
103
|
+
}
|
|
104
|
+
// Only run completeness if schema passed (it depends on well-formed data)
|
|
105
|
+
if (schemaResult.success) {
|
|
106
|
+
const intentRules = validateWURulesSync({
|
|
107
|
+
id,
|
|
108
|
+
type: effectiveType,
|
|
109
|
+
status: 'ready',
|
|
110
|
+
code_paths: wuContent.code_paths,
|
|
111
|
+
tests: wuContent.tests,
|
|
112
|
+
}, { phase: 'intent' });
|
|
113
|
+
errors.push(...intentRules.errors.map((issue) => issue.message));
|
|
114
|
+
const completeness = validateSpecCompleteness(wuContent, id);
|
|
115
|
+
if (!completeness.valid) {
|
|
116
|
+
errors.push(...completeness.errors);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (errors.length > 0) {
|
|
120
|
+
return { valid: false, errors };
|
|
121
|
+
}
|
|
122
|
+
return { valid: true, errors: [] };
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=wu-create-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wu-create-validation.js","sourceRoot":"","sources":["../src/wu-create-validation.ts"],"names":[],"mappings":"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"}
|