@lumenflow/core 2.2.0 → 2.2.2

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.
@@ -78,3 +78,21 @@ export declare function validateSystemMap(systemMap: any, deps: any): Promise<{
78
78
  queryErrors: any[];
79
79
  classificationErrors: any[];
80
80
  }>;
81
+ export interface SystemMapValidationResult {
82
+ valid: boolean;
83
+ skipped: boolean;
84
+ pathErrors: string[];
85
+ orphanDocs: string[];
86
+ audienceErrors: string[];
87
+ queryErrors: string[];
88
+ classificationErrors: string[];
89
+ }
90
+ export declare function runSystemMapValidation(options?: {
91
+ cwd?: string;
92
+ systemMapPath?: string;
93
+ logger?: {
94
+ log: (message: string) => void;
95
+ warn?: (message: string) => void;
96
+ error?: (message: string) => void;
97
+ };
98
+ }): Promise<SystemMapValidationResult>;
@@ -12,6 +12,7 @@
12
12
  * @module system-map-validator
13
13
  */
14
14
  import { existsSync, readFileSync } from 'node:fs';
15
+ import path from 'node:path';
15
16
  import fg from 'fast-glob';
16
17
  import { parseYAML } from './wu-yaml.js';
17
18
  /**
@@ -274,34 +275,64 @@ export async function validateSystemMap(systemMap, deps) {
274
275
  };
275
276
  }
276
277
  const DEFAULT_SYSTEM_MAP_PATH = 'SYSTEM-MAP.yaml';
277
- function emitErrors(label, errors) {
278
- if (!errors || errors.length === 0)
279
- return;
280
- console.error(`\n${label}:`);
281
- for (const error of errors) {
282
- console.error(` - ${error}`);
283
- }
284
- }
285
- async function runCLI() {
286
- const systemMapPath = process.env.SYSTEM_MAP_PATH || DEFAULT_SYSTEM_MAP_PATH;
287
- if (!existsSync(systemMapPath)) {
288
- console.warn(`[system-map] ${systemMapPath} not found; skipping validation.`);
289
- process.exit(0);
278
+ export async function runSystemMapValidation(options = {}) {
279
+ const { cwd = process.cwd(), systemMapPath, logger = console } = options;
280
+ const resolvedPath = systemMapPath ?? path.join(cwd, DEFAULT_SYSTEM_MAP_PATH);
281
+ if (!existsSync(resolvedPath)) {
282
+ logger.warn?.(`[system-map] ${resolvedPath} not found; skipping validation.`);
283
+ return {
284
+ valid: true,
285
+ skipped: true,
286
+ pathErrors: [],
287
+ orphanDocs: [],
288
+ audienceErrors: [],
289
+ queryErrors: [],
290
+ classificationErrors: [],
291
+ };
290
292
  }
291
293
  let systemMap;
292
294
  try {
293
- const raw = readFileSync(systemMapPath, 'utf-8');
295
+ const raw = readFileSync(resolvedPath, 'utf-8');
294
296
  systemMap = parseYAML(raw);
295
297
  }
296
298
  catch (error) {
297
299
  const message = error instanceof Error ? error.message : String(error);
298
- console.error(`[system-map] Failed to read or parse ${systemMapPath}: ${message}`);
299
- process.exit(1);
300
+ logger.error?.(`[system-map] Failed to read or parse ${resolvedPath}: ${message}`);
301
+ return {
302
+ valid: false,
303
+ skipped: false,
304
+ pathErrors: [message],
305
+ orphanDocs: [],
306
+ audienceErrors: [],
307
+ queryErrors: [],
308
+ classificationErrors: [],
309
+ };
300
310
  }
301
311
  const result = await validateSystemMap(systemMap, {
302
312
  exists: (path) => existsSync(path),
303
313
  glob: (pattern) => fg(pattern, { dot: false }),
304
314
  });
315
+ return {
316
+ valid: result.valid,
317
+ skipped: false,
318
+ pathErrors: result.pathErrors,
319
+ orphanDocs: result.orphanDocs,
320
+ audienceErrors: result.audienceErrors,
321
+ queryErrors: result.queryErrors,
322
+ classificationErrors: result.classificationErrors,
323
+ };
324
+ }
325
+ function emitErrors(label, errors) {
326
+ if (!errors || errors.length === 0)
327
+ return;
328
+ console.error(`\n${label}:`);
329
+ for (const error of errors) {
330
+ console.error(` - ${error}`);
331
+ }
332
+ }
333
+ async function runCLI() {
334
+ const systemMapPath = process.env.SYSTEM_MAP_PATH || DEFAULT_SYSTEM_MAP_PATH;
335
+ const result = await runSystemMapValidation({ systemMapPath });
305
336
  if (!result.valid) {
306
337
  console.error('\n[system-map] Validation failed');
307
338
  emitErrors('Missing paths', result.pathErrors);
@@ -311,6 +342,9 @@ async function runCLI() {
311
342
  emitErrors('Classification routing violations', result.classificationErrors);
312
343
  process.exit(1);
313
344
  }
345
+ if (result.skipped) {
346
+ process.exit(0);
347
+ }
314
348
  console.log('[system-map] Validation passed');
315
349
  process.exit(0);
316
350
  }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @file backlog-sync.ts
3
+ * @description Validates backlog.md is in sync with WU YAML files (WU-1111)
4
+ */
5
+ export interface BacklogSyncResult {
6
+ valid: boolean;
7
+ errors: string[];
8
+ warnings: string[];
9
+ wuCount: number;
10
+ backlogCount: number;
11
+ }
12
+ export declare function validateBacklogSync(options?: {
13
+ cwd?: string;
14
+ }): Promise<BacklogSyncResult>;
@@ -0,0 +1,60 @@
1
+ /**
2
+ * @file backlog-sync.ts
3
+ * @description Validates backlog.md is in sync with WU YAML files (WU-1111)
4
+ */
5
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
6
+ import path from 'node:path';
7
+ import { FILE_SYSTEM } from '../wu-constants.js';
8
+ function extractWUIDsFromBacklog(content) {
9
+ const wuIds = [];
10
+ const pattern = /WU-\d+/gi;
11
+ let match;
12
+ while ((match = pattern.exec(content)) !== null) {
13
+ const wuId = match[0].toUpperCase();
14
+ if (!wuIds.includes(wuId)) {
15
+ wuIds.push(wuId);
16
+ }
17
+ }
18
+ return wuIds;
19
+ }
20
+ function getWUIDsFromFiles(wuDir) {
21
+ if (!existsSync(wuDir)) {
22
+ return [];
23
+ }
24
+ return readdirSync(wuDir)
25
+ .filter((f) => f.endsWith('.yaml'))
26
+ .map((f) => f.replace('.yaml', '').toUpperCase());
27
+ }
28
+ export async function validateBacklogSync(options = {}) {
29
+ const { cwd = process.cwd() } = options;
30
+ const errors = [];
31
+ const warnings = [];
32
+ const backlogPath = path.join(cwd, 'docs', '04-operations', 'tasks', 'backlog.md');
33
+ const wuDir = path.join(cwd, 'docs', '04-operations', 'tasks', 'wu');
34
+ if (!existsSync(backlogPath)) {
35
+ errors.push(`Backlog file not found: ${backlogPath}`);
36
+ return { valid: false, errors, warnings, wuCount: 0, backlogCount: 0 };
37
+ }
38
+ const wuIdsFromFiles = getWUIDsFromFiles(wuDir);
39
+ const backlogContent = readFileSync(backlogPath, {
40
+ encoding: FILE_SYSTEM.UTF8,
41
+ });
42
+ const wuIdsFromBacklog = extractWUIDsFromBacklog(backlogContent);
43
+ for (const wuId of wuIdsFromFiles) {
44
+ if (!wuIdsFromBacklog.includes(wuId)) {
45
+ errors.push(`${wuId} not found in backlog.md (exists as ${wuId}.yaml)`);
46
+ }
47
+ }
48
+ for (const wuId of wuIdsFromBacklog) {
49
+ if (!wuIdsFromFiles.includes(wuId)) {
50
+ warnings.push(`${wuId} referenced in backlog.md but ${wuId}.yaml not found`);
51
+ }
52
+ }
53
+ return {
54
+ valid: errors.length === 0,
55
+ errors,
56
+ warnings,
57
+ wuCount: wuIdsFromFiles.length,
58
+ backlogCount: wuIdsFromBacklog.length,
59
+ };
60
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @file supabase-docs-linter.ts
3
+ * @description Runs Supabase docs linter when available (optional in consumer repos)
4
+ */
5
+ export interface SupabaseDocsLinterResult {
6
+ ok: boolean;
7
+ skipped: boolean;
8
+ message?: string;
9
+ errors?: string[];
10
+ }
11
+ export interface SupabaseDocsLinterOptions {
12
+ cwd?: string;
13
+ logger?: {
14
+ log: (message: string) => void;
15
+ warn?: (message: string) => void;
16
+ };
17
+ }
18
+ export declare function runSupabaseDocsLinter(options?: SupabaseDocsLinterOptions): Promise<SupabaseDocsLinterResult>;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @file supabase-docs-linter.ts
3
+ * @description Runs Supabase docs linter when available (optional in consumer repos)
4
+ */
5
+ import { existsSync } from 'node:fs';
6
+ import path from 'node:path';
7
+ import { pathToFileURL } from 'node:url';
8
+ export async function runSupabaseDocsLinter(options = {}) {
9
+ const { cwd = process.cwd(), logger = console } = options;
10
+ const linterPath = path.join(cwd, 'packages', 'linters', 'supabase-docs-linter.js');
11
+ if (!existsSync(linterPath)) {
12
+ return {
13
+ ok: true,
14
+ skipped: true,
15
+ message: 'Supabase docs linter not found; skipping.',
16
+ };
17
+ }
18
+ const moduleUrl = pathToFileURL(linterPath).href;
19
+ const module = await import(moduleUrl);
20
+ const runFn = module.runSupabaseDocsLinter ?? module.default;
21
+ if (typeof runFn !== 'function') {
22
+ return {
23
+ ok: false,
24
+ skipped: false,
25
+ errors: ['Supabase docs linter does not export runSupabaseDocsLinter.'],
26
+ };
27
+ }
28
+ const result = await runFn({ cwd, logger });
29
+ if (result && typeof result === 'object' && 'ok' in result) {
30
+ return {
31
+ ok: Boolean(result.ok),
32
+ skipped: Boolean(result.skipped),
33
+ message: result.message,
34
+ errors: result.errors,
35
+ };
36
+ }
37
+ return {
38
+ ok: true,
39
+ skipped: false,
40
+ message: 'Supabase docs linter completed.',
41
+ };
42
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @file wu-tasks.ts
3
+ * @description WU YAML validation helpers (shared by CLI and preflight)
4
+ */
5
+ export interface ValidationResult {
6
+ valid: boolean;
7
+ warnings: string[];
8
+ errors: string[];
9
+ }
10
+ export interface ValidationSummary {
11
+ totalValid: number;
12
+ totalInvalid: number;
13
+ totalWarnings: number;
14
+ results: Array<{
15
+ wuId: string;
16
+ } & ValidationResult>;
17
+ }
18
+ export declare function validateSingleWU(wuPath: string, options?: {
19
+ strict?: boolean;
20
+ }): ValidationResult;
21
+ export declare function validateAllWUs(options?: {
22
+ strict?: boolean;
23
+ doneOnly?: boolean;
24
+ }): ValidationSummary;
@@ -0,0 +1,90 @@
1
+ /**
2
+ * @file wu-tasks.ts
3
+ * @description WU YAML validation helpers (shared by CLI and preflight)
4
+ */
5
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
6
+ import { WU_PATHS } from '../wu-paths.js';
7
+ import { parseYAML } from '../wu-yaml.js';
8
+ import { validateWU, validateWUCompleteness } from '../wu-schema.js';
9
+ import { FILE_SYSTEM } from '../wu-constants.js';
10
+ export function validateSingleWU(wuPath, options = {}) {
11
+ const { strict = false } = options;
12
+ const errors = [];
13
+ const warnings = [];
14
+ if (!existsSync(wuPath)) {
15
+ errors.push(`WU file not found: ${wuPath}`);
16
+ return { valid: false, warnings, errors };
17
+ }
18
+ let doc;
19
+ try {
20
+ const text = readFileSync(wuPath, { encoding: FILE_SYSTEM.UTF8 });
21
+ doc = parseYAML(text);
22
+ }
23
+ catch (e) {
24
+ errors.push(`Failed to parse YAML: ${e.message}`);
25
+ return { valid: false, warnings, errors };
26
+ }
27
+ const schemaResult = validateWU(doc);
28
+ if (!schemaResult.success) {
29
+ const schemaErrors = schemaResult.error.issues.map((issue) => `${issue.path.join('.')}: ${issue.message}`);
30
+ errors.push(...schemaErrors);
31
+ return { valid: false, warnings, errors };
32
+ }
33
+ const completenessResult = validateWUCompleteness(schemaResult.data);
34
+ warnings.push(...completenessResult.warnings);
35
+ if (strict && warnings.length > 0) {
36
+ errors.push(...warnings.map((w) => `[STRICT] ${w}`));
37
+ return { valid: false, warnings: [], errors };
38
+ }
39
+ return { valid: true, warnings, errors };
40
+ }
41
+ export function validateAllWUs(options = {}) {
42
+ const { strict = false, doneOnly = false } = options;
43
+ const wuDir = WU_PATHS.WU_DIR();
44
+ if (!existsSync(wuDir)) {
45
+ return {
46
+ totalValid: 0,
47
+ totalInvalid: 1,
48
+ totalWarnings: 0,
49
+ results: [
50
+ {
51
+ wuId: 'DIRECTORY',
52
+ valid: false,
53
+ warnings: [],
54
+ errors: [`WU directory not found: ${wuDir}`],
55
+ },
56
+ ],
57
+ };
58
+ }
59
+ const files = readdirSync(wuDir).filter((f) => f.endsWith('.yaml'));
60
+ const results = [];
61
+ let totalValid = 0;
62
+ let totalInvalid = 0;
63
+ let totalWarnings = 0;
64
+ for (const file of files) {
65
+ const wuPath = `${wuDir}/${file}`;
66
+ const wuId = file.replace('.yaml', '');
67
+ if (doneOnly) {
68
+ try {
69
+ const text = readFileSync(wuPath, { encoding: FILE_SYSTEM.UTF8 });
70
+ const doc = parseYAML(text);
71
+ if (doc.status !== 'done') {
72
+ continue;
73
+ }
74
+ }
75
+ catch {
76
+ // If we can't read, still validate to catch the error
77
+ }
78
+ }
79
+ const result = validateSingleWU(wuPath, { strict });
80
+ results.push({ wuId, ...result });
81
+ if (result.valid) {
82
+ totalValid++;
83
+ totalWarnings += result.warnings.length;
84
+ }
85
+ else {
86
+ totalInvalid++;
87
+ }
88
+ }
89
+ return { totalValid, totalInvalid, totalWarnings, results };
90
+ }
@@ -958,17 +958,6 @@ export declare const GATE_COMMANDS: {
958
958
  /** WU-2062: Triggers tiered test execution based on risk */
959
959
  TIERED_TEST: string;
960
960
  };
961
- /**
962
- * Tool paths for scripts
963
- *
964
- * Centralized paths to tool scripts.
965
- */
966
- export declare const TOOL_PATHS: {
967
- VALIDATE_BACKLOG_SYNC: string;
968
- SUPABASE_DOCS_LINTER: string;
969
- /** WU-2315: System map validator script */
970
- SYSTEM_MAP_VALIDATE: string;
971
- };
972
961
  /**
973
962
  * CLI mode flags
974
963
  *
@@ -1186,8 +1175,6 @@ export declare const AUDIT_ARGS: {
1186
1175
  * Centralized paths to validation scripts.
1187
1176
  */
1188
1177
  export declare const SCRIPT_PATHS: {
1189
- /** WU YAML validation */
1190
- VALIDATE: string;
1191
1178
  /** Prompt registry validation */
1192
1179
  VALIDATE_PROMPT_REGISTRY: string;
1193
1180
  };
@@ -1000,17 +1000,6 @@ export const GATE_COMMANDS = {
1000
1000
  /** WU-2062: Triggers tiered test execution based on risk */
1001
1001
  TIERED_TEST: 'tiered-test',
1002
1002
  };
1003
- /**
1004
- * Tool paths for scripts
1005
- *
1006
- * Centralized paths to tool scripts.
1007
- */
1008
- export const TOOL_PATHS = {
1009
- VALIDATE_BACKLOG_SYNC: 'node packages/@lumenflow/cli/dist/validate-backlog-sync.js',
1010
- SUPABASE_DOCS_LINTER: 'node packages/linters/supabase-docs-linter.js',
1011
- /** WU-2315: System map validator script */
1012
- SYSTEM_MAP_VALIDATE: 'node packages/@lumenflow/core/dist/system-map-validator.js',
1013
- };
1014
1003
  /**
1015
1004
  * CLI mode flags
1016
1005
  *
@@ -1229,8 +1218,6 @@ export const AUDIT_ARGS = {
1229
1218
  * Centralized paths to validation scripts.
1230
1219
  */
1231
1220
  export const SCRIPT_PATHS = {
1232
- /** WU YAML validation */
1233
- VALIDATE: 'node packages/@lumenflow/cli/dist/validate.js',
1234
1221
  /** Prompt registry validation */
1235
1222
  VALIDATE_PROMPT_REGISTRY: 'tools/validate-prompt-registry.js',
1236
1223
  };
@@ -1,7 +1,6 @@
1
1
  /**
2
2
  * Preflight validation helpers for wu:done.
3
3
  */
4
- import { execSync as execSyncImport } from 'node:child_process';
5
4
  import { validatePreflight } from './wu-preflight-validators.js';
6
5
  /**
7
6
  * WU-1781: Build preflight error message with actionable guidance
@@ -28,21 +27,24 @@ export declare function buildPreflightCodePathErrorMessage(id: any, result: any)
28
27
  /**
29
28
  * WU-1781: Run tasks:validate as preflight check before any git operations
30
29
  */
31
- export interface ExecSyncOverrideOptions {
32
- /** Override execSync for testing (default: child_process.execSync) */
33
- execSyncFn?: typeof execSyncImport;
34
- }
35
- export declare function runPreflightTasksValidation(id: any, options?: ExecSyncOverrideOptions): {
30
+ export declare function runPreflightTasksValidation(id: any): {
36
31
  valid: boolean;
37
- errors: any;
32
+ errors: string[];
38
33
  abortedBeforeMerge: boolean;
39
34
  localMainModified: boolean;
40
- hasStampStatusError: any;
35
+ hasStampStatusError: boolean;
41
36
  };
42
37
  /**
43
38
  * WU-2308: Validate all pre-commit hooks with worktree context
44
39
  */
45
- export declare function validateAllPreCommitHooks(id: any, worktreePath?: any, options?: ExecSyncOverrideOptions): {
40
+ export interface ValidateAllPreCommitHooksOptions {
41
+ runGates?: (options: {
42
+ cwd?: string;
43
+ docsOnly?: boolean;
44
+ wuId?: string;
45
+ }) => Promise<boolean>;
46
+ }
47
+ export declare function validateAllPreCommitHooks(id: any, worktreePath?: any, options?: ValidateAllPreCommitHooksOptions): Promise<{
46
48
  valid: boolean;
47
49
  errors: any[];
48
- };
50
+ }>;
@@ -1,9 +1,10 @@
1
1
  /**
2
2
  * Preflight validation helpers for wu:done.
3
3
  */
4
- import { execSync as execSyncImport } from 'node:child_process';
5
4
  import { validatePreflight } from './wu-preflight-validators.js';
6
- import { LOG_PREFIX, EMOJI, STDIO, SCRIPT_PATHS } from './wu-constants.js';
5
+ import { LOG_PREFIX, EMOJI } from './wu-constants.js';
6
+ import { WU_PATHS } from './wu-paths.js';
7
+ import { validateSingleWU } from './validators/wu-tasks.js';
7
8
  /**
8
9
  * WU-1781: Build preflight error message with actionable guidance
9
10
  */
@@ -108,17 +109,14 @@ See: docs/04-operations/_frameworks/lumenflow/agent/onboarding/troubleshooting-w
108
109
  `;
109
110
  return message;
110
111
  }
111
- export function runPreflightTasksValidation(id, options = {}) {
112
- // Use injected execSync for testability, default to node's child_process
113
- const execSyncFn = options.execSyncFn || execSyncImport;
112
+ /**
113
+ * WU-1781: Run tasks:validate as preflight check before any git operations
114
+ */
115
+ export function runPreflightTasksValidation(id) {
114
116
  console.log(`\n${LOG_PREFIX.DONE} 🔍 Preflight: running tasks:validate...`);
115
- try {
116
- // Run tasks:validate with WU_ID context (single-WU validation mode)
117
- execSyncFn(SCRIPT_PATHS.VALIDATE, {
118
- stdio: STDIO.PIPE,
119
- encoding: 'utf-8',
120
- env: { ...process.env, WU_ID: id },
121
- });
117
+ const wuPath = WU_PATHS.WU(id);
118
+ const result = validateSingleWU(wuPath, { strict: false });
119
+ if (result.valid) {
122
120
  console.log(`${LOG_PREFIX.DONE} ${EMOJI.SUCCESS} Preflight tasks:validate passed`);
123
121
  return {
124
122
  valid: true,
@@ -128,46 +126,33 @@ export function runPreflightTasksValidation(id, options = {}) {
128
126
  hasStampStatusError: false,
129
127
  };
130
128
  }
131
- catch (err) {
132
- // Validation failed - extract errors from output
133
- const output = err.stdout || err.message || 'Unknown validation error';
134
- const errors = output
135
- .split('\n')
136
- .filter((line) => line.includes('[') && line.includes(']'))
137
- .map((line) => line.trim());
138
- const hasStampStatusError = errors.some((e) => e.includes('stamp but status is not done'));
139
- console.error(`\n${LOG_PREFIX.DONE} ${EMOJI.FAILURE} Preflight tasks:validate failed`);
140
- return {
141
- valid: false,
142
- errors: errors.length > 0 ? errors : [output],
143
- abortedBeforeMerge: true,
144
- localMainModified: false,
145
- hasStampStatusError,
146
- };
147
- }
129
+ console.error(`\n${LOG_PREFIX.DONE} ${EMOJI.FAILURE} Preflight tasks:validate failed`);
130
+ return {
131
+ valid: false,
132
+ errors: result.errors,
133
+ abortedBeforeMerge: true,
134
+ localMainModified: false,
135
+ hasStampStatusError: false,
136
+ };
148
137
  }
149
- /**
150
- * WU-2308: Validate all pre-commit hooks with worktree context
151
- */
152
- export function validateAllPreCommitHooks(id, worktreePath = null, options = {}) {
153
- const execSyncFn = options.execSyncFn || execSyncImport;
138
+ export async function validateAllPreCommitHooks(id, worktreePath = null, options = {}) {
154
139
  console.log(`\n${LOG_PREFIX.DONE} 🔍 Pre-flight: validating all pre-commit hooks...`);
155
140
  const errors = [];
156
141
  try {
157
142
  // WU-2308: Run from worktree context when provided to ensure audit checks
158
143
  // the worktree's dependencies (with fixes) not main's stale dependencies
159
- const execOptions = {
160
- stdio: STDIO.INHERIT,
161
- encoding: 'utf-8',
162
- };
163
- // Only set cwd when worktreePath is provided
164
- if (worktreePath) {
165
- execOptions.cwd = worktreePath;
144
+ if (!options.runGates) {
145
+ throw new Error('runGates not provided for pre-commit validation.');
146
+ }
147
+ const ok = await options.runGates({
148
+ cwd: worktreePath ?? process.cwd(),
149
+ wuId: id,
150
+ });
151
+ if (ok) {
152
+ console.log(`${LOG_PREFIX.DONE} ${EMOJI.SUCCESS} All pre-commit hooks passed`);
153
+ return { valid: true, errors: [] };
166
154
  }
167
- // WU-1139: Run CLI gates directly (removes stub scripts)
168
- execSyncFn('node packages/@lumenflow/cli/dist/gates.js', execOptions);
169
- console.log(`${LOG_PREFIX.DONE} ${EMOJI.SUCCESS} All pre-commit hooks passed`);
170
- return { valid: true, errors: [] };
155
+ throw new Error('Pre-commit hooks failed.');
171
156
  }
172
157
  catch {
173
158
  // Pre-commit hooks failed
@@ -12,4 +12,4 @@ export { applyExposureDefaults, validateCodePathsExist, validateSpecCompleteness
12
12
  export { buildPreflightErrorMessage, executePreflightCodePathValidation, buildPreflightCodePathErrorMessage, runPreflightTasksValidation, validateAllPreCommitHooks, } from './wu-done-preflight.js';
13
13
  export { validateAutomatedTestRequirement } from './manual-test-validator.js';
14
14
  export type { ValidateCodePathsExistOptions } from './wu-done-validation.js';
15
- export type { ExecutePreflightCodePathValidationOptions, ExecSyncOverrideOptions, } from './wu-done-preflight.js';
15
+ export type { ExecutePreflightCodePathValidationOptions, ValidateAllPreCommitHooksOptions, } from './wu-done-preflight.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lumenflow/core",
3
- "version": "2.2.0",
3
+ "version": "2.2.2",
4
4
  "description": "Core WU lifecycle tools for LumenFlow workflow framework",
5
5
  "keywords": [
6
6
  "lumenflow",
@@ -95,7 +95,7 @@
95
95
  "vitest": "^4.0.17"
96
96
  },
97
97
  "peerDependencies": {
98
- "@lumenflow/memory": "2.2.0"
98
+ "@lumenflow/memory": "2.2.2"
99
99
  },
100
100
  "peerDependenciesMeta": {
101
101
  "@lumenflow/memory": {