@lumenflow/core 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.
Files changed (215) hide show
  1. package/dist/adapters/terminal-renderer.adapter.d.ts.map +1 -1
  2. package/dist/adapters/terminal-renderer.adapter.js +6 -4
  3. package/dist/adapters/terminal-renderer.adapter.js.map +1 -1
  4. package/dist/arg-parser.js +2 -2
  5. package/dist/arg-parser.js.map +1 -1
  6. package/dist/atomic-merge.d.ts +21 -0
  7. package/dist/atomic-merge.d.ts.map +1 -0
  8. package/dist/atomic-merge.js +83 -0
  9. package/dist/atomic-merge.js.map +1 -0
  10. package/dist/context/wu-state-reader.d.ts +2 -0
  11. package/dist/context/wu-state-reader.d.ts.map +1 -1
  12. package/dist/context/wu-state-reader.js +3 -0
  13. package/dist/context/wu-state-reader.js.map +1 -1
  14. package/dist/delegation-escalation.d.ts +91 -0
  15. package/dist/delegation-escalation.d.ts.map +1 -0
  16. package/dist/delegation-escalation.js +258 -0
  17. package/dist/delegation-escalation.js.map +1 -0
  18. package/dist/delegation-monitor.d.ts +230 -0
  19. package/dist/delegation-monitor.d.ts.map +1 -0
  20. package/dist/delegation-monitor.js +675 -0
  21. package/dist/delegation-monitor.js.map +1 -0
  22. package/dist/delegation-recovery.d.ts +83 -0
  23. package/dist/delegation-recovery.d.ts.map +1 -0
  24. package/dist/delegation-recovery.js +299 -0
  25. package/dist/delegation-recovery.js.map +1 -0
  26. package/dist/delegation-registry-schema.d.ts +80 -0
  27. package/dist/delegation-registry-schema.d.ts.map +1 -0
  28. package/dist/delegation-registry-schema.js +91 -0
  29. package/dist/delegation-registry-schema.js.map +1 -0
  30. package/dist/delegation-registry-store.d.ts +159 -0
  31. package/dist/delegation-registry-store.d.ts.map +1 -0
  32. package/dist/delegation-registry-store.js +299 -0
  33. package/dist/delegation-registry-store.js.map +1 -0
  34. package/dist/delegation-tree.d.ts +57 -0
  35. package/dist/delegation-tree.d.ts.map +1 -0
  36. package/dist/delegation-tree.js +203 -0
  37. package/dist/delegation-tree.js.map +1 -0
  38. package/dist/gates-agent-mode.d.ts +25 -0
  39. package/dist/gates-agent-mode.d.ts.map +1 -1
  40. package/dist/gates-agent-mode.js +41 -0
  41. package/dist/gates-agent-mode.js.map +1 -1
  42. package/dist/index.d.ts +16 -7
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +20 -9
  45. package/dist/index.js.map +1 -1
  46. package/dist/lumenflow-config-schema.d.ts +9 -3
  47. package/dist/lumenflow-config-schema.d.ts.map +1 -1
  48. package/dist/lumenflow-config-schema.js +19 -4
  49. package/dist/lumenflow-config-schema.js.map +1 -1
  50. package/dist/lumenflow-config.d.ts +2 -0
  51. package/dist/lumenflow-config.d.ts.map +1 -1
  52. package/dist/lumenflow-config.js +1 -0
  53. package/dist/lumenflow-config.js.map +1 -1
  54. package/dist/micro-worktree.d.ts.map +1 -1
  55. package/dist/micro-worktree.js +15 -9
  56. package/dist/micro-worktree.js.map +1 -1
  57. package/dist/rollback-utils.d.ts +52 -0
  58. package/dist/rollback-utils.d.ts.map +1 -1
  59. package/dist/rollback-utils.js +111 -0
  60. package/dist/rollback-utils.js.map +1 -1
  61. package/dist/sandbox-allowlist.d.ts +16 -0
  62. package/dist/sandbox-allowlist.d.ts.map +1 -0
  63. package/dist/sandbox-allowlist.js +75 -0
  64. package/dist/sandbox-allowlist.js.map +1 -0
  65. package/dist/sandbox-backend-linux.d.ts +6 -0
  66. package/dist/sandbox-backend-linux.d.ts.map +1 -0
  67. package/dist/sandbox-backend-linux.js +65 -0
  68. package/dist/sandbox-backend-linux.js.map +1 -0
  69. package/dist/sandbox-backend-macos.d.ts +6 -0
  70. package/dist/sandbox-backend-macos.d.ts.map +1 -0
  71. package/dist/sandbox-backend-macos.js +64 -0
  72. package/dist/sandbox-backend-macos.js.map +1 -0
  73. package/dist/sandbox-backend-windows.d.ts +6 -0
  74. package/dist/sandbox-backend-windows.d.ts.map +1 -0
  75. package/dist/sandbox-backend-windows.js +28 -0
  76. package/dist/sandbox-backend-windows.js.map +1 -0
  77. package/dist/sandbox-profile.d.ts +53 -0
  78. package/dist/sandbox-profile.d.ts.map +1 -0
  79. package/dist/sandbox-profile.js +62 -0
  80. package/dist/sandbox-profile.js.map +1 -0
  81. package/dist/schemas/index.d.ts +3 -3
  82. package/dist/schemas/index.d.ts.map +1 -1
  83. package/dist/schemas/index.js +6 -6
  84. package/dist/schemas/index.js.map +1 -1
  85. package/dist/schemas/initiative-arg-validators.d.ts +1 -0
  86. package/dist/schemas/initiative-arg-validators.d.ts.map +1 -1
  87. package/dist/schemas/initiative-schemas.d.ts +3 -1
  88. package/dist/schemas/initiative-schemas.d.ts.map +1 -1
  89. package/dist/schemas/initiative-schemas.js +2 -1
  90. package/dist/schemas/initiative-schemas.js.map +1 -1
  91. package/dist/schemas/setup-arg-validators.d.ts +4 -4
  92. package/dist/schemas/setup-arg-validators.d.ts.map +1 -1
  93. package/dist/schemas/setup-arg-validators.js +6 -6
  94. package/dist/schemas/setup-arg-validators.js.map +1 -1
  95. package/dist/schemas/setup-schemas.d.ts +7 -7
  96. package/dist/schemas/setup-schemas.d.ts.map +1 -1
  97. package/dist/schemas/setup-schemas.js +11 -11
  98. package/dist/schemas/setup-schemas.js.map +1 -1
  99. package/dist/schemas/wu-lifecycle-arg-validators.d.ts +2 -1
  100. package/dist/schemas/wu-lifecycle-arg-validators.d.ts.map +1 -1
  101. package/dist/schemas/wu-lifecycle-schemas.d.ts +5 -3
  102. package/dist/schemas/wu-lifecycle-schemas.d.ts.map +1 -1
  103. package/dist/schemas/wu-lifecycle-schemas.js +6 -2
  104. package/dist/schemas/wu-lifecycle-schemas.js.map +1 -1
  105. package/dist/spawn-strategy.d.ts +1 -1
  106. package/dist/spawn-strategy.js +1 -1
  107. package/dist/template-loader.d.ts +7 -3
  108. package/dist/template-loader.d.ts.map +1 -1
  109. package/dist/template-loader.js +22 -6
  110. package/dist/template-loader.js.map +1 -1
  111. package/dist/validation/types.d.ts +2 -0
  112. package/dist/validation/types.d.ts.map +1 -1
  113. package/dist/wu-consistency-checker.d.ts +1 -0
  114. package/dist/wu-consistency-checker.d.ts.map +1 -1
  115. package/dist/wu-consistency-checker.js +31 -2
  116. package/dist/wu-consistency-checker.js.map +1 -1
  117. package/dist/wu-context-constants.d.ts +4 -2
  118. package/dist/wu-context-constants.d.ts.map +1 -1
  119. package/dist/wu-context-constants.js +4 -2
  120. package/dist/wu-context-constants.js.map +1 -1
  121. package/dist/wu-done-branch-only.d.ts +2 -11
  122. package/dist/wu-done-branch-only.d.ts.map +1 -1
  123. package/dist/wu-done-branch-only.js +81 -45
  124. package/dist/wu-done-branch-only.js.map +1 -1
  125. package/dist/wu-done-cleanup.js +33 -1
  126. package/dist/wu-done-cleanup.js.map +1 -1
  127. package/dist/wu-done-initiative-sync.d.ts.map +1 -1
  128. package/dist/wu-done-initiative-sync.js +20 -5
  129. package/dist/wu-done-initiative-sync.js.map +1 -1
  130. package/dist/wu-done-machine.d.ts +175 -0
  131. package/dist/wu-done-machine.d.ts.map +1 -0
  132. package/dist/wu-done-machine.js +225 -0
  133. package/dist/wu-done-machine.js.map +1 -0
  134. package/dist/wu-done-metadata.d.ts.map +1 -1
  135. package/dist/wu-done-metadata.js +3 -1
  136. package/dist/wu-done-metadata.js.map +1 -1
  137. package/dist/wu-done-preflight.d.ts +8 -0
  138. package/dist/wu-done-preflight.d.ts.map +1 -1
  139. package/dist/wu-done-preflight.js +17 -1
  140. package/dist/wu-done-preflight.js.map +1 -1
  141. package/dist/wu-done-validation.d.ts +0 -37
  142. package/dist/wu-done-validation.d.ts.map +1 -1
  143. package/dist/wu-done-validation.js +1 -155
  144. package/dist/wu-done-validation.js.map +1 -1
  145. package/dist/wu-done-validators.d.ts +1 -2
  146. package/dist/wu-done-validators.d.ts.map +1 -1
  147. package/dist/wu-done-validators.js +1 -3
  148. package/dist/wu-done-validators.js.map +1 -1
  149. package/dist/wu-done-worktree-services.d.ts +191 -0
  150. package/dist/wu-done-worktree-services.d.ts.map +1 -0
  151. package/dist/wu-done-worktree-services.js +273 -0
  152. package/dist/wu-done-worktree-services.js.map +1 -0
  153. package/dist/wu-done-worktree.d.ts +0 -19
  154. package/dist/wu-done-worktree.d.ts.map +1 -1
  155. package/dist/wu-done-worktree.js +165 -118
  156. package/dist/wu-done-worktree.js.map +1 -1
  157. package/dist/wu-git-constants.d.ts +4 -0
  158. package/dist/wu-git-constants.d.ts.map +1 -1
  159. package/dist/wu-git-constants.js +4 -0
  160. package/dist/wu-git-constants.js.map +1 -1
  161. package/dist/wu-helpers.d.ts +5 -1
  162. package/dist/wu-helpers.d.ts.map +1 -1
  163. package/dist/wu-helpers.js +5 -1
  164. package/dist/wu-helpers.js.map +1 -1
  165. package/dist/wu-lint.d.ts +53 -37
  166. package/dist/wu-lint.d.ts.map +1 -1
  167. package/dist/wu-lint.js +95 -105
  168. package/dist/wu-lint.js.map +1 -1
  169. package/dist/wu-paths-constants.d.ts +3 -3
  170. package/dist/wu-paths-constants.d.ts.map +1 -1
  171. package/dist/wu-paths-constants.js +3 -3
  172. package/dist/wu-paths-constants.js.map +1 -1
  173. package/dist/wu-preflight-validators.d.ts +28 -77
  174. package/dist/wu-preflight-validators.d.ts.map +1 -1
  175. package/dist/wu-preflight-validators.js +86 -130
  176. package/dist/wu-preflight-validators.js.map +1 -1
  177. package/dist/wu-recovery.d.ts +89 -0
  178. package/dist/wu-recovery.d.ts.map +1 -1
  179. package/dist/wu-recovery.js +118 -0
  180. package/dist/wu-recovery.js.map +1 -1
  181. package/dist/wu-rules-core.d.ts +95 -0
  182. package/dist/wu-rules-core.d.ts.map +1 -0
  183. package/dist/wu-rules-core.js +399 -0
  184. package/dist/wu-rules-core.js.map +1 -0
  185. package/dist/wu-rules-engine.d.ts +29 -0
  186. package/dist/wu-rules-engine.d.ts.map +1 -0
  187. package/dist/wu-rules-engine.js +59 -0
  188. package/dist/wu-rules-engine.js.map +1 -0
  189. package/dist/wu-rules-resolvers.d.ts +19 -0
  190. package/dist/wu-rules-resolvers.d.ts.map +1 -0
  191. package/dist/wu-rules-resolvers.js +208 -0
  192. package/dist/wu-rules-resolvers.js.map +1 -0
  193. package/dist/wu-schema.d.ts +24 -9
  194. package/dist/wu-schema.d.ts.map +1 -1
  195. package/dist/wu-schema.js +14 -1
  196. package/dist/wu-schema.js.map +1 -1
  197. package/dist/wu-spawn-context.d.ts +1 -1
  198. package/dist/wu-spawn-context.d.ts.map +1 -1
  199. package/dist/wu-spawn-context.js +8 -2
  200. package/dist/wu-spawn-context.js.map +1 -1
  201. package/dist/wu-spawn-helpers.js +2 -2
  202. package/dist/wu-spawn-helpers.js.map +1 -1
  203. package/dist/wu-state-schema.d.ts +12 -12
  204. package/dist/wu-state-schema.d.ts.map +1 -1
  205. package/dist/wu-state-schema.js +10 -10
  206. package/dist/wu-state-schema.js.map +1 -1
  207. package/dist/wu-state-store.d.ts +10 -4
  208. package/dist/wu-state-store.d.ts.map +1 -1
  209. package/dist/wu-state-store.js +309 -11
  210. package/dist/wu-state-store.js.map +1 -1
  211. package/dist/wu-transaction.d.ts +21 -0
  212. package/dist/wu-transaction.d.ts.map +1 -1
  213. package/dist/wu-transaction.js +17 -0
  214. package/dist/wu-transaction.js.map +1 -1
  215. package/package.json +14 -11
@@ -13,6 +13,11 @@
13
13
  * NOTE (WU-1826): Core recovery functions are now re-exported from
14
14
  * tools/lib/wu-repair-core.ts for use by the unified wu:repair command.
15
15
  * This module remains the canonical implementation used by wu-done.ts.
16
+ *
17
+ * WU-1665: Adds state-machine-driven recovery consolidation.
18
+ * - StateMachineRecoveryManager determines rollback scope from pipeline failedAt state.
19
+ * - Legacy rollback path retained behind LUMENFLOW_LEGACY_ROLLBACK=1 env flag.
20
+ * - All recovery is now centralized through state-machine semantics by default.
16
21
  */
17
22
  import { existsSync, readFileSync, unlinkSync, writeFileSync, mkdirSync } from 'node:fs';
18
23
  import { join, isAbsolute } from 'node:path';
@@ -339,4 +344,117 @@ export async function recoverZombieState({ id, doc, _worktreePath, _args }) {
339
344
  throw createError(ErrorCodes.RECOVERY_ERROR, `Recovery operation failed: ${error.message}\nFiles rolled back to clean state. Re-run wu:done to retry.`, { originalError: error.message, wuId: id });
340
345
  }
341
346
  }
347
+ // ---------------------------------------------------------------------------
348
+ // WU-1665: State-machine-driven recovery consolidation
349
+ // ---------------------------------------------------------------------------
350
+ /**
351
+ * WU-1665: Environment variable key for legacy rollback compatibility guard.
352
+ * When set to "1", the legacy rollback path is used instead of state-machine-driven recovery.
353
+ */
354
+ export const LUMENFLOW_LEGACY_ROLLBACK_ENV_KEY = 'LUMENFLOW_LEGACY_ROLLBACK';
355
+ /**
356
+ * WU-1665: Check if legacy rollback mode is enabled via environment variable.
357
+ *
358
+ * During the migration window, operators can set LUMENFLOW_LEGACY_ROLLBACK=1
359
+ * to use the pre-WU-1665 recovery path for rollback operations.
360
+ *
361
+ * @returns {boolean} True if legacy rollback is enabled
362
+ */
363
+ export function isLegacyRollbackEnabled() {
364
+ return process.env[LUMENFLOW_LEGACY_ROLLBACK_ENV_KEY] === '1';
365
+ }
366
+ /**
367
+ * WU-1665: State-machine-driven recovery manager.
368
+ *
369
+ * Determines rollback scope from the pipeline's failedAt state, replacing
370
+ * the ad-hoc per-function rollback logic scattered across wu-recovery.ts,
371
+ * wu-transaction.ts, and rollback-utils.ts.
372
+ *
373
+ * Usage:
374
+ * ```ts
375
+ * const manager = new StateMachineRecoveryManager({
376
+ * wuId: 'WU-1665',
377
+ * failedAt: 'committing',
378
+ * error: 'git commit failed',
379
+ * retryCount: 0,
380
+ * });
381
+ * const scope = manager.getRollbackScope();
382
+ * // scope.snapshotRestore === true
383
+ * // scope.branchRollback === false
384
+ * ```
385
+ */
386
+ export class StateMachineRecoveryManager {
387
+ wuId;
388
+ failedAt;
389
+ error;
390
+ retryCount;
391
+ constructor(state) {
392
+ this.wuId = state.wuId;
393
+ this.failedAt = state.failedAt;
394
+ this.error = state.error;
395
+ this.retryCount = state.retryCount;
396
+ }
397
+ /**
398
+ * Determine rollback scope based on the pipeline stage where failure occurred.
399
+ *
400
+ * The scope is deterministic: given the same failedAt state, the same
401
+ * rollback actions are always prescribed.
402
+ */
403
+ getRollbackScope() {
404
+ const failedAt = this.failedAt;
405
+ // Pre-write states: nothing to roll back
406
+ if (!failedAt ||
407
+ failedAt === 'validating' ||
408
+ failedAt === 'preparing' ||
409
+ failedAt === 'gating') {
410
+ return {
411
+ snapshotRestore: false,
412
+ branchRollback: false,
413
+ worktreeCleanup: false,
414
+ };
415
+ }
416
+ // Post-push state: push already succeeded, only cleanup remains
417
+ if (failedAt === 'cleaningUp') {
418
+ return {
419
+ snapshotRestore: false,
420
+ branchRollback: false,
421
+ worktreeCleanup: true,
422
+ };
423
+ }
424
+ // Commit-phase failures: files written, need snapshot restore
425
+ if (failedAt === 'committing') {
426
+ return {
427
+ snapshotRestore: true,
428
+ branchRollback: false,
429
+ worktreeCleanup: false,
430
+ };
431
+ }
432
+ // Merge/push phase failures: committed + potentially merged, need full rollback
433
+ // (merging, pushing)
434
+ return {
435
+ snapshotRestore: true,
436
+ branchRollback: true,
437
+ worktreeCleanup: false,
438
+ };
439
+ }
440
+ /**
441
+ * Serialize recovery state for persistence (e.g., to .lumenflow/recovery/).
442
+ */
443
+ serialize() {
444
+ return JSON.stringify({
445
+ wuId: this.wuId,
446
+ failedAt: this.failedAt,
447
+ error: this.error,
448
+ retryCount: this.retryCount,
449
+ serializedAt: new Date().toISOString(),
450
+ });
451
+ }
452
+ /**
453
+ * Deserialize recovery state from persisted JSON.
454
+ */
455
+ static deserialize(json) {
456
+ const data = JSON.parse(json);
457
+ return new StateMachineRecoveryManager(data);
458
+ }
459
+ }
342
460
  //# sourceMappingURL=wu-recovery.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"wu-recovery.js","sourceRoot":"","sources":["../src/wu-recovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wu-recovery.js","sourceRoot":"","sources":["../src/wu-recovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC5F,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAElG,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC;AAExE;;GAEG;AACH,MAAM,mBAAmB,GAAG,UAAU,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE;IAC/D,OAAO,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,IAAI,EAAE,mBAAmB,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;AACpF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE;IACjE,MAAM,UAAU,GAAG,qBAAqB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACtD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,8BAA8B;QAC9B,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE;IAClE,MAAM,UAAU,GAAG,qBAAqB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;IAE3E,0BAA0B;IAC1B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,YAAY,GAAG,uBAAuB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,YAAY,GAAG,CAAC,CAAC;IAElC,MAAM,IAAI,GAAG;QACX,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,IAAI,EAAE,EAAE;KACT,CAAC;IAEF,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACzD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE;IAC/D,MAAM,UAAU,GAAG,qBAAqB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACtD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,UAAU,CAAC,UAAU,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kCAAkC,CAAC,QAAQ;IACzD,OAAO,QAAQ,IAAI,qBAAqB,CAAC;AAC3C,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,mBAAmB,CAAC,KAAK;IAChC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAC7D,OAAO;QACL,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;QAClF,aAAa,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;QAC9F,cAAc,EAAE,UAAU,CAAC,WAAW,CAAC;YACrC,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;YAClD,CAAC,CAAC,IAAI;QACR,YAAY,EAAE,UAAU,CAAC,SAAS,CAAC;QACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,2BAA2B,CAAC,KAAK,EAAE,KAAK;IAC/C,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAE7D,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,uCAAuC,CAAC,CAAC;IAExF,iCAAiC;IACjC,MAAM,cAAc,GAAG,EAAE,CAAC;IAE1B,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QAC7B,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,KAAK,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;QACjC,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;IAC7F,CAAC;IACD,IAAI,KAAK,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;QAClC,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;IAChG,CAAC;IAED,gBAAgB;IAChB,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;QAC7C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,aAAa,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,CACX,GAAG,UAAU,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,sBAAsB,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,KAAK,EAAE,CAClF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC;YACH,UAAU,CAAC,SAAS,CAAC,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;QACxE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,4BAA4B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,6CAA6C,CAAC,CAAC;AAChG,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAG,EAAE,YAAY;IACjD,OAAO,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,IAAI,IAAI,YAAY,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC;AACnF,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,4BAA4B,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,EAAE;IACpE,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpD,MAAM,oBAAoB,GAAG,UAAU,CAAC,YAAY,CAAC;QACnD,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAE7D,8BAA8B;IAC9B,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,WAAW,CAAC;IAEnC,iDAAiD;IACjD,OAAO,GAAG,CAAC,MAAM,CAAC;IAClB,OAAO,GAAG,CAAC,YAAY,CAAC;IAExB,iCAAiC;IACjC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAEvB,OAAO,CAAC,GAAG,CACT,GAAG,UAAU,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,kDAAkD,CACtF,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,2GAA2G;AAE3G;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE;IACxE,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAElC,MAAM,OAAO,GAKT;QACF,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;KACtC,CAAC;IAEF,0EAA0E;IAC1E,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/B,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAErC,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;IAC7D,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAEhD,IAAI,CAAC;QACH,sCAAsC;QACtC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QACrC,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAEpC,iDAAiD;QACjD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QACpC,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACxB,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC;YAClB,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;YACxC,GAAG,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC5C,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACrB,OAAO,CAAC,IAAI,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;QAChE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAEnC,uEAAuE;QACvE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAEpC,4BAA4B,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC7C,oBAAoB,CAAC,UAAU,EAAE,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAExC,MAAM,mBAAmB,CAAC,WAAW,EAAE,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAEzC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAEnC,mEAAmE;QACnE,oDAAoD;QACpD,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;QAC3B,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,SAAS,EAAE,CAAC;QAC3C,IAAI,YAAY,IAAI,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAEjC,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;gBAC5D,oFAAoF;gBACpF,kFAAkF;gBAClF,yFAAyF;gBACzF,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,EAAE,CAAC;gBAChC,IAAI,CAAC;oBACH,MAAM,GAAG,CAAC,MAAM,CAAC,kDAAkD,EAAE,EAAE,CAAC,CAAC;gBAC3E,CAAC;wBAAS,CAAC;oBACT,oCAAoC;oBACpC,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;gBACpC,CAAC;gBACD,OAAO,CAAC,MAAM,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;gBACrC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,WAAW,EAAE,CAAC;gBACrB,iDAAiD;gBACjD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC1D,2BAA2B,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;gBAEjD,MAAM,WAAW,CACf,UAAU,CAAC,SAAS,EACpB,2BAA2B,WAAW,CAAC,OAAO,8DAA8D,EAC5G,EAAE,aAAa,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CACjD,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;QAC9D,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;QAEzC,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,4DAA4D;QAC5D,kEAAkE;QAClE,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,SAAS,EAAE,CAAC;YACxC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,8CAA8C;QAC9C,OAAO,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,qBAAqB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACvF,2BAA2B,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAEjD,MAAM,WAAW,CACf,UAAU,CAAC,cAAc,EACzB,8BAA8B,KAAK,CAAC,OAAO,8DAA8D,EACzG,EAAE,aAAa,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAC3C,CAAC;IACJ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,uDAAuD;AACvD,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG,2BAA2B,CAAC;AAE7E;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,KAAK,GAAG,CAAC;AAChE,CAAC;AAgCD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,2BAA2B;IAC7B,IAAI,CAAS;IACb,QAAQ,CAAgB;IACxB,KAAK,CAAgB;IACrB,UAAU,CAAS;IAE5B,YAAY,KAA4B;QACtC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IACrC,CAAC;IAED;;;;;OAKG;IACH,gBAAgB;QACd,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE/B,yCAAyC;QACzC,IACE,CAAC,QAAQ;YACT,QAAQ,KAAK,YAAY;YACzB,QAAQ,KAAK,WAAW;YACxB,QAAQ,KAAK,QAAQ,EACrB,CAAC;YACD,OAAO;gBACL,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,KAAK;gBACrB,eAAe,EAAE,KAAK;aACvB,CAAC;QACJ,CAAC;QAED,gEAAgE;QAChE,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC9B,OAAO;gBACL,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,KAAK;gBACrB,eAAe,EAAE,IAAI;aACtB,CAAC;QACJ,CAAC;QAED,8DAA8D;QAC9D,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC9B,OAAO;gBACL,eAAe,EAAE,IAAI;gBACrB,cAAc,EAAE,KAAK;gBACrB,eAAe,EAAE,KAAK;aACvB,CAAC;QACJ,CAAC;QAED,gFAAgF;QAChF,qBAAqB;QACrB,OAAO;YACL,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,IAAI;YACpB,eAAe,EAAE,KAAK;SACvB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACvC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,IAAY;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA0B,CAAC;QACvD,OAAO,IAAI,2BAA2B,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;CACF"}
@@ -0,0 +1,95 @@
1
+ export type ValidationPhase = 'intent' | 'structural' | 'reality';
2
+ export interface ValidationIssue {
3
+ code: string;
4
+ severity: 'error' | 'warning';
5
+ message: string;
6
+ suggestion: string;
7
+ metadata?: Record<string, unknown>;
8
+ }
9
+ export interface WUValidationContextInput {
10
+ id?: string;
11
+ type?: string;
12
+ status?: string;
13
+ code_paths?: unknown;
14
+ tests?: unknown;
15
+ test_paths?: unknown;
16
+ cwd?: string;
17
+ baseRef?: string;
18
+ headRef?: string;
19
+ }
20
+ export interface WUValidationResult {
21
+ valid: boolean;
22
+ issues: ValidationIssue[];
23
+ errors: ValidationIssue[];
24
+ warnings: ValidationIssue[];
25
+ metadata: {
26
+ missingCodePaths: string[];
27
+ missingCoverageCodePaths: string[];
28
+ missingTestPaths: string[];
29
+ changedFiles: string[];
30
+ parityState: CliBinDiffState;
31
+ parityReason?: string;
32
+ };
33
+ }
34
+ export declare const RULE_CODES: {
35
+ readonly CODE_PATH_SHAPE: "R001_CODE_PATH_SHAPE";
36
+ readonly MINIMUM_TEST_INTENT: "R002_MINIMUM_TEST_INTENT";
37
+ readonly CODE_PATH_EXISTENCE: "R003_CODE_PATH_EXISTENCE";
38
+ readonly CODE_PATH_COVERAGE: "R004_CODE_PATH_COVERAGE";
39
+ readonly PARITY_MISSING_SURFACE: "R005_PARITY_MISSING_SURFACE";
40
+ readonly PARITY_UNAVAILABLE: "R005_PARITY_UNAVAILABLE";
41
+ readonly TEST_CLASSIFICATION: "R007_TEST_CLASSIFICATION";
42
+ readonly TEST_EXISTENCE: "R008_TEST_EXISTENCE";
43
+ };
44
+ export declare const CLI_PACKAGE_JSON_PATH = "packages/@lumenflow/cli/package.json";
45
+ export declare const REGISTRATION_SURFACES: {
46
+ readonly PUBLIC_MANIFEST: "packages/@lumenflow/cli/src/public-manifest.ts";
47
+ readonly MCP_TOOLS: "packages/@lumenflow/mcp/src/tools.ts";
48
+ };
49
+ export type CliBinDiffState = 'changed' | 'unchanged' | 'unavailable';
50
+ export interface CliBinDiffResult {
51
+ state: CliBinDiffState;
52
+ reason?: string;
53
+ baseRef?: string;
54
+ headRef: string;
55
+ }
56
+ export type ResolveChangedFilesResult = {
57
+ ok: true;
58
+ files: string[];
59
+ baseRef: string;
60
+ headRef: string;
61
+ } | {
62
+ ok: false;
63
+ reason: string;
64
+ };
65
+ export interface WURuleResolvers {
66
+ pathReferenceExists: (reference: string, cwd: string) => Promise<boolean>;
67
+ resolveChangedFiles: (options: {
68
+ cwd: string;
69
+ baseRef?: string;
70
+ headRef?: string;
71
+ }) => Promise<ResolveChangedFilesResult>;
72
+ resolveCliBinDiff: (options: {
73
+ cwd: string;
74
+ baseRef?: string;
75
+ headRef?: string;
76
+ }) => Promise<CliBinDiffResult>;
77
+ }
78
+ export declare function hasGlobPattern(pathValue: string): boolean;
79
+ export declare function normalizePathForCoverage(pathValue: string): string;
80
+ export declare function isCodePathCoveredByChangedFiles(options: {
81
+ codePath: string;
82
+ changedFiles: string[];
83
+ }): boolean;
84
+ export declare function findMissingCodePathCoverage(options: {
85
+ codePaths: string[];
86
+ changedFiles: string[];
87
+ }): string[];
88
+ export declare function isPathLikeTestEntry(value: string): boolean;
89
+ export declare function validateWURulesSync(input: WUValidationContextInput, options?: {
90
+ phase?: ValidationPhase;
91
+ }): WUValidationResult;
92
+ export declare function validateWURulesWithResolvers(input: WUValidationContextInput, options: {
93
+ phase?: ValidationPhase;
94
+ }, resolvers: WURuleResolvers): Promise<WUValidationResult>;
95
+ //# sourceMappingURL=wu-rules-core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wu-rules-core.d.ts","sourceRoot":"","sources":["../src/wu-rules-core.ts"],"names":[],"mappings":"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"}
@@ -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