@humanbased/crosscheck 1.2.0-beta.81 → 1.2.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/LICENSE +1 -1
- package/README.md +375 -182
- package/README.zh.md +1 -1
- package/crosscheck.config.example.yml +9 -101
- package/dist/__tests__/board.test.js +0 -11
- package/dist/__tests__/board.test.js.map +1 -1
- package/dist/__tests__/codex.test.js +27 -14
- package/dist/__tests__/codex.test.js.map +1 -1
- package/dist/__tests__/comment-bodies.test.js +1 -49
- package/dist/__tests__/comment-bodies.test.js.map +1 -1
- package/dist/__tests__/conflict-resolve.test.js +1 -44
- package/dist/__tests__/conflict-resolve.test.js.map +1 -1
- package/dist/__tests__/fix.test.js +0 -33
- package/dist/__tests__/fix.test.js.map +1 -1
- package/dist/__tests__/onboard-preservation.test.js +3 -59
- package/dist/__tests__/onboard-preservation.test.js.map +1 -1
- package/dist/__tests__/optimize.test.js +0 -2
- package/dist/__tests__/optimize.test.js.map +1 -1
- package/dist/__tests__/repo-picker.test.js +1 -7
- package/dist/__tests__/repo-picker.test.js.map +1 -1
- package/dist/__tests__/review-comment-body.test.js +0 -35
- package/dist/__tests__/review-comment-body.test.js.map +1 -1
- package/dist/__tests__/review-models.test.js +3 -19
- package/dist/__tests__/review-models.test.js.map +1 -1
- package/dist/__tests__/runner.test.js +1 -29
- package/dist/__tests__/runner.test.js.map +1 -1
- package/dist/cli.js +0 -29
- package/dist/cli.js.map +1 -1
- package/dist/commands/onboard.d.ts +3 -36
- package/dist/commands/onboard.d.ts.map +1 -1
- package/dist/commands/onboard.js +42 -233
- package/dist/commands/onboard.js.map +1 -1
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +6 -65
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +7 -45
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +1 -53
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +12 -90
- package/dist/commands/watch.js.map +1 -1
- package/dist/config/loader.d.ts +1 -3
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +0 -13
- package/dist/config/loader.js.map +1 -1
- package/dist/config/review-model-tiers.json +3 -3
- package/dist/config/schema.d.ts +15 -261
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +8 -90
- package/dist/config/schema.js.map +1 -1
- package/dist/github/client.d.ts +1 -21
- package/dist/github/client.d.ts.map +1 -1
- package/dist/github/client.js +7 -46
- package/dist/github/client.js.map +1 -1
- package/dist/github/webhook.d.ts +0 -4
- package/dist/github/webhook.d.ts.map +1 -1
- package/dist/github/webhook.js.map +1 -1
- package/dist/issues/ticket-ref.d.ts.map +1 -1
- package/dist/issues/ticket-ref.js +5 -6
- package/dist/issues/ticket-ref.js.map +1 -1
- package/dist/lib/annotation.d.ts +0 -7
- package/dist/lib/annotation.d.ts.map +1 -1
- package/dist/lib/annotation.js +1 -11
- package/dist/lib/annotation.js.map +1 -1
- package/dist/lib/board.d.ts +0 -3
- package/dist/lib/board.d.ts.map +1 -1
- package/dist/lib/board.js +2 -4
- package/dist/lib/board.js.map +1 -1
- package/dist/lib/clone.d.ts +0 -1
- package/dist/lib/clone.d.ts.map +1 -1
- package/dist/lib/clone.js +10 -32
- package/dist/lib/clone.js.map +1 -1
- package/dist/lib/comment-bodies.d.ts +0 -37
- package/dist/lib/comment-bodies.d.ts.map +1 -1
- package/dist/lib/comment-bodies.js +9 -47
- package/dist/lib/comment-bodies.js.map +1 -1
- package/dist/lib/repo-picker.d.ts +0 -3
- package/dist/lib/repo-picker.d.ts.map +1 -1
- package/dist/lib/repo-picker.js +9 -45
- package/dist/lib/repo-picker.js.map +1 -1
- package/dist/lib/review-models.d.ts +2 -15
- package/dist/lib/review-models.d.ts.map +1 -1
- package/dist/lib/review-models.js +6 -26
- package/dist/lib/review-models.js.map +1 -1
- package/dist/lib/runner.d.ts +0 -92
- package/dist/lib/runner.d.ts.map +1 -1
- package/dist/lib/runner.js +54 -470
- package/dist/lib/runner.js.map +1 -1
- package/dist/lib/workflow.d.ts +0 -9
- package/dist/lib/workflow.d.ts.map +1 -1
- package/dist/lib/workflow.js +0 -20
- package/dist/lib/workflow.js.map +1 -1
- package/dist/reviewers/claude.d.ts +1 -4
- package/dist/reviewers/claude.d.ts.map +1 -1
- package/dist/reviewers/claude.js +7 -39
- package/dist/reviewers/claude.js.map +1 -1
- package/dist/reviewers/codex.d.ts +1 -3
- package/dist/reviewers/codex.d.ts.map +1 -1
- package/dist/reviewers/codex.js +70 -76
- package/dist/reviewers/codex.js.map +1 -1
- package/dist/reviewers/conflict-resolve.d.ts +1 -3
- package/dist/reviewers/conflict-resolve.d.ts.map +1 -1
- package/dist/reviewers/conflict-resolve.js +6 -21
- package/dist/reviewers/conflict-resolve.js.map +1 -1
- package/dist/reviewers/fix.d.ts +2 -5
- package/dist/reviewers/fix.d.ts.map +1 -1
- package/dist/reviewers/fix.js +10 -26
- package/dist/reviewers/fix.js.map +1 -1
- package/get-started.md +11 -207
- package/package.json +3 -4
- package/assets/icon-256.png +0 -0
- package/assets/linear-comment.svg +0 -18
- package/assets/linear-onboard.svg +0 -30
- package/assets/linear-status.svg +0 -23
- package/assets/linear-test.svg +0 -34
- package/assets/skills/code-review/.crosscheck-skill.json +0 -9
- package/assets/skills/code-review/LICENSE +0 -21
- package/assets/skills/code-review/SKILL.md +0 -89
- package/assets/skills/code-review/agents/openai.yaml +0 -3
- package/assets/skills/code-review-skill/.crosscheck-skill.json +0 -9
- package/assets/skills/code-review-skill/LICENSE +0 -21
- package/assets/skills/code-review-skill/SKILL.md +0 -231
- package/assets/skills/code-review-skill/assets/pr-review-template.md +0 -137
- package/assets/skills/code-review-skill/assets/review-checklist.md +0 -123
- package/assets/skills/code-review-skill/reference/angular.md +0 -768
- package/assets/skills/code-review-skill/reference/architecture-review-guide.md +0 -472
- package/assets/skills/code-review-skill/reference/c.md +0 -890
- package/assets/skills/code-review-skill/reference/code-quality-universal.md +0 -488
- package/assets/skills/code-review-skill/reference/code-review-best-practices.md +0 -136
- package/assets/skills/code-review-skill/reference/common-bugs-checklist.md +0 -286
- package/assets/skills/code-review-skill/reference/cpp.md +0 -893
- package/assets/skills/code-review-skill/reference/cross-cutting/async-concurrency-patterns.md +0 -515
- package/assets/skills/code-review-skill/reference/cross-cutting/error-handling-principles.md +0 -492
- package/assets/skills/code-review-skill/reference/cross-cutting/n-plus-one-queries.md +0 -309
- package/assets/skills/code-review-skill/reference/cross-cutting/sql-injection-prevention.md +0 -308
- package/assets/skills/code-review-skill/reference/cross-cutting/xss-prevention.md +0 -264
- package/assets/skills/code-review-skill/reference/csharp.md +0 -525
- package/assets/skills/code-review-skill/reference/css-less-sass.md +0 -661
- package/assets/skills/code-review-skill/reference/django.md +0 -985
- package/assets/skills/code-review-skill/reference/fastapi.md +0 -580
- package/assets/skills/code-review-skill/reference/go.md +0 -993
- package/assets/skills/code-review-skill/reference/java.md +0 -409
- package/assets/skills/code-review-skill/reference/java8.md +0 -586
- package/assets/skills/code-review-skill/reference/kotlin.md +0 -1018
- package/assets/skills/code-review-skill/reference/nestjs.md +0 -593
- package/assets/skills/code-review-skill/reference/performance-review-guide.md +0 -816
- package/assets/skills/code-review-skill/reference/php.md +0 -684
- package/assets/skills/code-review-skill/reference/python.md +0 -1073
- package/assets/skills/code-review-skill/reference/qt.md +0 -757
- package/assets/skills/code-review-skill/reference/react.md +0 -871
- package/assets/skills/code-review-skill/reference/ruby.md +0 -964
- package/assets/skills/code-review-skill/reference/rust.md +0 -846
- package/assets/skills/code-review-skill/reference/security-review-guide.md +0 -494
- package/assets/skills/code-review-skill/reference/svelte.md +0 -1064
- package/assets/skills/code-review-skill/reference/swift.md +0 -936
- package/assets/skills/code-review-skill/reference/typescript.md +0 -1016
- package/assets/skills/code-review-skill/reference/vue.md +0 -924
- package/assets/skills/code-review-skill/reference/zig.md +0 -440
- package/assets/skills/code-review-skill/scripts/pr-analyzer.py +0 -435
- package/assets/skills/code-review-skill/scripts/test_pr_analyzer.py +0 -380
- package/assets/skills/codebase-design/.crosscheck-skill.json +0 -9
- package/assets/skills/codebase-design/DEEPENING.md +0 -37
- package/assets/skills/codebase-design/DESIGN-IT-TWICE.md +0 -44
- package/assets/skills/codebase-design/LICENSE +0 -21
- package/assets/skills/codebase-design/SKILL.md +0 -114
- package/assets/skills/codebase-design/agents/openai.yaml +0 -3
- package/assets/skills/diagnosing-bugs/.crosscheck-skill.json +0 -9
- package/assets/skills/diagnosing-bugs/LICENSE +0 -21
- package/assets/skills/diagnosing-bugs/SKILL.md +0 -134
- package/assets/skills/diagnosing-bugs/agents/openai.yaml +0 -3
- package/assets/skills/diagnosing-bugs/scripts/hitl-loop.template.sh +0 -41
- package/dist/__tests__/can-write-verdict.test.d.ts +0 -2
- package/dist/__tests__/can-write-verdict.test.d.ts.map +0 -1
- package/dist/__tests__/can-write-verdict.test.js +0 -31
- package/dist/__tests__/can-write-verdict.test.js.map +0 -1
- package/dist/__tests__/linear-branding.test.d.ts +0 -2
- package/dist/__tests__/linear-branding.test.d.ts.map +0 -1
- package/dist/__tests__/linear-branding.test.js +0 -156
- package/dist/__tests__/linear-branding.test.js.map +0 -1
- package/dist/__tests__/linear-client.test.d.ts +0 -2
- package/dist/__tests__/linear-client.test.d.ts.map +0 -1
- package/dist/__tests__/linear-client.test.js +0 -120
- package/dist/__tests__/linear-client.test.js.map +0 -1
- package/dist/__tests__/linear-comment.test.d.ts +0 -2
- package/dist/__tests__/linear-comment.test.d.ts.map +0 -1
- package/dist/__tests__/linear-comment.test.js +0 -151
- package/dist/__tests__/linear-comment.test.js.map +0 -1
- package/dist/__tests__/linear-identity.test.d.ts +0 -2
- package/dist/__tests__/linear-identity.test.d.ts.map +0 -1
- package/dist/__tests__/linear-identity.test.js +0 -253
- package/dist/__tests__/linear-identity.test.js.map +0 -1
- package/dist/__tests__/linear-notify.test.d.ts +0 -2
- package/dist/__tests__/linear-notify.test.d.ts.map +0 -1
- package/dist/__tests__/linear-notify.test.js +0 -144
- package/dist/__tests__/linear-notify.test.js.map +0 -1
- package/dist/__tests__/linear-ref.test.d.ts +0 -2
- package/dist/__tests__/linear-ref.test.d.ts.map +0 -1
- package/dist/__tests__/linear-ref.test.js +0 -261
- package/dist/__tests__/linear-ref.test.js.map +0 -1
- package/dist/__tests__/linear-test-ref.test.d.ts +0 -2
- package/dist/__tests__/linear-test-ref.test.d.ts.map +0 -1
- package/dist/__tests__/linear-test-ref.test.js +0 -81
- package/dist/__tests__/linear-test-ref.test.js.map +0 -1
- package/dist/__tests__/linear-verify.test.d.ts +0 -2
- package/dist/__tests__/linear-verify.test.d.ts.map +0 -1
- package/dist/__tests__/linear-verify.test.js +0 -132
- package/dist/__tests__/linear-verify.test.js.map +0 -1
- package/dist/__tests__/linear-worker.test.d.ts +0 -2
- package/dist/__tests__/linear-worker.test.d.ts.map +0 -1
- package/dist/__tests__/linear-worker.test.js +0 -83
- package/dist/__tests__/linear-worker.test.js.map +0 -1
- package/dist/__tests__/linear-write-possible.test.d.ts +0 -2
- package/dist/__tests__/linear-write-possible.test.d.ts.map +0 -1
- package/dist/__tests__/linear-write-possible.test.js +0 -30
- package/dist/__tests__/linear-write-possible.test.js.map +0 -1
- package/dist/__tests__/repository-guidance.test.d.ts +0 -2
- package/dist/__tests__/repository-guidance.test.d.ts.map +0 -1
- package/dist/__tests__/repository-guidance.test.js +0 -107
- package/dist/__tests__/repository-guidance.test.js.map +0 -1
- package/dist/__tests__/review-strategy.test.d.ts +0 -2
- package/dist/__tests__/review-strategy.test.d.ts.map +0 -1
- package/dist/__tests__/review-strategy.test.js +0 -397
- package/dist/__tests__/review-strategy.test.js.map +0 -1
- package/dist/__tests__/skill-attribution.test.d.ts +0 -2
- package/dist/__tests__/skill-attribution.test.d.ts.map +0 -1
- package/dist/__tests__/skill-attribution.test.js +0 -53
- package/dist/__tests__/skill-attribution.test.js.map +0 -1
- package/dist/__tests__/skill-broker.test.d.ts +0 -2
- package/dist/__tests__/skill-broker.test.d.ts.map +0 -1
- package/dist/__tests__/skill-broker.test.js +0 -144
- package/dist/__tests__/skill-broker.test.js.map +0 -1
- package/dist/__tests__/skill-catalog.test.d.ts +0 -2
- package/dist/__tests__/skill-catalog.test.d.ts.map +0 -1
- package/dist/__tests__/skill-catalog.test.js +0 -40
- package/dist/__tests__/skill-catalog.test.js.map +0 -1
- package/dist/__tests__/skill-installer.test.d.ts +0 -2
- package/dist/__tests__/skill-installer.test.d.ts.map +0 -1
- package/dist/__tests__/skill-installer.test.js +0 -96
- package/dist/__tests__/skill-installer.test.js.map +0 -1
- package/dist/__tests__/skills-config.test.d.ts +0 -2
- package/dist/__tests__/skills-config.test.d.ts.map +0 -1
- package/dist/__tests__/skills-config.test.js +0 -12
- package/dist/__tests__/skills-config.test.js.map +0 -1
- package/dist/commands/linear-test.d.ts +0 -18
- package/dist/commands/linear-test.d.ts.map +0 -1
- package/dist/commands/linear-test.js +0 -130
- package/dist/commands/linear-test.js.map +0 -1
- package/dist/commands/skill.d.ts +0 -2
- package/dist/commands/skill.d.ts.map +0 -1
- package/dist/commands/skill.js +0 -16
- package/dist/commands/skill.js.map +0 -1
- package/dist/config/review-strategy.json +0 -204
- package/dist/lib/repository-guidance.d.ts +0 -2
- package/dist/lib/repository-guidance.d.ts.map +0 -1
- package/dist/lib/repository-guidance.js +0 -55
- package/dist/lib/repository-guidance.js.map +0 -1
- package/dist/lib/review-strategy.d.ts +0 -92
- package/dist/lib/review-strategy.d.ts.map +0 -1
- package/dist/lib/review-strategy.js +0 -282
- package/dist/lib/review-strategy.js.map +0 -1
- package/dist/linear/client.d.ts +0 -18
- package/dist/linear/client.d.ts.map +0 -1
- package/dist/linear/client.js +0 -67
- package/dist/linear/client.js.map +0 -1
- package/dist/linear/comment.d.ts +0 -20
- package/dist/linear/comment.d.ts.map +0 -1
- package/dist/linear/comment.js +0 -57
- package/dist/linear/comment.js.map +0 -1
- package/dist/linear/identity.d.ts +0 -59
- package/dist/linear/identity.d.ts.map +0 -1
- package/dist/linear/identity.js +0 -187
- package/dist/linear/identity.js.map +0 -1
- package/dist/linear/notify.d.ts +0 -35
- package/dist/linear/notify.d.ts.map +0 -1
- package/dist/linear/notify.js +0 -76
- package/dist/linear/notify.js.map +0 -1
- package/dist/linear/ref.d.ts +0 -13
- package/dist/linear/ref.d.ts.map +0 -1
- package/dist/linear/ref.js +0 -90
- package/dist/linear/ref.js.map +0 -1
- package/dist/linear/verify.d.ts +0 -26
- package/dist/linear/verify.d.ts.map +0 -1
- package/dist/linear/verify.js +0 -67
- package/dist/linear/verify.js.map +0 -1
- package/dist/skills/attribution.d.ts +0 -4
- package/dist/skills/attribution.d.ts.map +0 -1
- package/dist/skills/attribution.js +0 -14
- package/dist/skills/attribution.js.map +0 -1
- package/dist/skills/broker-server.d.ts +0 -2
- package/dist/skills/broker-server.d.ts.map +0 -1
- package/dist/skills/broker-server.js +0 -17
- package/dist/skills/broker-server.js.map +0 -1
- package/dist/skills/broker.d.ts +0 -42
- package/dist/skills/broker.d.ts.map +0 -1
- package/dist/skills/broker.js +0 -285
- package/dist/skills/broker.js.map +0 -1
- package/dist/skills/catalog.d.ts +0 -28
- package/dist/skills/catalog.d.ts.map +0 -1
- package/dist/skills/catalog.js +0 -104
- package/dist/skills/catalog.js.map +0 -1
- package/dist/skills/installer.d.ts +0 -10
- package/dist/skills/installer.d.ts.map +0 -1
- package/dist/skills/installer.js +0 -138
- package/dist/skills/installer.js.map +0 -1
- package/dist/skills/integrity.d.ts +0 -4
- package/dist/skills/integrity.d.ts.map +0 -1
- package/dist/skills/integrity.js +0 -36
- package/dist/skills/integrity.js.map +0 -1
- package/docs/dynamic-thoroughness.md +0 -738
- package/docs/linear-identity-contract.md +0 -139
- package/docs/linear-identity.md +0 -293
package/README.md
CHANGED
|
@@ -6,313 +6,509 @@
|
|
|
6
6
|
<img src="./assets/logo.png" alt="crosscheck" width="160" />
|
|
7
7
|
</p>
|
|
8
8
|
|
|
9
|
-
<
|
|
9
|
+
<p align="center"><em>A Humanbased project, built with crosscheck.</em></p>
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
<p align="center">
|
|
14
|
-
<a href="https://www.npmjs.com/package/@humanbased/crosscheck"><img src="https://img.shields.io/npm/v/@humanbased/crosscheck?color=2f6feb&label=npm" alt="npm" /></a>
|
|
15
|
-
<a href="./LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue" alt="MIT" /></a>
|
|
16
|
-
<a href="https://nodejs.org"><img src="https://img.shields.io/badge/node-18%2B-brightgreen" alt="Node 18+" /></a>
|
|
17
|
-
</p>
|
|
11
|
+
# crosscheck
|
|
18
12
|
|
|
19
13
|
<p align="center">
|
|
20
14
|
<img src="./assets/screenshot-watch.png" alt="crosscheck watch — live pipeline view" width="860" />
|
|
21
15
|
</p>
|
|
22
16
|
|
|
23
|
-
|
|
17
|
+
**Your agents ship fast. Crosscheck makes sure they ship right.**
|
|
24
18
|
|
|
25
|
-
|
|
19
|
+
AI coding agents create PRs faster than review habits can absorb. The failure mode isn't broken builds — it's *early victory*: patches that pass CI, look complete, and still hide regressions, brittle edge cases, or half-finished fixes.
|
|
26
20
|
|
|
27
|
-
|
|
21
|
+
Crosscheck adds an independent Review → Fix → Recheck loop. One agent writes the patch. Another reviews it. Findings go back to the author to repair. The result gets rechecked before merge. The PR moves toward genuinely merge-ready — not just "looks green."
|
|
28
22
|
|
|
29
|
-
|
|
23
|
+
No new hosted service. No per-review API bill. Crosscheck runs through the `claude` and `codex` CLIs you already have — your existing subscriptions, your machine or server.
|
|
30
24
|
|
|
31
|
-
|
|
25
|
+
Built by [Humanbased](https://github.com/humanbased-ai). Read the field report: [What 295 Agentic PRs Taught Us About Code Review](https://blog.humanbased.ai/posts/agentic-pr-quality-crosscheck/) — 295 agentic PRs analyzed, real Crosscheck logs included.
|
|
32
26
|
|
|
33
|
-
|
|
27
|
+
## Why crosscheck?
|
|
34
28
|
|
|
35
|
-
|
|
36
|
-
PR → review → fix → recheck → merge-ready
|
|
37
|
-
(codex) (claude) (codex)
|
|
38
|
-
```
|
|
29
|
+
**Agent velocity without lowering the merge bar.**
|
|
39
30
|
|
|
40
|
-
|
|
31
|
+
- **Independent eyes, not self-review** — route Claude-authored PRs to Codex and vice versa. Self-review is exactly where early-victory failures hide.
|
|
32
|
+
- **Review → Fix → Recheck, not just comments** — findings return to the author agent for repair; a clean recheck follows before merge. PRs move forward, not sideways.
|
|
33
|
+
- **No new vendor** — runs through the `claude` and `codex` CLIs you already pay for. No per-review bill, no extra trust surface.
|
|
34
|
+
- **Configurable for any team size** — review-only, review + fix, or the full loop. Use one workflow locally, or one always-on team watcher with per-repo overrides via `crosscheck alter`.
|
|
41
35
|
|
|
42
|
-
|
|
43
|
-
- **A loop, not a comment.** Findings return to the author agent for repair; a clean recheck follows. The PR moves forward instead of sideways.
|
|
44
|
-
- **No new vendor.** Runs through the `claude` and `codex` CLIs you already pay for. No hosted service, no per-review API bill, no extra trust surface.
|
|
36
|
+
## Who uses crosscheck
|
|
45
37
|
|
|
46
|
-
|
|
38
|
+
| Persona | Problem | How crosscheck helps |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| **Solo agentic builder** | Same agent that wrote the code may self-approve incomplete work | Independent reviewer from a different vendor, on your machine |
|
|
41
|
+
| **Technical founder** | AI PRs look done before delivering stable value | Closes the loop: review finding → agent fix → clean recheck |
|
|
42
|
+
| **Engineering lead** | Agent use is hard to supervise or standardize | A default full-loop workflow, per-repo overrides (`crosscheck alter`), and a visible PR audit trail |
|
|
43
|
+
| **OSS maintainer** | Review bandwidth is scarce; comments must be actionable | One-shot `crosscheck review` posts concrete findings directly on the PR |
|
|
47
44
|
|
|
48
|
-
|
|
45
|
+
### Usage scenarios
|
|
49
46
|
|
|
50
|
-
|
|
47
|
+
**Local use**
|
|
51
48
|
|
|
52
|
-
|
|
53
|
-
- `codebase-design (by @mattpocock, MIT)` — evaluates deep modules, small interfaces, clean seams, and testability.
|
|
54
|
-
- `diagnosing-bugs (by @mattpocock, MIT)` — requires a reproducible signal, tested hypotheses, and regression evidence before declaring a fix complete.
|
|
49
|
+
Use Crosscheck from your own machine when you want an independent review before merge, or a temporary watcher while you work.
|
|
55
50
|
|
|
56
|
-
|
|
51
|
+
```bash
|
|
52
|
+
# Catch regressions before merging a solo PR
|
|
53
|
+
crosscheck run <pr-url>
|
|
57
54
|
|
|
58
|
-
|
|
55
|
+
# One-shot review of a specific PR
|
|
56
|
+
crosscheck review <pr-url>
|
|
59
57
|
|
|
60
|
-
|
|
58
|
+
# Continuous review while your terminal is open
|
|
59
|
+
crosscheck onboard --personal
|
|
60
|
+
crosscheck watch
|
|
61
61
|
|
|
62
|
-
|
|
62
|
+
# Loop until the agent produces an approved patch
|
|
63
|
+
crosscheck run <pr-url> --crazy
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Always-on team server**
|
|
67
|
+
|
|
68
|
+
Run one long-lived `watch` process for the whole team or org on a shared machine. Configure the default workflow once, then narrow individual repos only when needed.
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# One-time setup on the server
|
|
72
|
+
crosscheck onboard --team
|
|
73
|
+
|
|
74
|
+
# Example: one repo gets review-only, the rest keep the global workflow
|
|
75
|
+
crosscheck alter humanbased-ai/xny-monorepo --review-only
|
|
76
|
+
|
|
77
|
+
# Start the team watcher
|
|
78
|
+
crosscheck watch
|
|
79
|
+
```
|
|
63
80
|
|
|
64
81
|
---
|
|
65
82
|
|
|
66
|
-
##
|
|
83
|
+
## Quick start
|
|
84
|
+
|
|
85
|
+
### First useful review in 10 minutes
|
|
86
|
+
|
|
87
|
+
Start with one low-risk PR before turning on continuous watch mode. You only need GitHub CLI plus one authenticated reviewer CLI.
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# 1. Install crosscheck
|
|
91
|
+
npm install -g @humanbased/crosscheck
|
|
92
|
+
|
|
93
|
+
# 2. Authenticate GitHub
|
|
94
|
+
brew install gh && gh auth login
|
|
95
|
+
|
|
96
|
+
# 3. Authenticate one reviewer
|
|
97
|
+
npm install -g @openai/codex && codex login --device-auth
|
|
98
|
+
# or:
|
|
99
|
+
npm install -g @anthropic-ai/claude-code && claude
|
|
100
|
+
|
|
101
|
+
# 4. Check your setup
|
|
102
|
+
crosscheck status
|
|
103
|
+
|
|
104
|
+
# 5. Review the public fixture PR
|
|
105
|
+
crosscheck review https://github.com/humanbased-ai/crosscheck-proof-fixture/pull/1 --reviewer codex
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
This fixture PR intentionally contains a realistic agentic-code regression, so you can see whether Crosscheck produces a useful review before pointing it at your own repo. Use `--reviewer claude` if Claude Code is the authenticated reviewer. After the fixture review works, swap in one low-risk PR from your repo, then run `crosscheck onboard` to configure repos, workflow mode, and continuous monitoring.
|
|
109
|
+
|
|
110
|
+
### Continuous local mode
|
|
67
111
|
|
|
68
112
|
```bash
|
|
113
|
+
# 1. Install crosscheck and the agent CLIs
|
|
69
114
|
npm install -g @humanbased/crosscheck
|
|
115
|
+
npm install -g @anthropic-ai/claude-code && claude # Claude Pro/Max subscription
|
|
116
|
+
npm install -g @openai/codex && codex login --device-auth # ChatGPT Plus/Pro subscription
|
|
117
|
+
brew install gh && gh auth login # GitHub CLI
|
|
118
|
+
|
|
119
|
+
# 2. Guided setup — repos, review mode, workflow pipeline
|
|
120
|
+
crosscheck onboard
|
|
121
|
+
|
|
122
|
+
# 3. Start watching
|
|
123
|
+
crosscheck watch # continuous review → fix → recheck as PRs arrive
|
|
70
124
|
```
|
|
71
125
|
|
|
72
|
-
|
|
73
|
-
|
|
126
|
+
> Want reviews only (no auto-fix) for a repo? Make it review-only with
|
|
127
|
+
> `crosscheck alter owner/repo --review-only` — see [per-repo overrides](#crosscheck-alter-repo).
|
|
128
|
+
|
|
129
|
+
### Always-on team mode
|
|
74
130
|
|
|
75
131
|
```bash
|
|
76
|
-
|
|
77
|
-
|
|
132
|
+
# 1. Run guided setup on the shared machine
|
|
133
|
+
crosscheck onboard --team
|
|
78
134
|
|
|
79
|
-
|
|
80
|
-
|
|
135
|
+
# 2. Optional: tune individual repos without changing the global workflow
|
|
136
|
+
crosscheck alter humanbased-ai/xny-monorepo --review-only
|
|
137
|
+
crosscheck alter humanbased-ai/api --steps review,fix,recheck
|
|
138
|
+
|
|
139
|
+
# 3. Start the long-lived watcher
|
|
140
|
+
crosscheck watch
|
|
81
141
|
```
|
|
82
|
-
</details>
|
|
83
142
|
|
|
84
|
-
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Commands
|
|
85
146
|
|
|
86
147
|
```bash
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
148
|
+
crosscheck onboard # guided setup — pick repos, mode, and default pipeline
|
|
149
|
+
crosscheck alter <repo> # per-repo override: --steps review,fix | --review-only | --reset | --show
|
|
150
|
+
crosscheck watch # continuous use — tunnel + webhook + listening
|
|
151
|
+
crosscheck review <pr-urls...> # review one or more PRs (comma lists, ranges, cross-repo)
|
|
152
|
+
crosscheck run <pr-urls...> # run the full workflow: review → (fix → recheck) × max_rounds (--review-only for review only)
|
|
153
|
+
crosscheck recheck|fix|resolve <pr-urls...> # force one workflow step on one or more PRs
|
|
154
|
+
crosscheck scan # show open PR workflow state across monitored repos
|
|
155
|
+
crosscheck detect-step <pr-url> # explain the next workflow step for one PR
|
|
156
|
+
crosscheck kickass # advance stale PRs from an interactive operator queue
|
|
157
|
+
crosscheck init # check prerequisites, write starter config
|
|
158
|
+
crosscheck status # auth state, config summary, CLI versions
|
|
90
159
|
```
|
|
91
160
|
|
|
92
|
-
|
|
161
|
+
**Operator queue (scan + kickass)**
|
|
162
|
+
|
|
163
|
+
`crosscheck scan` tracks two independent dimensions per PR:
|
|
164
|
+
|
|
165
|
+
| Workflow stage (`reviewState`) | Meaning | Next action |
|
|
166
|
+
|---|---|---|
|
|
167
|
+
| `NEEDS_REVIEW` | No crosscheck review for current HEAD | review |
|
|
168
|
+
| `NEEDS_FIX` | Reviewed — fix requested | fix |
|
|
169
|
+
| `NEEDS_RECHECK` | Fix committed, recheck pending | recheck |
|
|
170
|
+
| `APPROVED` | Reviewed and approved | merge |
|
|
171
|
+
|
|
172
|
+
| Verdict (`verdict`) | Meaning |
|
|
173
|
+
|---|---|
|
|
174
|
+
| `UNREVIEWED` | No review found |
|
|
175
|
+
| `APPROVE` | AI approved |
|
|
176
|
+
| `NEEDS_WORK` | AI requested changes |
|
|
177
|
+
| `BLOCK` | AI hard-blocked merge |
|
|
93
178
|
|
|
94
|
-
|
|
179
|
+
`BLOCK` and `NEEDS_WORK` both map to `NEEDS_FIX` stage — same next action, but the `verdict` field preserves severity so operators can prioritise.
|
|
180
|
+
|
|
181
|
+
**How workflow steps are counted**
|
|
182
|
+
|
|
183
|
+
Crosscheck reconstructs PR workflow state from visible artifacts:
|
|
184
|
+
|
|
185
|
+
| Evidence | Counts as |
|
|
186
|
+
|---|---|
|
|
187
|
+
| Review or recheck comment with `<!-- crosscheck: ... verdict=... -->` | completed `review` / `recheck` step |
|
|
188
|
+
| Fix or conflict-resolve comment, such as `<!-- crosscheck: fix_applied ... -->` | completed `fix` / `conflict-resolve` step |
|
|
189
|
+
| PR commit trailer, such as `Crosscheck-Step: fix` | completed step declared by that trailer |
|
|
190
|
+
|
|
191
|
+
Commit trailers are accepted as operator-declared workflow state. In practice, a PR author may command Claude, Codex, or another agent to apply a fix outside a standalone Crosscheck post; if the resulting PR commit carries `Crosscheck-Step: fix`, Crosscheck counts it as fix evidence.
|
|
192
|
+
|
|
193
|
+
That evidence only advances the next step to `recheck` when the fix commit is the current PR HEAD. If another commit lands after the fix evidence, Crosscheck starts a fresh review round so the newer code is reviewed normally. This prevents an old fix trailer from marking later changes as ready for recheck.
|
|
95
194
|
|
|
96
195
|
```bash
|
|
97
|
-
crosscheck
|
|
98
|
-
crosscheck
|
|
196
|
+
crosscheck scan [--tidy] [--stale-after <duration>] [--force] [--json]
|
|
197
|
+
crosscheck kickass [--dry-run] [--stale-after <duration>] [--force]
|
|
99
198
|
```
|
|
100
199
|
|
|
101
|
-
|
|
200
|
+
`crosscheck review --reviewer`, `crosscheck run --reviewer`, `crosscheck run --fixer`, and `crosscheck run --vendor` accept vendor aliases:
|
|
201
|
+
- Claude: `claude`, `claude-code`, `cc`, `anthropic`
|
|
202
|
+
- Codex: `codex`, `openai`
|
|
203
|
+
|
|
204
|
+
**Continuous improvement** *(experimental)*
|
|
102
205
|
|
|
103
206
|
```bash
|
|
104
|
-
crosscheck
|
|
105
|
-
crosscheck
|
|
207
|
+
crosscheck diagnose # surface failure patterns from review logs
|
|
208
|
+
crosscheck optimize [--apply] # rewrite reviewer instructions based on diagnose output
|
|
209
|
+
crosscheck impact [--money] # time saved, issues caught, code quality trends
|
|
210
|
+
crosscheck issue # draft and file a bug report from recent error logs
|
|
106
211
|
```
|
|
107
212
|
|
|
108
213
|
---
|
|
109
214
|
|
|
110
|
-
|
|
215
|
+
### `crosscheck onboard`
|
|
111
216
|
|
|
112
|
-
|
|
217
|
+
Interactive setup wizard. Picks repos/orgs to monitor, selects single-vendor or cross-vendor mode, configures the review pipeline, and writes `~/.crosscheck/config.yml` and `workflow.yml`.
|
|
113
218
|
|
|
114
|
-
|
|
219
|
+
```bash
|
|
220
|
+
crosscheck onboard # guided setup
|
|
221
|
+
crosscheck onboard --personal # skip persona prompt, go straight to personal mode
|
|
222
|
+
crosscheck onboard --team # skip persona prompt, go straight to team mode
|
|
223
|
+
crosscheck onboard -y # accept all defaults non-interactively
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
### `crosscheck alter <repo>`
|
|
229
|
+
|
|
230
|
+
Sets the workflow depth for one repo, leaving the global default in place for every other monitored repo. Writes a standalone file at `~/.crosscheck/workflows/<owner>__<repo>.yml` (`alter-workflow` is an alias). This is how you run one watcher for many repos while making one repo review-only. Changes apply on the next PR event — no need to restart `crosscheck watch`.
|
|
115
231
|
|
|
232
|
+
```bash
|
|
233
|
+
crosscheck alter humanbased-ai/xny-monorepo --review-only # alias for --steps review
|
|
234
|
+
crosscheck alter github.com/humanbased-ai/xny-monorepo --steps review,fix
|
|
235
|
+
crosscheck alter https://github.com/humanbased-ai/xny-monorepo --steps review,fix,recheck
|
|
236
|
+
crosscheck alter humanbased-ai/xny-monorepo --show # print effective steps
|
|
237
|
+
crosscheck alter humanbased-ai/xny-monorepo --reset # revert to the global default
|
|
116
238
|
```
|
|
117
|
-
|
|
118
|
-
|
|
239
|
+
|
|
240
|
+
Accepted repo formats: `owner/repo`, `github.com/owner/repo`, and `https://github.com/owner/repo`. The override narrows the global `~/.crosscheck/workflow.yml` — it wins over the global default but a repo-committed `.crosscheck/workflow.yml` still wins over it.
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
### `crosscheck watch`
|
|
245
|
+
|
|
246
|
+
Starts an SSH tunnel (localhost.run), registers GitHub webhooks, and listens for PR events. Everything self-cleans on Ctrl+C.
|
|
247
|
+
|
|
248
|
+
```bash
|
|
249
|
+
crosscheck watch
|
|
250
|
+
crosscheck watch --no-backtrace # skip startup scan for unreviewed open PRs
|
|
251
|
+
crosscheck watch --reconfigure # re-run deployment setup before starting
|
|
119
252
|
```
|
|
120
253
|
|
|
121
|
-
|
|
254
|
+
> For reviews only, make the repo review-only with `crosscheck alter <repo> --review-only` rather than a global flag.
|
|
122
255
|
|
|
123
|
-
|
|
256
|
+
---
|
|
124
257
|
|
|
125
|
-
|
|
258
|
+
### `crosscheck review <pr-urls...>`
|
|
126
259
|
|
|
127
|
-
|
|
128
|
-
<img src="./assets/linear-comment.svg" alt="A crosscheck review comment on a Linear issue" width="740" />
|
|
129
|
-
</p>
|
|
260
|
+
Reviews one or more PRs. Clones, checks out, reviews, and posts the comment. The PR argument accepts the [multi-PR spec syntax](#multi-pr-syntax) — multiple PRs are reviewed concurrently.
|
|
130
261
|
|
|
131
|
-
|
|
262
|
+
```bash
|
|
263
|
+
crosscheck review https://github.com/org/repo/pull/42
|
|
264
|
+
crosscheck review <pr-url> --reviewer claude # force Claude regardless of detection
|
|
265
|
+
crosscheck review <pr-url> --reviewer codex # force Codex regardless of detection
|
|
266
|
+
crosscheck review <pr-url> --reviewer cc # alias for Claude
|
|
267
|
+
crosscheck review <pr-url> --reviewer openai # alias for Codex
|
|
268
|
+
crosscheck review .../pull/245,255 # review several PRs at once
|
|
269
|
+
crosscheck review .../pull/245-256 # review an inclusive range
|
|
270
|
+
```
|
|
132
271
|
|
|
133
|
-
|
|
134
|
-
|---|---|---|
|
|
135
|
-
| **api key** | one env var | Your Linear account, with a `🤖 crosscheck · <model>` signature line |
|
|
136
|
-
| **workspace app** | one OAuth app, ~5 min, once per workspace | crosscheck itself, with its own icon |
|
|
272
|
+
---
|
|
137
273
|
|
|
138
|
-
|
|
274
|
+
### `crosscheck run <pr-urls...>`
|
|
139
275
|
|
|
140
|
-
`crosscheck
|
|
276
|
+
Runs the configured workflow against one or more PRs: review → (fix → recheck) × `max_rounds`. Without `--steps`, this honors any repo workflow set by `crosscheck alter`. Loops autonomously through fix→recheck cycles up to the `max_rounds` value configured in `workflow.yml` (default: 1). Use `--crazy` or `--half-crazy` to loop until approved or unblocked, ignoring `max_rounds`. The PR argument accepts the [multi-PR spec syntax](#multi-pr-syntax); multiple PRs run concurrently (one agent per PR by default).
|
|
141
277
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
278
|
+
```bash
|
|
279
|
+
crosscheck run <pr-url>
|
|
280
|
+
crosscheck run <pr-url> --steps review # only the review step
|
|
281
|
+
crosscheck run <pr-url> --steps fix,recheck # skip initial review
|
|
282
|
+
crosscheck run <pr-url> --reviewer claude # force review/recheck agent
|
|
283
|
+
crosscheck run <pr-url> --fixer claude # force fix agent
|
|
284
|
+
crosscheck run <pr-url> --vendor claude # force review/recheck/fix agent
|
|
285
|
+
crosscheck run <pr-url> --dry-run # review without posting or fixing
|
|
286
|
+
crosscheck run <pr-url> --crazy # 🔥🔥 loop until APPROVE
|
|
287
|
+
crosscheck run <pr-url> --half-crazy # 🔥 loop until not BLOCK
|
|
288
|
+
crosscheck run <pr-url> --timeout 10m # custom reviewer timeout
|
|
289
|
+
crosscheck run .../pull/245,255 # several PRs, concurrently
|
|
290
|
+
crosscheck run .../pull/245-256 --concurrent 3 # range, max 3 agents in parallel
|
|
291
|
+
```
|
|
145
292
|
|
|
146
|
-
|
|
293
|
+
---
|
|
147
294
|
|
|
148
|
-
<
|
|
149
|
-
<img src="./assets/linear-test.svg" alt="crosscheck linear-test — verifying Linear write-back end to end" width="700" />
|
|
150
|
-
</p>
|
|
295
|
+
### `crosscheck recheck` / `fix` / `resolve <pr-urls...>`
|
|
151
296
|
|
|
152
|
-
<
|
|
153
|
-
<summary>Confirming which rung you're on at any time</summary>
|
|
297
|
+
Force a single workflow step against one or more PRs, bypassing next-step auto-detection. Each is sugar for `crosscheck run <spec> --steps <type>` and accepts the same [multi-PR spec syntax](#multi-pr-syntax) and `--concurrent` / `--sequential` / `--stagger` flags as `run`.
|
|
154
298
|
|
|
155
|
-
|
|
299
|
+
| Command | Forces the step |
|
|
300
|
+
|---|---|
|
|
301
|
+
| `crosscheck recheck <spec>` | `recheck` — re-evaluate against the latest review |
|
|
302
|
+
| `crosscheck fix <spec>` | `fix` — apply fixes for the latest review |
|
|
303
|
+
| `crosscheck resolve <spec>` | `conflict-resolve` — resolve merge conflicts (Claude only) |
|
|
156
304
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
305
|
+
```bash
|
|
306
|
+
crosscheck recheck https://github.com/org/repo/pull/42
|
|
307
|
+
crosscheck fix .../pull/245,255 --fixer claude
|
|
308
|
+
crosscheck resolve .../pull/245-256 --vendor claude
|
|
309
|
+
```
|
|
161
310
|
|
|
162
|
-
|
|
311
|
+
When the step is absent from the active `workflow.yml`, `recheck` and `conflict-resolve` are synthesized with built-in defaults so the command still runs.
|
|
163
312
|
|
|
164
313
|
---
|
|
165
314
|
|
|
166
|
-
|
|
315
|
+
### Multi-PR syntax
|
|
167
316
|
|
|
168
|
-
|
|
169
|
-
|---|---|
|
|
170
|
-
| `crosscheck onboard` | Guided setup — repos, routing, pipeline depth, connection |
|
|
171
|
-
| `crosscheck status` | Auth, config, Linear identity, logs, impact summary |
|
|
172
|
-
| `crosscheck skill install <source>` | Install an Agent Skill from Git or a local directory |
|
|
173
|
-
| `crosscheck review <pr>` | One-shot review, posts a comment |
|
|
174
|
-
| `crosscheck run <pr>` | Full pipeline for a PR — review, fix, recheck |
|
|
175
|
-
| `crosscheck recheck` / `fix` / `resolve` | Run one step in isolation |
|
|
176
|
-
| `crosscheck watch` | Listen for PR events and run the pipeline automatically |
|
|
177
|
-
| `crosscheck scan` | Show open PRs with stale crosscheck state |
|
|
178
|
-
| `crosscheck kickass` | Pick a stale PR and drive it to its next step |
|
|
179
|
-
| `crosscheck alter <repo>` | Set a per-repo pipeline depth |
|
|
180
|
-
| `crosscheck detect-step <pr>` | Show step history and the next step to run |
|
|
181
|
-
| `crosscheck linear-test [issue]` | Dry-run Linear write-back |
|
|
182
|
-
| `crosscheck diagnose` / `optimize` / `impact` / `issue` | Analyse logs, tune config, report value, file tickets |
|
|
183
|
-
|
|
184
|
-
Multi-PR forms work where sensible — comma lists, bare numbers, and ranges:
|
|
317
|
+
`run`, `review`, `recheck`, `fix`, and `resolve` accept a single PR URL or a **spec** that expands to many PRs — a comma-separated list of full URLs, bare numbers, and `N-M` ranges:
|
|
185
318
|
|
|
186
319
|
```bash
|
|
187
|
-
|
|
188
|
-
|
|
320
|
+
.../pull/245,255 # two PRs in the same repo
|
|
321
|
+
.../pull/245-256 # an inclusive range
|
|
322
|
+
.../repo/pull/245,https://github.com/o/other/pull/3 # across repos
|
|
189
323
|
```
|
|
190
324
|
|
|
191
|
-
|
|
325
|
+
The first token must be a full URL (a bare number inherits the most recent repo). Duplicates are de-duplicated and a spec expands to at most 100 PRs. Multiple PRs run concurrently by default — control parallelism with `--concurrent <n>`, `--sequential`, or `--stagger <ms>`.
|
|
192
326
|
|
|
193
327
|
---
|
|
194
328
|
|
|
195
|
-
|
|
329
|
+
### `crosscheck scan`
|
|
196
330
|
|
|
197
|
-
|
|
331
|
+
Scans every open PR in the configured monitor scope and reports where each one is in the crosscheck workflow. Results are cached for 60 seconds.
|
|
198
332
|
|
|
199
|
-
|
|
333
|
+
States: `NEEDS_REVIEW` · `NEEDS_FIX` · `BLOCK` · `NEEDS_RECHECK` · `APPROVE`
|
|
200
334
|
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
enabled:
|
|
208
|
-
- code-review-skill # recommended · @awesome-skills, MIT
|
|
209
|
-
- codebase-design # recommended · @mattpocock, MIT
|
|
210
|
-
- diagnosing-bugs # recommended · @mattpocock, MIT
|
|
335
|
+
```bash
|
|
336
|
+
crosscheck scan # all open PRs, grouped stale/not-stale
|
|
337
|
+
crosscheck scan --tidy # stale actionable rows only
|
|
338
|
+
crosscheck scan --stale-after 4h # custom staleness threshold (default 24h)
|
|
339
|
+
crosscheck scan --force # bypass cache
|
|
340
|
+
crosscheck scan --json # machine-readable output
|
|
211
341
|
```
|
|
212
342
|
|
|
213
|
-
|
|
214
|
-
Existing configs keep skills disabled on upgrade; use `crosscheck onboard` to opt in. Installed packages are integrity-checked before agents can load them.
|
|
343
|
+
---
|
|
215
344
|
|
|
216
|
-
|
|
345
|
+
### `crosscheck detect-step`
|
|
217
346
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
347
|
+
Explains the workflow history for one PR and prints the next step Crosscheck would run. Use this when a PR has mixed evidence from comments, Crosscheck commits, or ad hoc agent commits with `Crosscheck-Step` trailers.
|
|
348
|
+
|
|
349
|
+
```bash
|
|
350
|
+
crosscheck detect-step <pr-url>
|
|
351
|
+
crosscheck detect-step <pr-url> --json
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
---
|
|
223
355
|
|
|
224
|
-
|
|
356
|
+
### `crosscheck kickass`
|
|
225
357
|
|
|
226
|
-
|
|
358
|
+
Selects stale PRs from the operator queue and advances them — runs `scan` first, presents a multi-select picker, shows a preflight summary, then executes after confirmation.
|
|
227
359
|
|
|
228
|
-
|
|
360
|
+
```bash
|
|
361
|
+
crosscheck kickass # interactive operator queue
|
|
362
|
+
crosscheck kickass --dry-run # preflight only — no mutations
|
|
363
|
+
crosscheck kickass --stale-after 2h # tighter staleness threshold
|
|
364
|
+
crosscheck kickass --force # bypass scan cache before picking
|
|
365
|
+
crosscheck kickass --crazy # 🔥🔥 auto loop until APPROVE
|
|
366
|
+
crosscheck kickass --half-crazy # 🔥 auto loop until not BLOCK
|
|
367
|
+
```
|
|
229
368
|
|
|
230
|
-
|
|
369
|
+
Actions: `NEEDS_REVIEW → CR` · `NEEDS_FIX/BLOCK → Fix` · `NEEDS_RECHECK → Recheck` · `APPROVE → Merge`
|
|
231
370
|
|
|
232
|
-
|
|
233
|
-
|---|---|---|---|---|
|
|
234
|
-
| 1 | Generated / vendored | every file is a lockfile or build output | — | **PR skipped** |
|
|
235
|
-
| 2 | Security / data-critical | auth, crypto, payment, migration paths; `risk:T3`; hotfix→default | `thorough` | full loop |
|
|
236
|
-
| 3 | Deletion-only | ≤ 5 additions with ≥ 20 deletions | `fast` | review |
|
|
237
|
-
| 4 | Docs / spec | ≥ 50% Markdown | `balanced` | review |
|
|
238
|
-
| 5 | Test-only | every file is a test | `fast` | review, fix |
|
|
239
|
-
| 6 | Config / infra | ≥ 50% config, no source | `balanced` | full loop |
|
|
240
|
-
| 7 | Trivial | ≤ 3 files, ≤ 150 lines | `fast` | review, fix |
|
|
241
|
-
| 8 | Standard | everything else | `balanced` | full loop |
|
|
371
|
+
**`kickass` + `watch` combo**
|
|
242
372
|
|
|
243
|
-
|
|
373
|
+
For the best recovery experience when a batch of PRs is stuck (timed out, stopped before `watch` was running), run both commands together. Each plays a distinct role:
|
|
244
374
|
|
|
245
|
-
|
|
375
|
+
- `kickass` kicks each stuck PR **one step at a time** — it uses `detect-step` to read live PR history and dispatches only the next needed step (review, fix, or recheck).
|
|
376
|
+
- `watch` owns **all continuation** — it listens for the webhooks each completed step produces and runs the full remaining pipeline from there.
|
|
246
377
|
|
|
247
|
-
|
|
378
|
+
```
|
|
379
|
+
crosscheck kickass
|
|
380
|
+
└─ ck run <url> --trigger kickass (one step; detect-step finds where to start)
|
|
381
|
+
└─ detect-step → "review" run review only → posts comment
|
|
382
|
+
└─ detect-step → "fix" run fix only → pushes commit
|
|
383
|
+
└─ detect-step → "recheck" run recheck only → posts verdict
|
|
248
384
|
|
|
249
|
-
|
|
385
|
+
crosscheck watch
|
|
386
|
+
├─ issue_comment (type=review) → pick up fix step automatically
|
|
387
|
+
└─ synchronize (fix commit) → pick up recheck step automatically
|
|
388
|
+
```
|
|
250
389
|
|
|
251
|
-
|
|
390
|
+
> **Note:** `crosscheck run <pr-url>` invoked directly runs the **full remaining pipeline** from the detected starting step. The one-step behaviour above applies only when kickass dispatches it with `--trigger kickass`.
|
|
252
391
|
|
|
253
|
-
|
|
392
|
+
Start `watch` first, then run `kickass` in a second terminal:
|
|
254
393
|
|
|
394
|
+
```bash
|
|
395
|
+
# terminal 1
|
|
396
|
+
crosscheck watch
|
|
397
|
+
|
|
398
|
+
# terminal 2
|
|
399
|
+
crosscheck scan --force # refresh PR state
|
|
400
|
+
crosscheck kickass
|
|
255
401
|
```
|
|
256
|
-
_thorough tier · touches a security or data-critical path, where a missed defect
|
|
257
|
-
is expensive · strategy v1.1.0_
|
|
258
402
|
|
|
259
|
-
|
|
403
|
+
> **How the review→fix bridge works:** after `kickass` posts a review comment, GitHub fires an `issue_comment` webhook (not a `pull_request` event). `watch` subscribes to `issue_comment` and, when it sees a crosscheck `type=review` annotation on an open PR, fetches the current PR head and runs the fix step automatically — no new commit required to wake it up. (Introduced in [#193](https://github.com/Motivation-Labs/crosscheck/pull/193).)
|
|
404
|
+
|
|
405
|
+
**Autonomous loop modes**
|
|
406
|
+
|
|
407
|
+
`--crazy` and `--half-crazy` turn `run` and `kickass` into autonomous fix→recheck loops that keep going until the verdict improves — no manual re-runs needed.
|
|
408
|
+
|
|
409
|
+
| Flag | Stops when | Max rounds | Timeout |
|
|
410
|
+
|---|---|---|---|
|
|
411
|
+
| `--crazy` 🔥🔥 | verdict = `APPROVE` | ∞ | none |
|
|
412
|
+
| `--half-crazy` 🔥 | verdict ≠ `BLOCK` | ∞ | none |
|
|
413
|
+
|
|
414
|
+
Both flags disable all reviewer subprocess timeout constraints — long fixes on large PRs won't be cut short. Use `--timeout <duration>` (e.g. `--timeout 10m`) without these flags to set a custom cap.
|
|
415
|
+
|
|
416
|
+
```bash
|
|
417
|
+
# Run full workflow and keep looping until approved
|
|
418
|
+
crosscheck run <pr-url> --crazy
|
|
419
|
+
|
|
420
|
+
# Advance every stale PR until it's no longer blocked
|
|
421
|
+
crosscheck kickass --half-crazy
|
|
422
|
+
|
|
423
|
+
# Custom timeout without looping
|
|
424
|
+
crosscheck run <pr-url> --timeout 10m
|
|
260
425
|
```
|
|
261
426
|
|
|
262
|
-
|
|
427
|
+
---
|
|
428
|
+
|
|
429
|
+
## Configuration
|
|
263
430
|
|
|
264
|
-
|
|
431
|
+
Crosscheck uses `~/.crosscheck/config.yml` by default. If that file exists, it wins over `./crosscheck.config.yml` unless you pass `--config ./crosscheck.config.yml`.
|
|
265
432
|
|
|
266
|
-
|
|
433
|
+
### Review depth (`quality.tier`)
|
|
267
434
|
|
|
268
|
-
|
|
435
|
+
```yaml
|
|
436
|
+
# crosscheck.config.yml
|
|
437
|
+
quality:
|
|
438
|
+
tier: balanced # fast | balanced | thorough
|
|
439
|
+
```
|
|
269
440
|
|
|
270
|
-
|
|
441
|
+
| Tier | Claude model | Codex model | Latency |
|
|
442
|
+
|---|---|---|---|
|
|
443
|
+
| `fast` | Haiku 4.5 | GPT-5.6 Luna | ~10s |
|
|
444
|
+
| `balanced` | Sonnet 5 | GPT-5.6 Terra | ~30s |
|
|
445
|
+
| `thorough` | Opus 4.8 | GPT-5.6 Sol | ~60s |
|
|
446
|
+
|
|
447
|
+
### Pipeline (`workflow.yml`)
|
|
271
448
|
|
|
272
449
|
```yaml
|
|
273
450
|
steps:
|
|
274
451
|
- name: review
|
|
275
452
|
type: review
|
|
276
|
-
reviewer: auto
|
|
453
|
+
reviewer: auto # auto | claude | codex | origin
|
|
454
|
+
|
|
277
455
|
- name: fix
|
|
278
456
|
type: fix
|
|
279
457
|
reviewer: origin
|
|
280
458
|
when: review.verdict != 'APPROVE'
|
|
459
|
+
|
|
281
460
|
- name: recheck
|
|
282
461
|
type: recheck
|
|
283
462
|
reviewer: auto
|
|
284
463
|
when: fix.applied_count > 0
|
|
285
464
|
```
|
|
286
465
|
|
|
287
|
-
|
|
466
|
+
### Per-repo workflow overrides
|
|
467
|
+
|
|
468
|
+
The global `workflow.yml` is the default for every repo (out of the box, the full `review → fix → recheck` loop). To run one repo at a narrower depth in the same watcher, use `crosscheck alter` — it writes a standalone override file at `~/.crosscheck/workflows/<owner>__<repo>.yml`:
|
|
288
469
|
|
|
289
470
|
```bash
|
|
290
|
-
crosscheck alter
|
|
471
|
+
crosscheck alter humanbased-ai/xny-monorepo --review-only # review only
|
|
472
|
+
crosscheck alter humanbased-ai/api --steps review,fix,recheck # full loop, explicit
|
|
473
|
+
crosscheck alter humanbased-ai/xny-monorepo --reset # back to the global default
|
|
291
474
|
```
|
|
292
475
|
|
|
293
|
-
|
|
476
|
+
Each override file lists the review → fix → recheck depth only:
|
|
294
477
|
|
|
295
|
-
|
|
478
|
+
```yaml
|
|
479
|
+
# ~/.crosscheck/workflows/humanbased-ai__xny-monorepo.yml
|
|
480
|
+
steps:
|
|
481
|
+
- review
|
|
482
|
+
```
|
|
296
483
|
|
|
297
|
-
|
|
484
|
+
The override *narrows* the global workflow — it keeps each step's configured instructions and reviewer. `conflict-resolve` is orthogonal to the depth ladder: it stays enabled for any override that permits code modification (`review,fix` or `review,fix,recheck`) and is dropped only for review-only (`review`). Repos without an override file keep the complete global workflow. Resolution order: `{repo}/.crosscheck/workflow.yml` → `~/.crosscheck/workflows/<owner>__<repo>.yml` → `~/.crosscheck/workflow.yml` → built-in default.
|
|
298
485
|
|
|
299
|
-
|
|
486
|
+
### Config snapshot
|
|
300
487
|
|
|
301
|
-
|
|
488
|
+
```yaml
|
|
489
|
+
# ~/.crosscheck/config.yml
|
|
490
|
+
orgs:
|
|
491
|
+
- your-org
|
|
302
492
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
493
|
+
routing:
|
|
494
|
+
allowed_authors:
|
|
495
|
+
- your-github-login
|
|
306
496
|
|
|
307
|
-
|
|
497
|
+
mode: cross-vendor # cross-vendor | single-vendor
|
|
308
498
|
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
499
|
+
vendors:
|
|
500
|
+
claude:
|
|
501
|
+
enabled: true
|
|
502
|
+
codex:
|
|
503
|
+
enabled: true
|
|
504
|
+
|
|
505
|
+
quality:
|
|
506
|
+
tier: balanced
|
|
507
|
+
|
|
508
|
+
clone_protocol: ssh # ssh (default) | https
|
|
313
509
|
```
|
|
314
510
|
|
|
315
|
-
|
|
511
|
+
Full reference: [get-started.md](./get-started.md)
|
|
316
512
|
|
|
317
513
|
---
|
|
318
514
|
|
|
@@ -321,8 +517,8 @@ Deployment mode decides scope: `personal` monitors your own repos and reviews on
|
|
|
321
517
|
| | Minimum |
|
|
322
518
|
|---|---|
|
|
323
519
|
| Node.js | 18+ |
|
|
324
|
-
| Claude Code CLI | `npm install -g @anthropic-ai/claude-code` |
|
|
325
|
-
| Codex CLI | `npm install -g @openai/codex` |
|
|
520
|
+
| Claude Code CLI | latest — `npm install -g @anthropic-ai/claude-code` |
|
|
521
|
+
| Codex CLI | latest — `npm install -g @openai/codex` |
|
|
326
522
|
| GitHub CLI | 2.65+ — `brew install gh` |
|
|
327
523
|
|
|
328
524
|
`GITHUB_TOKEN` is derived automatically from `gh auth login`. No manual export needed.
|
|
@@ -333,12 +529,9 @@ Deployment mode decides scope: `personal` monitors your own repos and reviews on
|
|
|
333
529
|
|
|
334
530
|
| | |
|
|
335
531
|
|---|---|
|
|
336
|
-
| **[get-started.md](./get-started.md)** | Full setup guide — prerequisites,
|
|
337
|
-
| **[
|
|
338
|
-
| **[docs/
|
|
339
|
-
| **[docs/linear-identity-contract.md](./docs/linear-identity-contract.md)** | The identity contract, as a spec for other tools |
|
|
340
|
-
| **[What 295 Agentic PRs Taught Us About Code Review](https://blog.humanbased.ai/posts/agentic-pr-quality-crosscheck/)** | Field report on agentic PR quality and why crosscheck exists |
|
|
341
|
-
| **[docs/fixture-pr.md](./docs/fixture-pr.md)** | The safe public fixture PR |
|
|
532
|
+
| **[get-started.md](./get-started.md)** | Full setup guide — prerequisites, all flags, complete config reference, FAQ |
|
|
533
|
+
| **[What 295 Agentic PRs Taught Us About Code Review](https://blog.humanbased.ai/posts/agentic-pr-quality-crosscheck/)** | Humanbased field report on agentic PR quality, review routing, and why Crosscheck exists |
|
|
534
|
+
| **[docs/fixture-pr.md](./docs/fixture-pr.md)** | Safe public fixture PR for the first Crosscheck review |
|
|
342
535
|
| **[crosscheck.config.example.yml](./crosscheck.config.example.yml)** | Annotated config with every option |
|
|
343
536
|
| **[CHANGELOG.md](./CHANGELOG.md)** | Release notes |
|
|
344
537
|
|
|
@@ -348,8 +541,8 @@ Deployment mode decides scope: `personal` monitors your own repos and reviews on
|
|
|
348
541
|
|
|
349
542
|
Issues and PRs welcome at [github.com/humanbased-ai/crosscheck](https://github.com/humanbased-ai/crosscheck).
|
|
350
543
|
|
|
351
|
-
|
|
544
|
+
---
|
|
352
545
|
|
|
353
|
-
|
|
546
|
+
## License
|
|
354
547
|
|
|
355
|
-
|
|
548
|
+
[MIT](./LICENSE) — Copyright (c) 2025–2026 Humanbased PTE LTD.
|