@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
@@ -0,0 +1,328 @@
1
+ /**
2
+ * Cache Store Module
3
+ * Stores and retrieves cached review results
4
+ * Uses GitHub Actions cache in CI, file-based cache locally
5
+ */
6
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, unlinkSync } from 'fs';
7
+ import { join, resolve, sep } from 'path';
8
+ import { homedir } from 'os';
9
+ import { AgentResultSchema } from '../agents/types.js';
10
+ import { AI_REVIEW_CACHE_PATH, CACHE_KEY_PREFIX, generateRestoreKeyPrefix } from './key.js';
11
+ import { buildRouterEnv } from '../agents/security.js';
12
+ /** Default TTL: 24 hours */
13
+ const DEFAULT_TTL_SECONDS = 24 * 60 * 60;
14
+ /** In-memory cache for current session */
15
+ const memoryCache = new Map();
16
+ /** Cache directory path */
17
+ function getCacheDir() {
18
+ // Use GITHUB_WORKSPACE in CI, otherwise ~/.ai-review-cache
19
+ const routerEnv = buildRouterEnv(process.env);
20
+ const base = routerEnv['GITHUB_WORKSPACE'] || homedir();
21
+ return join(base, AI_REVIEW_CACHE_PATH);
22
+ }
23
+ /**
24
+ * Check if we're running in GitHub Actions
25
+ */
26
+ function isGitHubActions() {
27
+ const routerEnv = buildRouterEnv(process.env);
28
+ return routerEnv['GITHUB_ACTIONS'] === 'true';
29
+ }
30
+ /**
31
+ * Ensure cache directory exists
32
+ */
33
+ function ensureCacheDir() {
34
+ const dir = getCacheDir();
35
+ if (!existsSync(dir)) {
36
+ mkdirSync(dir, { recursive: true });
37
+ }
38
+ }
39
+ /**
40
+ * Validate cache key to prevent path traversal and injection attacks.
41
+ *
42
+ * Keys must match the format from generateCacheKey(): ai-review-v{N}-{prNumber}-{hash}
43
+ * Only alphanumeric characters and dashes are allowed.
44
+ *
45
+ * SECURITY: Explicit rejection of dangerous characters (defense in depth):
46
+ * - Path separators: / \ (directory traversal)
47
+ * - URL encoding: % (bypass via encoding)
48
+ * - Drive letters: : (Windows absolute paths)
49
+ * - Traversal sequences: .. (parent directory access)
50
+ * - Whitespace and control chars (injection vectors)
51
+ * - Shell metacharacters: ; & | ` $ ( ) (command injection)
52
+ */
53
+ function isValidCacheKey(key) {
54
+ // Empty or excessively long keys are invalid
55
+ if (!key || key.length > 256) {
56
+ return false;
57
+ }
58
+ // Explicit rejection list (defense in depth)
59
+ const FORBIDDEN_CHARS = /[/\\%:\s;&|`$()]/;
60
+ if (FORBIDDEN_CHARS.test(key)) {
61
+ return false;
62
+ }
63
+ // Path traversal sequences
64
+ if (key.includes('..')) {
65
+ return false;
66
+ }
67
+ // Must match strict allowlist: alphanumeric + dashes only
68
+ // This matches generateCacheKey output: ai-review-v{N}-{prNumber}-{hash}
69
+ return /^[a-zA-Z0-9-]+$/.test(key);
70
+ }
71
+ /**
72
+ * Get cache file path for a key.
73
+ * Validates key format and ensures resolved path stays under cache root.
74
+ */
75
+ function getCacheFilePath(key) {
76
+ if (!isValidCacheKey(key)) {
77
+ throw new Error(`Invalid cache key format: ${key}`);
78
+ }
79
+ const cacheDir = getCacheDir();
80
+ const filePath = join(cacheDir, `${key}.json`);
81
+ // Ensure resolved path is under cache directory (defense in depth)
82
+ // Use cacheDir + sep to prevent prefix attacks (e.g., /cache vs /cache-evil)
83
+ const resolvedPath = resolve(filePath);
84
+ const resolvedCacheDir = resolve(cacheDir);
85
+ if (!resolvedPath.startsWith(resolvedCacheDir + sep)) {
86
+ throw new Error(`Cache path traversal detected: ${key}`);
87
+ }
88
+ return filePath;
89
+ }
90
+ /**
91
+ * Validate a cached result against AgentResultSchema
92
+ *
93
+ * (012-fix-agent-result-regressions) - Validates cache entries to handle:
94
+ * - Legacy cache entries (success: boolean format) → return null (cache miss)
95
+ * - Malformed/corrupted entries → return null (cache miss)
96
+ * - New-format entries (discriminated union with status field) → return result
97
+ */
98
+ function validateCachedResult(result) {
99
+ const parseResult = AgentResultSchema.safeParse(result);
100
+ if (!parseResult.success) {
101
+ // Legacy or malformed cache entry - treat as cache miss
102
+ return null;
103
+ }
104
+ return parseResult.data;
105
+ }
106
+ /**
107
+ * Get a cached result
108
+ */
109
+ export async function getCached(key) {
110
+ // Check memory cache first
111
+ const memEntry = memoryCache.get(key);
112
+ if (memEntry) {
113
+ if (new Date(memEntry.expiresAt) > new Date()) {
114
+ // Validate the cached result (012-fix-agent-result-regressions)
115
+ const validated = validateCachedResult(memEntry.result);
116
+ if (validated) {
117
+ console.log(`[cache] Memory hit: ${key}`);
118
+ return validated;
119
+ }
120
+ // Invalid format - treat as cache miss
121
+ console.warn(`[cache] Memory entry invalid format, treating as miss: ${key}`);
122
+ memoryCache.delete(key);
123
+ }
124
+ else {
125
+ memoryCache.delete(key);
126
+ }
127
+ }
128
+ // Check file cache
129
+ const filePath = getCacheFilePath(key);
130
+ if (existsSync(filePath)) {
131
+ try {
132
+ const content = readFileSync(filePath, 'utf-8');
133
+ const entry = JSON.parse(content);
134
+ if (new Date(entry.expiresAt) > new Date()) {
135
+ // Validate the cached result (012-fix-agent-result-regressions)
136
+ const validated = validateCachedResult(entry.result);
137
+ if (validated) {
138
+ console.log(`[cache] File hit: ${key}`);
139
+ // FR-007: Immutable update to avoid mutating parsed entry (spread creates new object)
140
+ const validatedEntry = { ...entry, result: validated };
141
+ memoryCache.set(key, validatedEntry);
142
+ return validated;
143
+ }
144
+ // Invalid format - treat as cache miss (remove stale file)
145
+ console.warn(`[cache] File entry invalid format, treating as miss: ${key}`);
146
+ unlinkSync(filePath);
147
+ return null;
148
+ }
149
+ // Expired, remove file
150
+ unlinkSync(filePath);
151
+ }
152
+ catch {
153
+ console.warn(`[cache] Failed to read cache file: ${filePath}`);
154
+ }
155
+ }
156
+ return null;
157
+ }
158
+ /**
159
+ * Store a result in the cache
160
+ */
161
+ export async function setCache(key, result, ttlSeconds = DEFAULT_TTL_SECONDS) {
162
+ const now = new Date();
163
+ const expiresAt = new Date(now.getTime() + ttlSeconds * 1000);
164
+ const entry = {
165
+ key,
166
+ result,
167
+ createdAt: now.toISOString(),
168
+ expiresAt: expiresAt.toISOString(),
169
+ };
170
+ // Store in memory
171
+ memoryCache.set(key, entry);
172
+ // Store to file
173
+ try {
174
+ ensureCacheDir();
175
+ const filePath = getCacheFilePath(key);
176
+ writeFileSync(filePath, JSON.stringify(entry, null, 2));
177
+ console.log(`[cache] Set: ${key} (expires: ${expiresAt.toISOString()})`);
178
+ }
179
+ catch (error) {
180
+ console.warn(`[cache] Failed to write cache file: ${error}`);
181
+ }
182
+ }
183
+ /**
184
+ * Clear the cache
185
+ */
186
+ export async function clearCache() {
187
+ memoryCache.clear();
188
+ const dir = getCacheDir();
189
+ if (existsSync(dir)) {
190
+ try {
191
+ const files = readdirSync(dir);
192
+ for (const file of files) {
193
+ if (file.startsWith(CACHE_KEY_PREFIX) && file.endsWith('.json')) {
194
+ unlinkSync(join(dir, file));
195
+ }
196
+ }
197
+ console.log('[cache] Cleared');
198
+ }
199
+ catch (error) {
200
+ console.warn(`[cache] Failed to clear cache: ${error}`);
201
+ }
202
+ }
203
+ }
204
+ /**
205
+ * Clean up expired cache entries
206
+ */
207
+ export async function cleanupExpired() {
208
+ let cleaned = 0;
209
+ const dir = getCacheDir();
210
+ if (!existsSync(dir))
211
+ return 0;
212
+ try {
213
+ const files = readdirSync(dir);
214
+ for (const file of files) {
215
+ if (!file.startsWith(CACHE_KEY_PREFIX) || !file.endsWith('.json'))
216
+ continue;
217
+ const filePath = join(dir, file);
218
+ try {
219
+ const content = readFileSync(filePath, 'utf-8');
220
+ const entry = JSON.parse(content);
221
+ if (new Date(entry.expiresAt) < new Date()) {
222
+ unlinkSync(filePath);
223
+ memoryCache.delete(entry.key);
224
+ cleaned++;
225
+ }
226
+ }
227
+ catch {
228
+ // Remove corrupted files
229
+ unlinkSync(filePath);
230
+ cleaned++;
231
+ }
232
+ }
233
+ }
234
+ catch (error) {
235
+ console.warn(`[cache] Cleanup failed: ${error}`);
236
+ }
237
+ if (cleaned > 0) {
238
+ console.log(`[cache] Cleaned up ${cleaned} expired entries`);
239
+ }
240
+ return cleaned;
241
+ }
242
+ /**
243
+ * Find cached result for a PR (even with different SHA)
244
+ * Used for fallback when exact cache miss
245
+ *
246
+ * (012-fix-agent-result-regressions) - Now validates results through validateCachedResult()
247
+ * to ensure legacy/malformed entries are treated as cache misses.
248
+ */
249
+ export async function findCachedForPR(prNumber) {
250
+ const prefix = generateRestoreKeyPrefix(prNumber);
251
+ const dir = getCacheDir();
252
+ if (!existsSync(dir))
253
+ return null;
254
+ try {
255
+ const files = readdirSync(dir)
256
+ .filter((f) => f.startsWith(prefix) && f.endsWith('.json'))
257
+ .sort()
258
+ .reverse(); // Most recent first
259
+ for (const file of files) {
260
+ const filePath = join(dir, file);
261
+ try {
262
+ const content = readFileSync(filePath, 'utf-8');
263
+ const entry = JSON.parse(content);
264
+ if (new Date(entry.expiresAt) > new Date()) {
265
+ // Validate the cached result (012-fix-agent-result-regressions)
266
+ const validated = validateCachedResult(entry.result);
267
+ if (validated) {
268
+ console.log(`[cache] Fallback hit for PR ${prNumber}: ${entry.key}`);
269
+ return validated;
270
+ }
271
+ // Invalid format - skip and try next file
272
+ console.warn(`[cache] Fallback entry invalid format, skipping: ${entry.key}`);
273
+ }
274
+ }
275
+ catch {
276
+ // Skip corrupted files
277
+ }
278
+ }
279
+ }
280
+ catch {
281
+ // Ignore errors
282
+ }
283
+ return null;
284
+ }
285
+ /**
286
+ * Save cache for GitHub Actions
287
+ * Call this at the end of a CI run to persist cache
288
+ */
289
+ export async function saveGitHubActionsCache(key) {
290
+ if (!isGitHubActions()) {
291
+ return false;
292
+ }
293
+ try {
294
+ // Dynamic import to avoid bundling @actions/cache for non-CI use
295
+ const cache = await import('@actions/cache');
296
+ const paths = [getCacheDir()];
297
+ await cache.saveCache(paths, key);
298
+ console.log(`[cache] Saved to GitHub Actions cache: ${key}`);
299
+ return true;
300
+ }
301
+ catch (error) {
302
+ console.warn(`[cache] Failed to save GitHub Actions cache: ${error}`);
303
+ return false;
304
+ }
305
+ }
306
+ /**
307
+ * Restore cache from GitHub Actions
308
+ * Call this at the start of a CI run
309
+ */
310
+ export async function restoreGitHubActionsCache(primaryKey, restoreKeys) {
311
+ if (!isGitHubActions()) {
312
+ return undefined;
313
+ }
314
+ try {
315
+ const cache = await import('@actions/cache');
316
+ const paths = [getCacheDir()];
317
+ const matchedKey = await cache.restoreCache(paths, primaryKey, restoreKeys);
318
+ if (matchedKey) {
319
+ console.log(`[cache] Restored from GitHub Actions cache: ${matchedKey}`);
320
+ }
321
+ return matchedKey;
322
+ }
323
+ catch (error) {
324
+ console.warn(`[cache] Failed to restore GitHub Actions cache: ${error}`);
325
+ return undefined;
326
+ }
327
+ }
328
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/cache/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Check Command Module
3
+ *
4
+ * Provides the `ai-review check` command for validating external dependencies.
5
+ * Reports status of all known dependencies with version information.
6
+ *
7
+ * @module cli/commands/check
8
+ */
9
+ import type { DependencyCheckResult } from '../dependencies/types.js';
10
+ /**
11
+ * Options for the check command
12
+ */
13
+ export interface CheckOptions {
14
+ /** Show additional details (minimum version, docs URL) */
15
+ verbose?: boolean;
16
+ /** Output results in JSON format */
17
+ json?: boolean;
18
+ }
19
+ /**
20
+ * Result from running the check command
21
+ */
22
+ export interface CheckResult {
23
+ /** Exit code (0=all available, 1=issues found) */
24
+ exitCode: number;
25
+ /** Individual dependency results */
26
+ results: DependencyCheckResult[];
27
+ /** Summary information */
28
+ summary: {
29
+ available: number;
30
+ missing: number;
31
+ unhealthy: number;
32
+ versionMismatch: number;
33
+ allAvailable: boolean;
34
+ };
35
+ }
36
+ /**
37
+ * Run the check command to validate all known dependencies.
38
+ *
39
+ * @param _options - Command options (verbose, json flags)
40
+ * @returns Check result with exit code and dependency status
41
+ */
42
+ export declare function runCheck(_options: CheckOptions): CheckResult;
43
+ /**
44
+ * Format check output for terminal display.
45
+ *
46
+ * @param results - Dependency check results
47
+ * @param options - Formatting options
48
+ * @returns Formatted output string
49
+ */
50
+ export declare function formatCheckOutput(results: DependencyCheckResult[], options: {
51
+ verbose: boolean;
52
+ }): string;
53
+ /**
54
+ * Format check output as JSON.
55
+ *
56
+ * @param results - Dependency check results
57
+ * @returns JSON string
58
+ */
59
+ export declare function formatCheckOutputJson(results: DependencyCheckResult[]): string;
60
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oCAAoC;IACpC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,OAAO,EAAE,qBAAqB,EAAE,CAAC;IACjC,0BAA0B;IAC1B,OAAO,EAAE;QACP,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,OAAO,CAAC;KACvB,CAAC;CACH;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,WAAW,CA0C5D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,qBAAqB,EAAE,EAChC,OAAO,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAC5B,MAAM,CA2DR;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,EAAE,GAAG,MAAM,CA6C9E"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Check Command Module
3
+ *
4
+ * Provides the `ai-review check` command for validating external dependencies.
5
+ * Reports status of all known dependencies with version information.
6
+ *
7
+ * @module cli/commands/check
8
+ */
9
+ import { getAllDependencyNames, checkAllDependencies, getDependencyInfo, detectPlatform, } from '../dependencies/index.js';
10
+ /**
11
+ * Run the check command to validate all known dependencies.
12
+ *
13
+ * @param _options - Command options (verbose, json flags)
14
+ * @returns Check result with exit code and dependency status
15
+ */
16
+ export function runCheck(_options) {
17
+ // Get all known dependency names and check them
18
+ const depNames = getAllDependencyNames();
19
+ const results = checkAllDependencies(depNames);
20
+ // Build summary
21
+ const summary = {
22
+ available: 0,
23
+ missing: 0,
24
+ unhealthy: 0,
25
+ versionMismatch: 0,
26
+ allAvailable: true,
27
+ };
28
+ for (const result of results) {
29
+ switch (result.status) {
30
+ case 'available':
31
+ summary.available++;
32
+ break;
33
+ case 'missing':
34
+ summary.missing++;
35
+ summary.allAvailable = false;
36
+ break;
37
+ case 'unhealthy':
38
+ summary.unhealthy++;
39
+ summary.allAvailable = false;
40
+ break;
41
+ case 'version-mismatch':
42
+ summary.versionMismatch++;
43
+ summary.allAvailable = false;
44
+ break;
45
+ }
46
+ }
47
+ // Exit code: 0 if all available, 1 otherwise
48
+ const exitCode = summary.allAvailable ? 0 : 1;
49
+ return {
50
+ exitCode,
51
+ results,
52
+ summary,
53
+ };
54
+ }
55
+ /**
56
+ * Format check output for terminal display.
57
+ *
58
+ * @param results - Dependency check results
59
+ * @param options - Formatting options
60
+ * @returns Formatted output string
61
+ */
62
+ export function formatCheckOutput(results, options) {
63
+ const lines = [];
64
+ const platform = detectPlatform();
65
+ // Header
66
+ lines.push('');
67
+ lines.push('Dependency Status Check');
68
+ lines.push('─'.repeat(40));
69
+ lines.push('');
70
+ for (const result of results) {
71
+ const depInfo = getDependencyInfo(result.name);
72
+ const displayName = depInfo?.displayName ?? result.name;
73
+ // Status line
74
+ switch (result.status) {
75
+ case 'available':
76
+ lines.push(`✓ ${displayName} ${result.version}`);
77
+ break;
78
+ case 'missing':
79
+ lines.push(`✗ ${displayName} - missing`);
80
+ break;
81
+ case 'unhealthy':
82
+ lines.push(`⚠ ${displayName} - unhealthy`);
83
+ if (result.error) {
84
+ lines.push(` Error: ${result.error}`);
85
+ }
86
+ break;
87
+ case 'version-mismatch':
88
+ lines.push(`⚠ ${displayName} ${result.version} - version mismatch`);
89
+ if (depInfo?.minVersion) {
90
+ lines.push(` Required: ${depInfo.minVersion} or later`);
91
+ }
92
+ break;
93
+ }
94
+ // Verbose details
95
+ if (options.verbose && depInfo) {
96
+ if (depInfo.minVersion) {
97
+ lines.push(` Minimum version: ${depInfo.minVersion}`);
98
+ }
99
+ lines.push(` Documentation: ${depInfo.docsUrl}`);
100
+ // Install instructions for non-available dependencies
101
+ if (result.status !== 'available') {
102
+ const instructions = depInfo.installInstructions[platform];
103
+ if (instructions) {
104
+ lines.push(' Install:');
105
+ for (const line of instructions.split('\n')) {
106
+ lines.push(` ${line}`);
107
+ }
108
+ }
109
+ }
110
+ }
111
+ lines.push('');
112
+ }
113
+ return lines.join('\n');
114
+ }
115
+ /**
116
+ * Format check output as JSON.
117
+ *
118
+ * @param results - Dependency check results
119
+ * @returns JSON string
120
+ */
121
+ export function formatCheckOutputJson(results) {
122
+ const platform = detectPlatform();
123
+ // Build summary counts
124
+ const summary = {
125
+ available: 0,
126
+ missing: 0,
127
+ unhealthy: 0,
128
+ versionMismatch: 0,
129
+ allAvailable: true,
130
+ };
131
+ for (const result of results) {
132
+ switch (result.status) {
133
+ case 'available':
134
+ summary.available++;
135
+ break;
136
+ case 'missing':
137
+ summary.missing++;
138
+ summary.allAvailable = false;
139
+ break;
140
+ case 'unhealthy':
141
+ summary.unhealthy++;
142
+ summary.allAvailable = false;
143
+ break;
144
+ case 'version-mismatch':
145
+ summary.versionMismatch++;
146
+ summary.allAvailable = false;
147
+ break;
148
+ }
149
+ }
150
+ const output = {
151
+ timestamp: new Date().toISOString(),
152
+ platform,
153
+ dependencies: results.map((r) => ({
154
+ name: r.name,
155
+ status: r.status,
156
+ version: r.version,
157
+ error: r.error,
158
+ })),
159
+ summary,
160
+ };
161
+ return JSON.stringify(output, null, 2);
162
+ }
163
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * CLI Commands Module Exports
3
+ *
4
+ * Barrel export for CLI command handlers.
5
+ */
6
+ export { runLocalReview, createDefaultDependencies, ExitCode, type LocalReviewDependencies, type LocalReviewResult, type DryRunResult, type CostEstimateResult, } from './local-review.js';
7
+ export { runCheck, formatCheckOutput, formatCheckOutputJson, type CheckOptions, type CheckResult, } from './check.js';
8
+ /**
9
+ * Command registry version - used for module loading verification
10
+ */
11
+ export declare const COMMANDS_MODULE_VERSION: "1.0.0";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,cAAc,EACd,yBAAyB,EACzB,QAAQ,EACR,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,kBAAkB,GACxB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,QAAQ,EACR,iBAAiB,EACjB,qBAAqB,EACrB,KAAK,YAAY,EACjB,KAAK,WAAW,GACjB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAG,OAAgB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * CLI Commands Module Exports
3
+ *
4
+ * Barrel export for CLI command handlers.
5
+ */
6
+ export { runLocalReview, createDefaultDependencies, ExitCode, } from './local-review.js';
7
+ export { runCheck, formatCheckOutput, formatCheckOutputJson, } from './check.js';
8
+ /**
9
+ * Command registry version - used for module loading verification
10
+ */
11
+ export const COMMANDS_MODULE_VERSION = '1.0.0';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,cAAc,EACd,yBAAyB,EACzB,QAAQ,GAKT,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,QAAQ,EACR,iBAAiB,EACjB,qBAAqB,GAGtB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,OAAgB,CAAC"}