critical-gate 2.0.1 → 2.1.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 (170) hide show
  1. package/README.md +163 -0
  2. package/dist/cli.d.ts +7 -2
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +469 -20
  5. package/dist/cli.js.map +1 -1
  6. package/dist/config/critical-gate-config.d.ts +41 -0
  7. package/dist/config/critical-gate-config.d.ts.map +1 -1
  8. package/dist/config/critical-gate-config.js +193 -4
  9. package/dist/config/critical-gate-config.js.map +1 -1
  10. package/dist/config/index.d.ts +2 -1
  11. package/dist/config/index.d.ts.map +1 -1
  12. package/dist/config/index.js +2 -1
  13. package/dist/config/index.js.map +1 -1
  14. package/dist/config/learning-policy.d.ts +9 -0
  15. package/dist/config/learning-policy.d.ts.map +1 -0
  16. package/dist/config/learning-policy.js +34 -0
  17. package/dist/config/learning-policy.js.map +1 -0
  18. package/dist/detectors/api-surface-detector.d.ts.map +1 -1
  19. package/dist/detectors/api-surface-detector.js +123 -5
  20. package/dist/detectors/api-surface-detector.js.map +1 -1
  21. package/dist/detectors/confidence-calibration.d.ts +11 -0
  22. package/dist/detectors/confidence-calibration.d.ts.map +1 -0
  23. package/dist/detectors/confidence-calibration.js +53 -0
  24. package/dist/detectors/confidence-calibration.js.map +1 -0
  25. package/dist/detectors/existing-solution-detector.js +6 -0
  26. package/dist/detectors/existing-solution-detector.js.map +1 -1
  27. package/dist/detectors/expected-companions-detector.d.ts.map +1 -1
  28. package/dist/detectors/expected-companions-detector.js +208 -10
  29. package/dist/detectors/expected-companions-detector.js.map +1 -1
  30. package/dist/detectors/index.d.ts +1 -0
  31. package/dist/detectors/index.d.ts.map +1 -1
  32. package/dist/detectors/index.js +1 -0
  33. package/dist/detectors/index.js.map +1 -1
  34. package/dist/detectors/intent-verification-detector.d.ts.map +1 -1
  35. package/dist/detectors/intent-verification-detector.js +64 -1
  36. package/dist/detectors/intent-verification-detector.js.map +1 -1
  37. package/dist/detectors/reason-chain.d.ts +4 -0
  38. package/dist/detectors/reason-chain.d.ts.map +1 -0
  39. package/dist/detectors/reason-chain.js +102 -0
  40. package/dist/detectors/reason-chain.js.map +1 -0
  41. package/dist/detectors/repair-contract.d.ts +4 -0
  42. package/dist/detectors/repair-contract.d.ts.map +1 -0
  43. package/dist/detectors/repair-contract.js +45 -0
  44. package/dist/detectors/repair-contract.js.map +1 -0
  45. package/dist/detectors/repository-intelligence-detector.d.ts.map +1 -1
  46. package/dist/detectors/repository-intelligence-detector.js +17 -4
  47. package/dist/detectors/repository-intelligence-detector.js.map +1 -1
  48. package/dist/detectors/rewrite-detector.d.ts.map +1 -1
  49. package/dist/detectors/rewrite-detector.js +5 -2
  50. package/dist/detectors/rewrite-detector.js.map +1 -1
  51. package/dist/detectors/runner.d.ts +1 -0
  52. package/dist/detectors/runner.d.ts.map +1 -1
  53. package/dist/detectors/runner.js +50 -3
  54. package/dist/detectors/runner.js.map +1 -1
  55. package/dist/detectors/secret-path-detector.js +1 -1
  56. package/dist/detectors/secret-path-detector.js.map +1 -1
  57. package/dist/detectors/test-weakening-detector.d.ts.map +1 -1
  58. package/dist/detectors/test-weakening-detector.js +188 -39
  59. package/dist/detectors/test-weakening-detector.js.map +1 -1
  60. package/dist/detectors/types.d.ts +2 -0
  61. package/dist/detectors/types.d.ts.map +1 -1
  62. package/dist/diff/git-diff-reader.d.ts +1 -0
  63. package/dist/diff/git-diff-reader.d.ts.map +1 -1
  64. package/dist/diff/git-diff-reader.js +6 -3
  65. package/dist/diff/git-diff-reader.js.map +1 -1
  66. package/dist/diff/path-classifier.d.ts.map +1 -1
  67. package/dist/diff/path-classifier.js +9 -1
  68. package/dist/diff/path-classifier.js.map +1 -1
  69. package/dist/frameworks/detect.d.ts +11 -0
  70. package/dist/frameworks/detect.d.ts.map +1 -0
  71. package/dist/frameworks/detect.js +29 -0
  72. package/dist/frameworks/detect.js.map +1 -0
  73. package/dist/frameworks/index.d.ts +5 -0
  74. package/dist/frameworks/index.d.ts.map +1 -0
  75. package/dist/frameworks/index.js +4 -0
  76. package/dist/frameworks/index.js.map +1 -0
  77. package/dist/frameworks/packs.d.ts +3 -0
  78. package/dist/frameworks/packs.d.ts.map +1 -0
  79. package/dist/frameworks/packs.js +146 -0
  80. package/dist/frameworks/packs.js.map +1 -0
  81. package/dist/frameworks/path-patterns.d.ts +3 -0
  82. package/dist/frameworks/path-patterns.d.ts.map +1 -0
  83. package/dist/frameworks/path-patterns.js +16 -0
  84. package/dist/frameworks/path-patterns.js.map +1 -0
  85. package/dist/frameworks/types.d.ts +15 -0
  86. package/dist/frameworks/types.d.ts.map +1 -0
  87. package/dist/frameworks/types.js +2 -0
  88. package/dist/frameworks/types.js.map +1 -0
  89. package/dist/index.d.ts +2 -0
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +2 -0
  92. package/dist/index.js.map +1 -1
  93. package/dist/intent/diff-coherence-score.d.ts +13 -0
  94. package/dist/intent/diff-coherence-score.d.ts.map +1 -0
  95. package/dist/intent/diff-coherence-score.js +125 -0
  96. package/dist/intent/diff-coherence-score.js.map +1 -0
  97. package/dist/intent/index.d.ts +2 -0
  98. package/dist/intent/index.d.ts.map +1 -1
  99. package/dist/intent/index.js +2 -0
  100. package/dist/intent/index.js.map +1 -1
  101. package/dist/intent/intent-core.d.ts.map +1 -1
  102. package/dist/intent/intent-core.js +17 -1
  103. package/dist/intent/intent-core.js.map +1 -1
  104. package/dist/intent/intent-model.d.ts.map +1 -1
  105. package/dist/intent/intent-model.js +39 -2
  106. package/dist/intent/intent-model.js.map +1 -1
  107. package/dist/intent/task-intent-quality.d.ts +4 -0
  108. package/dist/intent/task-intent-quality.d.ts.map +1 -0
  109. package/dist/intent/task-intent-quality.js +98 -0
  110. package/dist/intent/task-intent-quality.js.map +1 -0
  111. package/dist/knowledge/history-index.d.ts.map +1 -1
  112. package/dist/knowledge/history-index.js +10 -3
  113. package/dist/knowledge/history-index.js.map +1 -1
  114. package/dist/knowledge/index.d.ts +2 -1
  115. package/dist/knowledge/index.d.ts.map +1 -1
  116. package/dist/knowledge/index.js +1 -0
  117. package/dist/knowledge/index.js.map +1 -1
  118. package/dist/knowledge/normal-change-model.d.ts +8 -0
  119. package/dist/knowledge/normal-change-model.d.ts.map +1 -0
  120. package/dist/knowledge/normal-change-model.js +121 -0
  121. package/dist/knowledge/normal-change-model.js.map +1 -0
  122. package/dist/knowledge/solution-index.d.ts.map +1 -1
  123. package/dist/knowledge/solution-index.js +43 -3
  124. package/dist/knowledge/solution-index.js.map +1 -1
  125. package/dist/knowledge/types.d.ts +11 -0
  126. package/dist/knowledge/types.d.ts.map +1 -1
  127. package/dist/reporters/index.d.ts +4 -1
  128. package/dist/reporters/index.d.ts.map +1 -1
  129. package/dist/reporters/index.js +6 -0
  130. package/dist/reporters/index.js.map +1 -1
  131. package/dist/reporters/markdown-reporter.d.ts.map +1 -1
  132. package/dist/reporters/markdown-reporter.js +67 -0
  133. package/dist/reporters/markdown-reporter.js.map +1 -1
  134. package/dist/reporters/pr-comment-reporter.d.ts +3 -0
  135. package/dist/reporters/pr-comment-reporter.d.ts.map +1 -0
  136. package/dist/reporters/pr-comment-reporter.js +105 -0
  137. package/dist/reporters/pr-comment-reporter.js.map +1 -0
  138. package/dist/reporters/repair-contract.d.ts +3 -0
  139. package/dist/reporters/repair-contract.d.ts.map +1 -0
  140. package/dist/reporters/repair-contract.js +25 -0
  141. package/dist/reporters/repair-contract.js.map +1 -0
  142. package/dist/reporters/repair-reporter.d.ts.map +1 -1
  143. package/dist/reporters/repair-reporter.js +19 -1
  144. package/dist/reporters/repair-reporter.js.map +1 -1
  145. package/dist/reporters/reviewer-checklist.d.ts +10 -0
  146. package/dist/reporters/reviewer-checklist.d.ts.map +1 -0
  147. package/dist/reporters/reviewer-checklist.js +112 -0
  148. package/dist/reporters/reviewer-checklist.js.map +1 -0
  149. package/dist/repository/api-snapshot.d.ts +41 -0
  150. package/dist/repository/api-snapshot.d.ts.map +1 -0
  151. package/dist/repository/api-snapshot.js +219 -0
  152. package/dist/repository/api-snapshot.js.map +1 -0
  153. package/dist/repository/index.d.ts +2 -0
  154. package/dist/repository/index.d.ts.map +1 -1
  155. package/dist/repository/index.js +2 -0
  156. package/dist/repository/index.js.map +1 -1
  157. package/dist/repository/monorepo.d.ts +7 -0
  158. package/dist/repository/monorepo.d.ts.map +1 -0
  159. package/dist/repository/monorepo.js +189 -0
  160. package/dist/repository/monorepo.js.map +1 -0
  161. package/dist/schema/gate-result.schema.d.ts +272 -0
  162. package/dist/schema/gate-result.schema.d.ts.map +1 -1
  163. package/dist/schema/gate-result.schema.js +148 -1
  164. package/dist/schema/gate-result.schema.js.map +1 -1
  165. package/dist/schema/index.d.ts +1 -1
  166. package/dist/schema/index.d.ts.map +1 -1
  167. package/dist/schema/index.js.map +1 -1
  168. package/dist/schema/types.d.ts +63 -0
  169. package/dist/schema/types.d.ts.map +1 -1
  170. package/package.json +1 -1
@@ -0,0 +1,25 @@
1
+ export function renderFindingRepairContract(finding) {
2
+ const contract = finding.repairContract;
3
+ if (contract === undefined) {
4
+ return finding.repair;
5
+ }
6
+ return [
7
+ `Repair contract for ${finding.id}`,
8
+ "",
9
+ "Instructions:",
10
+ ...contract.instructions.map((instruction) => `- ${instruction}`),
11
+ "",
12
+ "Allowed files:",
13
+ ...renderList(contract.allowedFiles),
14
+ "",
15
+ "Forbidden files:",
16
+ ...renderList(contract.forbiddenFiles),
17
+ "",
18
+ "Success criteria:",
19
+ ...contract.successCriteria.map((criterion) => `- ${criterion}`)
20
+ ].join("\n");
21
+ }
22
+ function renderList(values) {
23
+ return values.length === 0 ? ["- None."] : values.map((value) => `- ${value}`);
24
+ }
25
+ //# sourceMappingURL=repair-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair-contract.js","sourceRoot":"","sources":["../../src/reporters/repair-contract.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,2BAA2B,CAAC,OAAgB;IAC1D,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC;IAExC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IAED,OAAO;QACL,uBAAuB,OAAO,CAAC,EAAE,EAAE;QACnC,EAAE;QACF,eAAe;QACf,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,KAAK,WAAW,EAAE,CAAC;QACjE,EAAE;QACF,gBAAgB;QAChB,GAAG,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC;QACpC,EAAE;QACF,kBAAkB;QAClB,GAAG,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC;QACtC,EAAE;QACF,mBAAmB;QACnB,GAAG,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,SAAS,EAAE,CAAC;KACjE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,MAAgB;IAClC,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;AACjF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"repair-reporter.d.ts","sourceRoot":"","sources":["../../src/reporters/repair-reporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAI9D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAkB7D"}
1
+ {"version":3,"file":"repair-reporter.d.ts","sourceRoot":"","sources":["../../src/reporters/repair-reporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAK9D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAkB7D"}
@@ -1,3 +1,4 @@
1
+ import { renderFindingRepairContract } from "./repair-contract.js";
1
2
  const maxRepairFindings = 5;
2
3
  export function renderRepairReport(result) {
3
4
  if (result.findings.length === 0) {
@@ -35,10 +36,27 @@ function renderRepairFinding(finding, index) {
35
36
  return [
36
37
  `${index}. ${finding.severity.toUpperCase()}: ${finding.title}`,
37
38
  `${finding.message}${location}`,
38
- `Repair: ${finding.repair}`,
39
+ ...renderReasonChain(finding),
40
+ "Repair Contract:",
41
+ indent(renderFindingRepairContract(finding)),
39
42
  ""
40
43
  ];
41
44
  }
45
+ function indent(value) {
46
+ return value
47
+ .split("\n")
48
+ .map((line) => (line.length === 0 ? "" : ` ${line}`))
49
+ .join("\n");
50
+ }
51
+ function renderReasonChain(finding) {
52
+ if (finding.reasonChain === undefined) {
53
+ return [];
54
+ }
55
+ return [
56
+ `Why suspicious: ${finding.reasonChain.whySuspicious}`,
57
+ `Acceptable if: ${finding.reasonChain.acceptableIf[0] ?? "the change is explicitly justified."}`
58
+ ];
59
+ }
42
60
  function severityRank(severity) {
43
61
  switch (severity) {
44
62
  case "blocker":
@@ -1 +1 @@
1
- {"version":3,"file":"repair-reporter.js","sourceRoot":"","sources":["../../src/reporters/repair-reporter.ts"],"names":[],"mappings":"AAEA,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAE5B,MAAM,UAAU,kBAAkB,CAAC,MAAkB;IACnD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,qDAAqD,CAAC;IAC/D,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;SAClC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACjF,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAE/B,MAAM,KAAK,GAAG;QACZ,gDAAgD;QAChD,EAAE;QACF,GAAG,2BAA2B,CAAC,MAAM,CAAC;QACtC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAChF,qDAAqD;KACtD,CAAC;IAEF,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC;AAC3C,CAAC;AAED,SAAS,2BAA2B,CAAC,MAAkB;IACrD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC;IACjD,MAAM,OAAO,GAAG,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAE5E,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO;QACL,0BAA0B,KAAK,CAAC,KAAK,KAAK;QAC1C,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,KAAK,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QAClE,EAAE;KACH,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAgB,EAAE,KAAa;IAC1D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,QAAQ,GACZ,QAAQ,EAAE,IAAI,KAAK,SAAS;QAC1B,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,cAAc,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC;IAExG,OAAO;QACL,GAAG,KAAK,KAAK,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,KAAK,EAAE;QAC/D,GAAG,OAAO,CAAC,OAAO,GAAG,QAAQ,EAAE;QAC/B,WAAW,OAAO,CAAC,MAAM,EAAE;QAC3B,EAAE;KACH,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,QAA6B;IACjD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,SAAS;YACZ,OAAO,CAAC,CAAC;QACX,KAAK,MAAM;YACT,OAAO,CAAC,CAAC;QACX,KAAK,QAAQ;YACX,OAAO,CAAC,CAAC;QACX,KAAK,KAAK;YACR,OAAO,CAAC,CAAC;QACX,KAAK,MAAM;YACT,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"repair-reporter.js","sourceRoot":"","sources":["../../src/reporters/repair-reporter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAEnE,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAE5B,MAAM,UAAU,kBAAkB,CAAC,MAAkB;IACnD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,qDAAqD,CAAC;IAC/D,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;SAClC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACjF,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAE/B,MAAM,KAAK,GAAG;QACZ,gDAAgD;QAChD,EAAE;QACF,GAAG,2BAA2B,CAAC,MAAM,CAAC;QACtC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAChF,qDAAqD;KACtD,CAAC;IAEF,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC;AAC3C,CAAC;AAED,SAAS,2BAA2B,CAAC,MAAkB;IACrD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC;IACjD,MAAM,OAAO,GAAG,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAE5E,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO;QACL,0BAA0B,KAAK,CAAC,KAAK,KAAK;QAC1C,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,KAAK,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QAClE,EAAE;KACH,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAgB,EAAE,KAAa;IAC1D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,QAAQ,GACZ,QAAQ,EAAE,IAAI,KAAK,SAAS;QAC1B,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,cAAc,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC;IAExG,OAAO;QACL,GAAG,KAAK,KAAK,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,KAAK,EAAE;QAC/D,GAAG,OAAO,CAAC,OAAO,GAAG,QAAQ,EAAE;QAC/B,GAAG,iBAAiB,CAAC,OAAO,CAAC;QAC7B,kBAAkB;QAClB,MAAM,CAAC,2BAA2B,CAAC,OAAO,CAAC,CAAC;QAC5C,EAAE;KACH,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,KAAK;SACT,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;SACrD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAgB;IACzC,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO;QACL,mBAAmB,OAAO,CAAC,WAAW,CAAC,aAAa,EAAE;QACtD,kBAAkB,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,qCAAqC,EAAE;KACjG,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,QAA6B;IACjD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,SAAS;YACZ,OAAO,CAAC,CAAC;QACX,KAAK,MAAM;YACT,OAAO,CAAC,CAAC;QACX,KAAK,QAAQ;YACX,OAAO,CAAC,CAAC;QACX,KAAK,KAAK;YACR,OAAO,CAAC,CAAC;QACX,KAAK,MAAM;YACT,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { GateResult } from "../schema/index.js";
2
+ export interface ReviewerChecklistItem {
3
+ text: string;
4
+ source: "blocking-finding" | "observation" | "changed-role" | "score" | "intent";
5
+ findingId?: string;
6
+ evidence?: string;
7
+ }
8
+ export declare function buildReviewerChecklist(result: GateResult, limit?: number): ReviewerChecklistItem[];
9
+ export declare function renderReviewerChecklist(result: GateResult, heading: string): string[];
10
+ //# sourceMappingURL=reviewer-checklist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewer-checklist.d.ts","sourceRoot":"","sources":["../../src/reporters/reviewer-checklist.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAqB,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAExE,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,kBAAkB,GAAG,aAAa,GAAG,cAAc,GAAG,OAAO,GAAG,QAAQ,CAAC;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,SAAI,GAAG,qBAAqB,EAAE,CA0C7F;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAgBrF"}
@@ -0,0 +1,112 @@
1
+ import { calibrateFindingConfidence } from "../detectors/confidence-calibration.js";
2
+ export function buildReviewerChecklist(result, limit = 8) {
3
+ const items = [];
4
+ const blockingFindings = result.findings.filter(isBlockingFinding);
5
+ const observations = result.findings.filter((finding) => !isBlockingFinding(finding));
6
+ for (const finding of blockingFindings.slice(0, 4)) {
7
+ items.push({
8
+ source: "blocking-finding",
9
+ findingId: finding.id,
10
+ text: `Resolve or explicitly accept ${finding.title}.`,
11
+ evidence: formatPrimaryEvidence(finding)
12
+ });
13
+ }
14
+ for (const finding of observations.slice(0, Math.max(0, 5 - items.length))) {
15
+ items.push({
16
+ source: "observation",
17
+ findingId: finding.id,
18
+ text: `Review non-blocking ${finding.detector} signal: ${finding.title}.`,
19
+ evidence: formatPrimaryEvidence(finding)
20
+ });
21
+ }
22
+ appendRoleChecklistItems(items, result.diff.files);
23
+ if ((result.intentQuality?.warnings.length ?? 0) > 0) {
24
+ items.push({
25
+ source: "intent",
26
+ text: "Confirm the task intent is specific enough to bound the diff.",
27
+ evidence: result.intentQuality?.warnings[0]?.message
28
+ });
29
+ }
30
+ if ((result.summary.diffCoherenceScore?.score ?? 100) < 75) {
31
+ items.push({
32
+ source: "score",
33
+ text: "Check whether the changed files form one coherent task-shaped diff.",
34
+ evidence: `Diff coherence ${result.summary.diffCoherenceScore?.score ?? 0}/100`
35
+ });
36
+ }
37
+ return dedupeChecklist(items).slice(0, limit);
38
+ }
39
+ export function renderReviewerChecklist(result, heading) {
40
+ const items = buildReviewerChecklist(result);
41
+ if (items.length === 0) {
42
+ return [heading, "", "- [ ] No specific review prompts generated from this diff.", ""];
43
+ }
44
+ return [
45
+ heading,
46
+ "",
47
+ ...items.map((item) => {
48
+ const evidence = item.evidence === undefined ? "" : ` Evidence: ${item.evidence}.`;
49
+ return `- [ ] ${item.text}${evidence}`;
50
+ }),
51
+ ""
52
+ ];
53
+ }
54
+ function isBlockingFinding(finding) {
55
+ return calibrateFindingConfidence(finding).blockingEligible;
56
+ }
57
+ function appendRoleChecklistItems(items, files) {
58
+ const roles = new Set(files.map((file) => file.role));
59
+ if (roles.has("test")) {
60
+ items.push({
61
+ source: "changed-role",
62
+ text: "Confirm changed tests still assert behavior, not only rendering or existence.",
63
+ evidence: summarizeRoleFiles(files, "test")
64
+ });
65
+ }
66
+ if (roles.has("manifest") || roles.has("lockfile")) {
67
+ items.push({
68
+ source: "changed-role",
69
+ text: "Confirm dependency or lockfile changes are required by the task.",
70
+ evidence: summarizeRoleFiles(files, "manifest", "lockfile")
71
+ });
72
+ }
73
+ if (roles.has("config")) {
74
+ items.push({
75
+ source: "changed-role",
76
+ text: "Confirm config changes include visible operational context.",
77
+ evidence: summarizeRoleFiles(files, "config")
78
+ });
79
+ }
80
+ }
81
+ function summarizeRoleFiles(files, ...roles) {
82
+ return files
83
+ .filter((file) => roles.includes(file.role))
84
+ .slice(0, 3)
85
+ .map((file) => file.path)
86
+ .join(", ");
87
+ }
88
+ function formatPrimaryEvidence(finding) {
89
+ const evidence = finding.evidence[0];
90
+ if (evidence === undefined) {
91
+ return undefined;
92
+ }
93
+ if (evidence.path === undefined) {
94
+ return evidence.message;
95
+ }
96
+ const location = evidence.startLine === undefined ? evidence.path : `${evidence.path}:${evidence.startLine}`;
97
+ return `${location}: ${evidence.message}`;
98
+ }
99
+ function dedupeChecklist(items) {
100
+ const seen = new Set();
101
+ const deduped = [];
102
+ for (const item of items) {
103
+ const key = `${item.text}:${item.evidence ?? ""}`;
104
+ if (seen.has(key)) {
105
+ continue;
106
+ }
107
+ seen.add(key);
108
+ deduped.push(item);
109
+ }
110
+ return deduped;
111
+ }
112
+ //# sourceMappingURL=reviewer-checklist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewer-checklist.js","sourceRoot":"","sources":["../../src/reporters/reviewer-checklist.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { DiffFile } from "../schema/index.js";
2
+ export declare const API_SURFACE_SNAPSHOT_PATH = ".critical-gate/api-surface.json";
3
+ export declare const API_SURFACE_SNAPSHOT_SCHEMA_VERSION: "1.0";
4
+ export interface ApiSurfaceSnapshot {
5
+ schemaVersion: typeof API_SURFACE_SNAPSHOT_SCHEMA_VERSION;
6
+ generatedAt: string;
7
+ entrypoints: string[];
8
+ exports: ApiSurfaceExport[];
9
+ }
10
+ export interface ApiSurfaceExport {
11
+ path: string;
12
+ name: string;
13
+ kind: "function" | "class" | "interface" | "type" | "enum" | "const" | "var" | "reexport" | "default";
14
+ signature: string;
15
+ source?: string;
16
+ }
17
+ export interface ApiSurfaceSnapshotSummary {
18
+ path: string;
19
+ schemaVersion: string;
20
+ exportCount: number;
21
+ entrypoints: string[];
22
+ }
23
+ export interface ApiSnapshotReader {
24
+ exists?: (path: string) => boolean;
25
+ readFile?: (path: string) => string;
26
+ }
27
+ export interface BuildApiSurfaceSnapshotOptions {
28
+ root: string;
29
+ generatedAt: Date;
30
+ entrypoints?: string[];
31
+ reader?: ApiSnapshotReader;
32
+ }
33
+ export declare function buildApiSurfaceSnapshot({ root, generatedAt, entrypoints, reader }: BuildApiSurfaceSnapshotOptions): ApiSurfaceSnapshot;
34
+ export declare function loadApiSurfaceSnapshot(root: string, reader?: ApiSnapshotReader): ApiSurfaceSnapshot | undefined;
35
+ export declare function summarizeApiSurfaceSnapshot(snapshot: ApiSurfaceSnapshot | undefined): ApiSurfaceSnapshotSummary | undefined;
36
+ export declare function extractApiSurfaceExports(path: string, sourceText: string): ApiSurfaceExport[];
37
+ export declare function findSnapshotExport(snapshot: ApiSurfaceSnapshot, path: string, name: string): ApiSurfaceExport | undefined;
38
+ export declare function hasApiSnapshotEvidence(files: DiffFile[]): boolean;
39
+ export declare function getApiSnapshotOutputPath(root: string, output?: string): string;
40
+ export declare function getApiSnapshotOutputDirectory(path: string): string;
41
+ //# sourceMappingURL=api-snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-snapshot.d.ts","sourceRoot":"","sources":["../../src/repository/api-snapshot.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,eAAO,MAAM,yBAAyB,oCAAoC,CAAC;AAC3E,eAAO,MAAM,mCAAmC,EAAG,KAAc,CAAC;AAElE,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,OAAO,mCAAmC,CAAC;IAC1D,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EACA,UAAU,GACV,OAAO,GACP,WAAW,GACX,MAAM,GACN,MAAM,GACN,OAAO,GACP,KAAK,GACL,UAAU,GACV,SAAS,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,IAAI,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B;AAWD,wBAAgB,uBAAuB,CAAC,EACtC,IAAI,EACJ,WAAW,EACX,WAAW,EACX,MAAW,EACZ,EAAE,8BAA8B,GAAG,kBAAkB,CA+BrD;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,iBAAsB,GAC7B,kBAAkB,GAAG,SAAS,CAkBhC;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,kBAAkB,GAAG,SAAS,GACvC,yBAAyB,GAAG,SAAS,CAWvC;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAkD7F;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,kBAAkB,EAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,gBAAgB,GAAG,SAAS,CAE9B;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAEjE;AA+ID,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElE"}
@@ -0,0 +1,219 @@
1
+ import { dirname, join } from "node:path";
2
+ export const API_SURFACE_SNAPSHOT_PATH = ".critical-gate/api-surface.json";
3
+ export const API_SURFACE_SNAPSHOT_SCHEMA_VERSION = "1.0";
4
+ const packageEntrypointKeys = ["main", "module", "types", "typings", "browser"];
5
+ const fallbackEntrypoints = ["src/index.ts", "src/index.tsx", "index.ts", "index.tsx", "index.js"];
6
+ const declaredExportPattern = /^\s*export\s+(?:async\s+)?(?:declare\s+)?(function|class|interface|type|enum|const|let|var)\s+([A-Za-z_$][\w$]*)([^\n]*)/gm;
7
+ const namedExportPattern = /^\s*export\s*\{([^}]+)\}(?:\s*from\s*["']([^"']+)["'])?/gm;
8
+ const defaultExportPattern = /^\s*export\s+default\s+(?:async\s+)?(?:(function|class)\s+([A-Za-z_$][\w$]*)?|([A-Za-z_$][\w$]*))?/gm;
9
+ export function buildApiSurfaceSnapshot({ root, generatedAt, entrypoints, reader = {} }) {
10
+ const resolvedEntrypoints = normalizeEntrypoints(entrypoints !== undefined && entrypoints.length > 0
11
+ ? entrypoints
12
+ : inferPublicEntrypoints(root, reader));
13
+ const exports = resolvedEntrypoints
14
+ .flatMap((entrypoint) => {
15
+ const absolutePath = join(root, entrypoint);
16
+ if (reader.exists?.(absolutePath) === false) {
17
+ return [];
18
+ }
19
+ const sourceText = reader.readFile?.(absolutePath);
20
+ if (sourceText === undefined) {
21
+ return [];
22
+ }
23
+ return extractApiSurfaceExports(entrypoint, sourceText);
24
+ })
25
+ .sort(compareExports);
26
+ return {
27
+ schemaVersion: API_SURFACE_SNAPSHOT_SCHEMA_VERSION,
28
+ generatedAt: generatedAt.toISOString(),
29
+ entrypoints: resolvedEntrypoints,
30
+ exports
31
+ };
32
+ }
33
+ export function loadApiSurfaceSnapshot(root, reader = {}) {
34
+ const path = join(root, API_SURFACE_SNAPSHOT_PATH);
35
+ if (reader.exists?.(path) !== true) {
36
+ return undefined;
37
+ }
38
+ try {
39
+ const parsed = JSON.parse(reader.readFile?.(path) ?? "");
40
+ if (!isApiSurfaceSnapshot(parsed)) {
41
+ return undefined;
42
+ }
43
+ return parsed;
44
+ }
45
+ catch {
46
+ return undefined;
47
+ }
48
+ }
49
+ export function summarizeApiSurfaceSnapshot(snapshot) {
50
+ if (snapshot === undefined) {
51
+ return undefined;
52
+ }
53
+ return {
54
+ path: API_SURFACE_SNAPSHOT_PATH,
55
+ schemaVersion: snapshot.schemaVersion,
56
+ exportCount: snapshot.exports.length,
57
+ entrypoints: snapshot.entrypoints
58
+ };
59
+ }
60
+ export function extractApiSurfaceExports(path, sourceText) {
61
+ const exports = [];
62
+ for (const match of sourceText.matchAll(declaredExportPattern)) {
63
+ const kind = normalizeExportKind(match[1] ?? "const");
64
+ const name = match[2];
65
+ if (name === undefined) {
66
+ continue;
67
+ }
68
+ exports.push({
69
+ path,
70
+ name,
71
+ kind,
72
+ signature: normalizeSignature(match[0])
73
+ });
74
+ }
75
+ for (const match of sourceText.matchAll(namedExportPattern)) {
76
+ const exportedNames = match[1] ?? "";
77
+ const source = match[2];
78
+ for (const rawName of exportedNames.split(",")) {
79
+ const name = normalizeNamedExport(rawName);
80
+ if (name.length === 0) {
81
+ continue;
82
+ }
83
+ exports.push({
84
+ path,
85
+ name,
86
+ kind: "reexport",
87
+ signature: normalizeSignature(match[0]),
88
+ source
89
+ });
90
+ }
91
+ }
92
+ for (const match of sourceText.matchAll(defaultExportPattern)) {
93
+ exports.push({
94
+ path,
95
+ name: "default",
96
+ kind: "default",
97
+ signature: normalizeSignature(match[0])
98
+ });
99
+ }
100
+ return dedupeExports(exports).sort(compareExports);
101
+ }
102
+ export function findSnapshotExport(snapshot, path, name) {
103
+ return snapshot.exports.find((entry) => entry.path === path && entry.name === name);
104
+ }
105
+ export function hasApiSnapshotEvidence(files) {
106
+ return files.some((file) => normalizePath(file.path) === API_SURFACE_SNAPSHOT_PATH);
107
+ }
108
+ function inferPublicEntrypoints(root, reader) {
109
+ const packageJson = readPackageJson(root, reader);
110
+ const entrypoints = new Set();
111
+ if (isRecord(packageJson)) {
112
+ for (const key of packageEntrypointKeys) {
113
+ addEntrypointValue(entrypoints, packageJson[key]);
114
+ }
115
+ addEntrypointValue(entrypoints, packageJson.exports);
116
+ }
117
+ for (const fallback of fallbackEntrypoints) {
118
+ if (reader.exists?.(join(root, fallback)) === true) {
119
+ entrypoints.add(fallback);
120
+ }
121
+ }
122
+ return [...entrypoints];
123
+ }
124
+ function readPackageJson(root, reader) {
125
+ const path = join(root, "package.json");
126
+ if (reader.exists?.(path) !== true) {
127
+ return undefined;
128
+ }
129
+ try {
130
+ return JSON.parse(reader.readFile?.(path) ?? "");
131
+ }
132
+ catch {
133
+ return undefined;
134
+ }
135
+ }
136
+ function addEntrypointValue(entrypoints, value) {
137
+ if (typeof value === "string") {
138
+ const normalized = normalizeEntrypoint(value);
139
+ if (isSourceLikeEntrypoint(normalized)) {
140
+ entrypoints.add(normalized);
141
+ }
142
+ return;
143
+ }
144
+ if (Array.isArray(value)) {
145
+ for (const item of value) {
146
+ addEntrypointValue(entrypoints, item);
147
+ }
148
+ return;
149
+ }
150
+ if (isRecord(value)) {
151
+ for (const nested of Object.values(value)) {
152
+ addEntrypointValue(entrypoints, nested);
153
+ }
154
+ }
155
+ }
156
+ function normalizeEntrypoints(entrypoints) {
157
+ return [...new Set(entrypoints.map(normalizeEntrypoint).filter(Boolean))].sort();
158
+ }
159
+ function normalizeEntrypoint(path) {
160
+ return normalizePath(path.replace(/^\.\//, ""));
161
+ }
162
+ function normalizePath(path) {
163
+ return path.replace(/\\/g, "/");
164
+ }
165
+ function isSourceLikeEntrypoint(path) {
166
+ const extension = path.split(".").pop();
167
+ if (extension === undefined) {
168
+ return false;
169
+ }
170
+ return ["ts", "tsx", "js", "jsx", "mts", "cts", "mjs", "cjs"].includes(extension);
171
+ }
172
+ function normalizeExportKind(kind) {
173
+ return kind === "let" ? "var" : kind;
174
+ }
175
+ function normalizeNamedExport(rawName) {
176
+ const cleaned = rawName.trim();
177
+ const aliasMatch = /\s+as\s+([A-Za-z_$][\w$]*)$/u.exec(cleaned);
178
+ return aliasMatch?.[1] ?? cleaned.replace(/\s+as\s+.*/u, "").trim();
179
+ }
180
+ function normalizeSignature(signature) {
181
+ return signature.replace(/\s+/g, " ").trim();
182
+ }
183
+ function dedupeExports(exports) {
184
+ const byKey = new Map();
185
+ for (const entry of exports) {
186
+ byKey.set(`${entry.path}:${entry.name}:${entry.signature}`, entry);
187
+ }
188
+ return [...byKey.values()];
189
+ }
190
+ function compareExports(left, right) {
191
+ return (left.path.localeCompare(right.path) ||
192
+ left.name.localeCompare(right.name) ||
193
+ left.signature.localeCompare(right.signature));
194
+ }
195
+ function isApiSurfaceSnapshot(value) {
196
+ return (isRecord(value) &&
197
+ value.schemaVersion === API_SURFACE_SNAPSHOT_SCHEMA_VERSION &&
198
+ Array.isArray(value.entrypoints) &&
199
+ value.entrypoints.every((entrypoint) => typeof entrypoint === "string") &&
200
+ Array.isArray(value.exports) &&
201
+ value.exports.every(isApiSurfaceExport));
202
+ }
203
+ function isApiSurfaceExport(value) {
204
+ return (isRecord(value) &&
205
+ typeof value.path === "string" &&
206
+ typeof value.name === "string" &&
207
+ typeof value.kind === "string" &&
208
+ typeof value.signature === "string");
209
+ }
210
+ function isRecord(value) {
211
+ return typeof value === "object" && value !== null && !Array.isArray(value);
212
+ }
213
+ export function getApiSnapshotOutputPath(root, output) {
214
+ return output ?? join(root, API_SURFACE_SNAPSHOT_PATH);
215
+ }
216
+ export function getApiSnapshotOutputDirectory(path) {
217
+ return dirname(path);
218
+ }
219
+ //# sourceMappingURL=api-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-snapshot.js","sourceRoot":"","sources":["../../src/repository/api-snapshot.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ export { API_SURFACE_SNAPSHOT_PATH, buildApiSurfaceSnapshot, extractApiSurfaceExports, findSnapshotExport, getApiSnapshotOutputDirectory, getApiSnapshotOutputPath, hasApiSnapshotEvidence, loadApiSurfaceSnapshot, summarizeApiSurfaceSnapshot, type ApiSnapshotReader, type ApiSurfaceExport, type ApiSurfaceSnapshot, type BuildApiSurfaceSnapshotOptions } from "./api-snapshot.js";
1
2
  export { buildRepositoryProfile, parseNameOnlyLog, type BuildRepositoryProfileOptions, type HistoryCommandRunner } from "./profile.js";
3
+ export { detectMonorepoContext, type MonorepoReader } from "./monorepo.js";
2
4
  export { buildUtilityIndex, extractExportedNames, type BuildUtilityIndexOptions, type UtilityIndexRunner } from "./utility-index.js";
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/repository/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,KAAK,6BAA6B,EAClC,KAAK,oBAAoB,EAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,KAAK,wBAAwB,EAC7B,KAAK,kBAAkB,EACxB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/repository/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,wBAAwB,EACxB,kBAAkB,EAClB,6BAA6B,EAC7B,wBAAwB,EACxB,sBAAsB,EACtB,sBAAsB,EACtB,2BAA2B,EAC3B,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,8BAA8B,EACpC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,KAAK,6BAA6B,EAClC,KAAK,oBAAoB,EAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,qBAAqB,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,KAAK,wBAAwB,EAC7B,KAAK,kBAAkB,EACxB,MAAM,oBAAoB,CAAC"}
@@ -1,3 +1,5 @@
1
+ export { API_SURFACE_SNAPSHOT_PATH, buildApiSurfaceSnapshot, extractApiSurfaceExports, findSnapshotExport, getApiSnapshotOutputDirectory, getApiSnapshotOutputPath, hasApiSnapshotEvidence, loadApiSurfaceSnapshot, summarizeApiSurfaceSnapshot } from "./api-snapshot.js";
1
2
  export { buildRepositoryProfile, parseNameOnlyLog } from "./profile.js";
3
+ export { detectMonorepoContext } from "./monorepo.js";
2
4
  export { buildUtilityIndex, extractExportedNames } from "./utility-index.js";
3
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/repository/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAGjB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EAGrB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/repository/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,wBAAwB,EACxB,kBAAkB,EAClB,6BAA6B,EAC7B,wBAAwB,EACxB,sBAAsB,EACtB,sBAAsB,EACtB,2BAA2B,EAK5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAGjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,qBAAqB,EAAuB,MAAM,eAAe,CAAC;AAC3E,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EAGrB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { DiffFile, MonorepoContext } from "../schema/index.js";
2
+ export interface MonorepoReader {
3
+ exists?: (path: string) => boolean;
4
+ readFile?: (path: string) => string;
5
+ }
6
+ export declare function detectMonorepoContext(root: string, files: DiffFile[], reader?: MonorepoReader): MonorepoContext | undefined;
7
+ //# sourceMappingURL=monorepo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monorepo.d.ts","sourceRoot":"","sources":["../../src/repository/monorepo.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAmB,MAAM,oBAAoB,CAAC;AAErF,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACrC;AAID,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,QAAQ,EAAE,EACjB,MAAM,GAAE,cAAmB,GAC1B,eAAe,GAAG,SAAS,CAmE7B"}