@oddessentials/odd-ai-reviewers 1.0.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 (370) hide show
  1. package/README.md +190 -0
  2. package/dist/__tests__/hermetic-setup.d.ts +55 -0
  3. package/dist/__tests__/hermetic-setup.d.ts.map +1 -0
  4. package/dist/__tests__/hermetic-setup.js +62 -0
  5. package/dist/__tests__/hermetic-setup.js.map +1 -0
  6. package/dist/__tests__/test-utils/hermetic.d.ts +84 -0
  7. package/dist/__tests__/test-utils/hermetic.d.ts.map +1 -0
  8. package/dist/__tests__/test-utils/hermetic.js +147 -0
  9. package/dist/__tests__/test-utils/hermetic.js.map +1 -0
  10. package/dist/agents/ai_semantic_review.d.ts +12 -0
  11. package/dist/agents/ai_semantic_review.d.ts.map +1 -0
  12. package/dist/agents/ai_semantic_review.js +317 -0
  13. package/dist/agents/ai_semantic_review.js.map +1 -0
  14. package/dist/agents/control_flow/budget.d.ts +162 -0
  15. package/dist/agents/control_flow/budget.d.ts.map +1 -0
  16. package/dist/agents/control_flow/budget.js +331 -0
  17. package/dist/agents/control_flow/budget.js.map +1 -0
  18. package/dist/agents/control_flow/cfg-builder.d.ts +26 -0
  19. package/dist/agents/control_flow/cfg-builder.d.ts.map +1 -0
  20. package/dist/agents/control_flow/cfg-builder.js +776 -0
  21. package/dist/agents/control_flow/cfg-builder.js.map +1 -0
  22. package/dist/agents/control_flow/cfg-types.d.ts +186 -0
  23. package/dist/agents/control_flow/cfg-types.d.ts.map +1 -0
  24. package/dist/agents/control_flow/cfg-types.js +114 -0
  25. package/dist/agents/control_flow/cfg-types.js.map +1 -0
  26. package/dist/agents/control_flow/finding-generator.d.ts +118 -0
  27. package/dist/agents/control_flow/finding-generator.d.ts.map +1 -0
  28. package/dist/agents/control_flow/finding-generator.js +354 -0
  29. package/dist/agents/control_flow/finding-generator.js.map +1 -0
  30. package/dist/agents/control_flow/index.d.ts +39 -0
  31. package/dist/agents/control_flow/index.d.ts.map +1 -0
  32. package/dist/agents/control_flow/index.js +270 -0
  33. package/dist/agents/control_flow/index.js.map +1 -0
  34. package/dist/agents/control_flow/logger.d.ts +333 -0
  35. package/dist/agents/control_flow/logger.d.ts.map +1 -0
  36. package/dist/agents/control_flow/logger.js +607 -0
  37. package/dist/agents/control_flow/logger.js.map +1 -0
  38. package/dist/agents/control_flow/mitigation-detector.d.ts +207 -0
  39. package/dist/agents/control_flow/mitigation-detector.d.ts.map +1 -0
  40. package/dist/agents/control_flow/mitigation-detector.js +625 -0
  41. package/dist/agents/control_flow/mitigation-detector.js.map +1 -0
  42. package/dist/agents/control_flow/mitigation-patterns.d.ts +53 -0
  43. package/dist/agents/control_flow/mitigation-patterns.d.ts.map +1 -0
  44. package/dist/agents/control_flow/mitigation-patterns.js +620 -0
  45. package/dist/agents/control_flow/mitigation-patterns.js.map +1 -0
  46. package/dist/agents/control_flow/path-analyzer.d.ts +287 -0
  47. package/dist/agents/control_flow/path-analyzer.d.ts.map +1 -0
  48. package/dist/agents/control_flow/path-analyzer.js +695 -0
  49. package/dist/agents/control_flow/path-analyzer.js.map +1 -0
  50. package/dist/agents/control_flow/pattern-validator.d.ts +132 -0
  51. package/dist/agents/control_flow/pattern-validator.d.ts.map +1 -0
  52. package/dist/agents/control_flow/pattern-validator.js +420 -0
  53. package/dist/agents/control_flow/pattern-validator.js.map +1 -0
  54. package/dist/agents/control_flow/timeout-regex.d.ts +144 -0
  55. package/dist/agents/control_flow/timeout-regex.d.ts.map +1 -0
  56. package/dist/agents/control_flow/timeout-regex.js +339 -0
  57. package/dist/agents/control_flow/timeout-regex.js.map +1 -0
  58. package/dist/agents/control_flow/types.d.ts +782 -0
  59. package/dist/agents/control_flow/types.d.ts.map +1 -0
  60. package/dist/agents/control_flow/types.js +428 -0
  61. package/dist/agents/control_flow/types.js.map +1 -0
  62. package/dist/agents/control_flow/vulnerability-detector.d.ts +85 -0
  63. package/dist/agents/control_flow/vulnerability-detector.d.ts.map +1 -0
  64. package/dist/agents/control_flow/vulnerability-detector.js +493 -0
  65. package/dist/agents/control_flow/vulnerability-detector.js.map +1 -0
  66. package/dist/agents/date-utils.d.ts +19 -0
  67. package/dist/agents/date-utils.d.ts.map +1 -0
  68. package/dist/agents/date-utils.js +29 -0
  69. package/dist/agents/date-utils.js.map +1 -0
  70. package/dist/agents/index.d.ts +25 -0
  71. package/dist/agents/index.d.ts.map +1 -0
  72. package/dist/agents/index.js +50 -0
  73. package/dist/agents/index.js.map +1 -0
  74. package/dist/agents/json-utils.d.ts +34 -0
  75. package/dist/agents/json-utils.d.ts.map +1 -0
  76. package/dist/agents/json-utils.js +62 -0
  77. package/dist/agents/json-utils.js.map +1 -0
  78. package/dist/agents/local_llm.d.ts +24 -0
  79. package/dist/agents/local_llm.d.ts.map +1 -0
  80. package/dist/agents/local_llm.js +566 -0
  81. package/dist/agents/local_llm.js.map +1 -0
  82. package/dist/agents/metadata.d.ts +57 -0
  83. package/dist/agents/metadata.d.ts.map +1 -0
  84. package/dist/agents/metadata.js +45 -0
  85. package/dist/agents/metadata.js.map +1 -0
  86. package/dist/agents/opencode.d.ts +18 -0
  87. package/dist/agents/opencode.d.ts.map +1 -0
  88. package/dist/agents/opencode.js +364 -0
  89. package/dist/agents/opencode.js.map +1 -0
  90. package/dist/agents/path-filter.d.ts +25 -0
  91. package/dist/agents/path-filter.d.ts.map +1 -0
  92. package/dist/agents/path-filter.js +43 -0
  93. package/dist/agents/path-filter.js.map +1 -0
  94. package/dist/agents/pr_agent.d.ts +3 -0
  95. package/dist/agents/pr_agent.d.ts.map +1 -0
  96. package/dist/agents/pr_agent.js +312 -0
  97. package/dist/agents/pr_agent.js.map +1 -0
  98. package/dist/agents/retry.d.ts +12 -0
  99. package/dist/agents/retry.d.ts.map +1 -0
  100. package/dist/agents/retry.js +65 -0
  101. package/dist/agents/retry.js.map +1 -0
  102. package/dist/agents/reviewdog.d.ts +24 -0
  103. package/dist/agents/reviewdog.d.ts.map +1 -0
  104. package/dist/agents/reviewdog.js +259 -0
  105. package/dist/agents/reviewdog.js.map +1 -0
  106. package/dist/agents/security.d.ts +49 -0
  107. package/dist/agents/security.d.ts.map +1 -0
  108. package/dist/agents/security.js +302 -0
  109. package/dist/agents/security.js.map +1 -0
  110. package/dist/agents/semgrep.d.ts +8 -0
  111. package/dist/agents/semgrep.d.ts.map +1 -0
  112. package/dist/agents/semgrep.js +157 -0
  113. package/dist/agents/semgrep.js.map +1 -0
  114. package/dist/agents/types.d.ts +450 -0
  115. package/dist/agents/types.d.ts.map +1 -0
  116. package/dist/agents/types.js +127 -0
  117. package/dist/agents/types.js.map +1 -0
  118. package/dist/budget.d.ts +59 -0
  119. package/dist/budget.d.ts.map +1 -0
  120. package/dist/budget.js +82 -0
  121. package/dist/budget.js.map +1 -0
  122. package/dist/cache/key.d.ts +49 -0
  123. package/dist/cache/key.d.ts.map +1 -0
  124. package/dist/cache/key.js +71 -0
  125. package/dist/cache/key.js.map +1 -0
  126. package/dist/cache/store.d.ts +47 -0
  127. package/dist/cache/store.d.ts.map +1 -0
  128. package/dist/cache/store.js +328 -0
  129. package/dist/cache/store.js.map +1 -0
  130. package/dist/cli/commands/check.d.ts +60 -0
  131. package/dist/cli/commands/check.d.ts.map +1 -0
  132. package/dist/cli/commands/check.js +163 -0
  133. package/dist/cli/commands/check.js.map +1 -0
  134. package/dist/cli/commands/index.d.ts +12 -0
  135. package/dist/cli/commands/index.d.ts.map +1 -0
  136. package/dist/cli/commands/index.js +12 -0
  137. package/dist/cli/commands/index.js.map +1 -0
  138. package/dist/cli/commands/local-review.d.ts +149 -0
  139. package/dist/cli/commands/local-review.d.ts.map +1 -0
  140. package/dist/cli/commands/local-review.js +755 -0
  141. package/dist/cli/commands/local-review.js.map +1 -0
  142. package/dist/cli/config-wizard.d.ts +87 -0
  143. package/dist/cli/config-wizard.d.ts.map +1 -0
  144. package/dist/cli/config-wizard.js +240 -0
  145. package/dist/cli/config-wizard.js.map +1 -0
  146. package/dist/cli/dependencies/catalog.d.ts +44 -0
  147. package/dist/cli/dependencies/catalog.d.ts.map +1 -0
  148. package/dist/cli/dependencies/catalog.js +89 -0
  149. package/dist/cli/dependencies/catalog.js.map +1 -0
  150. package/dist/cli/dependencies/checker.d.ts +42 -0
  151. package/dist/cli/dependencies/checker.d.ts.map +1 -0
  152. package/dist/cli/dependencies/checker.js +240 -0
  153. package/dist/cli/dependencies/checker.js.map +1 -0
  154. package/dist/cli/dependencies/index.d.ts +16 -0
  155. package/dist/cli/dependencies/index.d.ts.map +1 -0
  156. package/dist/cli/dependencies/index.js +16 -0
  157. package/dist/cli/dependencies/index.js.map +1 -0
  158. package/dist/cli/dependencies/messages.d.ts +58 -0
  159. package/dist/cli/dependencies/messages.d.ts.map +1 -0
  160. package/dist/cli/dependencies/messages.js +183 -0
  161. package/dist/cli/dependencies/messages.js.map +1 -0
  162. package/dist/cli/dependencies/platform.d.ts +25 -0
  163. package/dist/cli/dependencies/platform.d.ts.map +1 -0
  164. package/dist/cli/dependencies/platform.js +42 -0
  165. package/dist/cli/dependencies/platform.js.map +1 -0
  166. package/dist/cli/dependencies/schemas.d.ts +65 -0
  167. package/dist/cli/dependencies/schemas.d.ts.map +1 -0
  168. package/dist/cli/dependencies/schemas.js +42 -0
  169. package/dist/cli/dependencies/schemas.js.map +1 -0
  170. package/dist/cli/dependencies/types.d.ts +112 -0
  171. package/dist/cli/dependencies/types.d.ts.map +1 -0
  172. package/dist/cli/dependencies/types.js +6 -0
  173. package/dist/cli/dependencies/types.js.map +1 -0
  174. package/dist/cli/dependencies/version.d.ts +67 -0
  175. package/dist/cli/dependencies/version.d.ts.map +1 -0
  176. package/dist/cli/dependencies/version.js +125 -0
  177. package/dist/cli/dependencies/version.js.map +1 -0
  178. package/dist/cli/git-context.d.ts +105 -0
  179. package/dist/cli/git-context.d.ts.map +1 -0
  180. package/dist/cli/git-context.js +313 -0
  181. package/dist/cli/git-context.js.map +1 -0
  182. package/dist/cli/interactive-prompts.d.ts +126 -0
  183. package/dist/cli/interactive-prompts.d.ts.map +1 -0
  184. package/dist/cli/interactive-prompts.js +128 -0
  185. package/dist/cli/interactive-prompts.js.map +1 -0
  186. package/dist/cli/options/index.d.ts +7 -0
  187. package/dist/cli/options/index.d.ts.map +1 -0
  188. package/dist/cli/options/index.js +11 -0
  189. package/dist/cli/options/index.js.map +1 -0
  190. package/dist/cli/options/local-review-options.d.ts +221 -0
  191. package/dist/cli/options/local-review-options.d.ts.map +1 -0
  192. package/dist/cli/options/local-review-options.js +332 -0
  193. package/dist/cli/options/local-review-options.js.map +1 -0
  194. package/dist/cli/output/colors.d.ts +154 -0
  195. package/dist/cli/output/colors.d.ts.map +1 -0
  196. package/dist/cli/output/colors.js +255 -0
  197. package/dist/cli/output/colors.js.map +1 -0
  198. package/dist/cli/output/errors.d.ts +157 -0
  199. package/dist/cli/output/errors.d.ts.map +1 -0
  200. package/dist/cli/output/errors.js +266 -0
  201. package/dist/cli/output/errors.js.map +1 -0
  202. package/dist/cli/output/index.d.ts +12 -0
  203. package/dist/cli/output/index.d.ts.map +1 -0
  204. package/dist/cli/output/index.js +15 -0
  205. package/dist/cli/output/index.js.map +1 -0
  206. package/dist/cli/output/progress.d.ts +237 -0
  207. package/dist/cli/output/progress.d.ts.map +1 -0
  208. package/dist/cli/output/progress.js +405 -0
  209. package/dist/cli/output/progress.js.map +1 -0
  210. package/dist/cli/signals.d.ts +145 -0
  211. package/dist/cli/signals.d.ts.map +1 -0
  212. package/dist/cli/signals.js +223 -0
  213. package/dist/cli/signals.js.map +1 -0
  214. package/dist/cli/validation-report.d.ts +106 -0
  215. package/dist/cli/validation-report.d.ts.map +1 -0
  216. package/dist/cli/validation-report.js +108 -0
  217. package/dist/cli/validation-report.js.map +1 -0
  218. package/dist/config/index.d.ts +9 -0
  219. package/dist/config/index.d.ts.map +1 -0
  220. package/dist/config/index.js +12 -0
  221. package/dist/config/index.js.map +1 -0
  222. package/dist/config/mitigation-config.d.ts +94 -0
  223. package/dist/config/mitigation-config.d.ts.map +1 -0
  224. package/dist/config/mitigation-config.js +430 -0
  225. package/dist/config/mitigation-config.js.map +1 -0
  226. package/dist/config/providers.d.ts +118 -0
  227. package/dist/config/providers.d.ts.map +1 -0
  228. package/dist/config/providers.js +229 -0
  229. package/dist/config/providers.js.map +1 -0
  230. package/dist/config/schemas.d.ts +278 -0
  231. package/dist/config/schemas.d.ts.map +1 -0
  232. package/dist/config/schemas.js +111 -0
  233. package/dist/config/schemas.js.map +1 -0
  234. package/dist/config/zero-config.d.ts +126 -0
  235. package/dist/config/zero-config.d.ts.map +1 -0
  236. package/dist/config/zero-config.js +243 -0
  237. package/dist/config/zero-config.js.map +1 -0
  238. package/dist/config.d.ts +110 -0
  239. package/dist/config.d.ts.map +1 -0
  240. package/dist/config.js +302 -0
  241. package/dist/config.js.map +1 -0
  242. package/dist/diff.d.ts +224 -0
  243. package/dist/diff.d.ts.map +1 -0
  244. package/dist/diff.js +832 -0
  245. package/dist/diff.js.map +1 -0
  246. package/dist/git-validators.d.ts +106 -0
  247. package/dist/git-validators.d.ts.map +1 -0
  248. package/dist/git-validators.js +224 -0
  249. package/dist/git-validators.js.map +1 -0
  250. package/dist/main.d.ts +61 -0
  251. package/dist/main.d.ts.map +1 -0
  252. package/dist/main.js +704 -0
  253. package/dist/main.js.map +1 -0
  254. package/dist/phases/execute.d.ts +60 -0
  255. package/dist/phases/execute.d.ts.map +1 -0
  256. package/dist/phases/execute.js +168 -0
  257. package/dist/phases/execute.js.map +1 -0
  258. package/dist/phases/index.d.ts +9 -0
  259. package/dist/phases/index.d.ts.map +1 -0
  260. package/dist/phases/index.js +9 -0
  261. package/dist/phases/index.js.map +1 -0
  262. package/dist/phases/preflight.d.ts +40 -0
  263. package/dist/phases/preflight.d.ts.map +1 -0
  264. package/dist/phases/preflight.js +122 -0
  265. package/dist/phases/preflight.js.map +1 -0
  266. package/dist/phases/report.d.ts +51 -0
  267. package/dist/phases/report.d.ts.map +1 -0
  268. package/dist/phases/report.js +152 -0
  269. package/dist/phases/report.js.map +1 -0
  270. package/dist/policy.d.ts +33 -0
  271. package/dist/policy.d.ts.map +1 -0
  272. package/dist/policy.js +34 -0
  273. package/dist/policy.js.map +1 -0
  274. package/dist/preflight.d.ts +181 -0
  275. package/dist/preflight.d.ts.map +1 -0
  276. package/dist/preflight.js +627 -0
  277. package/dist/preflight.js.map +1 -0
  278. package/dist/report/ado.d.ts +53 -0
  279. package/dist/report/ado.d.ts.map +1 -0
  280. package/dist/report/ado.js +411 -0
  281. package/dist/report/ado.js.map +1 -0
  282. package/dist/report/agent-icons.d.ts +36 -0
  283. package/dist/report/agent-icons.d.ts.map +1 -0
  284. package/dist/report/agent-icons.js +46 -0
  285. package/dist/report/agent-icons.js.map +1 -0
  286. package/dist/report/base.d.ts +30 -0
  287. package/dist/report/base.d.ts.map +1 -0
  288. package/dist/report/base.js +64 -0
  289. package/dist/report/base.js.map +1 -0
  290. package/dist/report/formats.d.ts +206 -0
  291. package/dist/report/formats.d.ts.map +1 -0
  292. package/dist/report/formats.js +481 -0
  293. package/dist/report/formats.js.map +1 -0
  294. package/dist/report/github.d.ts +44 -0
  295. package/dist/report/github.d.ts.map +1 -0
  296. package/dist/report/github.js +409 -0
  297. package/dist/report/github.js.map +1 -0
  298. package/dist/report/line-resolver.d.ts +208 -0
  299. package/dist/report/line-resolver.d.ts.map +1 -0
  300. package/dist/report/line-resolver.js +578 -0
  301. package/dist/report/line-resolver.js.map +1 -0
  302. package/dist/report/resolution.d.ts +158 -0
  303. package/dist/report/resolution.d.ts.map +1 -0
  304. package/dist/report/resolution.js +272 -0
  305. package/dist/report/resolution.js.map +1 -0
  306. package/dist/report/sanitize.d.ts +32 -0
  307. package/dist/report/sanitize.d.ts.map +1 -0
  308. package/dist/report/sanitize.js +84 -0
  309. package/dist/report/sanitize.js.map +1 -0
  310. package/dist/report/terminal.d.ts +440 -0
  311. package/dist/report/terminal.d.ts.map +1 -0
  312. package/dist/report/terminal.js +840 -0
  313. package/dist/report/terminal.js.map +1 -0
  314. package/dist/reviewignore.d.ts +125 -0
  315. package/dist/reviewignore.d.ts.map +1 -0
  316. package/dist/reviewignore.js +335 -0
  317. package/dist/reviewignore.js.map +1 -0
  318. package/dist/security-logger.d.ts +178 -0
  319. package/dist/security-logger.d.ts.map +1 -0
  320. package/dist/security-logger.js +256 -0
  321. package/dist/security-logger.js.map +1 -0
  322. package/dist/telemetry/backends/console.d.ts +24 -0
  323. package/dist/telemetry/backends/console.d.ts.map +1 -0
  324. package/dist/telemetry/backends/console.js +54 -0
  325. package/dist/telemetry/backends/console.js.map +1 -0
  326. package/dist/telemetry/backends/jsonl.d.ts +31 -0
  327. package/dist/telemetry/backends/jsonl.d.ts.map +1 -0
  328. package/dist/telemetry/backends/jsonl.js +121 -0
  329. package/dist/telemetry/backends/jsonl.js.map +1 -0
  330. package/dist/telemetry/emitter.d.ts +43 -0
  331. package/dist/telemetry/emitter.d.ts.map +1 -0
  332. package/dist/telemetry/emitter.js +83 -0
  333. package/dist/telemetry/emitter.js.map +1 -0
  334. package/dist/telemetry/hook.d.ts +53 -0
  335. package/dist/telemetry/hook.d.ts.map +1 -0
  336. package/dist/telemetry/hook.js +118 -0
  337. package/dist/telemetry/hook.js.map +1 -0
  338. package/dist/telemetry/index.d.ts +58 -0
  339. package/dist/telemetry/index.d.ts.map +1 -0
  340. package/dist/telemetry/index.js +143 -0
  341. package/dist/telemetry/index.js.map +1 -0
  342. package/dist/telemetry/types.d.ts +139 -0
  343. package/dist/telemetry/types.d.ts.map +1 -0
  344. package/dist/telemetry/types.js +133 -0
  345. package/dist/telemetry/types.js.map +1 -0
  346. package/dist/trust.d.ts +65 -0
  347. package/dist/trust.d.ts.map +1 -0
  348. package/dist/trust.js +78 -0
  349. package/dist/trust.js.map +1 -0
  350. package/dist/types/assert-never.d.ts +30 -0
  351. package/dist/types/assert-never.d.ts.map +1 -0
  352. package/dist/types/assert-never.js +32 -0
  353. package/dist/types/assert-never.js.map +1 -0
  354. package/dist/types/branded.d.ts +172 -0
  355. package/dist/types/branded.d.ts.map +1 -0
  356. package/dist/types/branded.js +262 -0
  357. package/dist/types/branded.js.map +1 -0
  358. package/dist/types/errors.d.ts +320 -0
  359. package/dist/types/errors.d.ts.map +1 -0
  360. package/dist/types/errors.js +551 -0
  361. package/dist/types/errors.js.map +1 -0
  362. package/dist/types/index.d.ts +37 -0
  363. package/dist/types/index.d.ts.map +1 -0
  364. package/dist/types/index.js +77 -0
  365. package/dist/types/index.js.map +1 -0
  366. package/dist/types/result.d.ts +323 -0
  367. package/dist/types/result.d.ts.map +1 -0
  368. package/dist/types/result.js +423 -0
  369. package/dist/types/result.js.map +1 -0
  370. package/package.json +63 -0
package/README.md ADDED
@@ -0,0 +1,190 @@
1
+ # @oddessentials/odd-ai-reviewers
2
+
3
+ AI-powered code review CLI that runs locally or in CI/CD pipelines. Get instant feedback on your code changes using LLMs like GPT-4 and Claude.
4
+
5
+ ## Quick Start
6
+
7
+ ```bash
8
+ # Run local review on current changes
9
+ npx @oddessentials/odd-ai-reviewers .
10
+
11
+ # Or install globally
12
+ npm install -g @oddessentials/odd-ai-reviewers
13
+ ai-review .
14
+ ```
15
+
16
+ ## Features
17
+
18
+ - **Local Review Mode**: Get instant AI feedback before pushing
19
+ - **CI/CD Integration**: GitHub Actions and Azure DevOps support
20
+ - **Zero Configuration**: Works out of the box with sensible defaults
21
+ - **Multiple AI Providers**: OpenAI, Anthropic, Azure OpenAI, Ollama
22
+ - **Cost Control**: Built-in budget limits and cost estimation
23
+ - **Customizable**: Configure passes, agents, and output formats
24
+
25
+ ## Prerequisites
26
+
27
+ - Node.js >= 22.0.0
28
+ - Git
29
+ - API key for your preferred AI provider
30
+
31
+ ## Environment Variables
32
+
33
+ Set one of these API keys:
34
+
35
+ ```bash
36
+ # OpenAI
37
+ export OPENAI_API_KEY=sk-...
38
+
39
+ # Anthropic
40
+ export ANTHROPIC_API_KEY=sk-ant-...
41
+
42
+ # Azure OpenAI
43
+ export AZURE_OPENAI_API_KEY=...
44
+ export AZURE_OPENAI_ENDPOINT=https://...
45
+ export AZURE_OPENAI_DEPLOYMENT=...
46
+
47
+ # Ollama (local)
48
+ export OLLAMA_BASE_URL=http://localhost:11434
49
+ ```
50
+
51
+ ## Usage
52
+
53
+ ### Local Review (Recommended for Development)
54
+
55
+ ```bash
56
+ # Review uncommitted changes
57
+ ai-review .
58
+
59
+ # Review only staged changes (for pre-commit hooks)
60
+ ai-review . --staged
61
+
62
+ # Review changes between current branch and main
63
+ ai-review . --base main
64
+
65
+ # Dry run - see what would be reviewed
66
+ ai-review . --dry-run
67
+
68
+ # Cost estimate only
69
+ ai-review . --cost-only
70
+
71
+ # JSON output for tooling integration
72
+ ai-review . --format json
73
+
74
+ # SARIF output for IDE integration
75
+ ai-review . --format sarif
76
+ ```
77
+
78
+ ### CI Review Mode
79
+
80
+ ```bash
81
+ # Review a specific commit range
82
+ ai-review review --repo . --base $BASE_SHA --head $HEAD_SHA
83
+
84
+ # With PR number for GitHub integration
85
+ ai-review review --repo . --base $BASE_SHA --head $HEAD_SHA --pr 123
86
+ ```
87
+
88
+ ### Configuration
89
+
90
+ ```bash
91
+ # Generate a new configuration file
92
+ ai-review config init
93
+
94
+ # Validate existing configuration
95
+ ai-review validate --repo .
96
+ ```
97
+
98
+ ## Configuration File
99
+
100
+ Create `.ai-review.yml` in your repository root:
101
+
102
+ ```yaml
103
+ # AI Provider configuration
104
+ provider: openai
105
+
106
+ # Model selection
107
+ models:
108
+ default: gpt-4o-mini
109
+
110
+ # Review passes
111
+ passes:
112
+ - name: ai-review
113
+ enabled: true
114
+ agents:
115
+ - opencode
116
+
117
+ # Resource limits
118
+ limits:
119
+ max_files: 50
120
+ max_diff_lines: 5000
121
+ max_usd_per_pr: 0.50
122
+
123
+ # Gating (fail CI on findings)
124
+ gating:
125
+ enabled: true
126
+ fail_on_severity: error
127
+ ```
128
+
129
+ ## CLI Reference
130
+
131
+ ### `ai-review local [path]`
132
+
133
+ Run AI review on local changes.
134
+
135
+ | Option | Description |
136
+ | ----------------- | --------------------------------------------- |
137
+ | `--base <ref>` | Base reference for comparison (auto-detected) |
138
+ | `--head <ref>` | Head reference (default: HEAD) |
139
+ | `--range <range>` | Git range (e.g., HEAD~3..) |
140
+ | `--staged` | Review only staged changes |
141
+ | `--uncommitted` | Include uncommitted changes (default: true) |
142
+ | `--pass <name>` | Run specific pass only |
143
+ | `--agent <id>` | Run specific agent only |
144
+ | `--format <fmt>` | Output format: pretty, json, sarif |
145
+ | `--no-color` | Disable colored output |
146
+ | `--quiet` | Minimal output (errors only) |
147
+ | `--verbose` | Show debug information |
148
+ | `--dry-run` | Preview without running agents |
149
+ | `--cost-only` | Estimate cost without running |
150
+ | `-c, --config` | Path to config file |
151
+
152
+ ### Exit Codes
153
+
154
+ | Code | Meaning |
155
+ | ---- | ---------------------------------------------- |
156
+ | 0 | Success (no blocking findings) |
157
+ | 1 | Failure (blocking findings or execution error) |
158
+ | 2 | Invalid arguments or configuration |
159
+
160
+ ## Pre-commit Hook Integration
161
+
162
+ Add to `.pre-commit-config.yaml`:
163
+
164
+ ```yaml
165
+ repos:
166
+ - repo: local
167
+ hooks:
168
+ - id: ai-review
169
+ name: AI Code Review
170
+ entry: npx @oddessentials/odd-ai-reviewers . --staged --quiet
171
+ language: system
172
+ pass_filenames: false
173
+ ```
174
+
175
+ Or use with Husky:
176
+
177
+ ```bash
178
+ # .husky/pre-commit
179
+ npx @oddessentials/odd-ai-reviewers . --staged --quiet || exit 1
180
+ ```
181
+
182
+ ## Changelog
183
+
184
+ This package uses [semantic-release](https://semantic-release.gitbook.io/) for automated versioning and changelog generation. The changelog is auto-generated from conventional commit messages.
185
+
186
+ See [CHANGELOG.md](./CHANGELOG.md) for the full release history.
187
+
188
+ ## License
189
+
190
+ MIT
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Hermetic Test Setup Utilities
3
+ *
4
+ * Shared test infrastructure for deterministic, isolated tests.
5
+ * Located in __tests__/ directory which is classified as test code
6
+ * by dependency-cruiser, allowing legitimate vitest imports.
7
+ *
8
+ * Provides:
9
+ * - Frozen time (no wall-clock dependencies)
10
+ * - Deterministic teardown
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * import { describe, it, beforeEach, afterEach } from 'vitest';
15
+ * import {
16
+ * FROZEN_TIMESTAMP,
17
+ * setupHermeticTest,
18
+ * teardownHermeticTest,
19
+ * } from '../hermetic-setup.js';
20
+ *
21
+ * describe('MyFeature', () => {
22
+ * beforeEach(() => setupHermeticTest());
23
+ * afterEach(() => teardownHermeticTest());
24
+ *
25
+ * it('works with frozen time', () => {
26
+ * expect(new Date().toISOString()).toBe(FROZEN_TIMESTAMP);
27
+ * });
28
+ * });
29
+ * ```
30
+ */
31
+ /**
32
+ * Frozen test timestamp - use consistently across all hermetic tests
33
+ */
34
+ export declare const FROZEN_TIMESTAMP = "2026-01-29T00:00:00.000Z";
35
+ export declare const FROZEN_DATE: Date;
36
+ /**
37
+ * Setup hermetic test environment
38
+ *
39
+ * Configures:
40
+ * - Frozen system time to FROZEN_TIMESTAMP
41
+ *
42
+ * Call this in beforeEach()
43
+ */
44
+ export declare function setupHermeticTest(): void;
45
+ /**
46
+ * Teardown hermetic test environment
47
+ *
48
+ * Restores:
49
+ * - Real system time
50
+ * - All mocks
51
+ *
52
+ * Call this in afterEach()
53
+ */
54
+ export declare function teardownHermeticTest(): void;
55
+ //# sourceMappingURL=hermetic-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermetic-setup.d.ts","sourceRoot":"","sources":["../../src/__tests__/hermetic-setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAIH;;GAEG;AACH,eAAO,MAAM,gBAAgB,6BAA6B,CAAC;AAC3D,eAAO,MAAM,WAAW,MAA6B,CAAC;AAEtD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAGxC;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAG3C"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Hermetic Test Setup Utilities
3
+ *
4
+ * Shared test infrastructure for deterministic, isolated tests.
5
+ * Located in __tests__/ directory which is classified as test code
6
+ * by dependency-cruiser, allowing legitimate vitest imports.
7
+ *
8
+ * Provides:
9
+ * - Frozen time (no wall-clock dependencies)
10
+ * - Deterministic teardown
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * import { describe, it, beforeEach, afterEach } from 'vitest';
15
+ * import {
16
+ * FROZEN_TIMESTAMP,
17
+ * setupHermeticTest,
18
+ * teardownHermeticTest,
19
+ * } from '../hermetic-setup.js';
20
+ *
21
+ * describe('MyFeature', () => {
22
+ * beforeEach(() => setupHermeticTest());
23
+ * afterEach(() => teardownHermeticTest());
24
+ *
25
+ * it('works with frozen time', () => {
26
+ * expect(new Date().toISOString()).toBe(FROZEN_TIMESTAMP);
27
+ * });
28
+ * });
29
+ * ```
30
+ */
31
+ import { vi } from 'vitest';
32
+ /**
33
+ * Frozen test timestamp - use consistently across all hermetic tests
34
+ */
35
+ export const FROZEN_TIMESTAMP = '2026-01-29T00:00:00.000Z';
36
+ export const FROZEN_DATE = new Date(FROZEN_TIMESTAMP);
37
+ /**
38
+ * Setup hermetic test environment
39
+ *
40
+ * Configures:
41
+ * - Frozen system time to FROZEN_TIMESTAMP
42
+ *
43
+ * Call this in beforeEach()
44
+ */
45
+ export function setupHermeticTest() {
46
+ vi.useFakeTimers();
47
+ vi.setSystemTime(FROZEN_DATE);
48
+ }
49
+ /**
50
+ * Teardown hermetic test environment
51
+ *
52
+ * Restores:
53
+ * - Real system time
54
+ * - All mocks
55
+ *
56
+ * Call this in afterEach()
57
+ */
58
+ export function teardownHermeticTest() {
59
+ vi.useRealTimers();
60
+ vi.restoreAllMocks();
61
+ }
62
+ //# sourceMappingURL=hermetic-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermetic-setup.js","sourceRoot":"","sources":["../../src/__tests__/hermetic-setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE5B;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AAC3D,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAEtD;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB;IAC/B,EAAE,CAAC,aAAa,EAAE,CAAC;IACnB,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB;IAClC,EAAE,CAAC,aAAa,EAAE,CAAC;IACnB,EAAE,CAAC,eAAe,EAAE,CAAC;AACvB,CAAC"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Hermetic Test Utilities
3
+ *
4
+ * Provides utilities for creating deterministic, isolated tests that:
5
+ * - Have frozen time (no wall-clock dependencies)
6
+ * - Have deterministic UUIDs
7
+ * - Have no real network access
8
+ * - Have no real git remote access
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * import { describe, it, beforeEach, afterEach } from 'vitest';
13
+ * import { setupHermeticTest, teardownHermeticTest } from './test-utils/hermetic.js';
14
+ *
15
+ * describe('MyFeature', () => {
16
+ * beforeEach(() => {
17
+ * setupHermeticTest();
18
+ * });
19
+ *
20
+ * afterEach(() => {
21
+ * teardownHermeticTest();
22
+ * });
23
+ *
24
+ * it('works with frozen time', () => {
25
+ * expect(new Date().toISOString()).toBe('2026-01-29T00:00:00.000Z');
26
+ * });
27
+ * });
28
+ * ```
29
+ */
30
+ /**
31
+ * Frozen test timestamp - use consistently across all hermetic tests
32
+ */
33
+ export declare const FROZEN_TIMESTAMP = "2026-01-29T00:00:00.000Z";
34
+ export declare const FROZEN_DATE: Date;
35
+ /**
36
+ * Generate a deterministic UUID for testing
37
+ * Returns UUIDs in format: test-uuid-NNNN where NNNN is a zero-padded counter
38
+ */
39
+ export declare function generateTestUUID(): string;
40
+ /**
41
+ * Reset the UUID counter (call in afterEach if needed)
42
+ */
43
+ export declare function resetUUIDCounter(): void;
44
+ /**
45
+ * Setup hermetic test environment
46
+ *
47
+ * Configures:
48
+ * - Frozen system time to FROZEN_TIMESTAMP
49
+ * - Deterministic crypto.randomUUID()
50
+ * - Stubbed fetch (returns 503 by default - must be mocked per test)
51
+ *
52
+ * Call this in beforeEach()
53
+ */
54
+ export declare function setupHermeticTest(): void;
55
+ /**
56
+ * Teardown hermetic test environment
57
+ *
58
+ * Restores:
59
+ * - Real system time
60
+ * - Original global stubs
61
+ *
62
+ * Call this in afterEach()
63
+ */
64
+ export declare function teardownHermeticTest(): void;
65
+ /**
66
+ * Create a mock response for testing fetch calls
67
+ */
68
+ export declare function createMockResponse(body: unknown, options?: {
69
+ status?: number;
70
+ headers?: Record<string, string>;
71
+ }): Response;
72
+ /**
73
+ * Create a mock git exec function that returns stubbed output
74
+ */
75
+ export declare function createMockGitExec(responses: Record<string, string | Error>): import("vitest").Mock<(command: string, args: string[]) => string>;
76
+ /**
77
+ * Advance time by specified milliseconds in hermetic tests
78
+ */
79
+ export declare function advanceTime(ms: number): Promise<void>;
80
+ /**
81
+ * Run all pending timers in hermetic tests
82
+ */
83
+ export declare function runAllTimers(): Promise<void>;
84
+ //# sourceMappingURL=hermetic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermetic.d.ts","sourceRoot":"","sources":["../../../src/__tests__/test-utils/hermetic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH;;GAEG;AACH,eAAO,MAAM,gBAAgB,6BAA6B,CAAC;AAC3D,eAAO,MAAM,WAAW,MAA6B,CAAC;AAOtD;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAGzC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAmBxC;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAK3C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,OAAO,EACb,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GAClE,QAAQ,CASV;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,mCAClD,MAAM,QAAQ,MAAM,EAAE,KAAG,MAAM,EA2BvD;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Hermetic Test Utilities
3
+ *
4
+ * Provides utilities for creating deterministic, isolated tests that:
5
+ * - Have frozen time (no wall-clock dependencies)
6
+ * - Have deterministic UUIDs
7
+ * - Have no real network access
8
+ * - Have no real git remote access
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * import { describe, it, beforeEach, afterEach } from 'vitest';
13
+ * import { setupHermeticTest, teardownHermeticTest } from './test-utils/hermetic.js';
14
+ *
15
+ * describe('MyFeature', () => {
16
+ * beforeEach(() => {
17
+ * setupHermeticTest();
18
+ * });
19
+ *
20
+ * afterEach(() => {
21
+ * teardownHermeticTest();
22
+ * });
23
+ *
24
+ * it('works with frozen time', () => {
25
+ * expect(new Date().toISOString()).toBe('2026-01-29T00:00:00.000Z');
26
+ * });
27
+ * });
28
+ * ```
29
+ */
30
+ import { vi } from 'vitest';
31
+ /**
32
+ * Frozen test timestamp - use consistently across all hermetic tests
33
+ */
34
+ export const FROZEN_TIMESTAMP = '2026-01-29T00:00:00.000Z';
35
+ export const FROZEN_DATE = new Date(FROZEN_TIMESTAMP);
36
+ /**
37
+ * Deterministic UUID counter for generating predictable UUIDs
38
+ */
39
+ let uuidCounter = 0;
40
+ /**
41
+ * Generate a deterministic UUID for testing
42
+ * Returns UUIDs in format: test-uuid-NNNN where NNNN is a zero-padded counter
43
+ */
44
+ export function generateTestUUID() {
45
+ const counter = uuidCounter++;
46
+ return `test-uuid-${counter.toString().padStart(4, '0')}`;
47
+ }
48
+ /**
49
+ * Reset the UUID counter (call in afterEach if needed)
50
+ */
51
+ export function resetUUIDCounter() {
52
+ uuidCounter = 0;
53
+ }
54
+ /**
55
+ * Setup hermetic test environment
56
+ *
57
+ * Configures:
58
+ * - Frozen system time to FROZEN_TIMESTAMP
59
+ * - Deterministic crypto.randomUUID()
60
+ * - Stubbed fetch (returns 503 by default - must be mocked per test)
61
+ *
62
+ * Call this in beforeEach()
63
+ */
64
+ export function setupHermeticTest() {
65
+ // Freeze time
66
+ vi.useFakeTimers();
67
+ vi.setSystemTime(FROZEN_DATE);
68
+ // Reset UUID counter
69
+ resetUUIDCounter();
70
+ // Stub crypto.randomUUID with deterministic values
71
+ vi.stubGlobal('crypto', {
72
+ ...globalThis.crypto,
73
+ randomUUID: generateTestUUID,
74
+ });
75
+ // Stub fetch to fail by default (tests must explicitly mock expected calls)
76
+ vi.stubGlobal('fetch', vi.fn().mockRejectedValue(new Error('Network access not allowed in hermetic tests')));
77
+ }
78
+ /**
79
+ * Teardown hermetic test environment
80
+ *
81
+ * Restores:
82
+ * - Real system time
83
+ * - Original global stubs
84
+ *
85
+ * Call this in afterEach()
86
+ */
87
+ export function teardownHermeticTest() {
88
+ vi.useRealTimers();
89
+ vi.unstubAllGlobals();
90
+ vi.restoreAllMocks();
91
+ resetUUIDCounter();
92
+ }
93
+ /**
94
+ * Create a mock response for testing fetch calls
95
+ */
96
+ export function createMockResponse(body, options = {}) {
97
+ const { status = 200, headers = {} } = options;
98
+ return new Response(JSON.stringify(body), {
99
+ status,
100
+ headers: {
101
+ 'Content-Type': 'application/json',
102
+ ...headers,
103
+ },
104
+ });
105
+ }
106
+ /**
107
+ * Create a mock git exec function that returns stubbed output
108
+ */
109
+ export function createMockGitExec(responses) {
110
+ return vi.fn((command, args) => {
111
+ const key = `${command} ${args.join(' ')}`;
112
+ // Check for exact match first
113
+ if (Object.prototype.hasOwnProperty.call(responses, key)) {
114
+ const response = responses[key];
115
+ if (response === undefined) {
116
+ throw new Error(`Unmocked git command: ${key}`);
117
+ }
118
+ if (response instanceof Error) {
119
+ throw response;
120
+ }
121
+ return response;
122
+ }
123
+ // Check for partial matches (command only)
124
+ for (const [pattern, response] of Object.entries(responses)) {
125
+ if (key.startsWith(pattern)) {
126
+ if (response instanceof Error) {
127
+ throw response;
128
+ }
129
+ return response;
130
+ }
131
+ }
132
+ throw new Error(`Unmocked git command: ${key}`);
133
+ });
134
+ }
135
+ /**
136
+ * Advance time by specified milliseconds in hermetic tests
137
+ */
138
+ export async function advanceTime(ms) {
139
+ await vi.advanceTimersByTimeAsync(ms);
140
+ }
141
+ /**
142
+ * Run all pending timers in hermetic tests
143
+ */
144
+ export async function runAllTimers() {
145
+ await vi.runAllTimersAsync();
146
+ }
147
+ //# sourceMappingURL=hermetic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermetic.js","sourceRoot":"","sources":["../../../src/__tests__/test-utils/hermetic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE5B;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AAC3D,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAEtD;;GAEG;AACH,IAAI,WAAW,GAAG,CAAC,CAAC;AAEpB;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,OAAO,aAAa,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,WAAW,GAAG,CAAC,CAAC;AAClB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB;IAC/B,cAAc;IACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACnB,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAE9B,qBAAqB;IACrB,gBAAgB,EAAE,CAAC;IAEnB,mDAAmD;IACnD,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE;QACtB,GAAG,UAAU,CAAC,MAAM;QACpB,UAAU,EAAE,gBAAgB;KAC7B,CAAC,CAAC;IAEH,4EAA4E;IAC5E,EAAE,CAAC,UAAU,CACX,OAAO,EACP,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC,CACrF,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB;IAClC,EAAE,CAAC,aAAa,EAAE,CAAC;IACnB,EAAE,CAAC,gBAAgB,EAAE,CAAC;IACtB,EAAE,CAAC,eAAe,EAAE,CAAC;IACrB,gBAAgB,EAAE,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAa,EACb,UAAiE,EAAE;IAEnE,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IAC/C,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QACxC,MAAM;QACN,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,GAAG,OAAO;SACX;KACF,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAyC;IACzE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,OAAe,EAAE,IAAc,EAAU,EAAE;QACvD,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAE3C,8BAA8B;QAC9B,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC;YACzD,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;YAClD,CAAC;YACD,IAAI,QAAQ,YAAY,KAAK,EAAE,CAAC;gBAC9B,MAAM,QAAQ,CAAC;YACjB,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,2CAA2C;QAC3C,KAAK,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5D,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,IAAI,QAAQ,YAAY,KAAK,EAAE,CAAC;oBAC9B,MAAM,QAAQ,CAAC;gBACjB,CAAC;gBACD,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAU;IAC1C,MAAM,EAAE,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * AI Semantic Review Agent
3
+ * Multi-provider AI semantic code review
4
+ *
5
+ * INVARIANTS:
6
+ * - Router owns provider/model resolution
7
+ * - Agent receives context.provider and context.effectiveModel
8
+ * - No per-agent defaults, no legacy key references
9
+ */
10
+ import type { ReviewAgent } from './types.js';
11
+ export declare const aiSemanticReviewAgent: ReviewAgent;
12
+ //# sourceMappingURL=ai_semantic_review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai_semantic_review.d.ts","sourceRoot":"","sources":["../../src/agents/ai_semantic_review.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,OAAO,KAAK,EAAE,WAAW,EAAgD,MAAM,YAAY,CAAC;AAyK5F,eAAO,MAAM,qBAAqB,EAAE,WAiNnC,CAAC"}