@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.
- package/AGENT.md +207 -0
- package/ISSUE.md +234 -0
- package/LICENSE +21 -0
- package/README.md +234 -0
- package/README.zh.md +169 -0
- package/assets/logo.png +0 -0
- package/assets/screenshot-watch-timing.png +0 -0
- package/assets/screenshot-watch-timing.svg +1 -0
- package/assets/screenshot-watch.png +0 -0
- package/crosscheck.config.example.yml +214 -0
- package/dist/__tests__/annotation.test.d.ts +2 -0
- package/dist/__tests__/annotation.test.d.ts.map +1 -0
- package/dist/__tests__/annotation.test.js +134 -0
- package/dist/__tests__/annotation.test.js.map +1 -0
- package/dist/__tests__/backtrace.test.d.ts +2 -0
- package/dist/__tests__/backtrace.test.d.ts.map +1 -0
- package/dist/__tests__/backtrace.test.js +280 -0
- package/dist/__tests__/backtrace.test.js.map +1 -0
- package/dist/__tests__/board.test.d.ts +2 -0
- package/dist/__tests__/board.test.d.ts.map +1 -0
- package/dist/__tests__/board.test.js +149 -0
- package/dist/__tests__/board.test.js.map +1 -0
- package/dist/__tests__/codex.test.d.ts +2 -0
- package/dist/__tests__/codex.test.d.ts.map +1 -0
- package/dist/__tests__/codex.test.js +92 -0
- package/dist/__tests__/codex.test.js.map +1 -0
- package/dist/__tests__/comment-bodies.test.d.ts +2 -0
- package/dist/__tests__/comment-bodies.test.d.ts.map +1 -0
- package/dist/__tests__/comment-bodies.test.js +75 -0
- package/dist/__tests__/comment-bodies.test.js.map +1 -0
- package/dist/__tests__/conflict-resolve.test.d.ts +2 -0
- package/dist/__tests__/conflict-resolve.test.d.ts.map +1 -0
- package/dist/__tests__/conflict-resolve.test.js +123 -0
- package/dist/__tests__/conflict-resolve.test.js.map +1 -0
- package/dist/__tests__/crosscheck-commit.test.d.ts +2 -0
- package/dist/__tests__/crosscheck-commit.test.d.ts.map +1 -0
- package/dist/__tests__/crosscheck-commit.test.js +13 -0
- package/dist/__tests__/crosscheck-commit.test.js.map +1 -0
- package/dist/__tests__/detector.test.d.ts +2 -0
- package/dist/__tests__/detector.test.d.ts.map +1 -0
- package/dist/__tests__/detector.test.js +112 -0
- package/dist/__tests__/detector.test.js.map +1 -0
- package/dist/__tests__/diagnose.test.d.ts +2 -0
- package/dist/__tests__/diagnose.test.d.ts.map +1 -0
- package/dist/__tests__/diagnose.test.js +164 -0
- package/dist/__tests__/diagnose.test.js.map +1 -0
- package/dist/__tests__/diff-hash.test.d.ts +2 -0
- package/dist/__tests__/diff-hash.test.d.ts.map +1 -0
- package/dist/__tests__/diff-hash.test.js +126 -0
- package/dist/__tests__/diff-hash.test.js.map +1 -0
- package/dist/__tests__/durations.test.d.ts +2 -0
- package/dist/__tests__/durations.test.d.ts.map +1 -0
- package/dist/__tests__/durations.test.js +26 -0
- package/dist/__tests__/durations.test.js.map +1 -0
- package/dist/__tests__/event-fields.test.d.ts +2 -0
- package/dist/__tests__/event-fields.test.d.ts.map +1 -0
- package/dist/__tests__/event-fields.test.js +50 -0
- package/dist/__tests__/event-fields.test.js.map +1 -0
- package/dist/__tests__/filter.test.d.ts +2 -0
- package/dist/__tests__/filter.test.d.ts.map +1 -0
- package/dist/__tests__/filter.test.js +21 -0
- package/dist/__tests__/filter.test.js.map +1 -0
- package/dist/__tests__/fix.test.d.ts +2 -0
- package/dist/__tests__/fix.test.d.ts.map +1 -0
- package/dist/__tests__/fix.test.js +124 -0
- package/dist/__tests__/fix.test.js.map +1 -0
- package/dist/__tests__/github-client.test.d.ts +2 -0
- package/dist/__tests__/github-client.test.d.ts.map +1 -0
- package/dist/__tests__/github-client.test.js +22 -0
- package/dist/__tests__/github-client.test.js.map +1 -0
- package/dist/__tests__/github-scan-client.test.d.ts +2 -0
- package/dist/__tests__/github-scan-client.test.d.ts.map +1 -0
- package/dist/__tests__/github-scan-client.test.js +100 -0
- package/dist/__tests__/github-scan-client.test.js.map +1 -0
- package/dist/__tests__/is-fresh-review-comment.test.d.ts +2 -0
- package/dist/__tests__/is-fresh-review-comment.test.d.ts.map +1 -0
- package/dist/__tests__/is-fresh-review-comment.test.js +86 -0
- package/dist/__tests__/is-fresh-review-comment.test.js.map +1 -0
- package/dist/__tests__/issue.test.d.ts +2 -0
- package/dist/__tests__/issue.test.d.ts.map +1 -0
- package/dist/__tests__/issue.test.js +259 -0
- package/dist/__tests__/issue.test.js.map +1 -0
- package/dist/__tests__/kickass.test.d.ts +2 -0
- package/dist/__tests__/kickass.test.d.ts.map +1 -0
- package/dist/__tests__/kickass.test.js +268 -0
- package/dist/__tests__/kickass.test.js.map +1 -0
- package/dist/__tests__/loader.test.d.ts +2 -0
- package/dist/__tests__/loader.test.d.ts.map +1 -0
- package/dist/__tests__/loader.test.js +180 -0
- package/dist/__tests__/loader.test.js.map +1 -0
- package/dist/__tests__/onboard-preservation.test.d.ts +2 -0
- package/dist/__tests__/onboard-preservation.test.d.ts.map +1 -0
- package/dist/__tests__/onboard-preservation.test.js +506 -0
- package/dist/__tests__/onboard-preservation.test.js.map +1 -0
- package/dist/__tests__/optimize.test.d.ts +2 -0
- package/dist/__tests__/optimize.test.d.ts.map +1 -0
- package/dist/__tests__/optimize.test.js +101 -0
- package/dist/__tests__/optimize.test.js.map +1 -0
- package/dist/__tests__/post-review-comment.test.d.ts +2 -0
- package/dist/__tests__/post-review-comment.test.d.ts.map +1 -0
- package/dist/__tests__/post-review-comment.test.js +44 -0
- package/dist/__tests__/post-review-comment.test.js.map +1 -0
- package/dist/__tests__/pr-lock.test.d.ts +2 -0
- package/dist/__tests__/pr-lock.test.d.ts.map +1 -0
- package/dist/__tests__/pr-lock.test.js +115 -0
- package/dist/__tests__/pr-lock.test.js.map +1 -0
- package/dist/__tests__/pr-picker.test.d.ts +2 -0
- package/dist/__tests__/pr-picker.test.d.ts.map +1 -0
- package/dist/__tests__/pr-picker.test.js +57 -0
- package/dist/__tests__/pr-picker.test.js.map +1 -0
- package/dist/__tests__/pr-status-scan.test.d.ts +2 -0
- package/dist/__tests__/pr-status-scan.test.d.ts.map +1 -0
- package/dist/__tests__/pr-status-scan.test.js +92 -0
- package/dist/__tests__/pr-status-scan.test.js.map +1 -0
- package/dist/__tests__/pr-status.test.d.ts +2 -0
- package/dist/__tests__/pr-status.test.d.ts.map +1 -0
- package/dist/__tests__/pr-status.test.js +346 -0
- package/dist/__tests__/pr-status.test.js.map +1 -0
- package/dist/__tests__/repo-picker.test.d.ts +2 -0
- package/dist/__tests__/repo-picker.test.d.ts.map +1 -0
- package/dist/__tests__/repo-picker.test.js +115 -0
- package/dist/__tests__/repo-picker.test.js.map +1 -0
- package/dist/__tests__/review-comment-body.test.d.ts +2 -0
- package/dist/__tests__/review-comment-body.test.d.ts.map +1 -0
- package/dist/__tests__/review-comment-body.test.js +54 -0
- package/dist/__tests__/review-comment-body.test.js.map +1 -0
- package/dist/__tests__/review-models.test.d.ts +2 -0
- package/dist/__tests__/review-models.test.d.ts.map +1 -0
- package/dist/__tests__/review-models.test.js +39 -0
- package/dist/__tests__/review-models.test.js.map +1 -0
- package/dist/__tests__/review-status.test.d.ts +2 -0
- package/dist/__tests__/review-status.test.d.ts.map +1 -0
- package/dist/__tests__/review-status.test.js +95 -0
- package/dist/__tests__/review-status.test.js.map +1 -0
- package/dist/__tests__/runner.test.d.ts +2 -0
- package/dist/__tests__/runner.test.d.ts.map +1 -0
- package/dist/__tests__/runner.test.js +204 -0
- package/dist/__tests__/runner.test.js.map +1 -0
- package/dist/__tests__/scan-cache.test.d.ts +2 -0
- package/dist/__tests__/scan-cache.test.d.ts.map +1 -0
- package/dist/__tests__/scan-cache.test.js +59 -0
- package/dist/__tests__/scan-cache.test.js.map +1 -0
- package/dist/__tests__/scan-client.test.d.ts +2 -0
- package/dist/__tests__/scan-client.test.d.ts.map +1 -0
- package/dist/__tests__/scan-client.test.js +30 -0
- package/dist/__tests__/scan-client.test.js.map +1 -0
- package/dist/__tests__/scan.test.d.ts +2 -0
- package/dist/__tests__/scan.test.d.ts.map +1 -0
- package/dist/__tests__/scan.test.js +115 -0
- package/dist/__tests__/scan.test.js.map +1 -0
- package/dist/__tests__/scopes.test.d.ts +2 -0
- package/dist/__tests__/scopes.test.d.ts.map +1 -0
- package/dist/__tests__/scopes.test.js +101 -0
- package/dist/__tests__/scopes.test.js.map +1 -0
- package/dist/__tests__/sha-cache.test.d.ts +2 -0
- package/dist/__tests__/sha-cache.test.d.ts.map +1 -0
- package/dist/__tests__/sha-cache.test.js +40 -0
- package/dist/__tests__/sha-cache.test.js.map +1 -0
- package/dist/__tests__/smart-switch.test.d.ts +2 -0
- package/dist/__tests__/smart-switch.test.d.ts.map +1 -0
- package/dist/__tests__/smart-switch.test.js +145 -0
- package/dist/__tests__/smart-switch.test.js.map +1 -0
- package/dist/ck.d.ts +3 -0
- package/dist/ck.d.ts.map +1 -0
- package/dist/ck.js +8 -0
- package/dist/ck.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +132 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/diagnose.d.ts +54 -0
- package/dist/commands/diagnose.d.ts.map +1 -0
- package/dist/commands/diagnose.js +294 -0
- package/dist/commands/diagnose.js.map +1 -0
- package/dist/commands/impact.d.ts +38 -0
- package/dist/commands/impact.d.ts.map +1 -0
- package/dist/commands/impact.js +210 -0
- package/dist/commands/impact.js.map +1 -0
- package/dist/commands/init.d.ts +12 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +183 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/issue.d.ts +25 -0
- package/dist/commands/issue.d.ts.map +1 -0
- package/dist/commands/issue.js +445 -0
- package/dist/commands/issue.js.map +1 -0
- package/dist/commands/kickass.d.ts +59 -0
- package/dist/commands/kickass.d.ts.map +1 -0
- package/dist/commands/kickass.js +288 -0
- package/dist/commands/kickass.js.map +1 -0
- package/dist/commands/onboard.d.ts +70 -0
- package/dist/commands/onboard.d.ts.map +1 -0
- package/dist/commands/onboard.js +883 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/commands/optimize.d.ts +16 -0
- package/dist/commands/optimize.d.ts.map +1 -0
- package/dist/commands/optimize.js +244 -0
- package/dist/commands/optimize.js.map +1 -0
- package/dist/commands/review.d.ts +2 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +118 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/run.d.ts +13 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +243 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/scan.d.ts +94 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +276 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/serve.d.ts +9 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +402 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +89 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/watch.d.ts +9 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +902 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/config/loader.d.ts +47 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +334 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +814 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +152 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/github/client.d.ts +139 -0
- package/dist/github/client.d.ts.map +1 -0
- package/dist/github/client.js +711 -0
- package/dist/github/client.js.map +1 -0
- package/dist/github/detector.d.ts +12 -0
- package/dist/github/detector.d.ts.map +1 -0
- package/dist/github/detector.js +120 -0
- package/dist/github/detector.js.map +1 -0
- package/dist/github/merge.d.ts +9 -0
- package/dist/github/merge.d.ts.map +1 -0
- package/dist/github/merge.js +33 -0
- package/dist/github/merge.js.map +1 -0
- package/dist/github/review-status.d.ts +6 -0
- package/dist/github/review-status.d.ts.map +1 -0
- package/dist/github/review-status.js +51 -0
- package/dist/github/review-status.js.map +1 -0
- package/dist/github/webhook.d.ts +41 -0
- package/dist/github/webhook.d.ts.map +1 -0
- package/dist/github/webhook.js +50 -0
- package/dist/github/webhook.js.map +1 -0
- package/dist/lib/annotation.d.ts +23 -0
- package/dist/lib/annotation.d.ts.map +1 -0
- package/dist/lib/annotation.js +103 -0
- package/dist/lib/annotation.js.map +1 -0
- package/dist/lib/backtrace.d.ts +40 -0
- package/dist/lib/backtrace.d.ts.map +1 -0
- package/dist/lib/backtrace.js +169 -0
- package/dist/lib/backtrace.js.map +1 -0
- package/dist/lib/board.d.ts +74 -0
- package/dist/lib/board.d.ts.map +1 -0
- package/dist/lib/board.js +640 -0
- package/dist/lib/board.js.map +1 -0
- package/dist/lib/clone.d.ts +12 -0
- package/dist/lib/clone.d.ts.map +1 -0
- package/dist/lib/clone.js +30 -0
- package/dist/lib/clone.js.map +1 -0
- package/dist/lib/comment-bodies.d.ts +17 -0
- package/dist/lib/comment-bodies.d.ts.map +1 -0
- package/dist/lib/comment-bodies.js +51 -0
- package/dist/lib/comment-bodies.js.map +1 -0
- package/dist/lib/crosscheck-commit.d.ts +2 -0
- package/dist/lib/crosscheck-commit.d.ts.map +1 -0
- package/dist/lib/crosscheck-commit.js +4 -0
- package/dist/lib/crosscheck-commit.js.map +1 -0
- package/dist/lib/diff-hash.d.ts +16 -0
- package/dist/lib/diff-hash.d.ts.map +1 -0
- package/dist/lib/diff-hash.js +71 -0
- package/dist/lib/diff-hash.js.map +1 -0
- package/dist/lib/durations.d.ts +5 -0
- package/dist/lib/durations.d.ts.map +1 -0
- package/dist/lib/durations.js +39 -0
- package/dist/lib/durations.js.map +1 -0
- package/dist/lib/event-fields.d.ts +6 -0
- package/dist/lib/event-fields.d.ts.map +1 -0
- package/dist/lib/event-fields.js +20 -0
- package/dist/lib/event-fields.js.map +1 -0
- package/dist/lib/filter.d.ts +2 -0
- package/dist/lib/filter.d.ts.map +1 -0
- package/dist/lib/filter.js +4 -0
- package/dist/lib/filter.js.map +1 -0
- package/dist/lib/fortune.d.ts +2 -0
- package/dist/lib/fortune.d.ts.map +1 -0
- package/dist/lib/fortune.js +26 -0
- package/dist/lib/fortune.js.map +1 -0
- package/dist/lib/languages.d.ts +3 -0
- package/dist/lib/languages.d.ts.map +1 -0
- package/dist/lib/languages.js +26 -0
- package/dist/lib/languages.js.map +1 -0
- package/dist/lib/log-analysis.d.ts +17 -0
- package/dist/lib/log-analysis.d.ts.map +1 -0
- package/dist/lib/log-analysis.js +72 -0
- package/dist/lib/log-analysis.js.map +1 -0
- package/dist/lib/logger.d.ts +14 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +84 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/port.d.ts +2 -0
- package/dist/lib/port.d.ts.map +1 -0
- package/dist/lib/port.js +21 -0
- package/dist/lib/port.js.map +1 -0
- package/dist/lib/pr-lock.d.ts +4 -0
- package/dist/lib/pr-lock.d.ts.map +1 -0
- package/dist/lib/pr-lock.js +91 -0
- package/dist/lib/pr-lock.js.map +1 -0
- package/dist/lib/pr-picker.d.ts +10 -0
- package/dist/lib/pr-picker.d.ts.map +1 -0
- package/dist/lib/pr-picker.js +80 -0
- package/dist/lib/pr-picker.js.map +1 -0
- package/dist/lib/pr-status.d.ts +206 -0
- package/dist/lib/pr-status.d.ts.map +1 -0
- package/dist/lib/pr-status.js +613 -0
- package/dist/lib/pr-status.js.map +1 -0
- package/dist/lib/repo-picker.d.ts +23 -0
- package/dist/lib/repo-picker.d.ts.map +1 -0
- package/dist/lib/repo-picker.js +411 -0
- package/dist/lib/repo-picker.js.map +1 -0
- package/dist/lib/review-models.d.ts +7 -0
- package/dist/lib/review-models.d.ts.map +1 -0
- package/dist/lib/review-models.js +32 -0
- package/dist/lib/review-models.js.map +1 -0
- package/dist/lib/runner.d.ts +65 -0
- package/dist/lib/runner.d.ts.map +1 -0
- package/dist/lib/runner.js +710 -0
- package/dist/lib/runner.js.map +1 -0
- package/dist/lib/scan-cache.d.ts +31 -0
- package/dist/lib/scan-cache.d.ts.map +1 -0
- package/dist/lib/scan-cache.js +112 -0
- package/dist/lib/scan-cache.js.map +1 -0
- package/dist/lib/scopes.d.ts +16 -0
- package/dist/lib/scopes.d.ts.map +1 -0
- package/dist/lib/scopes.js +37 -0
- package/dist/lib/scopes.js.map +1 -0
- package/dist/lib/sha-cache.d.ts +7 -0
- package/dist/lib/sha-cache.d.ts.map +1 -0
- package/dist/lib/sha-cache.js +44 -0
- package/dist/lib/sha-cache.js.map +1 -0
- package/dist/lib/smart-switch.d.ts +44 -0
- package/dist/lib/smart-switch.d.ts.map +1 -0
- package/dist/lib/smart-switch.js +145 -0
- package/dist/lib/smart-switch.js.map +1 -0
- package/dist/lib/verdict.d.ts +9 -0
- package/dist/lib/verdict.d.ts.map +1 -0
- package/dist/lib/verdict.js +52 -0
- package/dist/lib/verdict.js.map +1 -0
- package/dist/lib/workflow.d.ts +85 -0
- package/dist/lib/workflow.d.ts.map +1 -0
- package/dist/lib/workflow.js +116 -0
- package/dist/lib/workflow.js.map +1 -0
- package/dist/reviewers/address.d.ts +5 -0
- package/dist/reviewers/address.d.ts.map +1 -0
- package/dist/reviewers/address.js +87 -0
- package/dist/reviewers/address.js.map +1 -0
- package/dist/reviewers/claude.d.ts +12 -0
- package/dist/reviewers/claude.d.ts.map +1 -0
- package/dist/reviewers/claude.js +78 -0
- package/dist/reviewers/claude.js.map +1 -0
- package/dist/reviewers/codex.d.ts +9 -0
- package/dist/reviewers/codex.d.ts.map +1 -0
- package/dist/reviewers/codex.js +121 -0
- package/dist/reviewers/codex.js.map +1 -0
- package/dist/reviewers/conflict-resolve.d.ts +15 -0
- package/dist/reviewers/conflict-resolve.d.ts.map +1 -0
- package/dist/reviewers/conflict-resolve.js +219 -0
- package/dist/reviewers/conflict-resolve.js.map +1 -0
- package/dist/reviewers/fix.d.ts +7 -0
- package/dist/reviewers/fix.d.ts.map +1 -0
- package/dist/reviewers/fix.js +197 -0
- package/dist/reviewers/fix.js.map +1 -0
- package/get-started.md +1271 -0
- package/get-started.zh.md +1208 -0
- package/package.json +75 -0
|
@@ -0,0 +1,1208 @@
|
|
|
1
|
+
<div align="right">
|
|
2
|
+
<h5><a href="./get-started.md">🌐 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` 写入内容的掌控。
|