@agent-teams/engineering-foundation 0.3.0 → 0.4.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 (197) hide show
  1. package/README.md +11 -2
  2. package/dist/capabilities/public-api-compatibility/adapters/outbound/api-extractor/microsoft-public-api-extractor.d.ts +6 -0
  3. package/dist/capabilities/public-api-compatibility/adapters/outbound/api-extractor/microsoft-public-api-extractor.d.ts.map +1 -0
  4. package/dist/capabilities/public-api-compatibility/adapters/outbound/api-extractor/microsoft-public-api-extractor.js +143 -0
  5. package/dist/capabilities/public-api-compatibility/adapters/outbound/api-extractor/microsoft-public-api-extractor.js.map +1 -0
  6. package/dist/capabilities/public-api-compatibility/adapters/outbound/crypto/node-change-fingerprint.d.ts +5 -0
  7. package/dist/capabilities/public-api-compatibility/adapters/outbound/crypto/node-change-fingerprint.d.ts.map +1 -0
  8. package/dist/capabilities/public-api-compatibility/adapters/outbound/crypto/node-change-fingerprint.js +7 -0
  9. package/dist/capabilities/public-api-compatibility/adapters/outbound/crypto/node-change-fingerprint.js.map +1 -0
  10. package/dist/capabilities/public-api-compatibility/adapters/outbound/filesystem/filesystem-public-api-repository.d.ts +9 -0
  11. package/dist/capabilities/public-api-compatibility/adapters/outbound/filesystem/filesystem-public-api-repository.d.ts.map +1 -0
  12. package/dist/capabilities/public-api-compatibility/adapters/outbound/filesystem/filesystem-public-api-repository.js +205 -0
  13. package/dist/capabilities/public-api-compatibility/adapters/outbound/filesystem/filesystem-public-api-repository.js.map +1 -0
  14. package/dist/capabilities/public-api-compatibility/application/model/public-api.d.ts +46 -0
  15. package/dist/capabilities/public-api-compatibility/application/model/public-api.d.ts.map +1 -0
  16. package/dist/capabilities/public-api-compatibility/application/model/public-api.js +4 -0
  17. package/dist/capabilities/public-api-compatibility/application/model/public-api.js.map +1 -0
  18. package/dist/capabilities/public-api-compatibility/application/policies/evaluate-public-api-compatibility.d.ts +13 -0
  19. package/dist/capabilities/public-api-compatibility/application/policies/evaluate-public-api-compatibility.d.ts.map +1 -0
  20. package/dist/capabilities/public-api-compatibility/application/policies/evaluate-public-api-compatibility.js +168 -0
  21. package/dist/capabilities/public-api-compatibility/application/policies/evaluate-public-api-compatibility.js.map +1 -0
  22. package/dist/capabilities/public-api-compatibility/application/ports/change-fingerprint.d.ts +4 -0
  23. package/dist/capabilities/public-api-compatibility/application/ports/change-fingerprint.d.ts.map +1 -0
  24. package/dist/capabilities/public-api-compatibility/application/ports/change-fingerprint.js +2 -0
  25. package/dist/capabilities/public-api-compatibility/application/ports/change-fingerprint.js.map +1 -0
  26. package/dist/capabilities/public-api-compatibility/application/ports/public-api-extractor.d.ts +5 -0
  27. package/dist/capabilities/public-api-compatibility/application/ports/public-api-extractor.d.ts.map +1 -0
  28. package/dist/capabilities/public-api-compatibility/application/ports/public-api-extractor.js +2 -0
  29. package/dist/capabilities/public-api-compatibility/application/ports/public-api-extractor.js.map +1 -0
  30. package/dist/capabilities/public-api-compatibility/application/ports/public-api-repository.d.ts +8 -0
  31. package/dist/capabilities/public-api-compatibility/application/ports/public-api-repository.d.ts.map +1 -0
  32. package/dist/capabilities/public-api-compatibility/application/ports/public-api-repository.js +2 -0
  33. package/dist/capabilities/public-api-compatibility/application/ports/public-api-repository.js.map +1 -0
  34. package/dist/capabilities/public-api-compatibility/application/rules.d.ts +19 -0
  35. package/dist/capabilities/public-api-compatibility/application/rules.d.ts.map +1 -0
  36. package/dist/capabilities/public-api-compatibility/application/rules.js +20 -0
  37. package/dist/capabilities/public-api-compatibility/application/rules.js.map +1 -0
  38. package/dist/capabilities/public-api-compatibility/application/use-cases/analyze-public-api-compatibility.d.ts +15 -0
  39. package/dist/capabilities/public-api-compatibility/application/use-cases/analyze-public-api-compatibility.d.ts.map +1 -0
  40. package/dist/capabilities/public-api-compatibility/application/use-cases/analyze-public-api-compatibility.js +30 -0
  41. package/dist/capabilities/public-api-compatibility/application/use-cases/analyze-public-api-compatibility.js.map +1 -0
  42. package/dist/capabilities/public-api-compatibility/application/use-cases/promote-public-api-baselines.d.ts +14 -0
  43. package/dist/capabilities/public-api-compatibility/application/use-cases/promote-public-api-baselines.d.ts.map +1 -0
  44. package/dist/capabilities/public-api-compatibility/application/use-cases/promote-public-api-baselines.js +62 -0
  45. package/dist/capabilities/public-api-compatibility/application/use-cases/promote-public-api-baselines.js.map +1 -0
  46. package/dist/capabilities/public-api-compatibility/contract/config.d.ts +5 -0
  47. package/dist/capabilities/public-api-compatibility/contract/config.d.ts.map +1 -0
  48. package/dist/capabilities/public-api-compatibility/contract/config.js +104 -0
  49. package/dist/capabilities/public-api-compatibility/contract/config.js.map +1 -0
  50. package/dist/capabilities/public-api-compatibility/module.d.ts +10 -0
  51. package/dist/capabilities/public-api-compatibility/module.d.ts.map +1 -0
  52. package/dist/capabilities/public-api-compatibility/module.js +69 -0
  53. package/dist/capabilities/public-api-compatibility/module.js.map +1 -0
  54. package/dist/capabilities/repository-security-baseline/adapters/outbound/filesystem/filesystem-repository-security-reader.d.ts +6 -0
  55. package/dist/capabilities/repository-security-baseline/adapters/outbound/filesystem/filesystem-repository-security-reader.d.ts.map +1 -0
  56. package/dist/capabilities/repository-security-baseline/adapters/outbound/filesystem/filesystem-repository-security-reader.js +200 -0
  57. package/dist/capabilities/repository-security-baseline/adapters/outbound/filesystem/filesystem-repository-security-reader.js.map +1 -0
  58. package/dist/capabilities/repository-security-baseline/application/model/repository-security.d.ts +46 -0
  59. package/dist/capabilities/repository-security-baseline/application/model/repository-security.d.ts.map +1 -0
  60. package/dist/capabilities/repository-security-baseline/application/model/repository-security.js +2 -0
  61. package/dist/capabilities/repository-security-baseline/application/model/repository-security.js.map +1 -0
  62. package/dist/capabilities/repository-security-baseline/application/policies/evaluate-repository-security.d.ts +4 -0
  63. package/dist/capabilities/repository-security-baseline/application/policies/evaluate-repository-security.d.ts.map +1 -0
  64. package/dist/capabilities/repository-security-baseline/application/policies/evaluate-repository-security.js +218 -0
  65. package/dist/capabilities/repository-security-baseline/application/policies/evaluate-repository-security.js.map +1 -0
  66. package/dist/capabilities/repository-security-baseline/application/ports/repository-security-reader.d.ts +5 -0
  67. package/dist/capabilities/repository-security-baseline/application/ports/repository-security-reader.d.ts.map +1 -0
  68. package/dist/capabilities/repository-security-baseline/application/ports/repository-security-reader.js +2 -0
  69. package/dist/capabilities/repository-security-baseline/application/ports/repository-security-reader.js.map +1 -0
  70. package/dist/capabilities/repository-security-baseline/application/rules.d.ts +23 -0
  71. package/dist/capabilities/repository-security-baseline/application/rules.d.ts.map +1 -0
  72. package/dist/capabilities/repository-security-baseline/application/rules.js +24 -0
  73. package/dist/capabilities/repository-security-baseline/application/rules.js.map +1 -0
  74. package/dist/capabilities/repository-security-baseline/application/use-cases/analyze-repository-security.d.ts +9 -0
  75. package/dist/capabilities/repository-security-baseline/application/use-cases/analyze-repository-security.d.ts.map +1 -0
  76. package/dist/capabilities/repository-security-baseline/application/use-cases/analyze-repository-security.js +7 -0
  77. package/dist/capabilities/repository-security-baseline/application/use-cases/analyze-repository-security.js.map +1 -0
  78. package/dist/capabilities/repository-security-baseline/contract/config.d.ts +5 -0
  79. package/dist/capabilities/repository-security-baseline/contract/config.d.ts.map +1 -0
  80. package/dist/capabilities/repository-security-baseline/contract/config.js +86 -0
  81. package/dist/capabilities/repository-security-baseline/contract/config.js.map +1 -0
  82. package/dist/capabilities/repository-security-baseline/module.d.ts +5 -0
  83. package/dist/capabilities/repository-security-baseline/module.d.ts.map +1 -0
  84. package/dist/capabilities/repository-security-baseline/module.js +49 -0
  85. package/dist/capabilities/repository-security-baseline/module.js.map +1 -0
  86. package/dist/capabilities/source-dependencies/adapters/outbound/oxc/oxc-source-dependency-parser.d.ts +2 -1
  87. package/dist/capabilities/source-dependencies/adapters/outbound/oxc/oxc-source-dependency-parser.d.ts.map +1 -1
  88. package/dist/capabilities/source-dependencies/application/model/source-workspace.d.ts +1 -4
  89. package/dist/capabilities/source-dependencies/application/model/source-workspace.d.ts.map +1 -1
  90. package/dist/capabilities/source-dependencies/application/model/source-workspace.js.map +1 -1
  91. package/dist/capabilities/source-dependencies/application/policies/evaluate-source-dependencies.d.ts +2 -1
  92. package/dist/capabilities/source-dependencies/application/policies/evaluate-source-dependencies.d.ts.map +1 -1
  93. package/dist/capabilities/source-dependencies/application/ports/source-dependency-parser.d.ts +2 -1
  94. package/dist/capabilities/source-dependencies/application/ports/source-dependency-parser.d.ts.map +1 -1
  95. package/dist/capabilities/source-dependencies/application/use-cases/analyze-source-dependencies.d.ts +1 -1
  96. package/dist/capabilities/source-dependencies/application/use-cases/analyze-source-dependencies.d.ts.map +1 -1
  97. package/dist/capabilities/source-dependencies/application/use-cases/analyze-source-dependencies.js.map +1 -1
  98. package/dist/capabilities/source-dependencies/module.js +1 -1
  99. package/dist/capabilities/source-dependencies/module.js.map +1 -1
  100. package/dist/capabilities/suppression-governance/adapters/outbound/oxc/oxc-suppression-scanner.d.ts +7 -0
  101. package/dist/capabilities/suppression-governance/adapters/outbound/oxc/oxc-suppression-scanner.d.ts.map +1 -0
  102. package/dist/capabilities/suppression-governance/adapters/outbound/oxc/oxc-suppression-scanner.js +115 -0
  103. package/dist/capabilities/suppression-governance/adapters/outbound/oxc/oxc-suppression-scanner.js.map +1 -0
  104. package/dist/capabilities/suppression-governance/adapters/outbound/time/system-clock.d.ts +5 -0
  105. package/dist/capabilities/suppression-governance/adapters/outbound/time/system-clock.d.ts.map +1 -0
  106. package/dist/capabilities/suppression-governance/adapters/outbound/time/system-clock.js +6 -0
  107. package/dist/capabilities/suppression-governance/adapters/outbound/time/system-clock.js.map +1 -0
  108. package/dist/capabilities/suppression-governance/application/model/iso-date.d.ts +2 -0
  109. package/dist/capabilities/suppression-governance/application/model/iso-date.d.ts.map +1 -0
  110. package/dist/capabilities/suppression-governance/application/model/iso-date.js +27 -0
  111. package/dist/capabilities/suppression-governance/application/model/iso-date.js.map +1 -0
  112. package/dist/capabilities/suppression-governance/application/model/suppression-governance.d.ts +35 -0
  113. package/dist/capabilities/suppression-governance/application/model/suppression-governance.d.ts.map +1 -0
  114. package/dist/capabilities/suppression-governance/application/model/suppression-governance.js +8 -0
  115. package/dist/capabilities/suppression-governance/application/model/suppression-governance.js.map +1 -0
  116. package/dist/capabilities/suppression-governance/application/policies/evaluate-suppression-governance.d.ts +8 -0
  117. package/dist/capabilities/suppression-governance/application/policies/evaluate-suppression-governance.d.ts.map +1 -0
  118. package/dist/capabilities/suppression-governance/application/policies/evaluate-suppression-governance.js +196 -0
  119. package/dist/capabilities/suppression-governance/application/policies/evaluate-suppression-governance.js.map +1 -0
  120. package/dist/capabilities/suppression-governance/application/ports/calendar-clock.d.ts +4 -0
  121. package/dist/capabilities/suppression-governance/application/ports/calendar-clock.d.ts.map +1 -0
  122. package/dist/capabilities/suppression-governance/application/ports/calendar-clock.js +2 -0
  123. package/dist/capabilities/suppression-governance/application/ports/calendar-clock.js.map +1 -0
  124. package/dist/capabilities/suppression-governance/application/ports/suppression-scanner.d.ts +6 -0
  125. package/dist/capabilities/suppression-governance/application/ports/suppression-scanner.d.ts.map +1 -0
  126. package/dist/capabilities/suppression-governance/application/ports/suppression-scanner.js +2 -0
  127. package/dist/capabilities/suppression-governance/application/ports/suppression-scanner.js.map +1 -0
  128. package/dist/capabilities/suppression-governance/application/rules.d.ts +25 -0
  129. package/dist/capabilities/suppression-governance/application/rules.d.ts.map +1 -0
  130. package/dist/capabilities/suppression-governance/application/rules.js +26 -0
  131. package/dist/capabilities/suppression-governance/application/rules.js.map +1 -0
  132. package/dist/capabilities/suppression-governance/application/use-cases/analyze-suppression-governance.d.ts +15 -0
  133. package/dist/capabilities/suppression-governance/application/use-cases/analyze-suppression-governance.d.ts.map +1 -0
  134. package/dist/capabilities/suppression-governance/application/use-cases/analyze-suppression-governance.js +15 -0
  135. package/dist/capabilities/suppression-governance/application/use-cases/analyze-suppression-governance.js.map +1 -0
  136. package/dist/capabilities/suppression-governance/contract/config.d.ts +5 -0
  137. package/dist/capabilities/suppression-governance/contract/config.d.ts.map +1 -0
  138. package/dist/capabilities/suppression-governance/contract/config.js +108 -0
  139. package/dist/capabilities/suppression-governance/contract/config.js.map +1 -0
  140. package/dist/capabilities/suppression-governance/module.d.ts +5 -0
  141. package/dist/capabilities/suppression-governance/module.d.ts.map +1 -0
  142. package/dist/capabilities/suppression-governance/module.js +57 -0
  143. package/dist/capabilities/suppression-governance/module.js.map +1 -0
  144. package/dist/cli.js +25 -2
  145. package/dist/cli.js.map +1 -1
  146. package/dist/composition/capability-registry.d.ts.map +1 -1
  147. package/dist/composition/capability-registry.js +6 -0
  148. package/dist/composition/capability-registry.js.map +1 -1
  149. package/dist/composition/rule-registry.d.ts.map +1 -1
  150. package/dist/composition/rule-registry.js +6 -0
  151. package/dist/composition/rule-registry.js.map +1 -1
  152. package/dist/foundation-config.d.ts +1 -1
  153. package/dist/foundation-config.d.ts.map +1 -1
  154. package/dist/foundation-config.js +6 -0
  155. package/dist/foundation-config.js.map +1 -1
  156. package/dist/package-self-check.d.ts +2 -3
  157. package/dist/package-self-check.d.ts.map +1 -1
  158. package/dist/package-self-check.js +2 -4
  159. package/dist/package-self-check.js.map +1 -1
  160. package/dist/schema-catalog.d.ts +1 -3
  161. package/dist/schema-catalog.d.ts.map +1 -1
  162. package/dist/schema-catalog.js +1 -6
  163. package/dist/schema-catalog.js.map +1 -1
  164. package/dist/schema-ids.d.ts +3 -0
  165. package/dist/schema-ids.d.ts.map +1 -0
  166. package/dist/schema-ids.js +11 -0
  167. package/dist/schema-ids.js.map +1 -0
  168. package/dist/semantic-version.d.ts +2 -0
  169. package/dist/semantic-version.d.ts.map +1 -1
  170. package/dist/semantic-version.js +72 -1
  171. package/dist/semantic-version.js.map +1 -1
  172. package/dist/{capabilities/source-dependencies → source-inventory}/adapters/outbound/filesystem/filesystem-source-tree-reader.d.ts +1 -1
  173. package/dist/source-inventory/adapters/outbound/filesystem/filesystem-source-tree-reader.d.ts.map +1 -0
  174. package/dist/{capabilities/source-dependencies → source-inventory}/adapters/outbound/filesystem/filesystem-source-tree-reader.js +3 -3
  175. package/dist/source-inventory/adapters/outbound/filesystem/filesystem-source-tree-reader.js.map +1 -0
  176. package/dist/source-inventory/application/model/source-file-snapshot.d.ts +5 -0
  177. package/dist/source-inventory/application/model/source-file-snapshot.d.ts.map +1 -0
  178. package/dist/source-inventory/application/model/source-file-snapshot.js +2 -0
  179. package/dist/source-inventory/application/model/source-file-snapshot.js.map +1 -0
  180. package/dist/{capabilities/source-dependencies → source-inventory}/application/ports/source-tree-reader.d.ts +1 -1
  181. package/dist/source-inventory/application/ports/source-tree-reader.d.ts.map +1 -0
  182. package/dist/source-inventory/application/ports/source-tree-reader.js.map +1 -0
  183. package/dist/strict-yaml.d.ts +1 -0
  184. package/dist/strict-yaml.d.ts.map +1 -1
  185. package/dist/strict-yaml.js +2 -2
  186. package/dist/strict-yaml.js.map +1 -1
  187. package/package.json +3 -1
  188. package/schemas/foundation-config/v1.schema.json +30 -0
  189. package/schemas/package-public-api-baseline/v1.schema.json +39 -0
  190. package/schemas/package-public-api-compatibility/v1.schema.json +70 -0
  191. package/schemas/quality-suppression-governance/v1.schema.json +109 -0
  192. package/schemas/repository-security-baseline/v1.schema.json +57 -0
  193. package/dist/capabilities/source-dependencies/adapters/outbound/filesystem/filesystem-source-tree-reader.d.ts.map +0 -1
  194. package/dist/capabilities/source-dependencies/adapters/outbound/filesystem/filesystem-source-tree-reader.js.map +0 -1
  195. package/dist/capabilities/source-dependencies/application/ports/source-tree-reader.d.ts.map +0 -1
  196. package/dist/capabilities/source-dependencies/application/ports/source-tree-reader.js.map +0 -1
  197. /package/dist/{capabilities/source-dependencies → source-inventory}/application/ports/source-tree-reader.js +0 -0
@@ -0,0 +1,27 @@
1
+ export function isoDateToEpochDay(value) {
2
+ const match = /^(20\d{2})-(\d{2})-(\d{2})$/u.exec(value);
3
+ if (match === null) {
4
+ return undefined;
5
+ }
6
+ const year = Number(match[1]);
7
+ const month = Number(match[2]);
8
+ const day = Number(match[3]);
9
+ if (!Number.isInteger(year) || !Number.isInteger(month) || !Number.isInteger(day)) {
10
+ return undefined;
11
+ }
12
+ const leap = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
13
+ const monthLengths = [31, leap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
14
+ const monthLength = monthLengths[month - 1];
15
+ if (monthLength === undefined || day < 1 || day > monthLength) {
16
+ return undefined;
17
+ }
18
+ let total = 365 * (year - 1);
19
+ total += Math.floor((year - 1) / 4);
20
+ total -= Math.floor((year - 1) / 100);
21
+ total += Math.floor((year - 1) / 400);
22
+ for (let index = 0; index < month - 1; index += 1) {
23
+ total += monthLengths[index] ?? 0;
24
+ }
25
+ return total + day;
26
+ }
27
+ //# sourceMappingURL=iso-date.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iso-date.js","sourceRoot":"","sources":["../../../../../src/capabilities/suppression-governance/application/model/iso-date.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,MAAM,KAAK,GAAG,8BAA8B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QAClF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,KAAK,CAAC,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAClF,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC5C,IAAI,WAAW,KAAK,SAAS,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,WAAW,EAAE,CAAC;QAC9D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,KAAK,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAC7B,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IACtC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IACtC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAClD,KAAK,IAAI,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,KAAK,GAAG,GAAG,CAAC;AACrB,CAAC"}
@@ -0,0 +1,35 @@
1
+ declare const WAIVERABLE_DIRECTIVES: readonly ["ast-grep-ignore", "oxlint-disable-line", "oxlint-disable-next-line", "typescript-expect-error"];
2
+ export type WaiverableDirective = (typeof WAIVERABLE_DIRECTIVES)[number];
3
+ export type SuppressionDirectiveKind = WaiverableDirective | "eslint-disable" | "eslint-disable-line" | "eslint-disable-next-line" | "oxlint-disable" | "typescript-ignore" | "typescript-nocheck";
4
+ export interface SuppressionDirective {
5
+ readonly kind: SuppressionDirectiveKind;
6
+ readonly path: string;
7
+ readonly line: number;
8
+ readonly column: number;
9
+ readonly rules: readonly string[];
10
+ readonly scope: "file" | "line";
11
+ }
12
+ export interface SuppressionScan {
13
+ readonly path: string;
14
+ readonly parseErrorCount: number;
15
+ readonly directives: readonly SuppressionDirective[];
16
+ }
17
+ export interface SuppressionWaiver {
18
+ readonly id: string;
19
+ readonly path: string;
20
+ readonly line: number;
21
+ readonly directive: WaiverableDirective;
22
+ readonly rules: readonly string[];
23
+ readonly owner: string;
24
+ readonly reason: string;
25
+ readonly createdOn: string;
26
+ readonly expiresOn: string;
27
+ readonly decisionRef: string;
28
+ }
29
+ export interface SuppressionGovernancePolicy {
30
+ readonly governedRoots: readonly string[];
31
+ readonly nonWaivableRulePrefixes: readonly string[];
32
+ readonly waivers: readonly SuppressionWaiver[];
33
+ }
34
+ export {};
35
+ //# sourceMappingURL=suppression-governance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suppression-governance.d.ts","sourceRoot":"","sources":["../../../../../src/capabilities/suppression-governance/application/model/suppression-governance.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,qBAAqB,YACzB,iBAAiB,EACjB,qBAAqB,EACrB,0BAA0B,EAC1B,yBAAyB,CACjB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzE,MAAM,MAAM,wBAAwB,GAChC,mBAAmB,GACnB,gBAAgB,GAChB,qBAAqB,GACrB,0BAA0B,GAC1B,gBAAgB,GAChB,mBAAmB,GACnB,oBAAoB,CAAC;AAEzB,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACtD;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,uBAAuB,EAAE,SAAS,MAAM,EAAE,CAAC;IACpD,QAAQ,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAChD"}
@@ -0,0 +1,8 @@
1
+ const WAIVERABLE_DIRECTIVES = [
2
+ "ast-grep-ignore",
3
+ "oxlint-disable-line",
4
+ "oxlint-disable-next-line",
5
+ "typescript-expect-error"
6
+ ];
7
+ export {};
8
+ //# sourceMappingURL=suppression-governance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suppression-governance.js","sourceRoot":"","sources":["../../../../../src/capabilities/suppression-governance/application/model/suppression-governance.ts"],"names":[],"mappings":"AAAA,MAAM,qBAAqB,GAAG;IAC5B,iBAAiB;IACjB,qBAAqB;IACrB,0BAA0B;IAC1B,yBAAyB;CACjB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { FoundationDiagnostic } from "../../../../check-contract.js";
2
+ import type { SuppressionGovernancePolicy, SuppressionScan } from "../model/suppression-governance.js";
3
+ export declare function evaluateSuppressionGovernance(input: {
4
+ readonly policy: SuppressionGovernancePolicy;
5
+ readonly scans: readonly SuppressionScan[];
6
+ readonly today: string;
7
+ }): readonly FoundationDiagnostic[];
8
+ //# sourceMappingURL=evaluate-suppression-governance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate-suppression-governance.d.ts","sourceRoot":"","sources":["../../../../../src/capabilities/suppression-governance/application/policies/evaluate-suppression-governance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAE1E,OAAO,KAAK,EAEV,2BAA2B,EAC3B,eAAe,EAGhB,MAAM,oCAAoC,CAAC;AAwK5C,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACnD,QAAQ,CAAC,MAAM,EAAE,2BAA2B,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,GAAG,SAAS,oBAAoB,EAAE,CA+ElC"}
@@ -0,0 +1,196 @@
1
+ import { isoDateToEpochDay } from "../model/iso-date.js";
2
+ import { SUPPRESSION_GOVERNANCE_RULES } from "../rules.js";
3
+ const BUILT_IN_PROTECTED_RULE_PREFIXES = [
4
+ "security.",
5
+ "tenancy.",
6
+ "tenant-isolation."
7
+ ];
8
+ const MAXIMUM_WAIVER_LIFETIME_DAYS = 90;
9
+ function diagnostic(input) {
10
+ return {
11
+ ruleId: input.rule.id,
12
+ severity: input.rule.severity,
13
+ subject: input.subject,
14
+ message: input.message,
15
+ location: {
16
+ path: input.path,
17
+ start: { line: input.line, column: input.column ?? 1 }
18
+ },
19
+ relatedLocations: [],
20
+ evidence: input.evidence ?? [],
21
+ remediation: input.rule.remediation,
22
+ requiresArchitectureReview: input.rule.requiresArchitectureReview
23
+ };
24
+ }
25
+ function locationKey(path, line) {
26
+ return `${path}:${line}`;
27
+ }
28
+ function exactRules(left, right) {
29
+ return (left.length === right.length &&
30
+ left.toSorted().every((value, index) => value === right.toSorted()[index]));
31
+ }
32
+ function waiverable(kind) {
33
+ return (kind === "ast-grep-ignore" ||
34
+ kind === "oxlint-disable-line" ||
35
+ kind === "oxlint-disable-next-line" ||
36
+ kind === "typescript-expect-error");
37
+ }
38
+ function protectedRules(directive, policy) {
39
+ const prefixes = [
40
+ ...BUILT_IN_PROTECTED_RULE_PREFIXES,
41
+ ...policy.nonWaivableRulePrefixes
42
+ ];
43
+ return directive.rules.filter((ruleId) => prefixes.some((prefix) => ruleId.startsWith(prefix)));
44
+ }
45
+ function classifyProhibited(directive, policy) {
46
+ const base = {
47
+ subject: locationKey(directive.path, directive.line),
48
+ path: directive.path,
49
+ line: directive.line,
50
+ column: directive.column
51
+ };
52
+ if (directive.kind.startsWith("eslint-")) {
53
+ return diagnostic({
54
+ ...base,
55
+ rule: SUPPRESSION_GOVERNANCE_RULES.legacySuppression,
56
+ message: `Legacy suppression directive is prohibited: ${directive.kind}.`
57
+ });
58
+ }
59
+ if (directive.kind === "typescript-ignore" || directive.kind === "typescript-nocheck") {
60
+ return diagnostic({
61
+ ...base,
62
+ rule: SUPPRESSION_GOVERNANCE_RULES.prohibitedTypeScriptSuppression,
63
+ message: `TypeScript suppression directive is prohibited: ${directive.kind}.`
64
+ });
65
+ }
66
+ if (directive.scope === "file") {
67
+ return diagnostic({
68
+ ...base,
69
+ rule: SUPPRESSION_GOVERNANCE_RULES.broadSuppression,
70
+ message: `Broad suppression directive is prohibited: ${directive.kind}.`
71
+ });
72
+ }
73
+ if (directive.rules.length === 0) {
74
+ return diagnostic({
75
+ ...base,
76
+ rule: SUPPRESSION_GOVERNANCE_RULES.unscopedSuppression,
77
+ message: `Suppression directive does not name an exact rule: ${directive.kind}.`
78
+ });
79
+ }
80
+ const blockedRules = protectedRules(directive, policy);
81
+ if (blockedRules.length > 0) {
82
+ return diagnostic({
83
+ ...base,
84
+ rule: SUPPRESSION_GOVERNANCE_RULES.protectedRuleSuppression,
85
+ message: `Suppression targets non-waivable rule(s): ${blockedRules.join(", ")}.`,
86
+ evidence: blockedRules.map((value) => ({ kind: "protected-rule", value }))
87
+ });
88
+ }
89
+ return undefined;
90
+ }
91
+ function waiverTimeDiagnostics(waiver, today) {
92
+ const created = isoDateToEpochDay(waiver.createdOn);
93
+ const expires = isoDateToEpochDay(waiver.expiresOn);
94
+ const current = isoDateToEpochDay(today);
95
+ if (created === undefined || expires === undefined || current === undefined) {
96
+ return [];
97
+ }
98
+ const base = {
99
+ subject: waiver.id,
100
+ path: waiver.path,
101
+ line: waiver.line,
102
+ evidence: [{ kind: "waiver-id", value: waiver.id }]
103
+ };
104
+ const diagnostics = [];
105
+ if (created > current) {
106
+ diagnostics.push(diagnostic({
107
+ ...base,
108
+ rule: SUPPRESSION_GOVERNANCE_RULES.futureWaiver,
109
+ message: `Waiver ${waiver.id} has future createdOn ${waiver.createdOn}.`
110
+ }));
111
+ }
112
+ if (expires < current) {
113
+ diagnostics.push(diagnostic({
114
+ ...base,
115
+ rule: SUPPRESSION_GOVERNANCE_RULES.expiredWaiver,
116
+ message: `Waiver ${waiver.id} expired on ${waiver.expiresOn}.`
117
+ }));
118
+ }
119
+ if (expires - created > MAXIMUM_WAIVER_LIFETIME_DAYS) {
120
+ diagnostics.push(diagnostic({
121
+ ...base,
122
+ rule: SUPPRESSION_GOVERNANCE_RULES.excessiveLifetime,
123
+ message: `Waiver ${waiver.id} exceeds ${MAXIMUM_WAIVER_LIFETIME_DAYS} days.`
124
+ }));
125
+ }
126
+ return diagnostics;
127
+ }
128
+ export function evaluateSuppressionGovernance(input) {
129
+ const diagnostics = [];
130
+ const waiversByLocation = new Map(input.policy.waivers.map((waiver) => [locationKey(waiver.path, waiver.line), waiver]));
131
+ const consumedWaivers = new Set();
132
+ for (const scan of input.scans) {
133
+ if (scan.parseErrorCount > 0) {
134
+ diagnostics.push(diagnostic({
135
+ rule: SUPPRESSION_GOVERNANCE_RULES.sourceParseError,
136
+ subject: scan.path,
137
+ message: `Source parser reported ${scan.parseErrorCount} error(s).`,
138
+ path: scan.path,
139
+ line: 1
140
+ }));
141
+ continue;
142
+ }
143
+ for (const directive of scan.directives) {
144
+ const key = locationKey(directive.path, directive.line);
145
+ const waiver = waiversByLocation.get(key);
146
+ const prohibited = classifyProhibited(directive, input.policy);
147
+ if (prohibited !== undefined) {
148
+ diagnostics.push(prohibited);
149
+ continue;
150
+ }
151
+ if (!waiverable(directive.kind)) {
152
+ continue;
153
+ }
154
+ if (waiver === undefined) {
155
+ diagnostics.push(diagnostic({
156
+ rule: SUPPRESSION_GOVERNANCE_RULES.unregisteredSuppression,
157
+ subject: key,
158
+ message: `Suppression has no registered waiver: ${directive.kind}.`,
159
+ path: directive.path,
160
+ line: directive.line,
161
+ column: directive.column,
162
+ evidence: directive.rules.map((value) => ({ kind: "rule", value }))
163
+ }));
164
+ continue;
165
+ }
166
+ consumedWaivers.add(waiver.id);
167
+ if (waiver.directive !== directive.kind || !exactRules(waiver.rules, directive.rules)) {
168
+ diagnostics.push(diagnostic({
169
+ rule: SUPPRESSION_GOVERNANCE_RULES.waiverMismatch,
170
+ subject: waiver.id,
171
+ message: `Waiver ${waiver.id} does not match the source directive.`,
172
+ path: directive.path,
173
+ line: directive.line,
174
+ column: directive.column,
175
+ evidence: [{ kind: "waiver-id", value: waiver.id }]
176
+ }));
177
+ continue;
178
+ }
179
+ diagnostics.push(...waiverTimeDiagnostics(waiver, input.today));
180
+ }
181
+ }
182
+ for (const waiver of input.policy.waivers) {
183
+ if (!consumedWaivers.has(waiver.id)) {
184
+ diagnostics.push(diagnostic({
185
+ rule: SUPPRESSION_GOVERNANCE_RULES.staleWaiver,
186
+ subject: waiver.id,
187
+ message: `Waiver ${waiver.id} does not match one allowed suppression.`,
188
+ path: waiver.path,
189
+ line: waiver.line,
190
+ evidence: [{ kind: "waiver-id", value: waiver.id }]
191
+ }));
192
+ }
193
+ }
194
+ return diagnostics;
195
+ }
196
+ //# sourceMappingURL=evaluate-suppression-governance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate-suppression-governance.js","sourceRoot":"","sources":["../../../../../src/capabilities/suppression-governance/application/policies/evaluate-suppression-governance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAQzD,OAAO,EACL,4BAA4B,EAE7B,MAAM,aAAa,CAAC;AAErB,MAAM,gCAAgC,GAAG;IACvC,WAAW;IACX,UAAU;IACV,mBAAmB;CACX,CAAC;AACX,MAAM,4BAA4B,GAAG,EAAE,CAAC;AAExC,SAAS,UAAU,CAAC,KAQnB;IACC,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE;QACrB,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;QAC7B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE;YACR,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE;SACvD;QACD,gBAAgB,EAAE,EAAE;QACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE;QAC9B,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW;QACnC,0BAA0B,EAAE,KAAK,CAAC,IAAI,CAAC,0BAA0B;KAClE,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,IAAY;IAC7C,OAAO,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,UAAU,CAAC,IAAuB,EAAE,KAAwB;IACnE,OAAO,CACL,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAC5B,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,CAC3E,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,IAAkC;IACpD,OAAO,CACL,IAAI,KAAK,iBAAiB;QAC1B,IAAI,KAAK,qBAAqB;QAC9B,IAAI,KAAK,0BAA0B;QACnC,IAAI,KAAK,yBAAyB,CACnC,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,SAA+B,EAC/B,MAAmC;IAEnC,MAAM,QAAQ,GAAG;QACf,GAAG,gCAAgC;QACnC,GAAG,MAAM,CAAC,uBAAuB;KAClC,CAAC;IACF,OAAO,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CACvC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CACrD,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CACzB,SAA+B,EAC/B,MAAmC;IAEnC,MAAM,IAAI,GAAG;QACX,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC;QACpD,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,MAAM,EAAE,SAAS,CAAC,MAAM;KACzB,CAAC;IACF,IAAI,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,OAAO,UAAU,CAAC;YAChB,GAAG,IAAI;YACP,IAAI,EAAE,4BAA4B,CAAC,iBAAiB;YACpD,OAAO,EAAE,+CAA+C,SAAS,CAAC,IAAI,GAAG;SAC1E,CAAC,CAAC;IACL,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,KAAK,mBAAmB,IAAI,SAAS,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;QACtF,OAAO,UAAU,CAAC;YAChB,GAAG,IAAI;YACP,IAAI,EAAE,4BAA4B,CAAC,+BAA+B;YAClE,OAAO,EAAE,mDAAmD,SAAS,CAAC,IAAI,GAAG;SAC9E,CAAC,CAAC;IACL,CAAC;IACD,IAAI,SAAS,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;QAC/B,OAAO,UAAU,CAAC;YAChB,GAAG,IAAI;YACP,IAAI,EAAE,4BAA4B,CAAC,gBAAgB;YACnD,OAAO,EAAE,8CAA8C,SAAS,CAAC,IAAI,GAAG;SACzE,CAAC,CAAC;IACL,CAAC;IACD,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,UAAU,CAAC;YAChB,GAAG,IAAI;YACP,IAAI,EAAE,4BAA4B,CAAC,mBAAmB;YACtD,OAAO,EAAE,sDAAsD,SAAS,CAAC,IAAI,GAAG;SACjF,CAAC,CAAC;IACL,CAAC;IACD,MAAM,YAAY,GAAG,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACvD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,UAAU,CAAC;YAChB,GAAG,IAAI;YACP,IAAI,EAAE,4BAA4B,CAAC,wBAAwB;YAC3D,OAAO,EAAE,6CAA6C,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YAChF,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAC;SAC3E,CAAC,CAAC;IACL,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,qBAAqB,CAC5B,MAAyB,EACzB,KAAa;IAEb,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC5E,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,GAAG;QACX,OAAO,EAAE,MAAM,CAAC,EAAE;QAClB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;KACpD,CAAC;IACF,MAAM,WAAW,GAA2B,EAAE,CAAC;IAC/C,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC;QACtB,WAAW,CAAC,IAAI,CACd,UAAU,CAAC;YACT,GAAG,IAAI;YACP,IAAI,EAAE,4BAA4B,CAAC,YAAY;YAC/C,OAAO,EAAE,UAAU,MAAM,CAAC,EAAE,yBAAyB,MAAM,CAAC,SAAS,GAAG;SACzE,CAAC,CACH,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC;QACtB,WAAW,CAAC,IAAI,CACd,UAAU,CAAC;YACT,GAAG,IAAI;YACP,IAAI,EAAE,4BAA4B,CAAC,aAAa;YAChD,OAAO,EAAE,UAAU,MAAM,CAAC,EAAE,eAAe,MAAM,CAAC,SAAS,GAAG;SAC/D,CAAC,CACH,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,GAAG,OAAO,GAAG,4BAA4B,EAAE,CAAC;QACrD,WAAW,CAAC,IAAI,CACd,UAAU,CAAC;YACT,GAAG,IAAI;YACP,IAAI,EAAE,4BAA4B,CAAC,iBAAiB;YACpD,OAAO,EAAE,UAAU,MAAM,CAAC,EAAE,YAAY,4BAA4B,QAAQ;SAC7E,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,KAI7C;IACC,MAAM,WAAW,GAA2B,EAAE,CAAC;IAC/C,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAC/B,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CACtF,CAAC;IACF,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAE1C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;YAC7B,WAAW,CAAC,IAAI,CACd,UAAU,CAAC;gBACT,IAAI,EAAE,4BAA4B,CAAC,gBAAgB;gBACnD,OAAO,EAAE,IAAI,CAAC,IAAI;gBAClB,OAAO,EAAE,0BAA0B,IAAI,CAAC,eAAe,YAAY;gBACnE,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,CAAC;aACR,CAAC,CACH,CAAC;YACF,SAAS;QACX,CAAC;QACD,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YACxD,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1C,MAAM,UAAU,GAAG,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAC/D,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAC7B,SAAS;YACX,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,SAAS;YACX,CAAC;YACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,WAAW,CAAC,IAAI,CACd,UAAU,CAAC;oBACT,IAAI,EAAE,4BAA4B,CAAC,uBAAuB;oBAC1D,OAAO,EAAE,GAAG;oBACZ,OAAO,EAAE,yCAAyC,SAAS,CAAC,IAAI,GAAG;oBACnE,IAAI,EAAE,SAAS,CAAC,IAAI;oBACpB,IAAI,EAAE,SAAS,CAAC,IAAI;oBACpB,MAAM,EAAE,SAAS,CAAC,MAAM;oBACxB,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;iBACpE,CAAC,CACH,CAAC;gBACF,SAAS;YACX,CAAC;YACD,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC/B,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtF,WAAW,CAAC,IAAI,CACd,UAAU,CAAC;oBACT,IAAI,EAAE,4BAA4B,CAAC,cAAc;oBACjD,OAAO,EAAE,MAAM,CAAC,EAAE;oBAClB,OAAO,EAAE,UAAU,MAAM,CAAC,EAAE,uCAAuC;oBACnE,IAAI,EAAE,SAAS,CAAC,IAAI;oBACpB,IAAI,EAAE,SAAS,CAAC,IAAI;oBACpB,MAAM,EAAE,SAAS,CAAC,MAAM;oBACxB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;iBACpD,CAAC,CACH,CAAC;gBACF,SAAS;YACX,CAAC;YACD,WAAW,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC1C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;YACpC,WAAW,CAAC,IAAI,CACd,UAAU,CAAC;gBACT,IAAI,EAAE,4BAA4B,CAAC,WAAW;gBAC9C,OAAO,EAAE,MAAM,CAAC,EAAE;gBAClB,OAAO,EAAE,UAAU,MAAM,CAAC,EAAE,0CAA0C;gBACtE,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;aACpD,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export interface CalendarClock {
2
+ today(): string;
3
+ }
4
+ //# sourceMappingURL=calendar-clock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-clock.d.ts","sourceRoot":"","sources":["../../../../../src/capabilities/suppression-governance/application/ports/calendar-clock.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,KAAK,IAAI,MAAM,CAAC;CACjB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=calendar-clock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-clock.js","sourceRoot":"","sources":["../../../../../src/capabilities/suppression-governance/application/ports/calendar-clock.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import type { SourceFileSnapshot } from "../../../../source-inventory/application/model/source-file-snapshot.js";
2
+ import type { SuppressionScan } from "../model/suppression-governance.js";
3
+ export interface SuppressionScanner {
4
+ scan(file: SourceFileSnapshot): SuppressionScan;
5
+ }
6
+ //# sourceMappingURL=suppression-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suppression-scanner.d.ts","sourceRoot":"","sources":["../../../../../src/capabilities/suppression-governance/application/ports/suppression-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wEAAwE,CAAC;AACjH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAE1E,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,IAAI,EAAE,kBAAkB,GAAG,eAAe,CAAC;CACjD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=suppression-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suppression-scanner.js","sourceRoot":"","sources":["../../../../../src/capabilities/suppression-governance/application/ports/suppression-scanner.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import type { DiagnosticSeverity } from "../../../check-contract.js";
2
+ export interface SuppressionGovernanceRuleMetadata {
3
+ readonly id: string;
4
+ readonly severity: DiagnosticSeverity;
5
+ readonly rationale: string;
6
+ readonly remediation: string;
7
+ readonly documentation: string;
8
+ readonly requiresArchitectureReview: boolean;
9
+ }
10
+ export declare const SUPPRESSION_GOVERNANCE_RULES: Readonly<{
11
+ broadSuppression: SuppressionGovernanceRuleMetadata;
12
+ excessiveLifetime: SuppressionGovernanceRuleMetadata;
13
+ expiredWaiver: SuppressionGovernanceRuleMetadata;
14
+ futureWaiver: SuppressionGovernanceRuleMetadata;
15
+ legacySuppression: SuppressionGovernanceRuleMetadata;
16
+ prohibitedTypeScriptSuppression: SuppressionGovernanceRuleMetadata;
17
+ protectedRuleSuppression: SuppressionGovernanceRuleMetadata;
18
+ sourceParseError: SuppressionGovernanceRuleMetadata;
19
+ staleWaiver: SuppressionGovernanceRuleMetadata;
20
+ unregisteredSuppression: SuppressionGovernanceRuleMetadata;
21
+ unscopedSuppression: SuppressionGovernanceRuleMetadata;
22
+ waiverMismatch: SuppressionGovernanceRuleMetadata;
23
+ }>;
24
+ export declare const SUPPRESSION_GOVERNANCE_RULES_BY_ID: ReadonlyMap<string, SuppressionGovernanceRuleMetadata>;
25
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../../../src/capabilities/suppression-governance/application/rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAErE,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,0BAA0B,EAAE,OAAO,CAAC;CAC9C;AAkBD,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;EA8DvC,CAAC;AAEH,eAAO,MAAM,kCAAkC,EAAE,WAAW,CAC1D,MAAM,EACN,iCAAiC,CAGlC,CAAC"}
@@ -0,0 +1,26 @@
1
+ function rule(suffix, rationale, remediation, requiresArchitectureReview = false) {
2
+ return Object.freeze({
3
+ id: `quality.suppression-governance.${suffix}`,
4
+ severity: "error",
5
+ rationale,
6
+ remediation,
7
+ documentation: "docs/architecture/suppression-governance.md",
8
+ requiresArchitectureReview
9
+ });
10
+ }
11
+ export const SUPPRESSION_GOVERNANCE_RULES = Object.freeze({
12
+ broadSuppression: rule("broad-suppression", "File and region suppressions hide unrelated future diagnostics.", "Replace the directive with an exact line-scoped suppression and waiver."),
13
+ excessiveLifetime: rule("excessive-waiver-lifetime", "A temporary waiver must not silently become permanent technical debt.", "Shorten the waiver lifetime to at most 90 calendar days."),
14
+ expiredWaiver: rule("expired-waiver", "Expired exceptions must be removed or explicitly reconsidered.", "Remove the suppression or approve a new bounded waiver."),
15
+ futureWaiver: rule("future-waiver", "A waiver cannot be created in the future relative to the build clock.", "Correct createdOn using the current UTC calendar date."),
16
+ legacySuppression: rule("legacy-suppression", "ESLint compatibility directives create a second suppression vocabulary.", "Use an Oxlint directive and register an exact waiver."),
17
+ prohibitedTypeScriptSuppression: rule("prohibited-typescript-suppression", "TypeScript ignore and nocheck directives can hide unrelated compiler failures.", "Remove the directive; use a line-scoped @ts-expect-error waiver only when necessary."),
18
+ protectedRuleSuppression: rule("protected-rule-suppression", "Security and tenant-isolation rules are not waivable.", "Fix the violation or change the governing architecture through an accepted decision.", true),
19
+ sourceParseError: rule("source-parse-error", "Suppression evidence is incomplete when governed source does not parse.", "Fix the source syntax before evaluating suppression governance."),
20
+ staleWaiver: rule("stale-waiver", "A waiver without one exact suppression is stale or incorrectly scoped.", "Remove the waiver or align its path, line, directive, and rules with the source."),
21
+ unregisteredSuppression: rule("unregistered-suppression", "Every allowed suppression needs accountable, expiring ownership.", "Register an exact waiver with owner, reason, expiry, and decision reference."),
22
+ unscopedSuppression: rule("unscoped-suppression", "A suppression without explicit rule IDs can hide arbitrary diagnostics.", "List every suppressed rule explicitly."),
23
+ waiverMismatch: rule("waiver-mismatch", "A waiver must describe the exact directive and exact rule set at its location.", "Update the waiver or suppression so their directive and rules match exactly.")
24
+ });
25
+ export const SUPPRESSION_GOVERNANCE_RULES_BY_ID = new Map(Object.values(SUPPRESSION_GOVERNANCE_RULES).map((metadata) => [metadata.id, metadata]));
26
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../../../src/capabilities/suppression-governance/application/rules.ts"],"names":[],"mappings":"AAWA,SAAS,IAAI,CACX,MAAc,EACd,SAAiB,EACjB,WAAmB,EACnB,0BAA0B,GAAG,KAAK;IAElC,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,EAAE,EAAE,kCAAkC,MAAM,EAAE;QAC9C,QAAQ,EAAE,OAAO;QACjB,SAAS;QACT,WAAW;QACX,aAAa,EAAE,6CAA6C;QAC5D,0BAA0B;KAC3B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAC,MAAM,CAAC;IACxD,gBAAgB,EAAE,IAAI,CACpB,mBAAmB,EACnB,iEAAiE,EACjE,yEAAyE,CAC1E;IACD,iBAAiB,EAAE,IAAI,CACrB,2BAA2B,EAC3B,uEAAuE,EACvE,0DAA0D,CAC3D;IACD,aAAa,EAAE,IAAI,CACjB,gBAAgB,EAChB,gEAAgE,EAChE,yDAAyD,CAC1D;IACD,YAAY,EAAE,IAAI,CAChB,eAAe,EACf,uEAAuE,EACvE,wDAAwD,CACzD;IACD,iBAAiB,EAAE,IAAI,CACrB,oBAAoB,EACpB,yEAAyE,EACzE,uDAAuD,CACxD;IACD,+BAA+B,EAAE,IAAI,CACnC,mCAAmC,EACnC,gFAAgF,EAChF,sFAAsF,CACvF;IACD,wBAAwB,EAAE,IAAI,CAC5B,4BAA4B,EAC5B,uDAAuD,EACvD,sFAAsF,EACtF,IAAI,CACL;IACD,gBAAgB,EAAE,IAAI,CACpB,oBAAoB,EACpB,yEAAyE,EACzE,iEAAiE,CAClE;IACD,WAAW,EAAE,IAAI,CACf,cAAc,EACd,wEAAwE,EACxE,kFAAkF,CACnF;IACD,uBAAuB,EAAE,IAAI,CAC3B,0BAA0B,EAC1B,kEAAkE,EAClE,8EAA8E,CAC/E;IACD,mBAAmB,EAAE,IAAI,CACvB,sBAAsB,EACtB,yEAAyE,EACzE,wCAAwC,CACzC;IACD,cAAc,EAAE,IAAI,CAClB,iBAAiB,EACjB,gFAAgF,EAChF,8EAA8E,CAC/E;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kCAAkC,GAG3C,IAAI,GAAG,CACT,MAAM,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CACvF,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { FoundationDiagnostic } from "../../../../check-contract.js";
2
+ import type { SourceTreeReader } from "../../../../source-inventory/application/ports/source-tree-reader.js";
3
+ import type { SuppressionGovernancePolicy } from "../model/suppression-governance.js";
4
+ import type { CalendarClock } from "../ports/calendar-clock.js";
5
+ import type { SuppressionScanner } from "../ports/suppression-scanner.js";
6
+ export declare function analyzeSuppressionGovernance(input: {
7
+ readonly consumerRoot: string;
8
+ readonly policy: SuppressionGovernancePolicy;
9
+ readonly signal?: AbortSignal;
10
+ }, dependencies: {
11
+ readonly clock: CalendarClock;
12
+ readonly scanner: SuppressionScanner;
13
+ readonly sourceReader: SourceTreeReader;
14
+ }): Promise<readonly FoundationDiagnostic[]>;
15
+ //# sourceMappingURL=analyze-suppression-governance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-suppression-governance.d.ts","sourceRoot":"","sources":["../../../../../src/capabilities/suppression-governance/application/use-cases/analyze-suppression-governance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sEAAsE,CAAC;AAE7G,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAG1E,wBAAsB,4BAA4B,CAChD,KAAK,EAAE;IACL,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,2BAA2B,CAAC;IAC7C,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B,EACD,YAAY,EAAE;IACZ,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC;CACzC,GACA,OAAO,CAAC,SAAS,oBAAoB,EAAE,CAAC,CAe1C"}
@@ -0,0 +1,15 @@
1
+ import { assertNotCancelled } from "../../../../strict-yaml.js";
2
+ import { evaluateSuppressionGovernance } from "../policies/evaluate-suppression-governance.js";
3
+ export async function analyzeSuppressionGovernance(input, dependencies) {
4
+ const files = await dependencies.sourceReader.read(input.consumerRoot, input.policy.governedRoots, input.signal);
5
+ const scans = files.map((file) => {
6
+ assertNotCancelled(input.signal);
7
+ return dependencies.scanner.scan(file);
8
+ });
9
+ return evaluateSuppressionGovernance({
10
+ policy: input.policy,
11
+ scans,
12
+ today: dependencies.clock.today()
13
+ });
14
+ }
15
+ //# sourceMappingURL=analyze-suppression-governance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-suppression-governance.js","sourceRoot":"","sources":["../../../../../src/capabilities/suppression-governance/application/use-cases/analyze-suppression-governance.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAIhE,OAAO,EAAE,6BAA6B,EAAE,MAAM,gDAAgD,CAAC;AAE/F,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,KAIC,EACD,YAIC;IAED,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,IAAI,CAChD,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,MAAM,CAAC,aAAa,EAC1B,KAAK,CAAC,MAAM,CACb,CAAC;IACF,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC/B,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IACH,OAAO,6BAA6B,CAAC;QACnC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,KAAK;QACL,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE;KAClC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { SuppressionGovernancePolicy } from "../application/model/suppression-governance.js";
2
+ export declare const CAPABILITY_ID: "quality.suppression-governance";
3
+ export declare const CAPABILITY_CONFIG_SCHEMA_VERSION: 1;
4
+ export declare function loadCapabilityConfig(consumerRoot: string, configPath: string, signal?: AbortSignal): Promise<SuppressionGovernancePolicy>;
5
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/capabilities/suppression-governance/contract/config.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,2BAA2B,EAG5B,MAAM,gDAAgD,CAAC;AAExD,eAAO,MAAM,aAAa,EAAG,gCAAyC,CAAC;AACvE,eAAO,MAAM,gCAAgC,EAAG,CAAU,CAAC;AA2F3D,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,2BAA2B,CAAC,CA8BtC"}
@@ -0,0 +1,108 @@
1
+ import { CapabilityInputError } from "../../../capability-runtime.js";
2
+ import { assertSchema } from "../../../schema-catalog.js";
3
+ import { assertRepositoryRelativePath, loadStrictYamlFile } from "../../../strict-yaml.js";
4
+ import { isoDateToEpochDay } from "../application/model/iso-date.js";
5
+ export const CAPABILITY_ID = "quality.suppression-governance";
6
+ export const CAPABILITY_CONFIG_SCHEMA_VERSION = 1;
7
+ function inputError(message) {
8
+ throw new CapabilityInputError({
9
+ code: "SUPPRESSION_GOVERNANCE_CONFIG_INVALID",
10
+ message,
11
+ phase: "suppression-governance-config",
12
+ retryable: false
13
+ });
14
+ }
15
+ function record(value, field) {
16
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
17
+ inputError(`${field} must be an object.`);
18
+ }
19
+ return value;
20
+ }
21
+ function string(value, field) {
22
+ if (typeof value !== "string") {
23
+ inputError(`${field} must be a string.`);
24
+ }
25
+ return value;
26
+ }
27
+ function integer(value, field) {
28
+ if (!Number.isInteger(value)) {
29
+ inputError(`${field} must be an integer.`);
30
+ }
31
+ return value;
32
+ }
33
+ function strings(value, field) {
34
+ if (!Array.isArray(value) || value.some((entry) => typeof entry !== "string")) {
35
+ inputError(`${field} must be an array of strings.`);
36
+ }
37
+ return Object.freeze(value);
38
+ }
39
+ function pathInside(path, root) {
40
+ return path === root || path.startsWith(`${root}/`);
41
+ }
42
+ function mapWaiver(value, index) {
43
+ const field = `waivers[${index}]`;
44
+ const waiver = record(value, field);
45
+ const path = string(waiver["path"], `${field}.path`);
46
+ assertRepositoryRelativePath(path, "suppression-governance-config");
47
+ const createdOn = string(waiver["createdOn"], `${field}.createdOn`);
48
+ const expiresOn = string(waiver["expiresOn"], `${field}.expiresOn`);
49
+ const createdDay = isoDateToEpochDay(createdOn);
50
+ const expiryDay = isoDateToEpochDay(expiresOn);
51
+ if (createdDay === undefined || expiryDay === undefined) {
52
+ inputError(`${field} contains an invalid calendar date.`);
53
+ }
54
+ if (createdDay > expiryDay) {
55
+ inputError(`${field}.createdOn must not be after expiresOn.`);
56
+ }
57
+ return Object.freeze({
58
+ id: string(waiver["id"], `${field}.id`),
59
+ path,
60
+ line: integer(waiver["line"], `${field}.line`),
61
+ directive: string(waiver["directive"], `${field}.directive`),
62
+ rules: Object.freeze(strings(waiver["rules"], `${field}.rules`).toSorted()),
63
+ owner: string(waiver["owner"], `${field}.owner`),
64
+ reason: string(waiver["reason"], `${field}.reason`),
65
+ createdOn,
66
+ expiresOn,
67
+ decisionRef: string(waiver["decisionRef"], `${field}.decisionRef`)
68
+ });
69
+ }
70
+ function validatePolicy(policy) {
71
+ const waiverIds = new Set();
72
+ const waiverLocations = new Set();
73
+ for (const waiver of policy.waivers) {
74
+ if (waiverIds.has(waiver.id)) {
75
+ inputError(`Waiver ID is duplicated: ${waiver.id}.`);
76
+ }
77
+ waiverIds.add(waiver.id);
78
+ const location = `${waiver.path}:${waiver.line}`;
79
+ if (waiverLocations.has(location)) {
80
+ inputError(`Only one waiver may own a source line: ${location}.`);
81
+ }
82
+ waiverLocations.add(location);
83
+ if (!policy.governedRoots.some((root) => pathInside(waiver.path, root))) {
84
+ inputError(`Waiver path is outside governed roots: ${waiver.path}.`);
85
+ }
86
+ }
87
+ }
88
+ export async function loadCapabilityConfig(consumerRoot, configPath, signal) {
89
+ const input = await loadStrictYamlFile(consumerRoot, configPath, "suppression-governance-config", signal);
90
+ await assertSchema("quality-suppression-governance/v1", input, "suppression-governance-config");
91
+ const root = record(input, "suppression governance config");
92
+ const governedRoots = strings(root["governedRoots"], "governedRoots");
93
+ for (const governedRoot of governedRoots) {
94
+ assertRepositoryRelativePath(governedRoot, "suppression-governance-config");
95
+ }
96
+ const waiverInputs = root["waivers"];
97
+ if (!Array.isArray(waiverInputs)) {
98
+ inputError("waivers must be an array.");
99
+ }
100
+ const policy = Object.freeze({
101
+ governedRoots: Object.freeze([...governedRoots]),
102
+ nonWaivableRulePrefixes: Object.freeze(strings(root["nonWaivableRulePrefixes"], "nonWaivableRulePrefixes")),
103
+ waivers: Object.freeze(waiverInputs.map(mapWaiver))
104
+ });
105
+ validatePolicy(policy);
106
+ return policy;
107
+ }
108
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/capabilities/suppression-governance/contract/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type CapabilityDefinition } from "../../capability-runtime.js";
2
+ import { SUPPRESSION_GOVERNANCE_RULES_BY_ID } from "./application/rules.js";
3
+ export { SUPPRESSION_GOVERNANCE_RULES_BY_ID };
4
+ export declare function createSuppressionGovernanceCapability(): CapabilityDefinition;
5
+ //# sourceMappingURL=module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../src/capabilities/suppression-governance/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,oBAAoB,EAE1B,MAAM,6BAA6B,CAAC;AAIrC,OAAO,EAAE,kCAAkC,EAAE,MAAM,wBAAwB,CAAC;AAQ5E,OAAO,EAAE,kCAAkC,EAAE,CAAC;AAE9C,wBAAgB,qCAAqC,IAAI,oBAAoB,CAsD5E"}