@humanbased/crosscheck 0.14.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 (381) hide show
  1. package/AGENT.md +207 -0
  2. package/ISSUE.md +234 -0
  3. package/LICENSE +21 -0
  4. package/README.md +234 -0
  5. package/README.zh.md +169 -0
  6. package/assets/logo.png +0 -0
  7. package/assets/screenshot-watch-timing.png +0 -0
  8. package/assets/screenshot-watch-timing.svg +1 -0
  9. package/assets/screenshot-watch.png +0 -0
  10. package/crosscheck.config.example.yml +214 -0
  11. package/dist/__tests__/annotation.test.d.ts +2 -0
  12. package/dist/__tests__/annotation.test.d.ts.map +1 -0
  13. package/dist/__tests__/annotation.test.js +134 -0
  14. package/dist/__tests__/annotation.test.js.map +1 -0
  15. package/dist/__tests__/backtrace.test.d.ts +2 -0
  16. package/dist/__tests__/backtrace.test.d.ts.map +1 -0
  17. package/dist/__tests__/backtrace.test.js +280 -0
  18. package/dist/__tests__/backtrace.test.js.map +1 -0
  19. package/dist/__tests__/board.test.d.ts +2 -0
  20. package/dist/__tests__/board.test.d.ts.map +1 -0
  21. package/dist/__tests__/board.test.js +149 -0
  22. package/dist/__tests__/board.test.js.map +1 -0
  23. package/dist/__tests__/codex.test.d.ts +2 -0
  24. package/dist/__tests__/codex.test.d.ts.map +1 -0
  25. package/dist/__tests__/codex.test.js +92 -0
  26. package/dist/__tests__/codex.test.js.map +1 -0
  27. package/dist/__tests__/comment-bodies.test.d.ts +2 -0
  28. package/dist/__tests__/comment-bodies.test.d.ts.map +1 -0
  29. package/dist/__tests__/comment-bodies.test.js +75 -0
  30. package/dist/__tests__/comment-bodies.test.js.map +1 -0
  31. package/dist/__tests__/conflict-resolve.test.d.ts +2 -0
  32. package/dist/__tests__/conflict-resolve.test.d.ts.map +1 -0
  33. package/dist/__tests__/conflict-resolve.test.js +123 -0
  34. package/dist/__tests__/conflict-resolve.test.js.map +1 -0
  35. package/dist/__tests__/crosscheck-commit.test.d.ts +2 -0
  36. package/dist/__tests__/crosscheck-commit.test.d.ts.map +1 -0
  37. package/dist/__tests__/crosscheck-commit.test.js +13 -0
  38. package/dist/__tests__/crosscheck-commit.test.js.map +1 -0
  39. package/dist/__tests__/detector.test.d.ts +2 -0
  40. package/dist/__tests__/detector.test.d.ts.map +1 -0
  41. package/dist/__tests__/detector.test.js +112 -0
  42. package/dist/__tests__/detector.test.js.map +1 -0
  43. package/dist/__tests__/diagnose.test.d.ts +2 -0
  44. package/dist/__tests__/diagnose.test.d.ts.map +1 -0
  45. package/dist/__tests__/diagnose.test.js +164 -0
  46. package/dist/__tests__/diagnose.test.js.map +1 -0
  47. package/dist/__tests__/diff-hash.test.d.ts +2 -0
  48. package/dist/__tests__/diff-hash.test.d.ts.map +1 -0
  49. package/dist/__tests__/diff-hash.test.js +126 -0
  50. package/dist/__tests__/diff-hash.test.js.map +1 -0
  51. package/dist/__tests__/durations.test.d.ts +2 -0
  52. package/dist/__tests__/durations.test.d.ts.map +1 -0
  53. package/dist/__tests__/durations.test.js +26 -0
  54. package/dist/__tests__/durations.test.js.map +1 -0
  55. package/dist/__tests__/event-fields.test.d.ts +2 -0
  56. package/dist/__tests__/event-fields.test.d.ts.map +1 -0
  57. package/dist/__tests__/event-fields.test.js +50 -0
  58. package/dist/__tests__/event-fields.test.js.map +1 -0
  59. package/dist/__tests__/filter.test.d.ts +2 -0
  60. package/dist/__tests__/filter.test.d.ts.map +1 -0
  61. package/dist/__tests__/filter.test.js +21 -0
  62. package/dist/__tests__/filter.test.js.map +1 -0
  63. package/dist/__tests__/fix.test.d.ts +2 -0
  64. package/dist/__tests__/fix.test.d.ts.map +1 -0
  65. package/dist/__tests__/fix.test.js +124 -0
  66. package/dist/__tests__/fix.test.js.map +1 -0
  67. package/dist/__tests__/github-client.test.d.ts +2 -0
  68. package/dist/__tests__/github-client.test.d.ts.map +1 -0
  69. package/dist/__tests__/github-client.test.js +22 -0
  70. package/dist/__tests__/github-client.test.js.map +1 -0
  71. package/dist/__tests__/github-scan-client.test.d.ts +2 -0
  72. package/dist/__tests__/github-scan-client.test.d.ts.map +1 -0
  73. package/dist/__tests__/github-scan-client.test.js +100 -0
  74. package/dist/__tests__/github-scan-client.test.js.map +1 -0
  75. package/dist/__tests__/is-fresh-review-comment.test.d.ts +2 -0
  76. package/dist/__tests__/is-fresh-review-comment.test.d.ts.map +1 -0
  77. package/dist/__tests__/is-fresh-review-comment.test.js +86 -0
  78. package/dist/__tests__/is-fresh-review-comment.test.js.map +1 -0
  79. package/dist/__tests__/issue.test.d.ts +2 -0
  80. package/dist/__tests__/issue.test.d.ts.map +1 -0
  81. package/dist/__tests__/issue.test.js +259 -0
  82. package/dist/__tests__/issue.test.js.map +1 -0
  83. package/dist/__tests__/kickass.test.d.ts +2 -0
  84. package/dist/__tests__/kickass.test.d.ts.map +1 -0
  85. package/dist/__tests__/kickass.test.js +268 -0
  86. package/dist/__tests__/kickass.test.js.map +1 -0
  87. package/dist/__tests__/loader.test.d.ts +2 -0
  88. package/dist/__tests__/loader.test.d.ts.map +1 -0
  89. package/dist/__tests__/loader.test.js +180 -0
  90. package/dist/__tests__/loader.test.js.map +1 -0
  91. package/dist/__tests__/onboard-preservation.test.d.ts +2 -0
  92. package/dist/__tests__/onboard-preservation.test.d.ts.map +1 -0
  93. package/dist/__tests__/onboard-preservation.test.js +506 -0
  94. package/dist/__tests__/onboard-preservation.test.js.map +1 -0
  95. package/dist/__tests__/optimize.test.d.ts +2 -0
  96. package/dist/__tests__/optimize.test.d.ts.map +1 -0
  97. package/dist/__tests__/optimize.test.js +101 -0
  98. package/dist/__tests__/optimize.test.js.map +1 -0
  99. package/dist/__tests__/post-review-comment.test.d.ts +2 -0
  100. package/dist/__tests__/post-review-comment.test.d.ts.map +1 -0
  101. package/dist/__tests__/post-review-comment.test.js +44 -0
  102. package/dist/__tests__/post-review-comment.test.js.map +1 -0
  103. package/dist/__tests__/pr-lock.test.d.ts +2 -0
  104. package/dist/__tests__/pr-lock.test.d.ts.map +1 -0
  105. package/dist/__tests__/pr-lock.test.js +115 -0
  106. package/dist/__tests__/pr-lock.test.js.map +1 -0
  107. package/dist/__tests__/pr-picker.test.d.ts +2 -0
  108. package/dist/__tests__/pr-picker.test.d.ts.map +1 -0
  109. package/dist/__tests__/pr-picker.test.js +57 -0
  110. package/dist/__tests__/pr-picker.test.js.map +1 -0
  111. package/dist/__tests__/pr-status-scan.test.d.ts +2 -0
  112. package/dist/__tests__/pr-status-scan.test.d.ts.map +1 -0
  113. package/dist/__tests__/pr-status-scan.test.js +92 -0
  114. package/dist/__tests__/pr-status-scan.test.js.map +1 -0
  115. package/dist/__tests__/pr-status.test.d.ts +2 -0
  116. package/dist/__tests__/pr-status.test.d.ts.map +1 -0
  117. package/dist/__tests__/pr-status.test.js +346 -0
  118. package/dist/__tests__/pr-status.test.js.map +1 -0
  119. package/dist/__tests__/repo-picker.test.d.ts +2 -0
  120. package/dist/__tests__/repo-picker.test.d.ts.map +1 -0
  121. package/dist/__tests__/repo-picker.test.js +115 -0
  122. package/dist/__tests__/repo-picker.test.js.map +1 -0
  123. package/dist/__tests__/review-comment-body.test.d.ts +2 -0
  124. package/dist/__tests__/review-comment-body.test.d.ts.map +1 -0
  125. package/dist/__tests__/review-comment-body.test.js +54 -0
  126. package/dist/__tests__/review-comment-body.test.js.map +1 -0
  127. package/dist/__tests__/review-models.test.d.ts +2 -0
  128. package/dist/__tests__/review-models.test.d.ts.map +1 -0
  129. package/dist/__tests__/review-models.test.js +39 -0
  130. package/dist/__tests__/review-models.test.js.map +1 -0
  131. package/dist/__tests__/review-status.test.d.ts +2 -0
  132. package/dist/__tests__/review-status.test.d.ts.map +1 -0
  133. package/dist/__tests__/review-status.test.js +95 -0
  134. package/dist/__tests__/review-status.test.js.map +1 -0
  135. package/dist/__tests__/runner.test.d.ts +2 -0
  136. package/dist/__tests__/runner.test.d.ts.map +1 -0
  137. package/dist/__tests__/runner.test.js +204 -0
  138. package/dist/__tests__/runner.test.js.map +1 -0
  139. package/dist/__tests__/scan-cache.test.d.ts +2 -0
  140. package/dist/__tests__/scan-cache.test.d.ts.map +1 -0
  141. package/dist/__tests__/scan-cache.test.js +59 -0
  142. package/dist/__tests__/scan-cache.test.js.map +1 -0
  143. package/dist/__tests__/scan-client.test.d.ts +2 -0
  144. package/dist/__tests__/scan-client.test.d.ts.map +1 -0
  145. package/dist/__tests__/scan-client.test.js +30 -0
  146. package/dist/__tests__/scan-client.test.js.map +1 -0
  147. package/dist/__tests__/scan.test.d.ts +2 -0
  148. package/dist/__tests__/scan.test.d.ts.map +1 -0
  149. package/dist/__tests__/scan.test.js +115 -0
  150. package/dist/__tests__/scan.test.js.map +1 -0
  151. package/dist/__tests__/scopes.test.d.ts +2 -0
  152. package/dist/__tests__/scopes.test.d.ts.map +1 -0
  153. package/dist/__tests__/scopes.test.js +101 -0
  154. package/dist/__tests__/scopes.test.js.map +1 -0
  155. package/dist/__tests__/sha-cache.test.d.ts +2 -0
  156. package/dist/__tests__/sha-cache.test.d.ts.map +1 -0
  157. package/dist/__tests__/sha-cache.test.js +40 -0
  158. package/dist/__tests__/sha-cache.test.js.map +1 -0
  159. package/dist/__tests__/smart-switch.test.d.ts +2 -0
  160. package/dist/__tests__/smart-switch.test.d.ts.map +1 -0
  161. package/dist/__tests__/smart-switch.test.js +145 -0
  162. package/dist/__tests__/smart-switch.test.js.map +1 -0
  163. package/dist/ck.d.ts +3 -0
  164. package/dist/ck.d.ts.map +1 -0
  165. package/dist/ck.js +8 -0
  166. package/dist/ck.js.map +1 -0
  167. package/dist/cli.d.ts +3 -0
  168. package/dist/cli.d.ts.map +1 -0
  169. package/dist/cli.js +132 -0
  170. package/dist/cli.js.map +1 -0
  171. package/dist/commands/diagnose.d.ts +54 -0
  172. package/dist/commands/diagnose.d.ts.map +1 -0
  173. package/dist/commands/diagnose.js +294 -0
  174. package/dist/commands/diagnose.js.map +1 -0
  175. package/dist/commands/impact.d.ts +38 -0
  176. package/dist/commands/impact.d.ts.map +1 -0
  177. package/dist/commands/impact.js +210 -0
  178. package/dist/commands/impact.js.map +1 -0
  179. package/dist/commands/init.d.ts +12 -0
  180. package/dist/commands/init.d.ts.map +1 -0
  181. package/dist/commands/init.js +183 -0
  182. package/dist/commands/init.js.map +1 -0
  183. package/dist/commands/issue.d.ts +25 -0
  184. package/dist/commands/issue.d.ts.map +1 -0
  185. package/dist/commands/issue.js +445 -0
  186. package/dist/commands/issue.js.map +1 -0
  187. package/dist/commands/kickass.d.ts +59 -0
  188. package/dist/commands/kickass.d.ts.map +1 -0
  189. package/dist/commands/kickass.js +288 -0
  190. package/dist/commands/kickass.js.map +1 -0
  191. package/dist/commands/onboard.d.ts +70 -0
  192. package/dist/commands/onboard.d.ts.map +1 -0
  193. package/dist/commands/onboard.js +883 -0
  194. package/dist/commands/onboard.js.map +1 -0
  195. package/dist/commands/optimize.d.ts +16 -0
  196. package/dist/commands/optimize.d.ts.map +1 -0
  197. package/dist/commands/optimize.js +244 -0
  198. package/dist/commands/optimize.js.map +1 -0
  199. package/dist/commands/review.d.ts +2 -0
  200. package/dist/commands/review.d.ts.map +1 -0
  201. package/dist/commands/review.js +118 -0
  202. package/dist/commands/review.js.map +1 -0
  203. package/dist/commands/run.d.ts +13 -0
  204. package/dist/commands/run.d.ts.map +1 -0
  205. package/dist/commands/run.js +243 -0
  206. package/dist/commands/run.js.map +1 -0
  207. package/dist/commands/scan.d.ts +94 -0
  208. package/dist/commands/scan.d.ts.map +1 -0
  209. package/dist/commands/scan.js +276 -0
  210. package/dist/commands/scan.js.map +1 -0
  211. package/dist/commands/serve.d.ts +9 -0
  212. package/dist/commands/serve.d.ts.map +1 -0
  213. package/dist/commands/serve.js +402 -0
  214. package/dist/commands/serve.js.map +1 -0
  215. package/dist/commands/status.d.ts +2 -0
  216. package/dist/commands/status.d.ts.map +1 -0
  217. package/dist/commands/status.js +89 -0
  218. package/dist/commands/status.js.map +1 -0
  219. package/dist/commands/watch.d.ts +9 -0
  220. package/dist/commands/watch.d.ts.map +1 -0
  221. package/dist/commands/watch.js +902 -0
  222. package/dist/commands/watch.js.map +1 -0
  223. package/dist/config/loader.d.ts +47 -0
  224. package/dist/config/loader.d.ts.map +1 -0
  225. package/dist/config/loader.js +334 -0
  226. package/dist/config/loader.js.map +1 -0
  227. package/dist/config/schema.d.ts +814 -0
  228. package/dist/config/schema.d.ts.map +1 -0
  229. package/dist/config/schema.js +152 -0
  230. package/dist/config/schema.js.map +1 -0
  231. package/dist/github/client.d.ts +139 -0
  232. package/dist/github/client.d.ts.map +1 -0
  233. package/dist/github/client.js +711 -0
  234. package/dist/github/client.js.map +1 -0
  235. package/dist/github/detector.d.ts +12 -0
  236. package/dist/github/detector.d.ts.map +1 -0
  237. package/dist/github/detector.js +120 -0
  238. package/dist/github/detector.js.map +1 -0
  239. package/dist/github/merge.d.ts +9 -0
  240. package/dist/github/merge.d.ts.map +1 -0
  241. package/dist/github/merge.js +33 -0
  242. package/dist/github/merge.js.map +1 -0
  243. package/dist/github/review-status.d.ts +6 -0
  244. package/dist/github/review-status.d.ts.map +1 -0
  245. package/dist/github/review-status.js +51 -0
  246. package/dist/github/review-status.js.map +1 -0
  247. package/dist/github/webhook.d.ts +41 -0
  248. package/dist/github/webhook.d.ts.map +1 -0
  249. package/dist/github/webhook.js +50 -0
  250. package/dist/github/webhook.js.map +1 -0
  251. package/dist/lib/annotation.d.ts +23 -0
  252. package/dist/lib/annotation.d.ts.map +1 -0
  253. package/dist/lib/annotation.js +103 -0
  254. package/dist/lib/annotation.js.map +1 -0
  255. package/dist/lib/backtrace.d.ts +40 -0
  256. package/dist/lib/backtrace.d.ts.map +1 -0
  257. package/dist/lib/backtrace.js +169 -0
  258. package/dist/lib/backtrace.js.map +1 -0
  259. package/dist/lib/board.d.ts +74 -0
  260. package/dist/lib/board.d.ts.map +1 -0
  261. package/dist/lib/board.js +640 -0
  262. package/dist/lib/board.js.map +1 -0
  263. package/dist/lib/clone.d.ts +12 -0
  264. package/dist/lib/clone.d.ts.map +1 -0
  265. package/dist/lib/clone.js +30 -0
  266. package/dist/lib/clone.js.map +1 -0
  267. package/dist/lib/comment-bodies.d.ts +17 -0
  268. package/dist/lib/comment-bodies.d.ts.map +1 -0
  269. package/dist/lib/comment-bodies.js +51 -0
  270. package/dist/lib/comment-bodies.js.map +1 -0
  271. package/dist/lib/crosscheck-commit.d.ts +2 -0
  272. package/dist/lib/crosscheck-commit.d.ts.map +1 -0
  273. package/dist/lib/crosscheck-commit.js +4 -0
  274. package/dist/lib/crosscheck-commit.js.map +1 -0
  275. package/dist/lib/diff-hash.d.ts +16 -0
  276. package/dist/lib/diff-hash.d.ts.map +1 -0
  277. package/dist/lib/diff-hash.js +71 -0
  278. package/dist/lib/diff-hash.js.map +1 -0
  279. package/dist/lib/durations.d.ts +5 -0
  280. package/dist/lib/durations.d.ts.map +1 -0
  281. package/dist/lib/durations.js +39 -0
  282. package/dist/lib/durations.js.map +1 -0
  283. package/dist/lib/event-fields.d.ts +6 -0
  284. package/dist/lib/event-fields.d.ts.map +1 -0
  285. package/dist/lib/event-fields.js +20 -0
  286. package/dist/lib/event-fields.js.map +1 -0
  287. package/dist/lib/filter.d.ts +2 -0
  288. package/dist/lib/filter.d.ts.map +1 -0
  289. package/dist/lib/filter.js +4 -0
  290. package/dist/lib/filter.js.map +1 -0
  291. package/dist/lib/fortune.d.ts +2 -0
  292. package/dist/lib/fortune.d.ts.map +1 -0
  293. package/dist/lib/fortune.js +26 -0
  294. package/dist/lib/fortune.js.map +1 -0
  295. package/dist/lib/languages.d.ts +3 -0
  296. package/dist/lib/languages.d.ts.map +1 -0
  297. package/dist/lib/languages.js +26 -0
  298. package/dist/lib/languages.js.map +1 -0
  299. package/dist/lib/log-analysis.d.ts +17 -0
  300. package/dist/lib/log-analysis.d.ts.map +1 -0
  301. package/dist/lib/log-analysis.js +72 -0
  302. package/dist/lib/log-analysis.js.map +1 -0
  303. package/dist/lib/logger.d.ts +14 -0
  304. package/dist/lib/logger.d.ts.map +1 -0
  305. package/dist/lib/logger.js +84 -0
  306. package/dist/lib/logger.js.map +1 -0
  307. package/dist/lib/port.d.ts +2 -0
  308. package/dist/lib/port.d.ts.map +1 -0
  309. package/dist/lib/port.js +21 -0
  310. package/dist/lib/port.js.map +1 -0
  311. package/dist/lib/pr-lock.d.ts +4 -0
  312. package/dist/lib/pr-lock.d.ts.map +1 -0
  313. package/dist/lib/pr-lock.js +91 -0
  314. package/dist/lib/pr-lock.js.map +1 -0
  315. package/dist/lib/pr-picker.d.ts +10 -0
  316. package/dist/lib/pr-picker.d.ts.map +1 -0
  317. package/dist/lib/pr-picker.js +80 -0
  318. package/dist/lib/pr-picker.js.map +1 -0
  319. package/dist/lib/pr-status.d.ts +206 -0
  320. package/dist/lib/pr-status.d.ts.map +1 -0
  321. package/dist/lib/pr-status.js +613 -0
  322. package/dist/lib/pr-status.js.map +1 -0
  323. package/dist/lib/repo-picker.d.ts +23 -0
  324. package/dist/lib/repo-picker.d.ts.map +1 -0
  325. package/dist/lib/repo-picker.js +411 -0
  326. package/dist/lib/repo-picker.js.map +1 -0
  327. package/dist/lib/review-models.d.ts +7 -0
  328. package/dist/lib/review-models.d.ts.map +1 -0
  329. package/dist/lib/review-models.js +32 -0
  330. package/dist/lib/review-models.js.map +1 -0
  331. package/dist/lib/runner.d.ts +65 -0
  332. package/dist/lib/runner.d.ts.map +1 -0
  333. package/dist/lib/runner.js +710 -0
  334. package/dist/lib/runner.js.map +1 -0
  335. package/dist/lib/scan-cache.d.ts +31 -0
  336. package/dist/lib/scan-cache.d.ts.map +1 -0
  337. package/dist/lib/scan-cache.js +112 -0
  338. package/dist/lib/scan-cache.js.map +1 -0
  339. package/dist/lib/scopes.d.ts +16 -0
  340. package/dist/lib/scopes.d.ts.map +1 -0
  341. package/dist/lib/scopes.js +37 -0
  342. package/dist/lib/scopes.js.map +1 -0
  343. package/dist/lib/sha-cache.d.ts +7 -0
  344. package/dist/lib/sha-cache.d.ts.map +1 -0
  345. package/dist/lib/sha-cache.js +44 -0
  346. package/dist/lib/sha-cache.js.map +1 -0
  347. package/dist/lib/smart-switch.d.ts +44 -0
  348. package/dist/lib/smart-switch.d.ts.map +1 -0
  349. package/dist/lib/smart-switch.js +145 -0
  350. package/dist/lib/smart-switch.js.map +1 -0
  351. package/dist/lib/verdict.d.ts +9 -0
  352. package/dist/lib/verdict.d.ts.map +1 -0
  353. package/dist/lib/verdict.js +52 -0
  354. package/dist/lib/verdict.js.map +1 -0
  355. package/dist/lib/workflow.d.ts +85 -0
  356. package/dist/lib/workflow.d.ts.map +1 -0
  357. package/dist/lib/workflow.js +116 -0
  358. package/dist/lib/workflow.js.map +1 -0
  359. package/dist/reviewers/address.d.ts +5 -0
  360. package/dist/reviewers/address.d.ts.map +1 -0
  361. package/dist/reviewers/address.js +87 -0
  362. package/dist/reviewers/address.js.map +1 -0
  363. package/dist/reviewers/claude.d.ts +12 -0
  364. package/dist/reviewers/claude.d.ts.map +1 -0
  365. package/dist/reviewers/claude.js +78 -0
  366. package/dist/reviewers/claude.js.map +1 -0
  367. package/dist/reviewers/codex.d.ts +9 -0
  368. package/dist/reviewers/codex.d.ts.map +1 -0
  369. package/dist/reviewers/codex.js +121 -0
  370. package/dist/reviewers/codex.js.map +1 -0
  371. package/dist/reviewers/conflict-resolve.d.ts +15 -0
  372. package/dist/reviewers/conflict-resolve.d.ts.map +1 -0
  373. package/dist/reviewers/conflict-resolve.js +219 -0
  374. package/dist/reviewers/conflict-resolve.js.map +1 -0
  375. package/dist/reviewers/fix.d.ts +7 -0
  376. package/dist/reviewers/fix.d.ts.map +1 -0
  377. package/dist/reviewers/fix.js +197 -0
  378. package/dist/reviewers/fix.js.map +1 -0
  379. package/get-started.md +1271 -0
  380. package/get-started.zh.md +1208 -0
  381. package/package.json +75 -0
@@ -0,0 +1,243 @@
1
+ import { mkdtempSync, rmSync } from 'fs';
2
+ import { tmpdir } from 'os';
3
+ import { join } from 'path';
4
+ import chalk from 'chalk';
5
+ import ora from 'ora';
6
+ import { createGithubClient } from '../github/client.js';
7
+ import { detectOriginFull, assignReviewer } from '../github/detector.js';
8
+ import { loadConfig, getGithubToken } from '../config/loader.js';
9
+ import { initLogger, log as fileLog, logError } from '../lib/logger.js';
10
+ import { runWorkflow } from '../lib/runner.js';
11
+ import { loadWorkflow } from '../lib/workflow.js';
12
+ import { formatVerdict } from '../lib/verdict.js';
13
+ import { clonePRForReview } from '../lib/clone.js';
14
+ import { acquirePRLock, releasePRLock } from '../lib/pr-lock.js';
15
+ import { checkRemoteLock, acquireRemoteLock, releaseRemoteLock, startRemoteLockHeartbeat } from '../github/review-status.js';
16
+ function parsePRUrl(url) {
17
+ const m = url.match(/github\.com\/([^/]+)\/([^/]+)\/pull\/(\d+)/);
18
+ if (!m)
19
+ return null;
20
+ return { owner: m[1], repo: m[2], number: parseInt(m[3], 10) };
21
+ }
22
+ export async function runRun(prUrl, opts = {}) {
23
+ const config = loadConfig(opts.config);
24
+ initLogger(config.logs);
25
+ fileLog({ level: 'info', event: 'session_start', command: 'run', pr_url: prUrl });
26
+ let token;
27
+ try {
28
+ token = getGithubToken();
29
+ }
30
+ catch (err) {
31
+ logError({ command: 'run', phase: 'auth' }, err);
32
+ console.error(chalk.red(`✗ ${err instanceof Error ? err.message : String(err)}`));
33
+ process.exit(1);
34
+ }
35
+ const parsed = parsePRUrl(prUrl);
36
+ if (!parsed) {
37
+ console.error(chalk.red('Invalid PR URL. Expected: https://github.com/owner/repo/pull/123'));
38
+ process.exit(1);
39
+ }
40
+ const { owner, repo, number } = parsed;
41
+ const spinner = ora(`Fetching PR #${number}...`).start();
42
+ const octokit = createGithubClient(token);
43
+ const { data: prData } = await octokit.rest.pulls.get({ owner, repo, pull_number: number });
44
+ if (opts.expectedHeadSha !== undefined && prData.head.sha !== opts.expectedHeadSha) {
45
+ spinner.warn(`PR #${number} head changed since selection — skipping stale_signature`);
46
+ fileLog({ level: 'info', event: 'pr_skipped', repo: `${owner}/${repo}`, pr: number, reason: 'stale_signature', expected_sha: opts.expectedHeadSha, actual_sha: prData.head.sha });
47
+ return;
48
+ }
49
+ spinner.succeed(`PR #${number}: ${prData.title}`);
50
+ fileLog({ level: 'info', event: 'pr_received', repo: `${owner}/${repo}`, pr: number, sha: prData.head.sha });
51
+ // Resolve origin and reviewer
52
+ let origin;
53
+ if (opts.reviewer === 'codex' || opts.reviewer === 'claude') {
54
+ // --reviewer forces the origin to the opposite vendor (cross-vendor semantics)
55
+ origin = opts.reviewer === 'codex' ? 'claude' : 'codex';
56
+ console.log(chalk.dim(` reviewer: ${opts.reviewer} (forced)`));
57
+ }
58
+ else {
59
+ const { origin: detectedOrigin, method } = await detectOriginFull(prData.body ?? '', prData.head.ref, owner, repo, number, config, token, prData.user?.login);
60
+ origin = detectedOrigin;
61
+ console.log(chalk.dim(` PR origin: ${origin} (via ${method})`));
62
+ }
63
+ const assignedReviewer = opts.reviewer === 'codex' || opts.reviewer === 'claude'
64
+ ? opts.reviewer
65
+ : await assignReviewer(origin, config);
66
+ if (!assignedReviewer) {
67
+ console.log(chalk.dim(` no reviewer assigned for origin "${origin}" — use --reviewer codex|claude to force`));
68
+ return;
69
+ }
70
+ if (!opts.reviewer) {
71
+ console.log(chalk.dim(` assigned reviewer: ${assignedReviewer}`));
72
+ }
73
+ // Resolve steps — filter from workflow.yml by type if --steps is specified, then pin the
74
+ // resolved reviewer on every review/recheck step so runWorkflow doesn't re-derive it
75
+ const allSteps = loadWorkflow(process.cwd());
76
+ const stepFilter = opts.steps?.split(',').map(s => s.trim().toLowerCase());
77
+ const filteredSteps = (stepFilter
78
+ ? allSteps.filter(s => stepFilter.includes(s.type) || stepFilter.includes(s.name))
79
+ : allSteps).map(s => s.type === 'review' || s.type === 'recheck' ? { ...s, reviewer: assignedReviewer } : s);
80
+ if (opts.dryRun) {
81
+ console.log(chalk.dim(' dry-run: review will run but no comment will be posted; fix step skipped'));
82
+ }
83
+ // Build the PREvent['pull_request'] shape from the GitHub API response
84
+ const pr = {
85
+ title: prData.title,
86
+ body: prData.body ?? '',
87
+ head: {
88
+ ref: prData.head.ref,
89
+ sha: prData.head.sha,
90
+ repo: prData.head.repo ? { full_name: prData.head.repo.full_name } : null,
91
+ },
92
+ base: {
93
+ ref: prData.base.ref,
94
+ repo: { full_name: `${owner}/${repo}` },
95
+ },
96
+ html_url: prData.html_url,
97
+ user: { login: prData.user?.login ?? '' },
98
+ };
99
+ const { sha } = prData.head;
100
+ if (!acquirePRLock(owner, repo, number, sha)) {
101
+ fileLog({ level: 'info', event: 'pr_skipped', repo: `${owner}/${repo}`, pr: number, reason: 'in_progress_local' });
102
+ console.log(chalk.yellow(`⚠ PR #${number} is already being reviewed by another process on this machine — skipping`));
103
+ return;
104
+ }
105
+ // Track which resources have actually been allocated so the SIGINT/SIGTERM
106
+ // handler only releases what exists. The handler must be installed BEFORE
107
+ // calling acquireRemoteLock: GitHub may create the pending status server-side
108
+ // even if the network round-trip is interrupted, and without an installed
109
+ // listener pr-lock would re-raise the signal and orphan the pending status
110
+ // until it goes stale.
111
+ let lockAttemptStarted = false;
112
+ let acquiredTmpDir;
113
+ let stopHeartbeat = () => { };
114
+ // Shared with runWorkflow — the runner appends every sha for which it set
115
+ // a remote pending status (e.g. after a conflict-resolve push). On normal
116
+ // completion or workflow error, the runner's own finally releases them;
117
+ // but if a signal fires mid-workflow we exit via process.exit and bypass
118
+ // that finally, so the signal handler iterates this array too.
119
+ const pushedShas = [];
120
+ const onSignal = (signal) => {
121
+ void (async () => {
122
+ try {
123
+ stopHeartbeat();
124
+ if (!opts.dryRun && lockAttemptStarted) {
125
+ await releaseRemoteLock(octokit, owner, repo, sha, 'failure');
126
+ // Drain the shared array via shift() so the runner's finally (which
127
+ // also drains via shift) doesn't double-release. Whichever loop
128
+ // shifts a sha first owns its release; the other sees a shorter
129
+ // array. This also prevents the reverse race — a signal arriving
130
+ // after the runner has already released a sha as 'success' would
131
+ // otherwise overwrite it with 'failure' here.
132
+ while (pushedShas.length > 0) {
133
+ const s = pushedShas.shift();
134
+ try {
135
+ await releaseRemoteLock(octokit, owner, repo, s, 'failure');
136
+ }
137
+ catch { /* best-effort per sha */ }
138
+ }
139
+ }
140
+ }
141
+ catch { /* best-effort — must still exit even if remote release fails */ }
142
+ try {
143
+ releasePRLock(owner, repo, number, sha);
144
+ }
145
+ catch { /* ignore */ }
146
+ if (acquiredTmpDir)
147
+ try {
148
+ rmSync(acquiredTmpDir, { force: true, recursive: true });
149
+ }
150
+ catch { /* ignore */ }
151
+ // 128 + signal number (SIGINT=2 → 130, SIGTERM=15 → 143) per POSIX convention
152
+ process.exit(signal === 'SIGTERM' ? 143 : 130);
153
+ })();
154
+ };
155
+ process.on('SIGINT', onSignal);
156
+ process.on('SIGTERM', onSignal);
157
+ try {
158
+ if (!opts.dryRun) {
159
+ if (await checkRemoteLock(octokit, owner, repo, sha)) {
160
+ releasePRLock(owner, repo, number, sha);
161
+ fileLog({ level: 'info', event: 'pr_skipped', repo: `${owner}/${repo}`, pr: number, reason: 'in_progress_remote' });
162
+ console.log(chalk.yellow(`⚠ PR #${number} is already being reviewed on another machine — skipping`));
163
+ return;
164
+ }
165
+ try {
166
+ // Set the flag BEFORE the await so a signal that interrupts the in-flight
167
+ // request still triggers releaseRemoteLock (GitHub may have already
168
+ // created the pending status server-side).
169
+ lockAttemptStarted = true;
170
+ await acquireRemoteLock(octokit, owner, repo, sha);
171
+ }
172
+ catch (err) {
173
+ releasePRLock(owner, repo, number, sha);
174
+ throw err;
175
+ }
176
+ }
177
+ // Clone the repo
178
+ const tmpDir = mkdtempSync(join(tmpdir(), 'crosscheck-run-'));
179
+ acquiredTmpDir = tmpDir;
180
+ const cloneSpinner = ora('Cloning repo...').start();
181
+ try {
182
+ clonePRForReview({
183
+ owner, repo, prNumber: number, baseRef: prData.base.ref,
184
+ tmpDir, token, protocol: config.clone_protocol,
185
+ onBaseFetchFailed: () => fileLog({ level: 'warn', event: 'base_branch_fetch_skipped', repo: `${owner}/${repo}`, pr: number, base: prData.base.ref }),
186
+ });
187
+ cloneSpinner.succeed('Repo ready');
188
+ if (!opts.dryRun)
189
+ stopHeartbeat = startRemoteLockHeartbeat(octokit, owner, repo, sha);
190
+ let activeSpinner = ora('').start();
191
+ const { verdict } = await runWorkflow({
192
+ owner,
193
+ repoName: repo,
194
+ prNumber: number,
195
+ pr,
196
+ tmpDir,
197
+ token,
198
+ config,
199
+ origin,
200
+ reviewStart: Date.now(),
201
+ log: (msg) => { activeSpinner.stop(); console.log(msg); activeSpinner = ora('').start(); },
202
+ onPhaseChange: (label) => { activeSpinner.text = label; },
203
+ crosscheckShas: new Set(),
204
+ pushedShas,
205
+ dryRun: opts.dryRun,
206
+ steps: filteredSteps,
207
+ initialReviewComment: opts.initialReviewComment,
208
+ });
209
+ activeSpinner.stop();
210
+ console.log(`\n ${formatVerdict(verdict)}`);
211
+ if (!opts.dryRun) {
212
+ console.log(chalk.green(`\n✓ Workflow complete — ${prUrl}\n`));
213
+ }
214
+ else {
215
+ console.log(chalk.dim(`\n dry-run complete — no changes posted\n`));
216
+ }
217
+ stopHeartbeat();
218
+ if (!opts.dryRun)
219
+ await releaseRemoteLock(octokit, owner, repo, sha, 'success');
220
+ }
221
+ catch (err) {
222
+ stopHeartbeat();
223
+ if (!opts.dryRun)
224
+ await releaseRemoteLock(octokit, owner, repo, sha, 'failure');
225
+ logError({ repo: `${owner}/${repo}`, pr: number, phase: 'run' }, err);
226
+ console.error(chalk.red(`\n✗ ${err instanceof Error ? err.message : String(err)}\n`));
227
+ releasePRLock(owner, repo, number, sha);
228
+ if (acquiredTmpDir)
229
+ rmSync(acquiredTmpDir, { force: true, recursive: true });
230
+ process.exit(2);
231
+ }
232
+ finally {
233
+ releasePRLock(owner, repo, number, sha);
234
+ if (acquiredTmpDir)
235
+ rmSync(acquiredTmpDir, { force: true, recursive: true });
236
+ }
237
+ }
238
+ finally {
239
+ process.removeListener('SIGINT', onSignal);
240
+ process.removeListener('SIGTERM', onSignal);
241
+ }
242
+ }
243
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ import { type ScanResult } from '../lib/pr-status.js';
2
+ export interface ScanOpts {
3
+ tidy?: boolean;
4
+ force?: boolean;
5
+ staleAfter?: string;
6
+ json?: boolean;
7
+ }
8
+ interface LoadScanOptions {
9
+ force?: boolean;
10
+ staleAfterMs: number;
11
+ }
12
+ export declare function loadScanResult(options: LoadScanOptions): Promise<ScanResult>;
13
+ export declare function runScan(opts?: ScanOpts): Promise<void>;
14
+ export declare function printScanResult(result: ScanResult, tidy: boolean): void;
15
+ export declare function handleScanError(command: string, err: unknown): never;
16
+ type ReviewState = 'PR' | 'APPROVE' | 'NEEDS_WORK' | 'BLOCK';
17
+ type StepType = 'review' | 'fix' | 'recheck';
18
+ export interface ScanTokens {
19
+ review: number;
20
+ fix: number;
21
+ recheck: number;
22
+ total: number;
23
+ }
24
+ export interface ScanAnnotationMetadata {
25
+ commentId: number;
26
+ commentCreatedAt: string;
27
+ raw: string;
28
+ origin?: string;
29
+ reviewer?: string;
30
+ verdict?: ReviewState;
31
+ type?: string;
32
+ isRecheck?: boolean;
33
+ }
34
+ export interface ScanRow {
35
+ repo: string;
36
+ pr: number;
37
+ title: string;
38
+ author: string;
39
+ branch: string;
40
+ headSha: string;
41
+ headShaShort: string;
42
+ url: string;
43
+ createdAt: string;
44
+ lastActiveAt: string;
45
+ isStale: boolean;
46
+ reviewState: ReviewState;
47
+ latestVerdict: ReviewState | null;
48
+ progressSummary: string;
49
+ tokens: ScanTokens;
50
+ latestAnnotation: ScanAnnotationMetadata | null;
51
+ nextAction: string | null;
52
+ }
53
+ export interface LogEntry {
54
+ ts: string;
55
+ event: string;
56
+ repo?: string;
57
+ pr?: number;
58
+ step_type?: string;
59
+ verdict?: string | null;
60
+ tokens_used?: number;
61
+ applied_count?: number;
62
+ conflicts_resolved?: number;
63
+ reason?: string;
64
+ }
65
+ export interface PRLogSummary {
66
+ reviewVerdict: ReviewState | null;
67
+ recheckVerdict: ReviewState | null;
68
+ latestVerdict: ReviewState | null;
69
+ latestVerdictAt: string | null;
70
+ latestStep: StepType | null;
71
+ latestLogAt: string | null;
72
+ fixAppliedCount: number | null;
73
+ fixCompletedAt: string | null;
74
+ tokens: ScanTokens;
75
+ }
76
+ export declare function filterScanRowsForOutput(rows: ScanRow[], tidy: boolean): ScanRow[];
77
+ export declare function chooseLatestVerdict(annotationVerdict: ReviewState, annotationAt: string, logSummary: PRLogSummary): ReviewState | null;
78
+ export declare function selectNextAction(latestVerdict: ReviewState | null, logSummary: PRLogSummary): string | null;
79
+ export declare function buildProgressSummary(annotation: ScanAnnotationMetadata | null, logSummary: PRLogSummary): string;
80
+ interface ScanAnnotations {
81
+ latestAnnotation: ScanAnnotationMetadata | null;
82
+ latestVerdictAnnotation: ScanAnnotationMetadata | null;
83
+ }
84
+ export declare function findLatestAnnotation(comments: Array<{
85
+ id: number;
86
+ body: string;
87
+ createdAt: string;
88
+ author?: string;
89
+ updatedAt?: string;
90
+ }>): ScanAnnotations;
91
+ export declare function applyLogEntry(summary: PRLogSummary, entry: LogEntry): void;
92
+ export declare function emptyLogSummary(): PRLogSummary;
93
+ export {};
94
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,276 @@
1
+ import chalk from 'chalk';
2
+ import { createHash } from 'crypto';
3
+ import { getGithubToken, loadConfig } from '../config/loader.js';
4
+ import { formatDuration, parseDuration } from '../lib/durations.js';
5
+ import { initLogger, logError } from '../lib/logger.js';
6
+ import { UserInputError } from '../lib/pr-picker.js';
7
+ import { scanOpenPRStatuses } from '../lib/pr-status.js';
8
+ import { readScanCache, writeScanCache } from '../lib/scan-cache.js';
9
+ export async function loadScanResult(options) {
10
+ const config = loadConfig();
11
+ initLogger(config.logs);
12
+ const token = getGithubToken();
13
+ const now = new Date();
14
+ const scopeHash = buildScanScopeHash(config);
15
+ if (!options.force) {
16
+ const cached = readScanCache({
17
+ nowMs: now.getTime(),
18
+ staleAfterMs: options.staleAfterMs,
19
+ scopeHash,
20
+ });
21
+ if (cached)
22
+ return { ...cached, cached: true };
23
+ }
24
+ const scan = await scanOpenPRStatuses(config, token, {
25
+ now,
26
+ staleAfterMs: options.staleAfterMs,
27
+ });
28
+ const result = { ...scan, scopeHash };
29
+ writeScanCache(toCachePayload(result));
30
+ return result;
31
+ }
32
+ export async function runScan(opts = {}) {
33
+ let staleAfterMs;
34
+ try {
35
+ staleAfterMs = parseDuration(opts.staleAfter ?? '24h');
36
+ }
37
+ catch (err) {
38
+ console.error(chalk.red(`✗ ${err instanceof Error ? err.message : String(err)}`));
39
+ process.exit(1);
40
+ }
41
+ try {
42
+ const result = await loadScanResult({ force: opts.force, staleAfterMs });
43
+ if (opts.json) {
44
+ console.log(JSON.stringify(result, null, 2));
45
+ return;
46
+ }
47
+ printScanResult(result, opts.tidy === true);
48
+ }
49
+ catch (err) {
50
+ handleScanError('scan', err);
51
+ }
52
+ }
53
+ export function printScanResult(result, tidy) {
54
+ const visible = tidy
55
+ ? result.prs.filter(pr => pr.freshness === 'stale' && pr.nextAction !== null)
56
+ : result.prs;
57
+ const cacheNote = result.cached ? chalk.dim(' cached') : '';
58
+ console.log(`crosscheck scan${cacheNote}`);
59
+ console.log(chalk.dim(` scanned ${result.scannedAt}`));
60
+ console.log(chalk.dim(` stale after ${formatDuration(result.staleAfterMs)}`));
61
+ console.log(` total ${result.summary.total}`);
62
+ console.log(` stale ${chalk.yellow(result.summary.stale)}`);
63
+ console.log(` actionable ${chalk.cyan(result.summary.actionable)}`);
64
+ console.log();
65
+ if (visible.length === 0) {
66
+ console.log(tidy ? chalk.dim('No stale PRs need attention.') : chalk.dim('No open PRs found in the configured monitor scope.'));
67
+ return;
68
+ }
69
+ for (const pr of visible) {
70
+ console.log(formatPRLine(pr));
71
+ }
72
+ }
73
+ function formatPRLine(pr) {
74
+ const freshness = pr.freshness === 'stale' ? chalk.yellow('stale') : chalk.dim('not_stale');
75
+ const next = pr.nextAction ? `next=${pr.nextAction}` : 'terminal';
76
+ const age = formatAge(pr.ageMs);
77
+ return [
78
+ ` ${freshness}`,
79
+ chalk.cyan(`#${pr.number}`),
80
+ `${pr.owner}/${pr.repo}`,
81
+ chalk.bold(pr.reviewState),
82
+ chalk.dim(`last=${age}`),
83
+ chalk.dim(next),
84
+ pr.title,
85
+ ].join(' ');
86
+ }
87
+ function formatAge(ms) {
88
+ const minuteMs = 60 * 1000;
89
+ const hourMs = 60 * minuteMs;
90
+ const dayMs = 24 * hourMs;
91
+ if (ms >= dayMs)
92
+ return `${Math.floor(ms / dayMs)}d`;
93
+ if (ms >= hourMs)
94
+ return `${Math.floor(ms / hourMs)}h`;
95
+ return `${Math.floor(ms / minuteMs)}m`;
96
+ }
97
+ function toCachePayload(result) {
98
+ return {
99
+ scannedAt: result.scannedAt,
100
+ staleAfterMs: result.staleAfterMs,
101
+ ...(result.scopeHash && { scopeHash: result.scopeHash }),
102
+ summary: result.summary,
103
+ prs: result.prs,
104
+ };
105
+ }
106
+ export function handleScanError(command, err) {
107
+ logError({ command }, err);
108
+ const message = err instanceof Error ? err.message : String(err);
109
+ console.error(chalk.red(`✗ ${message}`));
110
+ process.exit(isUserError(err, message) ? 1 : 2);
111
+ }
112
+ function isUserError(err, message) {
113
+ return err instanceof UserInputError
114
+ || message.startsWith('No GitHub token found')
115
+ || message.includes('Invalid configuration');
116
+ }
117
+ function buildScanScopeHash(config) {
118
+ const scope = {
119
+ orgs: [...config.orgs].sort(),
120
+ repos: config.repos.map(repo => `${repo.owner}/${repo.name}`).sort(),
121
+ users: [...config.users].sort(),
122
+ allowedAuthors: [...config.routing.allowed_authors].sort(),
123
+ };
124
+ return createHash('sha256').update(JSON.stringify(scope)).digest('hex');
125
+ }
126
+ export function filterScanRowsForOutput(rows, tidy) {
127
+ if (!tidy)
128
+ return rows;
129
+ return rows.filter(row => row.isStale && row.nextAction !== null);
130
+ }
131
+ export function chooseLatestVerdict(annotationVerdict, annotationAt, logSummary) {
132
+ if (!logSummary.latestVerdictAt)
133
+ return annotationVerdict;
134
+ return new Date(annotationAt).getTime() >= new Date(logSummary.latestVerdictAt).getTime()
135
+ ? annotationVerdict
136
+ : logSummary.latestVerdict;
137
+ }
138
+ export function selectNextAction(latestVerdict, logSummary) {
139
+ if (!latestVerdict || latestVerdict === 'PR')
140
+ return 'next CR';
141
+ if (latestVerdict === 'APPROVE')
142
+ return 'next merge';
143
+ if (latestVerdict === 'NEEDS_WORK' || latestVerdict === 'BLOCK') {
144
+ if (logSummary.latestStep === 'fix')
145
+ return 'next recheck';
146
+ return 'next fix';
147
+ }
148
+ return null;
149
+ }
150
+ export function buildProgressSummary(annotation, logSummary) {
151
+ const parts = ['PR'];
152
+ if (logSummary.reviewVerdict) {
153
+ parts.push(`CR(${logSummary.reviewVerdict})`);
154
+ }
155
+ else if (annotation?.verdict) {
156
+ parts.push(`${annotation.isRecheck ? 'recheck' : 'CR'}(${annotation.verdict})`);
157
+ }
158
+ if (logSummary.fixAppliedCount !== null)
159
+ parts.push(`fix(${logSummary.fixAppliedCount})`);
160
+ const recheckVerdict = logSummary.recheckVerdict;
161
+ if (recheckVerdict)
162
+ parts.push(`recheck(${recheckVerdict})`);
163
+ return parts.join(' -> ');
164
+ }
165
+ export function findLatestAnnotation(comments) {
166
+ let latestAnnotation = null;
167
+ let latestVerdictAnnotation = null;
168
+ const orderedComments = [...comments].sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());
169
+ for (const comment of orderedComments) {
170
+ const matches = [...comment.body.matchAll(/<!-- crosscheck: ([^>]+) -->/g)];
171
+ const match = matches.at(-1);
172
+ if (!match)
173
+ continue;
174
+ const attrs = parseAttrs(match[1]);
175
+ const annotation = {
176
+ commentId: comment.id,
177
+ commentCreatedAt: comment.createdAt,
178
+ raw: match[1],
179
+ origin: attrs.origin,
180
+ reviewer: attrs.reviewer,
181
+ verdict: normalizeReviewState(attrs.verdict) ?? undefined,
182
+ type: attrs.type,
183
+ isRecheck: attrs.type === 'recheck' || comment.body.startsWith('> Recheck of'),
184
+ };
185
+ latestAnnotation = annotation;
186
+ if (annotation.verdict)
187
+ latestVerdictAnnotation = annotation;
188
+ }
189
+ return { latestAnnotation, latestVerdictAnnotation };
190
+ }
191
+ export function applyLogEntry(summary, entry) {
192
+ if (entry.ts)
193
+ summary.latestLogAt = maxTimestamp([summary.latestLogAt, entry.ts]);
194
+ if (entry.event === 'review_complete') {
195
+ const verdict = normalizeReviewState(entry.verdict ?? undefined);
196
+ const stepType = entry.step_type === 'recheck' ? 'recheck' : 'review';
197
+ if (stepType === 'recheck')
198
+ summary.recheckVerdict = verdict;
199
+ else
200
+ summary.reviewVerdict = verdict;
201
+ if (verdict) {
202
+ summary.latestVerdict = verdict;
203
+ summary.latestVerdictAt = entry.ts;
204
+ summary.latestStep = stepType;
205
+ }
206
+ addTokens(summary.tokens, stepType, entry.tokens_used);
207
+ }
208
+ else if (entry.event === 'fix_complete') {
209
+ if (entry.applied_count !== undefined)
210
+ summary.fixAppliedCount = entry.applied_count;
211
+ summary.fixCompletedAt = entry.ts;
212
+ summary.latestStep = 'fix';
213
+ addTokens(summary.tokens, 'fix', entry.tokens_used);
214
+ }
215
+ else if (entry.event === 'conflict_resolve_complete') {
216
+ if (entry.conflicts_resolved !== undefined)
217
+ summary.fixAppliedCount = entry.conflicts_resolved;
218
+ summary.fixCompletedAt = entry.ts;
219
+ summary.latestStep = 'fix';
220
+ addTokens(summary.tokens, 'fix', entry.tokens_used);
221
+ }
222
+ }
223
+ export function emptyLogSummary() {
224
+ return {
225
+ reviewVerdict: null,
226
+ recheckVerdict: null,
227
+ latestVerdict: null,
228
+ latestVerdictAt: null,
229
+ latestStep: null,
230
+ latestLogAt: null,
231
+ fixAppliedCount: null,
232
+ fixCompletedAt: null,
233
+ tokens: { review: 0, fix: 0, recheck: 0, total: 0 },
234
+ };
235
+ }
236
+ function parseAttrs(raw) {
237
+ const attrs = {};
238
+ for (const part of raw.trim().split(/\s+/)) {
239
+ const eq = part.indexOf('=');
240
+ if (eq <= 0)
241
+ continue;
242
+ attrs[part.slice(0, eq)] = part.slice(eq + 1);
243
+ }
244
+ return attrs;
245
+ }
246
+ function normalizeReviewState(value) {
247
+ if (!value)
248
+ return null;
249
+ const normalized = value.toUpperCase().replace(/\s+/g, '_');
250
+ if (normalized === 'APPROVE')
251
+ return 'APPROVE';
252
+ if (normalized === 'NEEDS_WORK')
253
+ return 'NEEDS_WORK';
254
+ if (normalized === 'BLOCK')
255
+ return 'BLOCK';
256
+ return null;
257
+ }
258
+ function maxTimestamp(values) {
259
+ let latest = null;
260
+ for (const value of values) {
261
+ if (!value)
262
+ continue;
263
+ if (Number.isNaN(new Date(value).getTime()))
264
+ continue;
265
+ if (!latest || new Date(value).getTime() > new Date(latest).getTime())
266
+ latest = value;
267
+ }
268
+ return latest;
269
+ }
270
+ function addTokens(tokens, step, value) {
271
+ if (value === undefined)
272
+ return;
273
+ tokens[step] += value;
274
+ tokens.total += value;
275
+ }
276
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}