@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,1208 @@
1
+ <div align="right">
2
+ <h5><a href="./get-started.md">🌐 &nbsp;English</a></h5>
3
+ </div>
4
+
5
+ # crosscheck — 快速上手
6
+
7
+ ## 目录
8
+
9
+ - [前提条件](#前提条件)
10
+ - [安装](#安装)
11
+ - [环境变量](#环境变量)
12
+ - [第一步 — 配置 crosscheck](#第一步--配置-crosscheck)
13
+ - [第二步 — 用单个 PR 测试](#第二步--用单个-pr-测试)
14
+ - [第三步 — 选择部署模式](#第三步--选择部署模式)
15
+ - [第四步 — 验证运行正常](#第四步--验证运行正常)
16
+ - [命令](#命令)
17
+ - [init](#crosscheck-init)
18
+ - [onboard](#crosscheck-onboard)
19
+ - [review](#crosscheck-review-pr-url)
20
+ - [run](#crosscheck-run-pr-url)
21
+ - [watch](#crosscheck-watch)
22
+ - [serve](#crosscheck-serve-beta)
23
+ - [status](#crosscheck-status)
24
+ - [diagnose](#crosscheck-diagnose)
25
+ - [optimize](#crosscheck-optimize)
26
+ - [impact](#crosscheck-impact)
27
+ - [issue](#crosscheck-issue)
28
+ - [自定义根目录](#自定义根目录)
29
+ - [配置](#配置)
30
+ - [工作原理](#工作原理)
31
+ - [审查后自动修复](#审查后自动修复)
32
+ - [常见问题](#常见问题)
33
+
34
+ ---
35
+
36
+ ## 前提条件
37
+
38
+ 运行 crosscheck 之前,你需要安装并认证以下三个 CLI 工具。
39
+
40
+ ### Claude Code
41
+
42
+ ```bash
43
+ npm install -g @anthropic-ai/claude-code
44
+ claude # 按提示登录 claude.ai
45
+ ```
46
+
47
+ 需要 Claude Pro 或 Max 订阅计划。审查使用你的订阅配额,无需按 token 计费。
48
+
49
+ ### Codex
50
+
51
+ ```bash
52
+ npm install -g @openai/codex
53
+ codex login --device-auth # 使用 ChatGPT 账号 OAuth 登录
54
+ ```
55
+
56
+ 需要 ChatGPT Plus 或 Pro 订阅。通过 `--device-auth` 认证后,审查消耗订阅配额,无需 API Key。
57
+
58
+ 如果你更倾向于使用 OpenAI API Key:
59
+
60
+ ```bash
61
+ printenv OPENAI_API_KEY | codex login --with-api-key
62
+ ```
63
+
64
+ 然后在配置中设置 `auth: api-key` 以启用模型选择。
65
+
66
+ ### GitHub CLI
67
+
68
+ ```bash
69
+ brew install gh # macOS
70
+ gh auth login
71
+ ```
72
+
73
+ 用于克隆 PR 分支,在 watch 模式下自动注册 Webhook。
74
+
75
+ ---
76
+
77
+ ## 安装
78
+
79
+ **稳定版(推荐):**
80
+
81
+ ```bash
82
+ npm install -g @humanbased/crosscheck
83
+ ```
84
+
85
+ **Beta 版(最新特性,可能存在问题):**
86
+
87
+ ```bash
88
+ npm install -g @humanbased/crosscheck@beta
89
+ ```
90
+
91
+ **npx — 无需安装:**
92
+
93
+ ```bash
94
+ npx @humanbased/crosscheck <命令>
95
+ npx @humanbased/crosscheck@beta <命令>
96
+ ```
97
+
98
+ **从源码安装:**
99
+
100
+ ```bash
101
+ git clone https://github.com/humanbased-ai/crosscheck
102
+ cd crosscheck
103
+ npm install && npm run build && npm link
104
+ ```
105
+
106
+ ---
107
+
108
+ ## 环境变量
109
+
110
+ ### GitHub 认证 — 两种方式(选其一)
111
+
112
+ **方式一 — gh CLI(推荐):** 认证一次,crosscheck 自动获取 Token:
113
+
114
+ ```bash
115
+ gh auth login
116
+ ```
117
+
118
+ **方式二 — Personal Access Token:** 适合 CI 环境或偏好显式 Token:
119
+
120
+ ```bash
121
+ export GITHUB_TOKEN=ghp_...
122
+ ```
123
+
124
+ Classic PAT 需要 `repo` 和 `admin:org_hook` 权限(Org 级别 Webhook 需要 `admin:org_hook`;仅 Repo 级别只需 `repo`)。在 [github.com/settings/tokens](https://github.com/settings/tokens) 生成。
125
+
126
+ 如果两者都存在,crosscheck 优先使用 `gh` keyring 中的 Token(始终最新),以 `GITHUB_TOKEN` 为备选。
127
+
128
+ ### Webhook Secret — 自动管理
129
+
130
+ `CROSSCHECK_WEBHOOK_SECRET` 是**可选的**。如果未设置,crosscheck 会在首次使用时生成一个随机 Secret,保存到 `~/.crosscheck/webhook-secret`(仅本人可读),之后每次运行自动复用。
131
+
132
+ 稍后查询(例如需要手动注册 Webhook 时):
133
+
134
+ ```bash
135
+ cat ~/.crosscheck/webhook-secret
136
+ ```
137
+
138
+ 如需使用自定义 Secret,在 shell 配置文件中设置:
139
+
140
+ ```bash
141
+ export CROSSCHECK_WEBHOOK_SECRET=your-secret
142
+ ```
143
+
144
+ ---
145
+
146
+ ## 第一步 — 配置 crosscheck
147
+
148
+ ```bash
149
+ crosscheck onboard
150
+ ```
151
+
152
+ `crosscheck onboard` 是推荐的首次配置方式。它会检查你的 CLI 环境,引导你完成部署模式选择、仓库选择、审查模式和工作流流水线,然后一次性写入可用的配置。详见 [`crosscheck onboard`](#crosscheck-onboard) 命令参考。
153
+
154
+ 完成后直接运行 `crosscheck watch` 即可,无需单独执行 init 步骤。
155
+
156
+ > 如果你希望跳过向导手动配置,可运行 `crosscheck init` 生成初始配置,然后直接编辑 `~/.crosscheck/config.yml`。
157
+
158
+ ---
159
+
160
+ ## 第二步 — 用单个 PR 测试
161
+
162
+ 在持续运行之前,先用一个 PR 验证端到端流程:
163
+
164
+ ```bash
165
+ crosscheck review https://github.com/owner/repo/pull/123 --reviewer codex
166
+ ```
167
+
168
+ 此命令会克隆 PR 分支,运行 Codex 审查,并在 PR 中发布评论。如果无报错完成,说明你的配置正常。
169
+
170
+ 也可以用 Claude 作为审查者:
171
+
172
+ ```bash
173
+ crosscheck review https://github.com/owner/repo/pull/123 --reviewer claude
174
+ ```
175
+
176
+ ---
177
+
178
+ ## 第三步 — 选择部署模式
179
+
180
+ ### 个人模式 vs 团队模式
181
+
182
+ 首次运行时,`crosscheck watch`(或 `crosscheck serve`)会询问使用方式:
183
+
184
+ ```
185
+ How are you using crosscheck?
186
+
187
+ [1] personal — monitor all your repos and orgs; review only PRs you author
188
+ [2] team — monitor org repos only; review all PRs from any author
189
+
190
+ Choice [1]:
191
+ ```
192
+
193
+ 选择会以 `deployment: personal` 或 `deployment: team` 的形式保存到 `crosscheck.config.yml`。
194
+
195
+ **个人模式**(默认,个人开发者推荐)
196
+ - 监控你 GitHub 账号下的所有个人仓库 + 所属所有 Org
197
+ - 只审查你提交的 PR,忽略其他人的
198
+ - 自动将 `routing.allowed_authors` 设置为你的 GitHub 登录名
199
+
200
+ **团队模式**(共享机器推荐)
201
+ - 只监控你所属 Org 的仓库(不含个人仓库)
202
+ - 审查所有人提交的 PR,不过滤作者
203
+
204
+ 单次会话覆盖已保存的选择(不修改配置):
205
+
206
+ ```bash
207
+ crosscheck watch --personal # 本次会话使用个人模式
208
+ crosscheck watch --team # 本次会话使用团队模式
209
+ ```
210
+
211
+ 重新运行提示并永久修改选择:
212
+
213
+ ```bash
214
+ crosscheck watch --reconfigure
215
+ ```
216
+
217
+ ### Watch 模式 — 适合开发机器
218
+
219
+ 启动本地服务器,通过 `localhost.run`(SSH,无需额外安装)开通公网隧道,让 GitHub 能访问你的本地机器。自动注册 Webhook,支持 Org 级或 Repo 级覆盖,终端开启期间持续运行。
220
+
221
+ ```bash
222
+ # 监控整个 Org(在 crosscheck.config.yml 中配置)
223
+ crosscheck watch
224
+
225
+ # 或在仓库目录内运行 — 自动从 git remote 检测
226
+ cd /path/to/your/repo && crosscheck watch
227
+ ```
228
+
229
+ ```
230
+ crosscheck watch
231
+
232
+ orgs humanbased-ai, codatta
233
+ mode cross-vendor
234
+ quality balanced
235
+ config ./crosscheck.config.yml ← 编辑可修改以上配置
236
+
237
+ ✓ tunnel ready: https://abc123.lhr.life
238
+ tunnel https://abc123.lhr.life
239
+ ✓ webhook registered for humanbased-ai
240
+
241
+ Waiting for PR events — Ctrl+C to stop.
242
+ ```
243
+
244
+ 按下 `Ctrl+C` 后,SSH 隧道和已注册的 Webhook 会自动清理。
245
+
246
+ **Org Webhook 所需 Token 权限:** `GITHUB_TOKEN` 需要 `write:org` 权限用于 Org 级覆盖,Repo 级只需 `repo` 权限。
247
+
248
+ ### Serve 模式 [BETA] — 适合常驻机器(mac-mini、家庭服务器)
249
+
250
+ > **Beta:** `serve` 功能可用,但尚未经过充分生产验证。欢迎在 [github.com/humanbased-ai/crosscheck/issues](https://github.com/humanbased-ai/crosscheck/issues) 报告问题。
251
+
252
+ 监听固定端口,Webhook 只需手动注册一次,永久生效。
253
+
254
+ ```bash
255
+ crosscheck serve
256
+ ```
257
+
258
+ ```
259
+ crosscheck serving
260
+ ⚠ serve is in beta — report issues at github.com/humanbased-ai/crosscheck/issues
261
+
262
+ mode cross-vendor
263
+ quality balanced
264
+ port 7891
265
+ endpoint http://your-machine.local:7891/webhook
266
+
267
+ Register the endpoint above as a GitHub org webhook (content-type: application/json).
268
+ → https://github.com/organizations/humanbased-ai/settings/hooks
269
+ → https://github.com/organizations/codatta/settings/hooks
270
+ ```
271
+
272
+ **Org 级覆盖**(覆盖 Org 下所有仓库),在以下位置注册:
273
+ `https://github.com/organizations/<org>/settings/hooks`
274
+
275
+ **Repo 级覆盖**,在以下位置注册:
276
+ `https://github.com/<owner>/<repo>/settings/hooks`
277
+
278
+ - Payload URL:`http://your-machine:7891/webhook`
279
+ - Content type:`application/json`
280
+ - Secret:`CROSSCHECK_WEBHOOK_SECRET` 的值
281
+ - 触发事件:仅 **Pull requests**
282
+
283
+ **macOS launchd 后台服务配置:**
284
+
285
+ ```xml
286
+ <!-- ~/Library/LaunchAgents/dev.crosscheck.plist -->
287
+ <?xml version="1.0" encoding="UTF-8"?>
288
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
289
+ <plist version="1.0">
290
+ <dict>
291
+ <key>Label</key><string>dev.crosscheck</string>
292
+ <key>ProgramArguments</key>
293
+ <array>
294
+ <string>/usr/local/bin/crosscheck</string>
295
+ <string>serve</string>
296
+ </array>
297
+ <key>EnvironmentVariables</key>
298
+ <dict>
299
+ <key>GITHUB_TOKEN</key><string>ghp_your_token</string>
300
+ <key>CROSSCHECK_WEBHOOK_SECRET</key><string>your_secret</string>
301
+ </dict>
302
+ <key>RunAtLoad</key><true/>
303
+ <key>KeepAlive</key><true/>
304
+ <key>StandardOutPath</key><string>/tmp/crosscheck.log</string>
305
+ <key>StandardErrorPath</key><string>/tmp/crosscheck.error.log</string>
306
+ </dict>
307
+ </plist>
308
+ ```
309
+
310
+ ```bash
311
+ launchctl load ~/Library/LaunchAgents/dev.crosscheck.plist
312
+ launchctl start dev.crosscheck
313
+ ```
314
+
315
+ **pm2 运行(跨平台):**
316
+
317
+ ```bash
318
+ npm install -g pm2
319
+ pm2 start crosscheck -- serve
320
+ pm2 save && pm2 startup
321
+ ```
322
+
323
+ ---
324
+
325
+ ## 第四步 — 验证运行正常
326
+
327
+ 提交一个 PR(或向已有 PR 推送)。你应该看到:
328
+
329
+ 1. 事件到达时,终端中出现日志行
330
+ 2. 约 60 秒内,PR 中发布代码审查评论
331
+
332
+ 如果没有出现,运行 `crosscheck status` 检查认证和配置,然后在 GitHub 的 `Settings → Webhooks → Recent Deliveries` 查看 Webhook 投递日志。
333
+
334
+ ---
335
+
336
+ ## 命令
337
+
338
+ ### `crosscheck init`
339
+
340
+ 检查环境并生成初始配置文件。
341
+
342
+ ```bash
343
+ crosscheck init
344
+ crosscheck init --config /path/to/crosscheck.config.yml
345
+ ```
346
+
347
+ 检查内容:`codex` CLI、`claude` CLI、`gh` CLI、`GITHUB_TOKEN`、`CROSSCHECK_WEBHOOK_SECRET`。
348
+
349
+ | 参数 | 说明 |
350
+ |---|---|
351
+ | `-c, --config <path>` | 将配置文件写入指定路径 |
352
+
353
+ ---
354
+
355
+ ### `crosscheck onboard`
356
+
357
+ 推荐的首次配置命令,交互式引导完成七个步骤并写入可用配置。
358
+
359
+ ```bash
360
+ crosscheck onboard
361
+ crosscheck onboard --yes # 非交互式,接受所有默认值
362
+ crosscheck onboard --personal # 本次会话强制使用个人模式
363
+ crosscheck onboard --team # 本次会话强制使用团队模式
364
+ crosscheck onboard --reconfigure # 即使配置已存在也重新运行设置
365
+ ```
366
+
367
+ **七个步骤:**
368
+
369
+ **步骤 1 — 环境检查。** 验证 codex CLI、claude CLI、gh CLI 和 GitHub Token。至少需要一个 AI CLI 已认证;gh auth 始终必须。打印 ✓/✗ 及修复提示。
370
+
371
+ **步骤 2 — 部署模式。** 选择 crosscheck 的工作范围:
372
+ - `personal` — 监控你的个人仓库 + 所属所有 Org;只审查你提交的 PR
373
+ - `team` — 只监控 Org 仓库;审查所有人提交的 PR
374
+
375
+ **步骤 3 — 仓库选择。** 列出可访问的仓库和 Org,选择要监控的目标。选择 Org 级别可用一个 Webhook 覆盖该 Org 下所有仓库。
376
+
377
+ **步骤 4 — 审查模式。** 如果两个 CLI 都可用,选择:
378
+ - `cross-vendor` — Claude 审查 Codex 的 PR;Codex 审查 Claude 的 PR(同时使用两个 Agent 时推荐)
379
+ - `single-vendor` — 一个 AI 审查所有 PR(只安装了一个 CLI 时默认)
380
+
381
+ **步骤 5 — 工作流流水线。** 选择审查后的行为:
382
+
383
+ ```
384
+ [1] review only — AI 发布评论;由你处理修复
385
+ [2] review → fix — AI 审查,然后自动应用修复(推荐)
386
+ [3] review → fix → re-check — 完整闭环:审查、修复、再次审查确认
387
+ ```
388
+
389
+ 选择 `review → fix → re-check` 会写入包含三个流水线步骤的 `~/.crosscheck/workflow.yml`。
390
+
391
+ **步骤 6 — 连接方式。** 选择 GitHub Webhook 如何到达本地服务器:
392
+ - `localhost.run` — 零配置 SSH 隧道;自动重连,无需安装 *(默认)*
393
+ - `smee.io` — Webhook 中继;离线时事件排队,频道 URL 稳定(需要 `npm install -g smee-client` 和配置中的 `tunnel.smee_channel`)
394
+
395
+ **步骤 7 — 确认并写入配置。** 展示所有选择的摘要并写入 `~/.crosscheck/config.yml`(以及选择了 re-check 时的 `workflow.yml`)。
396
+
397
+ ```
398
+ crosscheck onboard
399
+
400
+ Step 1 — environment check
401
+ ✓ codex CLI codex-cli 0.128.0 — authenticated
402
+ ✓ claude CLI 2.1.x (Claude Code)
403
+ ✓ gh CLI gh version 2.65.0
404
+ ✓ GITHUB_TOKEN set (gh auth login)
405
+
406
+ Step 2 — deployment mode
407
+ [1] personal [2] team
408
+ Choice [1]: 1
409
+
410
+ Step 3 — select repos to monitor
411
+ [1] humanbased-ai (org · 12 repos)
412
+ [2] codatta (org · 5 repos)
413
+ [3] your-github-login (personal · 8 repos)
414
+ Select [all]: 1,3
415
+
416
+ Step 4 — review mode
417
+ [1] cross-vendor [2] single-vendor
418
+ Choice [1]: 1
419
+
420
+ Step 5 — workflow pipeline
421
+ [1] review only [2] review → fix [3] review → fix → re-check
422
+ Choice [2]: 3
423
+
424
+ Step 6 — connection type
425
+ [1] localhost.run [2] smee.io
426
+ Choice [1]: 1
427
+
428
+ Step 7 — review and write config
429
+ deployment personal
430
+ connection localhost.run
431
+ orgs humanbased-ai
432
+ users your-github-login (8 repos)
433
+ mode cross-vendor
434
+ pipeline review-fix-recheck
435
+ config ~/.crosscheck/config.yml
436
+
437
+ ✓ config written to ~/.crosscheck/config.yml
438
+ ✓ workflow written to ~/.crosscheck/workflow.yml
439
+
440
+ Next: run crosscheck watch to start reviewing PRs.
441
+ ```
442
+
443
+ > **`crosscheck init` vs `crosscheck onboard`** — `init` 只做轻量级环境检查(无仓库选择,无流水线提示)。适合快速健康检查或 CI 场景。`onboard` 是完整的首次配置向导。
444
+
445
+ | 参数 | 说明 |
446
+ |---|---|
447
+ | `-c, --config <path>` | 将配置写入指定路径 |
448
+ | `-y, --yes` | 非交互式,接受所有默认值 |
449
+ | `--personal` | 本次会话使用个人部署模式 |
450
+ | `--team` | 本次会话使用团队部署模式 |
451
+ | `--reconfigure` | 即使配置中已设置 `deployment` 也重新运行设置 |
452
+
453
+ ---
454
+
455
+ ### `crosscheck review <pr-url>`
456
+
457
+ 手动触发对单个 PR 的审查。
458
+
459
+ ```bash
460
+ crosscheck review https://github.com/owner/repo/pull/123
461
+ crosscheck review https://github.com/owner/repo/pull/123 --reviewer codex
462
+ crosscheck review https://github.com/owner/repo/pull/123 --reviewer claude
463
+ ```
464
+
465
+ | 参数 | 说明 |
466
+ |---|---|
467
+ | `-r, --reviewer codex\|claude` | 跳过自动检测,强制使用指定审查者 |
468
+ | `-c, --config <path>` | 使用指定配置文件 |
469
+
470
+ ---
471
+
472
+ ### `crosscheck run <pr-url>`
473
+
474
+ 对单个 PR 执行完整配置的工作流:审查 → 自动修复 → 复查。`crosscheck review` 在发布评论后停止,`crosscheck run` 会完成闭环——如果发现问题,原作者 Agent 会打开修复 PR,crosscheck 随后对其进行复查。
475
+
476
+ ```bash
477
+ crosscheck run https://github.com/owner/repo/pull/123
478
+ crosscheck run https://github.com/owner/repo/pull/123 --reviewer claude
479
+ crosscheck run https://github.com/owner/repo/pull/123 --steps review,fix
480
+ crosscheck run https://github.com/owner/repo/pull/123 --dry-run
481
+ ```
482
+
483
+ 执行的工作流从仓库根目录的 `.crosscheck/workflow.yml`(如存在)加载,否则回退到内置默认流水线(仅审查)。使用 `crosscheck run` 对真实 PR 进行端到端完整流水线测试。
484
+
485
+ | 参数 | 说明 |
486
+ |---|---|
487
+ | `-r, --reviewer codex\|claude` | 强制使用指定审查者,跳过自动检测 |
488
+ | `--steps <list>` | 只运行列出的步骤类型,逗号分隔:`review`、`fix`、`recheck` |
489
+ | `--dry-run` | 运行审查但不发布评论或应用修复 |
490
+ | `-c, --config <path>` | 使用指定配置文件 |
491
+
492
+ ---
493
+
494
+ ### `crosscheck watch`
495
+
496
+ 本地开发模式。自动创建隧道,注册 Webhook,退出时自动清理。
497
+
498
+ ```bash
499
+ cd /path/to/your/repo
500
+ crosscheck watch
501
+ ```
502
+
503
+ 使用 `localhost.run`(SSH)开通公网隧道——SSH 在 macOS/Linux 预装,无需额外安装或注册账号。Org 级覆盖需要 `GITHUB_TOKEN` 拥有 `write:org` 权限,Repo 级只需 `repo` 权限。
504
+
505
+ | 参数 | 说明 |
506
+ |---|---|
507
+ | `-c, --config <path>` | 使用指定配置文件 |
508
+
509
+ ---
510
+
511
+ ### `crosscheck serve` [BETA]
512
+
513
+ 常驻模式,监听固定端口,Webhook 只需手动注册一次。
514
+
515
+ ```bash
516
+ crosscheck serve
517
+ ```
518
+
519
+ | 参数 | 说明 |
520
+ |---|---|
521
+ | `-c, --config <path>` | 使用指定配置文件 |
522
+
523
+ ---
524
+
525
+ ### `crosscheck status`
526
+
527
+ 显示认证状态、配置摘要和 CLI 版本信息。
528
+
529
+ ```bash
530
+ crosscheck status
531
+ ```
532
+
533
+ ```
534
+ crosscheck status
535
+
536
+ Auth
537
+ ✓ codex authenticated
538
+ ✓ claude 2.1.x (Claude Code)
539
+ ✓ GITHUB_TOKEN via gh auth login
540
+ ✓ WEBHOOK_SECRET auto-managed at ~/.crosscheck/webhook-secret
541
+
542
+ Config
543
+ mode cross-vendor
544
+ quality tier balanced
545
+ codex auth subscription
546
+ claude model sonnet
547
+ per-review budget $2.00/review
548
+
549
+ Impact
550
+ summary 47 reviews · ~43h saved · 19 issues caught
551
+ (run crosscheck impact for details)
552
+
553
+ Logs
554
+ path ~/.crosscheck/logs/
555
+ today 2026-05-08.ndjson (12 entries)
556
+
557
+ CLIs
558
+ codex codex-cli 0.128.0
559
+ claude 2.1.x (Claude Code)
560
+ ```
561
+
562
+ | 参数 | 说明 |
563
+ |---|---|
564
+ | `-c, --config <path>` | 检查指定配置文件的状态 |
565
+
566
+ ---
567
+
568
+ ### `crosscheck diagnose`
569
+
570
+ 读取 `~/.crosscheck/logs/`,找出失败模式、审查者表现和改进建议。
571
+
572
+ ```bash
573
+ crosscheck diagnose
574
+ crosscheck diagnose --since 2026-05-01
575
+ crosscheck diagnose --json
576
+ ```
577
+
578
+ ```
579
+ crosscheck diagnose
580
+
581
+ Period 2026-05-07 → 2026-05-08 (1 log file)
582
+
583
+ Reviews
584
+ total 6
585
+ successful 3
586
+ failed 3 (50% failure rate)
587
+
588
+ Reviewer performance
589
+ codex 1/4 success 25%
590
+ claude 2/2 success 100%
591
+
592
+ Verdict distribution
593
+ APPROVE 2 (67%)
594
+ NEEDS WORK 1 (33%)
595
+ BLOCK 0 (0%)
596
+
597
+ Error patterns
598
+ ✗ command not found: tsc ×2 (codex)
599
+ ✗ base branch missing: staging ×2
600
+
601
+ Languages detected
602
+ typescript, nodejs
603
+
604
+ Suggestions
605
+ → tsc: command not found ×2 (codex)
606
+ add to workflow.yml review step instructions: "Do not run tsc, ts-node, or tsx."
607
+ → base branch 'staging' not found ×2 — verify branch is fetched before review
608
+
609
+ Run `crosscheck optimize` to apply suggestions automatically.
610
+ ```
611
+
612
+ | 参数 | 说明 |
613
+ |---|---|
614
+ | `--json` | 以 JSON 格式输出完整报告(用于脚本或传给 `optimize`) |
615
+ | `--since <YYYY-MM-DD>` | 只分析该日期之后的日志 |
616
+
617
+ ---
618
+
619
+ ### `crosscheck optimize`
620
+
621
+ 内部运行 `diagnose`,选择最优 AI Agent,为 `~/.crosscheck/workflow.yml` 中的 review 步骤生成改进指令。默认为预览模式(只显示 diff,不写入文件)。
622
+
623
+ ```bash
624
+ crosscheck optimize # 仅显示 diff
625
+ crosscheck optimize --apply # 应用更改
626
+ crosscheck optimize --agent codex --apply
627
+ ```
628
+
629
+ ```
630
+ Running diagnose...
631
+ agent claude (default — both enabled, no data)
632
+
633
+ diff /Users/you/.crosscheck/workflow.yml (review step)
634
+
635
+ +## Constraints
636
+ +
637
+ +- Do not run tsc, ts-node, or tsx.
638
+ +- Do not run npm, npx, yarn, or pnpm.
639
+ ...
640
+
641
+ Run with --apply to write changes to /Users/you/.crosscheck/workflow.yml (review step)
642
+ ```
643
+
644
+ **`optimize` 使用哪个 Agent?**
645
+
646
+ `optimize` 根据你的配置和日志历史自动选择:
647
+
648
+ 1. 只启用了一个供应商 → 使用该供应商。
649
+ 2. 两个都启用 → 使用近期日志中成功率更高的那个。
650
+ 3. 成功率相同或没有日志数据 → 默认使用 `claude`。
651
+ 4. `--agent claude|codex` 覆盖以上所有逻辑。
652
+
653
+ | 参数 | 说明 |
654
+ |---|---|
655
+ | `--apply` | 将改进指令写入 `~/.crosscheck/workflow.yml` 中的 review 步骤(默认为预览模式) |
656
+ | `--dry-run` | 显示 diff 不写入(默认行为,显式别名) |
657
+ | `--agent <claude\|codex>` | 强制使用指定 Agent,忽略配置和日志数据 |
658
+ | `--since <YYYY-MM-DD>` | 限制作为输入的 diagnose 时间窗口 |
659
+ | `-c, --config <path>` | 配置文件路径 |
660
+
661
+ ---
662
+
663
+ ### `crosscheck impact`
664
+
665
+ 报告审查历史带来的累计价值:节省的时间、发现的问题和代码质量趋势。读取 `~/.crosscheck/logs/`,无网络请求。
666
+
667
+ ```bash
668
+ crosscheck impact
669
+ crosscheck impact --money
670
+ crosscheck impact --since 2026-01-01
671
+ crosscheck impact --json
672
+ ```
673
+
674
+ ```
675
+ crosscheck impact (all time · 47 reviews)
676
+
677
+ Time saved
678
+ ──────────────────────────────────────────────
679
+ Reviews run 47
680
+ Avg AI review time ~14 min
681
+ Assumed human time 60 min ⓘ
682
+ Total time saved ~43 h
683
+
684
+ Issues caught
685
+ ──────────────────────────────────────────────
686
+ APPROVE 28 (60%)
687
+ NEEDS WORK 14 (30%) ← actionable feedback
688
+ BLOCK 5 (11%) ← potential bugs / breaking changes
689
+ Total issues caught 19
690
+
691
+ Code quality trend (BLOCK rate, weekly)
692
+ ──────────────────────────────────────────────
693
+ May W1 ████████████████ 22%
694
+ May W2 ████████████ 17%
695
+ May W3 ████████ 11% ↓ improving
696
+
697
+ ⓘ assumes 60 min avg human review — set impact.assumed_human_review_minutes to adjust
698
+ Run crosscheck impact --money for a rough monetary estimate.
699
+ ```
700
+
701
+ | 参数 | 说明 |
702
+ |---|---|
703
+ | `--money` | 追加基于 `impact.hourly_rate_usd` 和 `impact.defect_cost_usd` 的货币估算 |
704
+ | `--since <YYYY-MM-DD>` | 只分析该日期之后的日志 |
705
+ | `--json` | 以 JSON 格式输出完整报告 |
706
+ | `-c, --config <path>` | 配置文件路径 |
707
+
708
+ 货币估算公式:`(hours_saved × hourly_rate_usd) + (issues_caught × defect_cost_usd)`。默认值:`$150/hr`、`$150/issue`,均可在 `crosscheck.config.yml` 的 `impact` 节点中配置。
709
+
710
+ ---
711
+
712
+ ### `crosscheck issue`
713
+
714
+ 读取近期错误日志,由你最优 AI Agent 起草 GitHub Issue,询问三个简短跟进问题,确认后提交到 `humanbased-ai/crosscheck`。无需手动翻日志或手写 Issue。
715
+
716
+ ```bash
717
+ crosscheck issue # 交互式 — 提交前确认草稿
718
+ crosscheck issue --dry-run # 只打印草稿,不提交
719
+ crosscheck issue --yes # 展示草稿后立即提交
720
+ crosscheck issue --since 2026-05-01
721
+ ```
722
+
723
+ ```
724
+ crosscheck issue
725
+
726
+ Scanning logs (last 3 days)...
727
+ Found error pattern: command_not_found: tsc ×4 (codex)
728
+
729
+ Can you reproduce this consistently?
730
+ [1] Every time [2] Sometimes [3] Happened once
731
+ Choice [1]: 1
732
+
733
+ Which command triggered this?
734
+ [1] watch [2] serve [3] review [4] Unknown
735
+ Choice [1]: 1
736
+
737
+ Is this blocking you?
738
+ [1] Blocked [2] Degraded [3] Cosmetic
739
+ Choice [2]: 2
740
+
741
+ Draft issue:
742
+ ────────────────────────────────────────────────────────
743
+ TITLE: codex: command not found: tsc during review in temp clone
744
+ ...
745
+
746
+ Submit to humanbased-ai/crosscheck? [y/N]: y
747
+ ✓ https://github.com/humanbased-ai/crosscheck/issues/99
748
+ ```
749
+
750
+ 近期日志中若无错误,crosscheck 打印 `No errors found in recent logs — nothing to report` 并正常退出。
751
+
752
+ | 参数 | 说明 |
753
+ |---|---|
754
+ | `--since <YYYY-MM-DD>` | 将日志扫描限制在该日期之后(默认:最近 3 天) |
755
+ | `--dry-run` | 打印草稿但不提交 |
756
+ | `-y, --yes` | 展示草稿后立即提交(跳过确认) |
757
+ | `-c, --config <path>` | 配置文件路径 |
758
+
759
+ ---
760
+
761
+ ## 自定义根目录
762
+
763
+ `~/.crosscheck/` 是 crosscheck 所有学习成果和配置的持久化目录。迁移机器前备份该目录,重装后运行 `crosscheck onboard` 并一路回车确认即可恢复所有设置。
764
+
765
+ ### `~/.crosscheck/` 中的文件
766
+
767
+ | 文件 | 由谁写入 | 由谁读取 | 用途 |
768
+ |---|---|---|---|
769
+ | `config.yml` | `onboard`、`init`、`watch`/`serve`(首次运行) | 所有命令 | 主配置——部署、仓库、模式、供应商、质量、隧道、路由、预算 |
770
+ | `workflow.yml` | `onboard`(仅首次) | `watch`、`serve`、`run` | 带有每步内联指令的全局流水线。首次 onboard 时写入;之后不会覆盖——可自由编辑 |
771
+ | `webhook-secret` | 首次使用时自动生成 | `watch`、`serve` | GitHub Webhook 签名验证的 HMAC Secret,重启后自动复用 |
772
+ | `logs/YYYY-MM-DD.ndjson` | `watch`、`serve` | `diagnose`、`optimize`、`impact`、`issue` | 结构化审查事件日志,每天一个文件 |
773
+
774
+ ### 项目级覆盖(优先于全局文件)
775
+
776
+ | 文件 | 由谁读取 | 用途 |
777
+ |---|---|---|
778
+ | `.crosscheck/workflow.yml` *(仓库内)* | `watch`、`serve`、`run` | 项目级流水线——优先于 `~/.crosscheck/workflow.yml` |
779
+ | `.crosscheck/AGENT.md` *(仓库内)* | `optimize` | 项目级 Harness——优先于内置 `AGENT.md` |
780
+ | `AGENT.md` *(随 crosscheck 内置)* | `optimize` | 默认 Harness——随包附带,始终作为回退 |
781
+
782
+ ### `crosscheck onboard` 负责的内容 vs 保留的内容
783
+
784
+ 重新运行时,`onboard` 只更新它收集了答案的字段,其他内容保持不变。
785
+
786
+ **每次运行都会更新:** `deployment`、`orgs`、`repos`、`mode`、`vendors.*.enabled`、`vendors.*.effort`、`quality.tier`、`tunnel.*`、`post_review.auto_fix.*`
787
+
788
+ **首次运行初始化,之后不覆盖:** `routing.allowed_authors`、`routing.author_routes`、`routing.fallback_reviewer`
789
+
790
+ **onboard 从不修改:** `quality.focus`、`quality.custom_prompt`、`budget.*`、`branding.*`、`server.*`、`logs.*`、`backtrace.*`、`workflow.yml`(首次写入后)、Harness 文件
791
+
792
+ ---
793
+
794
+ ## 配置
795
+
796
+ crosscheck 默认将配置存储在 `~/.crosscheck/config.yml`——跨项目持久化,无需每个仓库都有配置文件。也会在以下位置查找(找到第一个为止):
797
+
798
+ 1. `~/.crosscheck/config.yml` ← **默认位置**
799
+ 2. `./crosscheck.config.yml`
800
+ 3. `./.crosscheck.yml`
801
+
802
+ 运行 `crosscheck init` 生成带完整注释的 `~/.crosscheck/config.yml`。
803
+
804
+ 日志写入 `~/.crosscheck/logs/YYYY-MM-DD.ndjson`,默认保留 30 天。
805
+
806
+ ### 完整配置参考
807
+
808
+ ```yaml
809
+ # ── 部署 ──────────────────────────────────────────────────────────────────────
810
+ # 首次运行时自动设置。通过以下命令重新运行提示:crosscheck watch --reconfigure
811
+ # personal — 监控你的仓库 + 所属 Org;只审查你提交的 PR
812
+ # team — 只监控 Org 仓库;审查所有人提交的 PR
813
+ # deployment: personal
814
+
815
+ # ── 模式 ──────────────────────────────────────────────────────────────────────
816
+ # single-vendor: 由一个 AI 审查所有 PR
817
+ # cross-vendor: Claude ↔ Codex 互相审查
818
+ mode: cross-vendor
819
+
820
+ # ── 供应商 ───────────────────────────────────────────────────────────────────
821
+ vendors:
822
+ codex:
823
+ enabled: true
824
+ auth: subscription # subscription | api-key
825
+ model: o4-mini # 仅在 auth: api-key 时生效
826
+
827
+ claude:
828
+ enabled: true
829
+ model: sonnet # haiku | sonnet | opus
830
+ effort: medium # low | medium | high | max
831
+
832
+ # ── 质量 ───────────────────────────────────────────────────────────────────
833
+ quality:
834
+ tier: balanced # fast | balanced | thorough
835
+ focus: # 收窄审查范围(可选)
836
+ - security
837
+ - types
838
+ - performance
839
+ custom_prompt: | # 追加到每次审查提示词末尾
840
+ Be concise. Flag only issues that would block a merge.
841
+
842
+ # ── 预算 ────────────────────────────────────────────────────────────────────
843
+ budget:
844
+ codex_monthly_usd: 20 # null = 不限;仅在 auth: api-key 时生效
845
+ per_review_usd: 2.00 # 传给 claude --max-budget-usd
846
+
847
+ # ── Org — 一个 Webhook 覆盖 Org 下所有仓库 ──────────────────────────────────
848
+ orgs:
849
+ - humanbased-ai
850
+ - codatta
851
+
852
+ # ── Users — 监控个人 GitHub 账号下的所有仓库(非 Org)──────────────────────
853
+ # 启动时 crosscheck 枚举每个用户的仓库并注册 Webhook。
854
+ # 与 `orgs` 和 `repos` 可叠加,所有来源均生效。
855
+ users:
856
+ - beingzy # 你的个人账号
857
+ # - my-agent-login # 向自己仓库推送的 bot 账号
858
+
859
+ # ── Repo — 只监控指定仓库 ────────────────────────────────────────────────────
860
+ # 使用 `orgs`/`users` 时可省略。三者都为空时,从 git remote 自动检测。
861
+ repos:
862
+ - owner: acme
863
+ name: specific-repo
864
+
865
+ # ── 路由 ───────────────────────────────────────────────────────────────────
866
+ routing:
867
+ # 来源检测使用四信号链:
868
+ # 1. PR 正文模式(最快)
869
+ # 2. Commit 消息中的 Co-Authored-By: trailer(API 调用,失败不影响流程)
870
+ # 3. 分支前缀(claude/ 或 codex/)
871
+ # 4. author_routes 配置回退(最后手段)
872
+ codex_reviews_patterns:
873
+ - "Generated with \\[Claude Code\\]" # Claude Code 归因页脚
874
+ - "Co-Authored-By: Claude" # commit trailer
875
+ claude_reviews_patterns:
876
+ - "Generated with \\[OpenAI Codex\\]" # Codex 归因页脚
877
+ - "Co-Authored-By: codex" # commit trailer
878
+
879
+ # 分支前缀检测(信号 3)。Claude Code 使用 claude/,Codex 使用 codex/。
880
+ claude_branch_prefixes:
881
+ - "claude/"
882
+ codex_branch_prefixes:
883
+ - "codex/"
884
+
885
+ # 将审查限制为这些 GitHub 账号提交的 PR。
886
+ # 由 `crosscheck init` 或首次运行 `crosscheck watch` 时自动从 gh auth 检测并填入。
887
+ # 为空 = 不限制(所有匹配的 PR 都会被审查)。
888
+ allowed_authors:
889
+ - your-github-login # 从 gh auth 自动检测
890
+
891
+ # 基于作者的路由回退(信号 4)——当无模式或前缀匹配时使用。
892
+ author_routes:
893
+ your-github-login: claude # 你提交的 PR → 视为 Claude 所作 → Codex 审查
894
+
895
+ # ── 隧道(仅 watch 模式)──────────────────────────────────────────────────
896
+ # localhost.run(默认)—— SSH 隧道,零安装,重连后 URL 会变化。
897
+ # smee —— 通过 smee.io 中继;离线时事件排队。
898
+ # 设置:npm install -g smee-client,访问 https://smee.io/new
899
+ tunnel:
900
+ backend: localhost.run
901
+ # backend: smee
902
+ # smee_channel: https://smee.io/your-channel-id
903
+
904
+ # ── Impact 报告 ──────────────────────────────────────────────────────────────
905
+ impact:
906
+ assumed_human_review_minutes: 60 # 节省时间计算的基准
907
+ hourly_rate_usd: 150 # 用于 --money 估算
908
+ defect_cost_usd: 150 # 每个发现的问题,用于 --money 估算
909
+
910
+ # ── 审查后自动修复 ────────────────────────────────────────────────────────────
911
+ # 控制修复的交付方式。步骤排序(哪些步骤运行、何时运行、使用哪个供应商)
912
+ # 在 ~/.crosscheck/workflow.yml 中配置。
913
+ post_review:
914
+ auto_fix:
915
+ delivery:
916
+ mode: pull_request # pull_request | commit | comment
917
+ # pull_request → 修复 PR 针对原始分支;人工审批后合并
918
+ # commit → 直接将修复推送到原始 PR 分支
919
+ # comment → 仅将建议修复作为审查评论发布
920
+ pr_title: "fix: address CR issues in #{original_pr_title}"
921
+ label: cr-autofix # 应用于修复 PR 的 GitHub 标签
922
+
923
+ # ── 回溯审查 ──────────────────────────────────────────────────────────────────
924
+ # 启动时扫描监控范围内所有开放的 PR,对尚未收到 [crosscheck] 评论的 PR 进行审查。
925
+ # 默认关闭。启用方式:
926
+ # backtrace.enabled: true (持久——每次启动都运行)
927
+ # --backtrace 参数 (仅本次会话)
928
+ # --no-backtrace 参数 (即使 enabled: true 也抑制)
929
+ # backtrace:
930
+ # enabled: true
931
+
932
+ # ── 服务器 ────────────────────────────────────────────────────────────────────
933
+ server:
934
+ port: 7891
935
+ webhook_path: /webhook
936
+ ```
937
+
938
+ ### 质量层级
939
+
940
+ | 层级 | 速度 | 深度 | 适合场景 |
941
+ |---|---|---|---|
942
+ | `fast` | ~10s | 仅核心问题 | 高频仓库、草稿 PR |
943
+ | `balanced` | ~30s | 完整审查,解释所有问题 | 大多数团队的默认选择 |
944
+ | `thorough` | ~60–90s | 深度多轮,架构 + 安全 | 合并到 main 之前 |
945
+
946
+ ### 路由模式
947
+
948
+ 模式对 PR 正文进行大小写不敏感的正则表达式匹配。
949
+
950
+ - `codex_reviews_patterns` — 匹配这些模式的 PR 由 Codex 审查
951
+ - `claude_reviews_patterns` — 匹配这些模式的 PR 由 Claude 审查
952
+
953
+ 如需同时审查人工提交的 PR,添加通配符:
954
+
955
+ ```yaml
956
+ routing:
957
+ codex_reviews_patterns:
958
+ - "Generated with \\[Claude Code\\]"
959
+ - ".*" # Codex 审查所有 PR
960
+ ```
961
+
962
+ ### 最简配置
963
+
964
+ ```yaml
965
+ mode: cross-vendor
966
+ ```
967
+
968
+ 其他所有选项使用默认值。
969
+
970
+ ---
971
+
972
+ ## 工作原理
973
+
974
+ ```
975
+ GitHub 仓库
976
+ │ pull_request 事件(opened / synchronize)
977
+
978
+ crosscheck webhook 服务器
979
+
980
+ ├─ 验证 HMAC-SHA256 签名
981
+ ├─ 从 PR 正文模式检测来源
982
+ ├─ 分配审查者(cross-vendor 模式下为对立供应商)
983
+
984
+
985
+ 将 PR 分支克隆到临时目录
986
+
987
+ ├─ codex review --base <branch> ← 非交互式 Codex 审查
988
+ │ 或
989
+ └─ claude --print --bare ... ← 非交互式 Claude 审查
990
+
991
+
992
+ 通过 GitHub API 在 PR 中发布评论
993
+ 删除临时克隆
994
+
995
+ ▼ post_review.auto_fix(如已启用且发现问题)
996
+ 原作者 Agent 读取审查评论
997
+
998
+ ├─ claude --print ... (Claude 提交了该 PR)
999
+ │ 或
1000
+ └─ codex ... (Codex 提交了该 PR)
1001
+
1002
+
1003
+ 打开修复 PR → fix/cr-<pr-number>-review-issues → 原始分支
1004
+ (你审查并合并修复 PR;原始 PR 自动更新)
1005
+ ```
1006
+
1007
+ ### PR 来源检测
1008
+
1009
+ crosscheck 使用四信号链确定 PR 是否由 Claude Code、Codex 或人工提交:
1010
+
1011
+ 1. **PR 正文** — 查找归因页脚(如 `Generated with [Claude Code]`)
1012
+ 2. **Commit 消息** — 扫描所有 commit 消息中的 `Co-Authored-By:` trailer
1013
+ 3. **分支前缀** — `claude/` → Claude 来源;`codex/` → Codex 来源
1014
+ 4. **`author_routes`** — 配置中按登录名的回退
1015
+
1016
+ 都不匹配时,来源为 `human`,cross-vendor 模式下跳过该 PR。
1017
+
1018
+ | 默认模式 | 匹配对象 |
1019
+ |---|---|
1020
+ | `Generated with \[Claude Code\]` | Claude Code 提交的 PR |
1021
+ | `Generated with \[OpenAI Codex\]` | Codex CLI 提交的 PR |
1022
+ | `Co-Authored-By: Claude` | Claude Code 的 commit trailer |
1023
+ | `Co-Authored-By: codex` | Codex 的 commit trailer |
1024
+ | 分支前缀 `claude/` | Claude 提交 PR 的命名约定 |
1025
+ | 分支前缀 `codex/` | Codex 提交 PR 的命名约定 |
1026
+
1027
+ ### 审查者分配
1028
+
1029
+ | 模式 | PR 来源 | 审查者 |
1030
+ |---|---|---|
1031
+ | `cross-vendor` | claude | Codex |
1032
+ | `cross-vendor` | codex | Claude |
1033
+ | `cross-vendor` | 人工 | 无 — 跳过 |
1034
+ | `single-vendor` | 任意 | 第一个启用的供应商 |
1035
+
1036
+ ### Codex 审查如何运行
1037
+
1038
+ ```bash
1039
+ codex review --base <base-branch> --title "<pr-title>"
1040
+ ```
1041
+
1042
+ `--base` 标志将当前 HEAD 与基础分支进行差异比较——与 PR diff 完全一致。使用 `auth: subscription` 时不传入模型参数。使用 `auth: api-key` 时,模型由质量层级决定(`fast` → `gpt-4o-mini`,`balanced` → `o4-mini`,`thorough` → `o3`)。
1043
+
1044
+ ### Claude 审查如何运行
1045
+
1046
+ ```bash
1047
+ claude \
1048
+ --print --bare \
1049
+ --model claude-sonnet-4-6 \
1050
+ --effort medium \
1051
+ --max-budget-usd 2.00 \
1052
+ --output-last-message /tmp/review.md \
1053
+ --allowedTools "Bash(git diff),Bash(git log)" \
1054
+ "<prompt>"
1055
+ ```
1056
+
1057
+ `--bare` 使执行快速且确定性。`--allowedTools` 将 Claude 限制为只能在克隆的仓库上执行只读的 git 操作。
1058
+
1059
+ ### 去重
1060
+
1061
+ GitHub 可能对同一次推送同时触发 `opened` 和 `synchronize` 事件。crosscheck 在内存中追踪 `owner/repo#pr@sha`,丢弃同一 commit 的重复事件。
1062
+
1063
+ ### Watch vs Serve
1064
+
1065
+ | | `watch` | `serve` [BETA] |
1066
+ |---|---|---|
1067
+ | 隧道 | `localhost.run`(SSH,无需安装) | 无 — 直连端口 |
1068
+ | Webhook | 自动管理,退出时清理 | 手动,永久有效 |
1069
+ | 覆盖范围 | Org 级或 Repo 级 | Org 级或 Repo 级 |
1070
+ | 目标机器 | 开发者笔记本 | mac-mini / 服务器 |
1071
+ | 生命周期 | 与终端绑定 | Daemon / 服务 |
1072
+
1073
+ ### 安全性
1074
+
1075
+ - **Webhook 签名** — 每个请求在解析前用 HMAC-SHA256 验证
1076
+ - **临时隔离** — 每个 PR 克隆到独立临时目录,审查后删除
1077
+ - **只读工具** — Claude 仅限使用 `git diff` 和 `git log`
1078
+ - **不在克隆中存储凭证** — `gh repo clone` 使用 gh credential helper,不将 Token 写入磁盘
1079
+
1080
+ ---
1081
+
1082
+ ## 审查后自动修复
1083
+
1084
+ 当 `post_review.auto_fix.enabled` 为 `true`(默认值)时,crosscheck 在每次发现问题的审查后自动完成完整闭环:
1085
+
1086
+ ```
1087
+ Agent 打开 PR #42 → 对立 AI 审查 → 发现问题?
1088
+ │ 是
1089
+ 原作者 Agent 生成修复
1090
+
1091
+ 修复 PR #43 打开 → feat/my-feature
1092
+
1093
+ 你审查并合并 PR #43
1094
+
1095
+ PR #42 更新 → 你合并到 main
1096
+ ```
1097
+
1098
+ **关键设计决策:**
1099
+
1100
+ | 设置 | 默认值 | 原因 |
1101
+ |---|---|---|
1102
+ | `fixer: same-as-author` | 提交 PR 的供应商也负责修复 | 原作者 Agent 最了解自己的代码和风格 |
1103
+ | `delivery: pull_request` | 新建 PR,不直接推送 | 你始终在环——不经你审批不会有代码落地 |
1104
+ | `trigger: on_issues` | 只在审查者发现警告或更严重问题时触发 | 干净的 PR 跳过修复步骤 |
1105
+ | `min_severity: warning` | 忽略 info/仅样式的发现 | 避免为纯样式评论产生噪声修复 PR |
1106
+
1107
+ **修复 PR 分支命名:** `fix/cr-<原始 PR 编号>-review-issues`
1108
+
1109
+ **原始 PR 编号永不改变。** 修复 PR 针对原始分支;合并后,其 commit 自动出现在原始 PR 中。
1110
+
1111
+ **禁用:** 在配置中设置 `post_review.auto_fix.enabled: false`,或设置 `trigger: never`。
1112
+
1113
+ ---
1114
+
1115
+ ## 常见问题
1116
+
1117
+ ### crosscheck 如何随时间自我改进?
1118
+
1119
+ 每次审查(成功或失败)都会追加到 `~/.crosscheck/logs/YYYY-MM-DD.ndjson`。运行 `crosscheck diagnose` 读取这些日志,找出规律:哪些命令失败了,哪个审查者表现不佳,哪些语言特定工具缺失。运行 `crosscheck optimize` 将该报告输入给表现最好的 AI Agent(由内置 `AGENT.md` 指导),并更新 `~/.crosscheck/workflow.yml` 中 review 步骤的 `instructions` 字段。改进在下一个 PR 即时生效。
1120
+
1121
+ ### `crosscheck optimize` 使用哪个 Agent?
1122
+
1123
+ 自动选择:
1124
+ 1. 配置中只启用了一个供应商 → 使用该供应商。
1125
+ 2. 两个都启用 → 使用近期日志中成功率更高的那个。
1126
+ 3. 成功率相同或没有数据 → 默认使用 `claude`。
1127
+ 4. 随时可以覆盖:`crosscheck optimize --agent codex`。
1128
+
1129
+ `optimize` 使用的 Agent 与审查你的 PR 的 Agent 相互独立——`optimize` 的目的是改进指令,而不是审查代码。
1130
+
1131
+ ### 如何自定义审查者行为?
1132
+
1133
+ 主要入口是 workflow 文件。每个步骤都有一个 `instructions` 字段,会逐字传递给审查者或修复 Agent:
1134
+
1135
+ ```yaml
1136
+ # .crosscheck/workflow.yml
1137
+ steps:
1138
+ - name: review
1139
+ type: review
1140
+ reviewer: auto
1141
+ instructions: |
1142
+ Do not suggest TypeScript patterns — this is a Rust project.
1143
+ Focus on memory safety and error handling.
1144
+ ## Verdict
1145
+ End with: VERDICT: APPROVE | NEEDS_WORK | BLOCK
1146
+ - name: fix
1147
+ type: fix
1148
+ reviewer: origin
1149
+ when: "review.verdict != 'APPROVE'"
1150
+ instructions: "Only fix issues explicitly called out. Do not refactor unrelated code."
1151
+ ```
1152
+
1153
+ `crosscheck optimize --apply` 会更新 `~/.crosscheck/workflow.yml` 中 review 步骤的 `instructions` 字段,将学到的改进持久化到后续会话。
1154
+
1155
+ 要将 review 步骤指令重置为默认值,删除 `~/.crosscheck/workflow.yml` 并重新运行 `crosscheck onboard`——它会用内置默认值重新生成该文件。
1156
+
1157
+ ### 可以设置项目级工作流吗?
1158
+
1159
+ 可以。在仓库根目录创建 `.crosscheck/workflow.yml`。crosscheck 会自动加载它,并以其替代内置默认流水线。这是自定义审查者行为的推荐方式——所有项目级设置都集中在一个受版本控制的文件中。
1160
+
1161
+ ### `AGENT.md` 是什么?
1162
+
1163
+ `AGENT.md` 是指导 AI 在 `crosscheck optimize` 期间工作的 Harness 文档,定义了输入/输出约定、语言检测规则、约束编写指南和质量原则。随 crosscheck 捆绑提供,使 `optimize` 开箱即用。
1164
+
1165
+ 你可以在项目根目录或 `.crosscheck/AGENT.md` 放置本地覆盖文件。crosscheck 优先查找本地覆盖,然后回退到内置版本。这允许团队针对自己的技术栈或规范自定义优化逻辑。
1166
+
1167
+ ### 为什么审查失败,提示 "command not found"?
1168
+
1169
+ 审查者(codex 或 claude)尝试运行一个在临时克隆中不存在的 CLI 工具(例如 `tsc`、`pytest`)。克隆是浅层 `git` checkout,没有 `node_modules` 或其他已安装的依赖。运行 `crosscheck diagnose` 查看哪些命令失败了,然后运行 `crosscheck optimize --apply` 在 `~/.crosscheck/workflow.yml` 的 review 步骤中添加相应约束,让审查者停止尝试这些命令。
1170
+
1171
+ ### 为什么审查失败,提示 "no such branch"?
1172
+
1173
+ crosscheck 在临时克隆中获取 PR 基础分支(例如 `staging`)后再运行审查者。如果获取失败(网络问题、分支已删除、Token 权限不足),审查者无法正确进行差异比较。检查:
1174
+ - 基础分支存在且可以用你的 Token 访问。
1175
+ - `GITHUB_TOKEN` 拥有 `repo` 权限。
1176
+ - PR 中的分支名与远程一致。
1177
+
1178
+ ### 如何用 smee.io 代替 localhost.run?
1179
+
1180
+ `localhost.run`(默认)在你的笔记本离线时 GitHub 触发 Webhook 的事件会丢失。[smee.io](https://smee.io) 会将事件排队,等笔记本重新联网后重放——适合审查机器不总是在线的情况。
1181
+
1182
+ ```bash
1183
+ npm install -g smee-client
1184
+ ```
1185
+
1186
+ 访问 [smee.io/new](https://smee.io/new) 并复制 Channel URL。然后在 `~/.crosscheck/config.yml` 中:
1187
+
1188
+ ```yaml
1189
+ tunnel:
1190
+ backend: smee
1191
+ smee_channel: https://smee.io/your-channel-id
1192
+ ```
1193
+
1194
+ crosscheck 会在首次 `watch` 启动时自动将 smee Channel URL 注册为 GitHub Webhook,无需手动注册。与 `localhost.run` 不同,重启后无需重新注册,离线期间的事件会在重连后重放。
1195
+
1196
+ ### 可以禁用自动修复步骤吗?
1197
+
1198
+ 可以。在配置中设置 `post_review.auto_fix.enabled: false`,或设置 `trigger: never`。也可以将 `min_severity` 提高到 `error`,将修复限制为仅阻塞性问题。
1199
+
1200
+ 如需不经单独 PR 直接推送修复(跳过你的审查),切换到 `delivery: commit`。如需以审查评论形式获取建议修复而不推送任何代码,使用 `delivery: comment`。
1201
+
1202
+ ### 为什么修复者使用与提交 PR 相同的供应商?
1203
+
1204
+ 原作者 Agent 对自己的代码拥有最多上下文——包括原始改动背后的风格、约束和意图。使用 `fixer: same-as-author` 让反馈闭环保持紧凑:Agent 编写代码,另一个 Agent 审查,原 Agent 修复。如果你偏好其他安排,可以覆盖为 `same-as-reviewer`、`codex` 或 `claude`。
1205
+
1206
+ ### optimize 会自动运行吗?
1207
+
1208
+ 不会——`crosscheck optimize` 始终由用户手动触发。你在需要改进指令时才运行它,没有后台守护进程或定时任务。未来版本可能会增加可选的 `--schedule` 模式,但默认值将始终是手动触发,以保持你对 `~/.crosscheck/workflow.yml` 写入内容的掌控。