@lumenflow/core 2.19.0 → 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.
Files changed (73) hide show
  1. package/dist/arg-parser.js +2 -2
  2. package/dist/arg-parser.js.map +1 -1
  3. package/dist/context/wu-state-reader.d.ts +2 -0
  4. package/dist/context/wu-state-reader.d.ts.map +1 -1
  5. package/dist/context/wu-state-reader.js +3 -0
  6. package/dist/context/wu-state-reader.js.map +1 -1
  7. package/dist/index.d.ts +6 -0
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +6 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/lumenflow-config-schema.js +1 -1
  12. package/dist/lumenflow-config-schema.js.map +1 -1
  13. package/dist/sandbox-allowlist.d.ts +16 -0
  14. package/dist/sandbox-allowlist.d.ts.map +1 -0
  15. package/dist/sandbox-allowlist.js +75 -0
  16. package/dist/sandbox-allowlist.js.map +1 -0
  17. package/dist/sandbox-backend-linux.d.ts +6 -0
  18. package/dist/sandbox-backend-linux.d.ts.map +1 -0
  19. package/dist/sandbox-backend-linux.js +65 -0
  20. package/dist/sandbox-backend-linux.js.map +1 -0
  21. package/dist/sandbox-backend-macos.d.ts +6 -0
  22. package/dist/sandbox-backend-macos.d.ts.map +1 -0
  23. package/dist/sandbox-backend-macos.js +64 -0
  24. package/dist/sandbox-backend-macos.js.map +1 -0
  25. package/dist/sandbox-backend-windows.d.ts +6 -0
  26. package/dist/sandbox-backend-windows.d.ts.map +1 -0
  27. package/dist/sandbox-backend-windows.js +28 -0
  28. package/dist/sandbox-backend-windows.js.map +1 -0
  29. package/dist/sandbox-profile.d.ts +53 -0
  30. package/dist/sandbox-profile.d.ts.map +1 -0
  31. package/dist/sandbox-profile.js +62 -0
  32. package/dist/sandbox-profile.js.map +1 -0
  33. package/dist/schemas/setup-schemas.js +1 -1
  34. package/dist/schemas/setup-schemas.js.map +1 -1
  35. package/dist/schemas/wu-lifecycle-schemas.js +1 -1
  36. package/dist/schemas/wu-lifecycle-schemas.js.map +1 -1
  37. package/dist/spawn-strategy.d.ts +1 -1
  38. package/dist/spawn-strategy.js +1 -1
  39. package/dist/validation/types.d.ts +2 -0
  40. package/dist/validation/types.d.ts.map +1 -1
  41. package/dist/wu-context-constants.d.ts +4 -0
  42. package/dist/wu-context-constants.d.ts.map +1 -1
  43. package/dist/wu-context-constants.js +4 -0
  44. package/dist/wu-context-constants.js.map +1 -1
  45. package/dist/wu-done-preflight.d.ts +8 -0
  46. package/dist/wu-done-preflight.d.ts.map +1 -1
  47. package/dist/wu-done-preflight.js +17 -1
  48. package/dist/wu-done-preflight.js.map +1 -1
  49. package/dist/wu-lint.d.ts +33 -41
  50. package/dist/wu-lint.d.ts.map +1 -1
  51. package/dist/wu-lint.js +85 -142
  52. package/dist/wu-lint.js.map +1 -1
  53. package/dist/wu-preflight-validators.d.ts +28 -77
  54. package/dist/wu-preflight-validators.d.ts.map +1 -1
  55. package/dist/wu-preflight-validators.js +86 -130
  56. package/dist/wu-preflight-validators.js.map +1 -1
  57. package/dist/wu-rules-core.d.ts +95 -0
  58. package/dist/wu-rules-core.d.ts.map +1 -0
  59. package/dist/wu-rules-core.js +399 -0
  60. package/dist/wu-rules-core.js.map +1 -0
  61. package/dist/wu-rules-engine.d.ts +29 -0
  62. package/dist/wu-rules-engine.d.ts.map +1 -0
  63. package/dist/wu-rules-engine.js +59 -0
  64. package/dist/wu-rules-engine.js.map +1 -0
  65. package/dist/wu-rules-resolvers.d.ts +19 -0
  66. package/dist/wu-rules-resolvers.d.ts.map +1 -0
  67. package/dist/wu-rules-resolvers.js +208 -0
  68. package/dist/wu-rules-resolvers.js.map +1 -0
  69. package/dist/wu-schema.d.ts +18 -3
  70. package/dist/wu-schema.d.ts.map +1 -1
  71. package/dist/wu-schema.js +14 -1
  72. package/dist/wu-schema.js.map +1 -1
  73. package/package.json +5 -4
@@ -0,0 +1,399 @@
1
+ import path from 'node:path';
2
+ import { minimatch } from 'minimatch';
3
+ import { TEST_TYPES, WU_TYPES } from './wu-constants.js';
4
+ export const RULE_CODES = {
5
+ CODE_PATH_SHAPE: 'R001_CODE_PATH_SHAPE',
6
+ MINIMUM_TEST_INTENT: 'R002_MINIMUM_TEST_INTENT',
7
+ CODE_PATH_EXISTENCE: 'R003_CODE_PATH_EXISTENCE',
8
+ CODE_PATH_COVERAGE: 'R004_CODE_PATH_COVERAGE',
9
+ PARITY_MISSING_SURFACE: 'R005_PARITY_MISSING_SURFACE',
10
+ PARITY_UNAVAILABLE: 'R005_PARITY_UNAVAILABLE',
11
+ TEST_CLASSIFICATION: 'R007_TEST_CLASSIFICATION',
12
+ TEST_EXISTENCE: 'R008_TEST_EXISTENCE',
13
+ };
14
+ export const CLI_PACKAGE_JSON_PATH = 'packages/@lumenflow/cli/package.json';
15
+ export const REGISTRATION_SURFACES = {
16
+ PUBLIC_MANIFEST: 'packages/@lumenflow/cli/src/public-manifest.ts',
17
+ MCP_TOOLS: 'packages/@lumenflow/mcp/src/tools.ts',
18
+ };
19
+ const DEFAULT_HEAD_REF = 'HEAD';
20
+ const AUTOMATED_TEST_BUCKETS = ['unit', 'e2e', 'integration'];
21
+ const BASIC_GLOB_CHAR_PATTERN = /[*?[\]{}]/;
22
+ const EXTGLOB_PATTERN = /[@!+*?]\(/;
23
+ function normalizeStringArray(value) {
24
+ if (!Array.isArray(value)) {
25
+ return [];
26
+ }
27
+ return value
28
+ .filter((entry) => typeof entry === 'string')
29
+ .map((entry) => entry.trim())
30
+ .filter(Boolean);
31
+ }
32
+ function normalizeCodePathsRaw(value) {
33
+ if (!Array.isArray(value)) {
34
+ return [];
35
+ }
36
+ return value;
37
+ }
38
+ function normalizeTests(testsValue) {
39
+ const testsRecord = testsValue && typeof testsValue === 'object' && !Array.isArray(testsValue)
40
+ ? testsValue
41
+ : {};
42
+ return {
43
+ manual: normalizeStringArray(testsRecord[TEST_TYPES.MANUAL]),
44
+ unit: normalizeStringArray(testsRecord[TEST_TYPES.UNIT]),
45
+ e2e: normalizeStringArray(testsRecord[TEST_TYPES.E2E]),
46
+ integration: normalizeStringArray(testsRecord[TEST_TYPES.INTEGRATION]),
47
+ };
48
+ }
49
+ function normalizeContext(input) {
50
+ const testsSource = input.tests && typeof input.tests === 'object'
51
+ ? input.tests
52
+ : input.test_paths && typeof input.test_paths === 'object'
53
+ ? input.test_paths
54
+ : {};
55
+ const codePathsRaw = normalizeCodePathsRaw(input.code_paths);
56
+ const codePaths = normalizeStringArray(input.code_paths);
57
+ return {
58
+ id: typeof input.id === 'string' && input.id.trim() ? input.id.trim() : '(unknown-wu)',
59
+ type: typeof input.type === 'string' ? input.type : undefined,
60
+ status: typeof input.status === 'string' ? input.status : undefined,
61
+ codePathsRaw,
62
+ codePaths,
63
+ tests: normalizeTests(testsSource),
64
+ cwd: input.cwd?.trim() || process.cwd(),
65
+ baseRef: input.baseRef,
66
+ headRef: input.headRef || DEFAULT_HEAD_REF,
67
+ };
68
+ }
69
+ function isDocsOrProcess(type) {
70
+ return type === WU_TYPES.DOCUMENTATION || type === WU_TYPES.PROCESS;
71
+ }
72
+ export function hasGlobPattern(pathValue) {
73
+ return BASIC_GLOB_CHAR_PATTERN.test(pathValue) || EXTGLOB_PATTERN.test(pathValue);
74
+ }
75
+ export function normalizePathForCoverage(pathValue) {
76
+ return pathValue
77
+ .trim()
78
+ .replace(/\\/g, '/')
79
+ .replace(/^\.\//, '')
80
+ .replace(/\/{2,}/g, '/')
81
+ .replace(/\/$/, '');
82
+ }
83
+ function isDirectoryLikeCodePath(codePath) {
84
+ if (codePath.endsWith('/')) {
85
+ return true;
86
+ }
87
+ const fileName = path.posix.basename(codePath);
88
+ return !fileName.includes('.');
89
+ }
90
+ function addIssue(issues, issue) {
91
+ issues.push(issue);
92
+ }
93
+ export function isCodePathCoveredByChangedFiles(options) {
94
+ const normalizedCodePath = normalizePathForCoverage(options.codePath);
95
+ if (!normalizedCodePath) {
96
+ return false;
97
+ }
98
+ const glob = hasGlobPattern(normalizedCodePath);
99
+ const directoryLike = isDirectoryLikeCodePath(options.codePath);
100
+ return options.changedFiles.some((changedFile) => {
101
+ const normalizedChangedFile = normalizePathForCoverage(changedFile);
102
+ if (!normalizedChangedFile) {
103
+ return false;
104
+ }
105
+ if (normalizedChangedFile === normalizedCodePath) {
106
+ return true;
107
+ }
108
+ if (glob) {
109
+ return minimatch(normalizedChangedFile, normalizedCodePath, { dot: true });
110
+ }
111
+ if (directoryLike) {
112
+ return normalizedChangedFile.startsWith(`${normalizedCodePath}/`);
113
+ }
114
+ return false;
115
+ });
116
+ }
117
+ export function findMissingCodePathCoverage(options) {
118
+ const { codePaths, changedFiles } = options;
119
+ return codePaths.filter((codePath) => !isCodePathCoveredByChangedFiles({ codePath, changedFiles }));
120
+ }
121
+ export function isPathLikeTestEntry(value) {
122
+ const trimmed = value.trim();
123
+ if (!trimmed) {
124
+ return false;
125
+ }
126
+ // Treat sentence-like entries as prose, not file paths.
127
+ // This avoids misclassifying notes like "N/A - metadata-only changes..." as paths.
128
+ const hasWhitespace = /\s/.test(trimmed);
129
+ const hasGlob = hasGlobPattern(trimmed);
130
+ const hasFileSuffix = /(\.(test|spec)\.[A-Za-z0-9]+|\.[A-Za-z0-9]+)$/.test(trimmed);
131
+ if (hasWhitespace &&
132
+ !trimmed.startsWith('./') &&
133
+ !trimmed.startsWith('../') &&
134
+ !trimmed.startsWith('/') &&
135
+ !hasGlob &&
136
+ !hasFileSuffix) {
137
+ return false;
138
+ }
139
+ if (trimmed.startsWith('./') || trimmed.startsWith('../') || trimmed.startsWith('/')) {
140
+ return true;
141
+ }
142
+ if (trimmed.includes('/') || trimmed.includes('\\')) {
143
+ return true;
144
+ }
145
+ if (hasGlobPattern(trimmed)) {
146
+ return true;
147
+ }
148
+ if (/\.(test|spec)\.[A-Za-z0-9]+$/i.test(trimmed)) {
149
+ return true;
150
+ }
151
+ if (!trimmed.includes(' ') && /\.[A-Za-z0-9]+$/.test(trimmed)) {
152
+ return true;
153
+ }
154
+ return false;
155
+ }
156
+ function validateRule001PathShape(context, issues) {
157
+ context.codePathsRaw.forEach((entry, index) => {
158
+ if (typeof entry !== 'string' || !entry.trim()) {
159
+ addIssue(issues, {
160
+ code: RULE_CODES.CODE_PATH_SHAPE,
161
+ severity: 'error',
162
+ message: `code_paths[${index}] must be a non-empty string path or glob.`,
163
+ suggestion: 'Provide a non-empty path/glob string or remove this entry.',
164
+ });
165
+ }
166
+ });
167
+ }
168
+ function validateRule002MinimumTestIntent(context, issues) {
169
+ if (isDocsOrProcess(context.type)) {
170
+ return;
171
+ }
172
+ if (context.codePaths.length === 0) {
173
+ return;
174
+ }
175
+ const hasTestIntent = context.tests.manual.length > 0 ||
176
+ context.tests.unit.length > 0 ||
177
+ context.tests.e2e.length > 0 ||
178
+ context.tests.integration.length > 0;
179
+ if (!hasTestIntent) {
180
+ addIssue(issues, {
181
+ code: RULE_CODES.MINIMUM_TEST_INTENT,
182
+ severity: 'error',
183
+ message: 'At least one test entry is required across tests.manual, tests.unit, tests.e2e, or tests.integration.',
184
+ suggestion: 'Add at least one test entry. Use tests.manual for descriptive checks when no automated path applies.',
185
+ });
186
+ }
187
+ }
188
+ async function validateRule003CodePathExistence(context, issues, missingCodePaths, pathReferenceExists) {
189
+ const missing = [];
190
+ for (const codePath of context.codePaths) {
191
+ // eslint-disable-next-line no-await-in-loop -- path existence checks are bounded by code_paths length
192
+ const exists = await pathReferenceExists(codePath, context.cwd);
193
+ if (!exists) {
194
+ missing.push(codePath);
195
+ }
196
+ }
197
+ if (missing.length > 0) {
198
+ missingCodePaths.push(...missing);
199
+ addIssue(issues, {
200
+ code: RULE_CODES.CODE_PATH_EXISTENCE,
201
+ severity: 'error',
202
+ message: `code_paths existence check failed for ${missing.length} path(s).`,
203
+ suggestion: 'Create the missing files/glob targets, or update code_paths to match actual repository paths.',
204
+ metadata: { missingCodePaths: missing },
205
+ });
206
+ }
207
+ }
208
+ async function validateRule004Coverage(context, issues, changedFilesOutput, missingCoverageCodePaths, resolveChangedFiles) {
209
+ if (context.codePaths.length === 0) {
210
+ return;
211
+ }
212
+ const changedFiles = await resolveChangedFiles({
213
+ cwd: context.cwd,
214
+ baseRef: context.baseRef,
215
+ headRef: context.headRef,
216
+ });
217
+ if (!changedFiles.ok) {
218
+ const coverageReason = 'reason' in changedFiles ? changedFiles.reason : 'git diff unavailable';
219
+ missingCoverageCodePaths.push(...context.codePaths);
220
+ addIssue(issues, {
221
+ code: RULE_CODES.CODE_PATH_COVERAGE,
222
+ severity: 'error',
223
+ message: `Unable to evaluate code_paths coverage: ${coverageReason}`,
224
+ suggestion: 'Ensure git diff base is available (origin/main or main) and rerun from the claimed worktree/branch context.',
225
+ });
226
+ return;
227
+ }
228
+ changedFilesOutput.push(...changedFiles.files);
229
+ const missing = findMissingCodePathCoverage({
230
+ codePaths: context.codePaths,
231
+ changedFiles: changedFiles.files,
232
+ });
233
+ if (missing.length > 0) {
234
+ missingCoverageCodePaths.push(...missing);
235
+ addIssue(issues, {
236
+ code: RULE_CODES.CODE_PATH_COVERAGE,
237
+ severity: 'error',
238
+ message: `code_paths coverage failed: ${missing.length} scoped path(s) have no matching branch diff changes.`,
239
+ suggestion: 'Commit changes that touch each missing code_path, or update code_paths to match actual branch scope.',
240
+ metadata: {
241
+ missingCodePaths: missing,
242
+ changedFiles: changedFiles.files,
243
+ baseRef: changedFiles.baseRef,
244
+ headRef: changedFiles.headRef,
245
+ },
246
+ });
247
+ }
248
+ }
249
+ function validateRule007AutomatedTestClassification(context, issues) {
250
+ const pathLikeEntries = {
251
+ unit: [],
252
+ e2e: [],
253
+ integration: [],
254
+ };
255
+ for (const bucket of AUTOMATED_TEST_BUCKETS) {
256
+ for (const entry of context.tests[bucket]) {
257
+ if (!isPathLikeTestEntry(entry)) {
258
+ addIssue(issues, {
259
+ code: RULE_CODES.TEST_CLASSIFICATION,
260
+ severity: 'error',
261
+ message: `tests.${bucket} entry is not path-like: "${entry}".`,
262
+ suggestion: `Move descriptive text to tests.manual and keep tests.${bucket} for file paths/globs only.`,
263
+ metadata: { bucket, value: entry },
264
+ });
265
+ continue;
266
+ }
267
+ pathLikeEntries[bucket].push(entry);
268
+ }
269
+ }
270
+ return pathLikeEntries;
271
+ }
272
+ async function validateRule008AutomatedTestExistence(context, issues, pathLikeEntries, missingTestPaths, pathReferenceExists) {
273
+ const missing = [];
274
+ for (const bucket of AUTOMATED_TEST_BUCKETS) {
275
+ for (const testPath of pathLikeEntries[bucket]) {
276
+ // eslint-disable-next-line no-await-in-loop -- bounded by test path list sizes
277
+ const exists = await pathReferenceExists(testPath, context.cwd);
278
+ if (!exists) {
279
+ missing.push(testPath);
280
+ }
281
+ }
282
+ }
283
+ if (missing.length > 0) {
284
+ missingTestPaths.push(...missing);
285
+ addIssue(issues, {
286
+ code: RULE_CODES.TEST_EXISTENCE,
287
+ severity: 'error',
288
+ message: `Automated test path existence failed for ${missing.length} path(s).`,
289
+ suggestion: 'Create the missing automated test files/glob targets, or move non-path notes to tests.manual.',
290
+ metadata: { missingTestPaths: missing },
291
+ });
292
+ }
293
+ }
294
+ async function validateRule005Parity(context, issues, resolveCliBinDiff) {
295
+ const includesCliPackage = context.codePaths.includes(CLI_PACKAGE_JSON_PATH);
296
+ if (!includesCliPackage) {
297
+ return { state: 'unchanged', headRef: context.headRef };
298
+ }
299
+ const diff = await resolveCliBinDiff({
300
+ cwd: context.cwd,
301
+ baseRef: context.baseRef,
302
+ headRef: context.headRef,
303
+ });
304
+ if (diff.state === 'unavailable') {
305
+ addIssue(issues, {
306
+ code: RULE_CODES.PARITY_UNAVAILABLE,
307
+ severity: 'warning',
308
+ message: `Skipped CLI registration parity check: ${diff.reason || 'bin diff unavailable.'}`,
309
+ suggestion: 'Ensure git base/head refs are available, then rerun reality validation to enforce parity.',
310
+ metadata: {
311
+ baseRef: diff.baseRef,
312
+ headRef: diff.headRef,
313
+ },
314
+ });
315
+ return diff;
316
+ }
317
+ if (diff.state === 'unchanged') {
318
+ return diff;
319
+ }
320
+ const hasPublicManifest = context.codePaths.includes(REGISTRATION_SURFACES.PUBLIC_MANIFEST);
321
+ const hasMcpTools = context.codePaths.includes(REGISTRATION_SURFACES.MCP_TOOLS);
322
+ if (!hasPublicManifest) {
323
+ addIssue(issues, {
324
+ code: RULE_CODES.PARITY_MISSING_SURFACE,
325
+ severity: 'error',
326
+ message: `CLI bin changed but '${REGISTRATION_SURFACES.PUBLIC_MANIFEST}' is missing from code_paths.`,
327
+ suggestion: `Add '${REGISTRATION_SURFACES.PUBLIC_MANIFEST}' to code_paths for CLI registration parity.`,
328
+ metadata: { surface: REGISTRATION_SURFACES.PUBLIC_MANIFEST, baseRef: diff.baseRef },
329
+ });
330
+ }
331
+ if (!hasMcpTools) {
332
+ addIssue(issues, {
333
+ code: RULE_CODES.PARITY_MISSING_SURFACE,
334
+ severity: 'error',
335
+ message: `CLI bin changed but '${REGISTRATION_SURFACES.MCP_TOOLS}' is missing from code_paths.`,
336
+ suggestion: `Add '${REGISTRATION_SURFACES.MCP_TOOLS}' to code_paths for CLI registration parity.`,
337
+ metadata: { surface: REGISTRATION_SURFACES.MCP_TOOLS, baseRef: diff.baseRef },
338
+ });
339
+ }
340
+ return diff;
341
+ }
342
+ function finalizeValidation(issues, metadata) {
343
+ const errors = issues.filter((issue) => issue.severity === 'error');
344
+ const warnings = issues.filter((issue) => issue.severity === 'warning');
345
+ return {
346
+ valid: errors.length === 0,
347
+ issues,
348
+ errors,
349
+ warnings,
350
+ metadata,
351
+ };
352
+ }
353
+ function runCommonPhaseRules(context, issues) {
354
+ validateRule001PathShape(context, issues);
355
+ validateRule002MinimumTestIntent(context, issues);
356
+ }
357
+ export function validateWURulesSync(input, options = {}) {
358
+ const phase = options.phase || 'structural';
359
+ if (phase === 'reality') {
360
+ throw new Error('validateWURulesSync does not support phase "reality". Use validateWURulesWithResolvers.');
361
+ }
362
+ const context = normalizeContext(input);
363
+ const issues = [];
364
+ runCommonPhaseRules(context, issues);
365
+ return finalizeValidation(issues, {
366
+ missingCodePaths: [],
367
+ missingCoverageCodePaths: [],
368
+ missingTestPaths: [],
369
+ changedFiles: [],
370
+ parityState: 'unavailable',
371
+ });
372
+ }
373
+ export async function validateWURulesWithResolvers(input, options = {}, resolvers) {
374
+ const phase = options.phase || 'structural';
375
+ if (phase !== 'reality') {
376
+ return validateWURulesSync(input, { phase });
377
+ }
378
+ const context = normalizeContext(input);
379
+ const issues = [];
380
+ const missingCodePaths = [];
381
+ const missingCoverageCodePaths = [];
382
+ const missingTestPaths = [];
383
+ const changedFiles = [];
384
+ runCommonPhaseRules(context, issues);
385
+ await validateRule003CodePathExistence(context, issues, missingCodePaths, resolvers.pathReferenceExists);
386
+ await validateRule004Coverage(context, issues, changedFiles, missingCoverageCodePaths, resolvers.resolveChangedFiles);
387
+ const parity = await validateRule005Parity(context, issues, resolvers.resolveCliBinDiff);
388
+ const pathLikeEntries = validateRule007AutomatedTestClassification(context, issues);
389
+ await validateRule008AutomatedTestExistence(context, issues, pathLikeEntries, missingTestPaths, resolvers.pathReferenceExists);
390
+ return finalizeValidation(issues, {
391
+ missingCodePaths,
392
+ missingCoverageCodePaths,
393
+ missingTestPaths,
394
+ changedFiles,
395
+ parityState: parity.state,
396
+ parityReason: parity.reason,
397
+ });
398
+ }
399
+ //# sourceMappingURL=wu-rules-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wu-rules-core.js","sourceRoot":"","sources":["../src/wu-rules-core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { type ValidationIssue, validateWURulesSync, type ValidationPhase, type WUValidationContextInput, type WUValidationResult } from './wu-rules-core.js';
2
+ export * from './wu-rules-core.js';
3
+ export { pathReferenceExistsSync, pathReferenceExists, resolveBaseRef, resolveChangedFiles, resolveCliBinDiff, createDefaultWURuleResolvers, } from './wu-rules-resolvers.js';
4
+ export interface NormalizedValidationIssue {
5
+ code: string;
6
+ type: string;
7
+ severity: 'error' | 'warning';
8
+ wuId?: string;
9
+ message: string;
10
+ suggestion: string;
11
+ details: string[];
12
+ }
13
+ export interface NormalizeValidationIssueOptions {
14
+ wuId?: string;
15
+ typeByCode?: Record<string, string>;
16
+ }
17
+ export declare function normalizeValidationIssue(issue: ValidationIssue, options?: NormalizeValidationIssueOptions): NormalizedValidationIssue;
18
+ export declare function validationIssueToDisplayLines(issue: ValidationIssue): string[];
19
+ /**
20
+ * Backward-compatible facade for the shared WU rules engine.
21
+ *
22
+ * Reality-phase validation is resolved via explicit git/fs adapters
23
+ * from wu-rules-resolvers so rule evaluation in wu-rules-core stays pure.
24
+ */
25
+ export declare function validateWURules(input: WUValidationContextInput, options?: {
26
+ phase?: ValidationPhase;
27
+ }): Promise<WUValidationResult>;
28
+ export { validateWURulesSync };
29
+ //# sourceMappingURL=wu-rules-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wu-rules-engine.d.ts","sourceRoot":"","sources":["../src/wu-rules-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EACpB,mBAAmB,EAEnB,KAAK,eAAe,EACpB,KAAK,wBAAwB,EAC7B,KAAK,kBAAkB,EACxB,MAAM,oBAAoB,CAAC;AAG5B,cAAc,oBAAoB,CAAC;AACnC,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,4BAA4B,GAC7B,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,+BAA+B;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAmCD,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,eAAe,EACtB,OAAO,GAAE,+BAAoC,GAC5C,yBAAyB,CAY3B;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,EAAE,CAG9E;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,wBAAwB,EAC/B,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,eAAe,CAAA;CAAO,GACxC,OAAO,CAAC,kBAAkB,CAAC,CAE7B;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { RULE_CODES, validateWURulesSync, validateWURulesWithResolvers, } from './wu-rules-core.js';
2
+ import { createDefaultWURuleResolvers } from './wu-rules-resolvers.js';
3
+ export * from './wu-rules-core.js';
4
+ export { pathReferenceExistsSync, pathReferenceExists, resolveBaseRef, resolveChangedFiles, resolveCliBinDiff, createDefaultWURuleResolvers, } from './wu-rules-resolvers.js';
5
+ function extractValidationIssueDetails(issue) {
6
+ if (!issue.metadata || typeof issue.metadata !== 'object') {
7
+ return [];
8
+ }
9
+ const metadata = issue.metadata;
10
+ const details = [];
11
+ const missingCodePaths = metadata.missingCodePaths;
12
+ if (Array.isArray(missingCodePaths) && missingCodePaths.length > 0) {
13
+ details.push(...missingCodePaths.map((entry) => ` - ${entry}`));
14
+ }
15
+ const missingTestPaths = metadata.missingTestPaths;
16
+ if (Array.isArray(missingTestPaths) && missingTestPaths.length > 0) {
17
+ details.push(...missingTestPaths.map((entry) => ` - ${entry}`));
18
+ }
19
+ if (issue.code === RULE_CODES.CODE_PATH_COVERAGE) {
20
+ const changedFiles = metadata.changedFiles;
21
+ if (Array.isArray(changedFiles)) {
22
+ details.push('Changed files considered:');
23
+ if (changedFiles.length === 0) {
24
+ details.push(' - (none)');
25
+ }
26
+ else {
27
+ details.push(...changedFiles.map((entry) => ` - ${entry}`));
28
+ }
29
+ }
30
+ }
31
+ return details;
32
+ }
33
+ export function normalizeValidationIssue(issue, options = {}) {
34
+ const mappedType = options.typeByCode?.[issue.code] ?? issue.code;
35
+ return {
36
+ code: issue.code,
37
+ type: mappedType,
38
+ severity: issue.severity,
39
+ wuId: options.wuId,
40
+ message: issue.message,
41
+ suggestion: issue.suggestion,
42
+ details: extractValidationIssueDetails(issue),
43
+ };
44
+ }
45
+ export function validationIssueToDisplayLines(issue) {
46
+ const normalized = normalizeValidationIssue(issue);
47
+ return [normalized.message, ...normalized.details];
48
+ }
49
+ /**
50
+ * Backward-compatible facade for the shared WU rules engine.
51
+ *
52
+ * Reality-phase validation is resolved via explicit git/fs adapters
53
+ * from wu-rules-resolvers so rule evaluation in wu-rules-core stays pure.
54
+ */
55
+ export async function validateWURules(input, options = {}) {
56
+ return validateWURulesWithResolvers(input, options, createDefaultWURuleResolvers());
57
+ }
58
+ export { validateWURulesSync };
59
+ //# sourceMappingURL=wu-rules-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wu-rules-engine.js","sourceRoot":"","sources":["../src/wu-rules-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type CliBinDiffResult, type ResolveChangedFilesResult, type WURuleResolvers } from './wu-rules-core.js';
2
+ export declare function pathReferenceExistsSync(reference: string, cwd: string): boolean;
3
+ export declare function pathReferenceExists(reference: string, cwd: string): Promise<boolean>;
4
+ export declare function resolveBaseRef(options: {
5
+ cwd: string;
6
+ baseRef?: string;
7
+ }): Promise<string | null>;
8
+ export declare function resolveChangedFiles(options: {
9
+ cwd: string;
10
+ baseRef?: string;
11
+ headRef?: string;
12
+ }): Promise<ResolveChangedFilesResult>;
13
+ export declare function resolveCliBinDiff(options: {
14
+ cwd: string;
15
+ baseRef?: string;
16
+ headRef?: string;
17
+ }): Promise<CliBinDiffResult>;
18
+ export declare function createDefaultWURuleResolvers(): WURuleResolvers;
19
+ //# sourceMappingURL=wu-rules-resolvers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wu-rules-resolvers.d.ts","sourceRoot":"","sources":["../src/wu-rules-resolvers.ts"],"names":[],"mappings":"AAKA,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,yBAAyB,EAC9B,KAAK,eAAe,EACrB,MAAM,oBAAoB,CAAC;AA4E5B,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAa/E;AAED,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAa1F;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiBzB;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CA4BrC;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAgF5B;AAED,wBAAgB,4BAA4B,IAAI,eAAe,CAM9D"}