@lumenflow/packs-software-delivery 4.24.0 → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. package/dist/manifest-schema.d.ts +12 -0
  2. package/dist/manifest-schema.d.ts.map +1 -1
  3. package/dist/manifest-schema.js +10 -0
  4. package/dist/manifest-schema.js.map +1 -1
  5. package/dist/manifest.d.ts +21 -0
  6. package/dist/manifest.d.ts.map +1 -1
  7. package/dist/manifest.js +92 -1
  8. package/dist/manifest.js.map +1 -1
  9. package/dist/src/commands/index.d.ts +2 -0
  10. package/dist/src/commands/index.d.ts.map +1 -0
  11. package/dist/src/commands/index.js +5 -0
  12. package/dist/src/commands/index.js.map +1 -0
  13. package/dist/src/config/delivery-review-contract.d.ts +17 -0
  14. package/dist/src/config/delivery-review-contract.d.ts.map +1 -0
  15. package/dist/src/config/delivery-review-contract.js +19 -0
  16. package/dist/src/config/delivery-review-contract.js.map +1 -0
  17. package/dist/src/config/env-accessors.d.ts +16 -0
  18. package/dist/src/config/env-accessors.d.ts.map +1 -0
  19. package/dist/src/config/env-accessors.js +18 -0
  20. package/dist/src/config/env-accessors.js.map +1 -0
  21. package/dist/src/config/index.d.ts +3 -0
  22. package/dist/src/config/index.d.ts.map +1 -0
  23. package/dist/src/config/index.js +8 -0
  24. package/dist/src/config/index.js.map +1 -0
  25. package/dist/src/config/normalize-config-keys.d.ts +16 -0
  26. package/dist/src/config/normalize-config-keys.d.ts.map +1 -0
  27. package/dist/src/config/normalize-config-keys.js +18 -0
  28. package/dist/src/config/normalize-config-keys.js.map +1 -0
  29. package/dist/src/config/schemas/lumenflow-config-schema-types.d.ts +190 -0
  30. package/dist/src/config/schemas/lumenflow-config-schema-types.d.ts.map +1 -0
  31. package/dist/src/config/schemas/lumenflow-config-schema-types.js +182 -0
  32. package/dist/src/config/schemas/lumenflow-config-schema-types.js.map +1 -0
  33. package/dist/src/config/schemas/lumenflow-config-schema.d.ts +190 -0
  34. package/dist/src/config/schemas/lumenflow-config-schema.d.ts.map +1 -0
  35. package/dist/src/config/schemas/lumenflow-config-schema.js +182 -0
  36. package/dist/src/config/schemas/lumenflow-config-schema.js.map +1 -0
  37. package/dist/src/config/workspace-reader.d.ts +56 -0
  38. package/dist/src/config/workspace-reader.d.ts.map +1 -0
  39. package/dist/src/config/workspace-reader.js +209 -0
  40. package/dist/src/config/workspace-reader.js.map +1 -0
  41. package/dist/src/constants/backlog-patterns.d.ts +21 -0
  42. package/dist/src/constants/backlog-patterns.d.ts.map +1 -0
  43. package/dist/src/constants/backlog-patterns.js +26 -0
  44. package/dist/src/constants/backlog-patterns.js.map +1 -0
  45. package/dist/src/constants/client-ids.d.ts +16 -0
  46. package/dist/src/constants/client-ids.d.ts.map +1 -0
  47. package/dist/src/constants/client-ids.js +16 -0
  48. package/dist/src/constants/client-ids.js.map +1 -0
  49. package/dist/src/constants/config-contract.d.ts +2 -0
  50. package/dist/src/constants/config-contract.d.ts.map +1 -0
  51. package/dist/src/constants/config-contract.js +7 -0
  52. package/dist/src/constants/config-contract.js.map +1 -0
  53. package/dist/src/constants/docs-layout-presets.d.ts +31 -0
  54. package/dist/src/constants/docs-layout-presets.d.ts.map +1 -0
  55. package/dist/src/constants/docs-layout-presets.js +41 -0
  56. package/dist/src/constants/docs-layout-presets.js.map +1 -0
  57. package/dist/src/constants/duration-constants.d.ts +11 -0
  58. package/dist/src/constants/duration-constants.d.ts.map +1 -0
  59. package/dist/src/constants/duration-constants.js +13 -0
  60. package/dist/src/constants/duration-constants.js.map +1 -0
  61. package/dist/src/constants/gate-constants.d.ts +24 -0
  62. package/dist/src/constants/gate-constants.d.ts.map +1 -0
  63. package/dist/src/constants/gate-constants.js +26 -0
  64. package/dist/src/constants/gate-constants.js.map +1 -0
  65. package/dist/src/constants/index.d.ts +18 -0
  66. package/dist/src/constants/index.d.ts.map +1 -0
  67. package/dist/src/constants/index.js +29 -0
  68. package/dist/src/constants/index.js.map +1 -0
  69. package/dist/src/constants/lock-constants.d.ts +29 -0
  70. package/dist/src/constants/lock-constants.d.ts.map +1 -0
  71. package/dist/src/constants/lock-constants.js +31 -0
  72. package/dist/src/constants/lock-constants.js.map +1 -0
  73. package/dist/src/constants/object-guards.d.ts +9 -0
  74. package/dist/src/constants/object-guards.d.ts.map +1 -0
  75. package/dist/src/constants/object-guards.js +11 -0
  76. package/dist/src/constants/object-guards.js.map +1 -0
  77. package/dist/src/constants/section-headings.d.ts +35 -0
  78. package/dist/src/constants/section-headings.d.ts.map +1 -0
  79. package/dist/src/constants/section-headings.js +82 -0
  80. package/dist/src/constants/section-headings.js.map +1 -0
  81. package/dist/src/constants/wu-cli-constants.d.ts +434 -0
  82. package/dist/src/constants/wu-cli-constants.d.ts.map +1 -0
  83. package/dist/src/constants/wu-cli-constants.js +439 -0
  84. package/dist/src/constants/wu-cli-constants.js.map +1 -0
  85. package/dist/src/constants/wu-domain-constants.d.ts +296 -0
  86. package/dist/src/constants/wu-domain-constants.d.ts.map +1 -0
  87. package/dist/src/constants/wu-domain-constants.js +400 -0
  88. package/dist/src/constants/wu-domain-constants.js.map +1 -0
  89. package/dist/src/constants/wu-git-constants.d.ts +2 -0
  90. package/dist/src/constants/wu-git-constants.d.ts.map +1 -0
  91. package/dist/src/constants/wu-git-constants.js +7 -0
  92. package/dist/src/constants/wu-git-constants.js.map +1 -0
  93. package/dist/src/constants/wu-id-format.d.ts +138 -0
  94. package/dist/src/constants/wu-id-format.d.ts.map +1 -0
  95. package/dist/src/constants/wu-id-format.js +265 -0
  96. package/dist/src/constants/wu-id-format.js.map +1 -0
  97. package/dist/src/constants/wu-paths-constants.d.ts +254 -0
  98. package/dist/src/constants/wu-paths-constants.d.ts.map +1 -0
  99. package/dist/src/constants/wu-paths-constants.js +276 -0
  100. package/dist/src/constants/wu-paths-constants.js.map +1 -0
  101. package/dist/src/constants/wu-statuses.d.ts +209 -0
  102. package/dist/src/constants/wu-statuses.d.ts.map +1 -0
  103. package/dist/src/constants/wu-statuses.js +245 -0
  104. package/dist/src/constants/wu-statuses.js.map +1 -0
  105. package/dist/src/constants/wu-type-helpers.d.ts +28 -0
  106. package/dist/src/constants/wu-type-helpers.d.ts.map +1 -0
  107. package/dist/src/constants/wu-type-helpers.js +49 -0
  108. package/dist/src/constants/wu-type-helpers.js.map +1 -0
  109. package/dist/src/constants/wu-ui-constants.d.ts +236 -0
  110. package/dist/src/constants/wu-ui-constants.d.ts.map +1 -0
  111. package/dist/src/constants/wu-ui-constants.js +238 -0
  112. package/dist/src/constants/wu-ui-constants.js.map +1 -0
  113. package/dist/src/constants/wu-validation-constants.d.ts +61 -0
  114. package/dist/src/constants/wu-validation-constants.d.ts.map +1 -0
  115. package/dist/src/constants/wu-validation-constants.js +69 -0
  116. package/dist/src/constants/wu-validation-constants.js.map +1 -0
  117. package/dist/src/domain/index.d.ts +4 -0
  118. package/dist/src/domain/index.d.ts.map +1 -0
  119. package/dist/src/domain/index.js +6 -0
  120. package/dist/src/domain/index.js.map +1 -0
  121. package/dist/src/domain/orchestration.constants.d.ts +111 -0
  122. package/dist/src/domain/orchestration.constants.d.ts.map +1 -0
  123. package/dist/src/domain/orchestration.constants.js +130 -0
  124. package/dist/src/domain/orchestration.constants.js.map +1 -0
  125. package/dist/src/domain/orchestration.schemas.d.ts +307 -0
  126. package/dist/src/domain/orchestration.schemas.d.ts.map +1 -0
  127. package/dist/src/domain/orchestration.schemas.js +214 -0
  128. package/dist/src/domain/orchestration.schemas.js.map +1 -0
  129. package/dist/src/domain/orchestration.types.d.ts +134 -0
  130. package/dist/src/domain/orchestration.types.d.ts.map +1 -0
  131. package/dist/src/domain/orchestration.types.js +5 -0
  132. package/dist/src/domain/orchestration.types.js.map +1 -0
  133. package/dist/src/methodology/incremental-test.d.ts +33 -0
  134. package/dist/src/methodology/incremental-test.d.ts.map +1 -0
  135. package/dist/src/methodology/incremental-test.js +73 -0
  136. package/dist/src/methodology/incremental-test.js.map +1 -0
  137. package/dist/src/methodology/index.d.ts +3 -0
  138. package/dist/src/methodology/index.d.ts.map +1 -0
  139. package/dist/src/methodology/index.js +6 -0
  140. package/dist/src/methodology/index.js.map +1 -0
  141. package/dist/src/methodology/manual-test-validator.d.ts +97 -0
  142. package/dist/src/methodology/manual-test-validator.d.ts.map +1 -0
  143. package/dist/src/methodology/manual-test-validator.js +248 -0
  144. package/dist/src/methodology/manual-test-validator.js.map +1 -0
  145. package/dist/src/policy/coverage-gate.d.ts +127 -0
  146. package/dist/src/policy/coverage-gate.d.ts.map +1 -0
  147. package/dist/src/policy/coverage-gate.js +211 -0
  148. package/dist/src/policy/coverage-gate.js.map +1 -0
  149. package/dist/src/policy/gates-agent-mode.d.ts +107 -0
  150. package/dist/src/policy/gates-agent-mode.d.ts.map +1 -0
  151. package/dist/src/policy/gates-agent-mode.js +138 -0
  152. package/dist/src/policy/gates-agent-mode.js.map +1 -0
  153. package/dist/src/policy/gates-config-internal.d.ts +54 -0
  154. package/dist/src/policy/gates-config-internal.d.ts.map +1 -0
  155. package/dist/src/policy/gates-config-internal.js +108 -0
  156. package/dist/src/policy/gates-config-internal.js.map +1 -0
  157. package/dist/src/policy/gates-config.d.ts +67 -0
  158. package/dist/src/policy/gates-config.d.ts.map +1 -0
  159. package/dist/src/policy/gates-config.js +193 -0
  160. package/dist/src/policy/gates-config.js.map +1 -0
  161. package/dist/src/policy/gates-coverage.d.ts +48 -0
  162. package/dist/src/policy/gates-coverage.d.ts.map +1 -0
  163. package/dist/src/policy/gates-coverage.js +182 -0
  164. package/dist/src/policy/gates-coverage.js.map +1 -0
  165. package/dist/src/policy/gates-presets.d.ts +51 -0
  166. package/dist/src/policy/gates-presets.d.ts.map +1 -0
  167. package/dist/src/policy/gates-presets.js +117 -0
  168. package/dist/src/policy/gates-presets.js.map +1 -0
  169. package/dist/src/policy/gates-schemas.d.ts +142 -0
  170. package/dist/src/policy/gates-schemas.d.ts.map +1 -0
  171. package/dist/src/policy/gates-schemas.js +67 -0
  172. package/dist/src/policy/gates-schemas.js.map +1 -0
  173. package/dist/src/policy/index.d.ts +19 -0
  174. package/dist/src/policy/index.d.ts.map +1 -0
  175. package/dist/src/policy/index.js +21 -0
  176. package/dist/src/policy/index.js.map +1 -0
  177. package/dist/src/policy/package-manager-resolver.d.ts +79 -0
  178. package/dist/src/policy/package-manager-resolver.d.ts.map +1 -0
  179. package/dist/src/policy/package-manager-resolver.js +245 -0
  180. package/dist/src/policy/package-manager-resolver.js.map +1 -0
  181. package/dist/src/policy/resolve-policy.d.ts +337 -0
  182. package/dist/src/policy/resolve-policy.d.ts.map +1 -0
  183. package/dist/src/policy/resolve-policy.js +353 -0
  184. package/dist/src/policy/resolve-policy.js.map +1 -0
  185. package/dist/src/ports/config.ports.d.ts +83 -0
  186. package/dist/src/ports/config.ports.d.ts.map +1 -0
  187. package/dist/src/ports/config.ports.js +4 -0
  188. package/dist/src/ports/config.ports.js.map +1 -0
  189. package/dist/src/ports/dashboard-renderer.port.d.ts +113 -0
  190. package/dist/src/ports/dashboard-renderer.port.d.ts.map +1 -0
  191. package/dist/src/ports/dashboard-renderer.port.js +4 -0
  192. package/dist/src/ports/dashboard-renderer.port.js.map +1 -0
  193. package/dist/src/ports/index.d.ts +5 -0
  194. package/dist/src/ports/index.d.ts.map +1 -0
  195. package/dist/src/ports/index.js +10 -0
  196. package/dist/src/ports/index.js.map +1 -0
  197. package/dist/src/ports/sync-validator.ports.d.ts +52 -0
  198. package/dist/src/ports/sync-validator.ports.d.ts.map +1 -0
  199. package/dist/src/ports/sync-validator.ports.js +4 -0
  200. package/dist/src/ports/sync-validator.ports.js.map +1 -0
  201. package/dist/src/ports/wu-helpers.ports.d.ts +157 -0
  202. package/dist/src/ports/wu-helpers.ports.d.ts.map +1 -0
  203. package/dist/src/ports/wu-helpers.ports.js +4 -0
  204. package/dist/src/ports/wu-helpers.ports.js.map +1 -0
  205. package/dist/src/ports/wu-state.ports.d.ts +209 -0
  206. package/dist/src/ports/wu-state.ports.d.ts.map +1 -0
  207. package/dist/src/ports/wu-state.ports.js +4 -0
  208. package/dist/src/ports/wu-state.ports.js.map +1 -0
  209. package/dist/src/primitives/index.d.ts +2 -0
  210. package/dist/src/primitives/index.d.ts.map +1 -0
  211. package/dist/src/primitives/index.js +5 -0
  212. package/dist/src/primitives/index.js.map +1 -0
  213. package/dist/src/runtime/index.d.ts +2 -0
  214. package/dist/src/runtime/index.d.ts.map +1 -0
  215. package/dist/src/runtime/index.js +6 -0
  216. package/dist/src/runtime/index.js.map +1 -0
  217. package/dist/src/runtime/work-classifier.d.ts +103 -0
  218. package/dist/src/runtime/work-classifier.d.ts.map +1 -0
  219. package/dist/src/runtime/work-classifier.js +427 -0
  220. package/dist/src/runtime/work-classifier.js.map +1 -0
  221. package/dist/src/sandbox/index.d.ts +6 -0
  222. package/dist/src/sandbox/index.d.ts.map +1 -0
  223. package/dist/src/sandbox/index.js +10 -0
  224. package/dist/src/sandbox/index.js.map +1 -0
  225. package/dist/src/sandbox/sandbox-allowlist.d.ts +16 -0
  226. package/dist/src/sandbox/sandbox-allowlist.d.ts.map +1 -0
  227. package/dist/src/sandbox/sandbox-allowlist.js +77 -0
  228. package/dist/src/sandbox/sandbox-allowlist.js.map +1 -0
  229. package/dist/src/sandbox/sandbox-backend-linux.d.ts +6 -0
  230. package/dist/src/sandbox/sandbox-backend-linux.d.ts.map +1 -0
  231. package/dist/src/sandbox/sandbox-backend-linux.js +67 -0
  232. package/dist/src/sandbox/sandbox-backend-linux.js.map +1 -0
  233. package/dist/src/sandbox/sandbox-backend-macos.d.ts +6 -0
  234. package/dist/src/sandbox/sandbox-backend-macos.d.ts.map +1 -0
  235. package/dist/src/sandbox/sandbox-backend-macos.js +112 -0
  236. package/dist/src/sandbox/sandbox-backend-macos.js.map +1 -0
  237. package/dist/src/sandbox/sandbox-backend-windows.d.ts +6 -0
  238. package/dist/src/sandbox/sandbox-backend-windows.d.ts.map +1 -0
  239. package/dist/src/sandbox/sandbox-backend-windows.js +30 -0
  240. package/dist/src/sandbox/sandbox-backend-windows.js.map +1 -0
  241. package/dist/src/sandbox/sandbox-profile.d.ts +58 -0
  242. package/dist/src/sandbox/sandbox-profile.d.ts.map +1 -0
  243. package/dist/src/sandbox/sandbox-profile.js +69 -0
  244. package/dist/src/sandbox/sandbox-profile.js.map +1 -0
  245. package/dist/src/schemas/index.d.ts +2 -0
  246. package/dist/src/schemas/index.d.ts.map +1 -0
  247. package/dist/src/schemas/index.js +5 -0
  248. package/dist/src/schemas/index.js.map +1 -0
  249. package/dist/src/state/date-utils.d.ts +66 -0
  250. package/dist/src/state/date-utils.d.ts.map +1 -0
  251. package/dist/src/state/date-utils.js +143 -0
  252. package/dist/src/state/date-utils.js.map +1 -0
  253. package/dist/src/state/index.d.ts +8 -0
  254. package/dist/src/state/index.d.ts.map +1 -0
  255. package/dist/src/state/index.js +15 -0
  256. package/dist/src/state/index.js.map +1 -0
  257. package/dist/src/state/state-machine.d.ts +14 -0
  258. package/dist/src/state/state-machine.d.ts.map +1 -0
  259. package/dist/src/state/state-machine.js +92 -0
  260. package/dist/src/state/state-machine.js.map +1 -0
  261. package/dist/src/state/wu-doc-types.d.ts +48 -0
  262. package/dist/src/state/wu-doc-types.d.ts.map +1 -0
  263. package/dist/src/state/wu-doc-types.js +4 -0
  264. package/dist/src/state/wu-doc-types.js.map +1 -0
  265. package/dist/src/state/wu-paths.d.ts +275 -0
  266. package/dist/src/state/wu-paths.d.ts.map +1 -0
  267. package/dist/src/state/wu-paths.js +335 -0
  268. package/dist/src/state/wu-paths.js.map +1 -0
  269. package/dist/src/state/wu-schema.d.ts +831 -0
  270. package/dist/src/state/wu-schema.d.ts.map +1 -0
  271. package/dist/src/state/wu-schema.js +934 -0
  272. package/dist/src/state/wu-schema.js.map +1 -0
  273. package/dist/src/state/wu-state-schema.d.ts +292 -0
  274. package/dist/src/state/wu-state-schema.d.ts.map +1 -0
  275. package/dist/src/state/wu-state-schema.js +215 -0
  276. package/dist/src/state/wu-state-schema.js.map +1 -0
  277. package/dist/src/state/wu-yaml.d.ts +113 -0
  278. package/dist/src/state/wu-yaml.d.ts.map +1 -0
  279. package/dist/src/state/wu-yaml.js +307 -0
  280. package/dist/src/state/wu-yaml.js.map +1 -0
  281. package/dist/tool-impl/wu-lifecycle-tools.d.ts +11 -0
  282. package/dist/tool-impl/wu-lifecycle-tools.d.ts.map +1 -1
  283. package/dist/tool-impl/wu-lifecycle-tools.js +17 -0
  284. package/dist/tool-impl/wu-lifecycle-tools.js.map +1 -1
  285. package/manifest.yaml +210 -230
  286. package/package.json +88 -3
@@ -0,0 +1,337 @@
1
+ /**
2
+ * Resolve Policy - Single Source of Truth for Methodology Decisions
3
+ *
4
+ * WU-1259: Provides a unified policy resolver that both wu:spawn and gates use.
5
+ *
6
+ * This module:
7
+ * - Defines the methodology.* config schema
8
+ * - Implements resolvePolicy() to produce ResolvedPolicy
9
+ * - Applies precedence: template defaults -> methodology.overrides -> explicit gates.* -> CLI flags
10
+ *
11
+ * @module resolve-policy
12
+ */
13
+ import { z } from 'zod';
14
+ import { type WUType } from '../constants/wu-statuses.js';
15
+ /**
16
+ * Testing methodology options
17
+ */
18
+ export declare const TESTING_METHODOLOGY: {
19
+ readonly TDD: "tdd";
20
+ readonly TEST_AFTER: "test-after";
21
+ readonly NONE: "none";
22
+ };
23
+ export type TestingMethodology = (typeof TESTING_METHODOLOGY)[keyof typeof TESTING_METHODOLOGY];
24
+ /**
25
+ * Architecture methodology options
26
+ */
27
+ export declare const ARCHITECTURE_METHODOLOGY: {
28
+ readonly HEXAGONAL: "hexagonal";
29
+ readonly LAYERED: "layered";
30
+ readonly NONE: "none";
31
+ };
32
+ export type ArchitectureMethodology = (typeof ARCHITECTURE_METHODOLOGY)[keyof typeof ARCHITECTURE_METHODOLOGY];
33
+ /**
34
+ * Coverage mode options
35
+ */
36
+ export declare const COVERAGE_MODE: {
37
+ readonly BLOCK: "block";
38
+ readonly WARN: "warn";
39
+ readonly OFF: "off";
40
+ };
41
+ export type CoverageMode = (typeof COVERAGE_MODE)[keyof typeof COVERAGE_MODE];
42
+ /**
43
+ * Zod schema for testing methodology enum
44
+ */
45
+ export declare const TestingMethodologySchema: z.ZodEnum<{
46
+ tdd: "tdd";
47
+ "test-after": "test-after";
48
+ none: "none";
49
+ }>;
50
+ /**
51
+ * Zod schema for architecture methodology enum
52
+ */
53
+ export declare const ArchitectureMethodologySchema: z.ZodEnum<{
54
+ none: "none";
55
+ hexagonal: "hexagonal";
56
+ layered: "layered";
57
+ }>;
58
+ /**
59
+ * Zod schema for coverage mode enum
60
+ */
61
+ export declare const CoverageModeSchema: z.ZodEnum<{
62
+ warn: "warn";
63
+ off: "off";
64
+ block: "block";
65
+ }>;
66
+ export declare const TddDiffEvidenceConfigSchema: z.ZodObject<{
67
+ mode: z.ZodOptional<z.ZodEnum<{
68
+ warn: "warn";
69
+ off: "off";
70
+ block: "block";
71
+ }>>;
72
+ applies_to_types: z.ZodOptional<z.ZodArray<z.ZodEnum<{
73
+ documentation: "documentation";
74
+ feature: "feature";
75
+ bug: "bug";
76
+ process: "process";
77
+ tooling: "tooling";
78
+ chore: "chore";
79
+ refactor: "refactor";
80
+ }>>>;
81
+ exempt_paths: z.ZodOptional<z.ZodArray<z.ZodString>>;
82
+ }, z.core.$strip>;
83
+ export type TddDiffEvidenceConfig = z.infer<typeof TddDiffEvidenceConfigSchema>;
84
+ /**
85
+ * WU-2650: Commit-order (RED-first) policy schema.
86
+ *
87
+ * Sibling to TddDiffEvidenceConfigSchema. Where the diff-evidence policy
88
+ * checks that tests EXIST somewhere in the branch diff, this policy checks
89
+ * that tests APPEARED BEFORE (or alongside) the runtime code in commit order.
90
+ *
91
+ * Defaults: when methodology.testing = 'tdd', mode resolves to 'block'.
92
+ * Otherwise 'off'. applies_to_types defaults to [feature, bug] so docs /
93
+ * chore / process / tooling / refactor WUs bypass automatically.
94
+ */
95
+ export declare const TddOrderingConfigSchema: z.ZodObject<{
96
+ mode: z.ZodOptional<z.ZodEnum<{
97
+ warn: "warn";
98
+ off: "off";
99
+ block: "block";
100
+ }>>;
101
+ applies_to_types: z.ZodOptional<z.ZodArray<z.ZodEnum<{
102
+ documentation: "documentation";
103
+ feature: "feature";
104
+ bug: "bug";
105
+ process: "process";
106
+ tooling: "tooling";
107
+ chore: "chore";
108
+ refactor: "refactor";
109
+ }>>>;
110
+ min_runtime_loc_per_commit_without_tests: z.ZodOptional<z.ZodNumber>;
111
+ grace_commits: z.ZodOptional<z.ZodNumber>;
112
+ exempt_paths: z.ZodOptional<z.ZodArray<z.ZodString>>;
113
+ }, z.core.$strip>;
114
+ export type TddOrderingConfig = z.infer<typeof TddOrderingConfigSchema>;
115
+ /**
116
+ * Methodology overrides schema
117
+ *
118
+ * These allow tweaking template defaults without changing methodology.
119
+ */
120
+ export declare const MethodologyOverridesSchema: z.ZodObject<{
121
+ coverage_threshold: z.ZodOptional<z.ZodNumber>;
122
+ coverage_mode: z.ZodOptional<z.ZodEnum<{
123
+ warn: "warn";
124
+ off: "off";
125
+ block: "block";
126
+ }>>;
127
+ }, z.core.$strip>;
128
+ export type MethodologyOverrides = z.infer<typeof MethodologyOverridesSchema>;
129
+ /**
130
+ * WU-1899: Work classification UI pattern configuration
131
+ *
132
+ * Allows extending default UI detection patterns with project-specific
133
+ * code path patterns and lane hints. Custom values EXTEND defaults,
134
+ * they do not replace them.
135
+ *
136
+ * @example
137
+ * ```yaml
138
+ * methodology:
139
+ * work_classification:
140
+ * ui:
141
+ * code_path_patterns:
142
+ * - 'src/widgets/*.tsx'
143
+ * lane_hints:
144
+ * - 'Design'
145
+ * ```
146
+ */
147
+ export declare const WorkClassificationUiSchema: z.ZodObject<{
148
+ code_path_patterns: z.ZodOptional<z.ZodArray<z.ZodString>>;
149
+ lane_hints: z.ZodOptional<z.ZodArray<z.ZodString>>;
150
+ }, z.core.$strip>;
151
+ /** WU-1899: TypeScript type for work classification UI config */
152
+ export type WorkClassificationUi = z.infer<typeof WorkClassificationUiSchema>;
153
+ /**
154
+ * WU-1899: Work classification configuration schema
155
+ *
156
+ * Controls signal-based work domain detection for code-path-aware
157
+ * UI/backend/docs/infra classification.
158
+ *
159
+ * @example
160
+ * ```yaml
161
+ * methodology:
162
+ * work_classification:
163
+ * ui:
164
+ * code_path_patterns:
165
+ * - 'src/widgets/*.tsx'
166
+ * lane_hints:
167
+ * - 'Design'
168
+ * ```
169
+ */
170
+ export declare const WorkClassificationConfigSchema: z.ZodObject<{
171
+ ui: z.ZodOptional<z.ZodObject<{
172
+ code_path_patterns: z.ZodOptional<z.ZodArray<z.ZodString>>;
173
+ lane_hints: z.ZodOptional<z.ZodArray<z.ZodString>>;
174
+ }, z.core.$strip>>;
175
+ }, z.core.$strip>;
176
+ /** WU-1899: TypeScript type for work classification config */
177
+ export type WorkClassificationSchemaConfig = z.infer<typeof WorkClassificationConfigSchema>;
178
+ /**
179
+ * Main methodology configuration schema
180
+ *
181
+ * Config example in workspace.yaml:
182
+ * ```yaml
183
+ * methodology:
184
+ * testing: 'tdd' # tdd | test-after | none
185
+ * architecture: 'hexagonal' # hexagonal | layered | none
186
+ * overrides:
187
+ * coverage_threshold: 85 # Override TDD's default 90%
188
+ * coverage_mode: 'warn' # Override TDD's default 'block'
189
+ * work_classification:
190
+ * ui:
191
+ * code_path_patterns:
192
+ * - 'src/widgets/*.tsx'
193
+ * lane_hints:
194
+ * - 'Design'
195
+ * ```
196
+ */
197
+ export declare const MethodologyConfigSchema: z.ZodObject<{
198
+ testing: z.ZodDefault<z.ZodEnum<{
199
+ tdd: "tdd";
200
+ "test-after": "test-after";
201
+ none: "none";
202
+ }>>;
203
+ architecture: z.ZodDefault<z.ZodEnum<{
204
+ none: "none";
205
+ hexagonal: "hexagonal";
206
+ layered: "layered";
207
+ }>>;
208
+ overrides: z.ZodOptional<z.ZodObject<{
209
+ coverage_threshold: z.ZodOptional<z.ZodNumber>;
210
+ coverage_mode: z.ZodOptional<z.ZodEnum<{
211
+ warn: "warn";
212
+ off: "off";
213
+ block: "block";
214
+ }>>;
215
+ }, z.core.$strip>>;
216
+ work_classification: z.ZodOptional<z.ZodObject<{
217
+ ui: z.ZodOptional<z.ZodObject<{
218
+ code_path_patterns: z.ZodOptional<z.ZodArray<z.ZodString>>;
219
+ lane_hints: z.ZodOptional<z.ZodArray<z.ZodString>>;
220
+ }, z.core.$strip>>;
221
+ }, z.core.$strip>>;
222
+ }, z.core.$strip>;
223
+ export type MethodologyConfig = z.infer<typeof MethodologyConfigSchema>;
224
+ /**
225
+ * The resolved policy used by wu:spawn and gates
226
+ *
227
+ * This is the single source of truth for methodology decisions.
228
+ * All consumers (spawn prompts, gate runners, etc.) should use this type.
229
+ */
230
+ export interface ResolvedPolicy {
231
+ /** Active testing methodology */
232
+ testing: TestingMethodology;
233
+ /** Active architecture methodology */
234
+ architecture: ArchitectureMethodology;
235
+ /** Resolved coverage threshold (0-100) */
236
+ coverage_threshold: number;
237
+ /** Resolved coverage mode */
238
+ coverage_mode: CoverageMode;
239
+ /** Whether tests are required for completion */
240
+ tests_required: boolean;
241
+ /** Resolved TDD diff evidence applicability */
242
+ tdd_diff_evidence: TddDiffEvidencePolicy;
243
+ /** WU-2650: Resolved commit-order (RED-first) policy */
244
+ tdd_ordering: TddOrderingPolicy;
245
+ }
246
+ export interface TddDiffEvidencePolicy {
247
+ mode: CoverageMode;
248
+ applies_to_types: WUType[];
249
+ exempt_paths: string[];
250
+ }
251
+ /**
252
+ * WU-2650: Resolved commit-order policy.
253
+ */
254
+ export interface TddOrderingPolicy {
255
+ mode: CoverageMode;
256
+ applies_to_types: WUType[];
257
+ min_runtime_loc_per_commit_without_tests: number;
258
+ grace_commits: number;
259
+ exempt_paths: string[];
260
+ }
261
+ /**
262
+ * Options for resolvePolicy
263
+ */
264
+ export interface ResolvePolicyOptions {
265
+ /**
266
+ * Raw config object before Zod defaults were applied.
267
+ * Used to detect explicit vs default values for gates.* fields.
268
+ *
269
+ * When provided, only EXPLICIT gates.* settings override methodology.
270
+ * When not provided, UnsafeAny gates.* value (including defaults) overrides methodology.
271
+ */
272
+ rawConfig?: {
273
+ gates?: {
274
+ minCoverage?: number;
275
+ enableCoverage?: boolean;
276
+ tdd_diff_evidence?: TddDiffEvidenceConfig;
277
+ tdd_ordering?: TddOrderingConfig;
278
+ };
279
+ };
280
+ }
281
+ interface PolicyConfigInput {
282
+ methodology?: MethodologyConfig;
283
+ gates: {
284
+ minCoverage: number;
285
+ enableCoverage: boolean;
286
+ tdd_diff_evidence?: TddDiffEvidenceConfig;
287
+ tdd_ordering?: TddOrderingConfig;
288
+ };
289
+ }
290
+ /**
291
+ * Resolve the effective policy from configuration
292
+ *
293
+ * Precedence (highest to lowest):
294
+ * 1. CLI flags (not handled here - handled by command layer)
295
+ * 2. Explicit gates.* configuration (only if rawConfig provided to detect explicit vs default)
296
+ * 3. methodology.overrides
297
+ * 4. methodology template defaults
298
+ *
299
+ * This ensures backwards compatibility: existing users with explicit
300
+ * gates.* config see no change, while new users can use methodology
301
+ * config for a higher-level abstraction.
302
+ *
303
+ * @param config - The full LumenFlow configuration
304
+ * @param options - Options including rawConfig for explicit detection
305
+ * @returns The resolved policy for use by wu:spawn and gates
306
+ *
307
+ * @example
308
+ * ```typescript
309
+ * import { getConfig } from './lumenflow-config.js';
310
+ * import { resolvePolicy } from './resolve-policy.js';
311
+ *
312
+ * const config = getConfig();
313
+ * const policy = resolvePolicy(config);
314
+ *
315
+ * console.log(policy.coverage_threshold); // 90 (or configured value)
316
+ * console.log(policy.testing); // 'tdd' (or configured value)
317
+ * ```
318
+ *
319
+ * @example With raw config for explicit detection
320
+ * ```typescript
321
+ * const rawConfig = { methodology: { testing: 'test-after' } };
322
+ * const config = parseConfig(rawConfig);
323
+ * const policy = resolvePolicy(config, { rawConfig });
324
+ * // policy.coverage_threshold will be 70 (test-after template default)
325
+ * // because gates.minCoverage wasn't EXPLICITLY set
326
+ * ```
327
+ */
328
+ export declare function resolvePolicy(config: PolicyConfigInput, options?: ResolvePolicyOptions): ResolvedPolicy;
329
+ /**
330
+ * Create a default resolved policy
331
+ *
332
+ * Convenience function for when no config is available.
333
+ * Returns strict TDD defaults.
334
+ */
335
+ export declare function getDefaultPolicy(): ResolvedPolicy;
336
+ export {};
337
+ //# sourceMappingURL=resolve-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-policy.d.ts","sourceRoot":"","sources":["../../../src/policy/resolve-policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,353 @@
1
+ // Copyright (c) 2026 Hellmai Ltd
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Resolve Policy - Single Source of Truth for Methodology Decisions
5
+ *
6
+ * WU-1259: Provides a unified policy resolver that both wu:spawn and gates use.
7
+ *
8
+ * This module:
9
+ * - Defines the methodology.* config schema
10
+ * - Implements resolvePolicy() to produce ResolvedPolicy
11
+ * - Applies precedence: template defaults -> methodology.overrides -> explicit gates.* -> CLI flags
12
+ *
13
+ * @module resolve-policy
14
+ */
15
+ import { z } from 'zod';
16
+ import { WU_TYPES, WU_TYPE_VALUES } from '../constants/wu-statuses.js';
17
+ /**
18
+ * Testing methodology options
19
+ */
20
+ export const TESTING_METHODOLOGY = {
21
+ TDD: 'tdd',
22
+ TEST_AFTER: 'test-after',
23
+ NONE: 'none',
24
+ };
25
+ /**
26
+ * Architecture methodology options
27
+ */
28
+ export const ARCHITECTURE_METHODOLOGY = {
29
+ HEXAGONAL: 'hexagonal',
30
+ LAYERED: 'layered',
31
+ NONE: 'none',
32
+ };
33
+ /**
34
+ * Coverage mode options
35
+ */
36
+ export const COVERAGE_MODE = {
37
+ BLOCK: 'block',
38
+ WARN: 'warn',
39
+ OFF: 'off',
40
+ };
41
+ /**
42
+ * Zod schema for testing methodology enum
43
+ */
44
+ export const TestingMethodologySchema = z.enum(['tdd', 'test-after', 'none']);
45
+ /**
46
+ * Zod schema for architecture methodology enum
47
+ */
48
+ export const ArchitectureMethodologySchema = z.enum(['hexagonal', 'layered', 'none']);
49
+ /**
50
+ * Zod schema for coverage mode enum
51
+ */
52
+ export const CoverageModeSchema = z.enum(['block', 'warn', 'off']);
53
+ export const TddDiffEvidenceConfigSchema = z.object({
54
+ mode: CoverageModeSchema.optional(),
55
+ applies_to_types: z.array(z.enum(WU_TYPE_VALUES)).min(1).optional(),
56
+ exempt_paths: z.array(z.string().min(1)).optional(),
57
+ });
58
+ /**
59
+ * WU-2650: Commit-order (RED-first) policy schema.
60
+ *
61
+ * Sibling to TddDiffEvidenceConfigSchema. Where the diff-evidence policy
62
+ * checks that tests EXIST somewhere in the branch diff, this policy checks
63
+ * that tests APPEARED BEFORE (or alongside) the runtime code in commit order.
64
+ *
65
+ * Defaults: when methodology.testing = 'tdd', mode resolves to 'block'.
66
+ * Otherwise 'off'. applies_to_types defaults to [feature, bug] so docs /
67
+ * chore / process / tooling / refactor WUs bypass automatically.
68
+ */
69
+ export const TddOrderingConfigSchema = z.object({
70
+ mode: CoverageModeSchema.optional(),
71
+ applies_to_types: z.array(z.enum(WU_TYPE_VALUES)).min(1).optional(),
72
+ min_runtime_loc_per_commit_without_tests: z.number().int().positive().optional(),
73
+ grace_commits: z.number().int().nonnegative().optional(),
74
+ exempt_paths: z.array(z.string().min(1)).optional(),
75
+ });
76
+ /**
77
+ * Methodology overrides schema
78
+ *
79
+ * These allow tweaking template defaults without changing methodology.
80
+ */
81
+ export const MethodologyOverridesSchema = z.object({
82
+ /** Override the default coverage threshold from the testing methodology */
83
+ coverage_threshold: z.number().min(0).max(100).optional(),
84
+ /** Override the default coverage mode from the testing methodology */
85
+ coverage_mode: CoverageModeSchema.optional(),
86
+ });
87
+ /**
88
+ * WU-1899: Work classification UI pattern configuration
89
+ *
90
+ * Allows extending default UI detection patterns with project-specific
91
+ * code path patterns and lane hints. Custom values EXTEND defaults,
92
+ * they do not replace them.
93
+ *
94
+ * @example
95
+ * ```yaml
96
+ * methodology:
97
+ * work_classification:
98
+ * ui:
99
+ * code_path_patterns:
100
+ * - 'src/widgets/*.tsx'
101
+ * lane_hints:
102
+ * - 'Design'
103
+ * ```
104
+ */
105
+ export const WorkClassificationUiSchema = z.object({
106
+ /**
107
+ * Additional glob patterns for detecting UI work via code paths.
108
+ * These extend the built-in defaults (CSS, SCSS, LESS, components, pages, etc.).
109
+ * Uses minimatch glob syntax.
110
+ */
111
+ code_path_patterns: z.array(z.string()).optional(),
112
+ /**
113
+ * Additional lane parent hints for detecting UI work.
114
+ * These extend the built-in defaults (Experience, Frontend, UI, Design).
115
+ * Matched case-insensitively against the lane parent (part before the colon).
116
+ */
117
+ lane_hints: z.array(z.string()).optional(),
118
+ });
119
+ /**
120
+ * WU-1899: Work classification configuration schema
121
+ *
122
+ * Controls signal-based work domain detection for code-path-aware
123
+ * UI/backend/docs/infra classification.
124
+ *
125
+ * @example
126
+ * ```yaml
127
+ * methodology:
128
+ * work_classification:
129
+ * ui:
130
+ * code_path_patterns:
131
+ * - 'src/widgets/*.tsx'
132
+ * lane_hints:
133
+ * - 'Design'
134
+ * ```
135
+ */
136
+ export const WorkClassificationConfigSchema = z.object({
137
+ /** UI detection pattern overrides (extend defaults) */
138
+ ui: WorkClassificationUiSchema.optional(),
139
+ });
140
+ /**
141
+ * Main methodology configuration schema
142
+ *
143
+ * Config example in workspace.yaml:
144
+ * ```yaml
145
+ * methodology:
146
+ * testing: 'tdd' # tdd | test-after | none
147
+ * architecture: 'hexagonal' # hexagonal | layered | none
148
+ * overrides:
149
+ * coverage_threshold: 85 # Override TDD's default 90%
150
+ * coverage_mode: 'warn' # Override TDD's default 'block'
151
+ * work_classification:
152
+ * ui:
153
+ * code_path_patterns:
154
+ * - 'src/widgets/*.tsx'
155
+ * lane_hints:
156
+ * - 'Design'
157
+ * ```
158
+ */
159
+ export const MethodologyConfigSchema = z.object({
160
+ /** Testing methodology (default: 'tdd') */
161
+ testing: TestingMethodologySchema.default('tdd'),
162
+ /** Architecture methodology (default: 'hexagonal') */
163
+ architecture: ArchitectureMethodologySchema.default('hexagonal'),
164
+ /** Optional overrides for template defaults */
165
+ overrides: MethodologyOverridesSchema.optional(),
166
+ /**
167
+ * WU-1899: Work classification configuration.
168
+ * Extends default signal patterns for UI/backend/docs/infra detection.
169
+ * Custom patterns extend defaults, they do not replace them.
170
+ */
171
+ work_classification: WorkClassificationConfigSchema.optional(),
172
+ });
173
+ const DEFAULT_TDD_DIFF_APPLIES_TO_TYPES = [
174
+ WU_TYPES.FEATURE,
175
+ WU_TYPES.BUG,
176
+ ];
177
+ const DEFAULT_TDD_DIFF_EXEMPT_PATHS = [];
178
+ const TESTING_TEMPLATE_DEFAULTS = {
179
+ tdd: {
180
+ coverage_threshold: 90,
181
+ coverage_mode: 'block',
182
+ tests_required: true,
183
+ },
184
+ 'test-after': {
185
+ coverage_threshold: 70,
186
+ coverage_mode: 'warn',
187
+ tests_required: true,
188
+ },
189
+ none: {
190
+ coverage_threshold: 0,
191
+ coverage_mode: 'off',
192
+ tests_required: false,
193
+ },
194
+ };
195
+ /**
196
+ * WU-2650: Default threshold for "non-trivial runtime LOC" in a single commit
197
+ * before the commit-order gate flags a missing preceding test commit.
198
+ *
199
+ * Rationale: WU-2641 committed 1198 LOC of runtime ahead of tests. 50 is low
200
+ * enough to catch meaningful feature work but high enough to ignore small
201
+ * config-only edits and typo fixes.
202
+ */
203
+ const DEFAULT_TDD_ORDERING_MIN_RUNTIME_LOC = 50;
204
+ const DEFAULT_TDD_ORDERING_GRACE_COMMITS = 0;
205
+ function resolveDefaultTddDiffEvidenceMode(testing) {
206
+ return testing === TESTING_METHODOLOGY.TDD ? COVERAGE_MODE.BLOCK : COVERAGE_MODE.OFF;
207
+ }
208
+ function cloneWuTypes(value) {
209
+ return [...(value ?? DEFAULT_TDD_DIFF_APPLIES_TO_TYPES)];
210
+ }
211
+ function cloneExemptPaths(value) {
212
+ return [...(value ?? DEFAULT_TDD_DIFF_EXEMPT_PATHS)];
213
+ }
214
+ function resolveTddDiffEvidencePolicy(testing, config) {
215
+ return {
216
+ mode: config?.mode ?? resolveDefaultTddDiffEvidenceMode(testing),
217
+ applies_to_types: cloneWuTypes(config?.applies_to_types),
218
+ exempt_paths: cloneExemptPaths(config?.exempt_paths),
219
+ };
220
+ }
221
+ /**
222
+ * WU-2650: Resolve the commit-order policy. Defaults mirror the diff-evidence
223
+ * policy: enforce under TDD, off otherwise; applies to feature/bug only.
224
+ */
225
+ function resolveTddOrderingPolicyInternal(testing, config) {
226
+ return {
227
+ mode: config?.mode ?? resolveDefaultTddDiffEvidenceMode(testing),
228
+ applies_to_types: cloneWuTypes(config?.applies_to_types),
229
+ min_runtime_loc_per_commit_without_tests: config?.min_runtime_loc_per_commit_without_tests ?? DEFAULT_TDD_ORDERING_MIN_RUNTIME_LOC,
230
+ grace_commits: config?.grace_commits ?? DEFAULT_TDD_ORDERING_GRACE_COMMITS,
231
+ exempt_paths: cloneExemptPaths(config?.exempt_paths),
232
+ };
233
+ }
234
+ /**
235
+ * Resolve the effective policy from configuration
236
+ *
237
+ * Precedence (highest to lowest):
238
+ * 1. CLI flags (not handled here - handled by command layer)
239
+ * 2. Explicit gates.* configuration (only if rawConfig provided to detect explicit vs default)
240
+ * 3. methodology.overrides
241
+ * 4. methodology template defaults
242
+ *
243
+ * This ensures backwards compatibility: existing users with explicit
244
+ * gates.* config see no change, while new users can use methodology
245
+ * config for a higher-level abstraction.
246
+ *
247
+ * @param config - The full LumenFlow configuration
248
+ * @param options - Options including rawConfig for explicit detection
249
+ * @returns The resolved policy for use by wu:spawn and gates
250
+ *
251
+ * @example
252
+ * ```typescript
253
+ * import { getConfig } from './lumenflow-config.js';
254
+ * import { resolvePolicy } from './resolve-policy.js';
255
+ *
256
+ * const config = getConfig();
257
+ * const policy = resolvePolicy(config);
258
+ *
259
+ * console.log(policy.coverage_threshold); // 90 (or configured value)
260
+ * console.log(policy.testing); // 'tdd' (or configured value)
261
+ * ```
262
+ *
263
+ * @example With raw config for explicit detection
264
+ * ```typescript
265
+ * const rawConfig = { methodology: { testing: 'test-after' } };
266
+ * const config = parseConfig(rawConfig);
267
+ * const policy = resolvePolicy(config, { rawConfig });
268
+ * // policy.coverage_threshold will be 70 (test-after template default)
269
+ * // because gates.minCoverage wasn't EXPLICITLY set
270
+ * ```
271
+ */
272
+ export function resolvePolicy(config, options = {}) {
273
+ const { rawConfig } = options;
274
+ // Parse methodology config (provides defaults if not specified)
275
+ const methodology = MethodologyConfigSchema.parse(config.methodology ?? {});
276
+ // Get template defaults based on testing methodology
277
+ const templateDefaults = TESTING_TEMPLATE_DEFAULTS[methodology.testing];
278
+ // Layer 1: Start with template defaults
279
+ let coverage_threshold = templateDefaults.coverage_threshold;
280
+ let coverage_mode = templateDefaults.coverage_mode;
281
+ const tests_required = templateDefaults.tests_required;
282
+ // Layer 2: Apply methodology.overrides (if specified)
283
+ if (methodology.overrides?.coverage_threshold !== undefined) {
284
+ coverage_threshold = methodology.overrides.coverage_threshold;
285
+ }
286
+ if (methodology.overrides?.coverage_mode !== undefined) {
287
+ coverage_mode = methodology.overrides.coverage_mode;
288
+ }
289
+ // Layer 3: Apply explicit gates.* configuration (highest precedence)
290
+ // This ensures backwards compatibility with existing gates config
291
+ //
292
+ // Key insight: We only want EXPLICIT gates.* to override methodology.
293
+ // If rawConfig is provided, we check if gates values were explicitly set.
294
+ // If rawConfig is NOT provided (legacy mode), we check if methodology
295
+ // was specified - if so, methodology controls unless gates differ from default.
296
+ const gates = config.gates;
297
+ // Determine if gates.minCoverage was explicitly set
298
+ const gatesMinCoverageExplicit = rawConfig !== undefined ? rawConfig.gates?.minCoverage !== undefined : false;
299
+ // Determine if gates.enableCoverage was explicitly set
300
+ const gatesEnableCoverageExplicit = rawConfig !== undefined ? rawConfig.gates?.enableCoverage !== undefined : false;
301
+ // Apply gates.minCoverage only if explicitly set, or if no methodology was specified
302
+ // (for backwards compatibility with pre-methodology configs)
303
+ const methodologySpecified = config.methodology !== undefined;
304
+ if (gatesMinCoverageExplicit || (!methodologySpecified && rawConfig === undefined)) {
305
+ // gates.minCoverage overrides methodology coverage_threshold
306
+ coverage_threshold = gates.minCoverage;
307
+ }
308
+ // gates.enableCoverage: false effectively sets coverage_mode to 'off'
309
+ if (gatesEnableCoverageExplicit || (!methodologySpecified && rawConfig === undefined)) {
310
+ if (gates?.enableCoverage === false) {
311
+ coverage_mode = 'off';
312
+ }
313
+ }
314
+ const tdd_diff_evidence = resolveTddDiffEvidencePolicy(methodology.testing, config.gates?.tdd_diff_evidence);
315
+ const tdd_ordering = resolveTddOrderingPolicyInternal(methodology.testing, config.gates?.tdd_ordering);
316
+ return {
317
+ testing: methodology.testing,
318
+ architecture: methodology.architecture,
319
+ coverage_threshold,
320
+ coverage_mode,
321
+ tests_required,
322
+ tdd_diff_evidence,
323
+ tdd_ordering,
324
+ };
325
+ }
326
+ /**
327
+ * Create a default resolved policy
328
+ *
329
+ * Convenience function for when no config is available.
330
+ * Returns strict TDD defaults.
331
+ */
332
+ export function getDefaultPolicy() {
333
+ return {
334
+ testing: 'tdd',
335
+ architecture: 'hexagonal',
336
+ coverage_threshold: 90,
337
+ coverage_mode: 'block',
338
+ tests_required: true,
339
+ tdd_diff_evidence: {
340
+ mode: COVERAGE_MODE.BLOCK,
341
+ applies_to_types: [...DEFAULT_TDD_DIFF_APPLIES_TO_TYPES],
342
+ exempt_paths: [...DEFAULT_TDD_DIFF_EXEMPT_PATHS],
343
+ },
344
+ tdd_ordering: {
345
+ mode: COVERAGE_MODE.BLOCK,
346
+ applies_to_types: [...DEFAULT_TDD_DIFF_APPLIES_TO_TYPES],
347
+ min_runtime_loc_per_commit_without_tests: DEFAULT_TDD_ORDERING_MIN_RUNTIME_LOC,
348
+ grace_commits: DEFAULT_TDD_ORDERING_GRACE_COMMITS,
349
+ exempt_paths: [...DEFAULT_TDD_DIFF_EXEMPT_PATHS],
350
+ },
351
+ };
352
+ }
353
+ //# sourceMappingURL=resolve-policy.js.map