@humanbased/crosscheck 0.14.0 → 0.15.0-beta.145

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/ISSUE.md +1 -1
  2. package/LICENSE +1 -1
  3. package/README.md +191 -8
  4. package/README.zh.md +1 -1
  5. package/crosscheck.config.example.yml +4 -2
  6. package/dist/__tests__/backtrace.test.js +1 -1
  7. package/dist/__tests__/backtrace.test.js.map +1 -1
  8. package/dist/__tests__/diagnose.test.js +36 -0
  9. package/dist/__tests__/diagnose.test.js.map +1 -1
  10. package/dist/__tests__/durations.test.js +5 -1
  11. package/dist/__tests__/durations.test.js.map +1 -1
  12. package/dist/__tests__/error-classification.test.d.ts +2 -0
  13. package/dist/__tests__/error-classification.test.d.ts.map +1 -0
  14. package/dist/__tests__/error-classification.test.js +36 -0
  15. package/dist/__tests__/error-classification.test.js.map +1 -0
  16. package/dist/__tests__/fix.test.js +48 -1
  17. package/dist/__tests__/fix.test.js.map +1 -1
  18. package/dist/__tests__/issue.test.js +2 -2
  19. package/dist/__tests__/issue.test.js.map +1 -1
  20. package/dist/__tests__/kickass.test.js +362 -69
  21. package/dist/__tests__/kickass.test.js.map +1 -1
  22. package/dist/__tests__/optimize.test.js +3 -3
  23. package/dist/__tests__/optimize.test.js.map +1 -1
  24. package/dist/__tests__/pr-picker.test.js +8 -7
  25. package/dist/__tests__/pr-picker.test.js.map +1 -1
  26. package/dist/__tests__/pr-status.test.js +41 -20
  27. package/dist/__tests__/pr-status.test.js.map +1 -1
  28. package/dist/__tests__/pr-workflow-state.test.d.ts +2 -0
  29. package/dist/__tests__/pr-workflow-state.test.d.ts.map +1 -0
  30. package/dist/__tests__/pr-workflow-state.test.js +184 -0
  31. package/dist/__tests__/pr-workflow-state.test.js.map +1 -0
  32. package/dist/__tests__/review-models.test.js +18 -0
  33. package/dist/__tests__/review-models.test.js.map +1 -1
  34. package/dist/__tests__/run.test.d.ts +2 -0
  35. package/dist/__tests__/run.test.d.ts.map +1 -0
  36. package/dist/__tests__/run.test.js +81 -0
  37. package/dist/__tests__/run.test.js.map +1 -0
  38. package/dist/__tests__/runner.test.js +117 -1
  39. package/dist/__tests__/runner.test.js.map +1 -1
  40. package/dist/__tests__/scopes.test.js +11 -11
  41. package/dist/__tests__/scopes.test.js.map +1 -1
  42. package/dist/__tests__/smart-switch.test.js +1 -1
  43. package/dist/__tests__/smart-switch.test.js.map +1 -1
  44. package/dist/__tests__/tier-timeouts.test.d.ts +2 -0
  45. package/dist/__tests__/tier-timeouts.test.d.ts.map +1 -0
  46. package/dist/__tests__/tier-timeouts.test.js +23 -0
  47. package/dist/__tests__/tier-timeouts.test.js.map +1 -0
  48. package/dist/__tests__/webhook.test.d.ts +2 -0
  49. package/dist/__tests__/webhook.test.d.ts.map +1 -0
  50. package/dist/__tests__/webhook.test.js +197 -0
  51. package/dist/__tests__/webhook.test.js.map +1 -0
  52. package/dist/cli.js +38 -5
  53. package/dist/cli.js.map +1 -1
  54. package/dist/commands/detect-step.d.ts +5 -0
  55. package/dist/commands/detect-step.d.ts.map +1 -0
  56. package/dist/commands/detect-step.js +124 -0
  57. package/dist/commands/detect-step.js.map +1 -0
  58. package/dist/commands/diagnose.d.ts +1 -1
  59. package/dist/commands/diagnose.d.ts.map +1 -1
  60. package/dist/commands/diagnose.js +30 -1
  61. package/dist/commands/diagnose.js.map +1 -1
  62. package/dist/commands/kickass.d.ts +28 -10
  63. package/dist/commands/kickass.d.ts.map +1 -1
  64. package/dist/commands/kickass.js +295 -68
  65. package/dist/commands/kickass.js.map +1 -1
  66. package/dist/commands/review.d.ts.map +1 -1
  67. package/dist/commands/review.js +14 -5
  68. package/dist/commands/review.js.map +1 -1
  69. package/dist/commands/run.d.ts +16 -1
  70. package/dist/commands/run.d.ts.map +1 -1
  71. package/dist/commands/run.js +347 -44
  72. package/dist/commands/run.js.map +1 -1
  73. package/dist/commands/serve.d.ts.map +1 -1
  74. package/dist/commands/serve.js +41 -3
  75. package/dist/commands/serve.js.map +1 -1
  76. package/dist/commands/status.d.ts.map +1 -1
  77. package/dist/commands/status.js +10 -2
  78. package/dist/commands/status.js.map +1 -1
  79. package/dist/commands/watch.d.ts.map +1 -1
  80. package/dist/commands/watch.js +200 -6
  81. package/dist/commands/watch.js.map +1 -1
  82. package/dist/config/schema.d.ts +52 -0
  83. package/dist/config/schema.d.ts.map +1 -1
  84. package/dist/config/schema.js +24 -1
  85. package/dist/config/schema.js.map +1 -1
  86. package/dist/github/client.d.ts +40 -1
  87. package/dist/github/client.d.ts.map +1 -1
  88. package/dist/github/client.js +69 -9
  89. package/dist/github/client.js.map +1 -1
  90. package/dist/github/review-status.d.ts.map +1 -1
  91. package/dist/github/review-status.js +7 -4
  92. package/dist/github/review-status.js.map +1 -1
  93. package/dist/github/webhook.d.ts +25 -1
  94. package/dist/github/webhook.d.ts.map +1 -1
  95. package/dist/github/webhook.js +37 -1
  96. package/dist/github/webhook.js.map +1 -1
  97. package/dist/lib/annotation.d.ts +4 -0
  98. package/dist/lib/annotation.d.ts.map +1 -1
  99. package/dist/lib/annotation.js +5 -1
  100. package/dist/lib/annotation.js.map +1 -1
  101. package/dist/lib/board.d.ts.map +1 -1
  102. package/dist/lib/board.js +7 -5
  103. package/dist/lib/board.js.map +1 -1
  104. package/dist/lib/comment-bodies.d.ts.map +1 -1
  105. package/dist/lib/comment-bodies.js +3 -2
  106. package/dist/lib/comment-bodies.js.map +1 -1
  107. package/dist/lib/durations.d.ts.map +1 -1
  108. package/dist/lib/durations.js +5 -3
  109. package/dist/lib/durations.js.map +1 -1
  110. package/dist/lib/logger.d.ts +4 -1
  111. package/dist/lib/logger.d.ts.map +1 -1
  112. package/dist/lib/logger.js +41 -5
  113. package/dist/lib/logger.js.map +1 -1
  114. package/dist/lib/pr-picker.d.ts.map +1 -1
  115. package/dist/lib/pr-picker.js +5 -1
  116. package/dist/lib/pr-picker.js.map +1 -1
  117. package/dist/lib/pr-status.d.ts +4 -3
  118. package/dist/lib/pr-status.d.ts.map +1 -1
  119. package/dist/lib/pr-status.js +19 -13
  120. package/dist/lib/pr-status.js.map +1 -1
  121. package/dist/lib/pr-workflow-state.d.ts +68 -0
  122. package/dist/lib/pr-workflow-state.d.ts.map +1 -0
  123. package/dist/lib/pr-workflow-state.js +328 -0
  124. package/dist/lib/pr-workflow-state.js.map +1 -0
  125. package/dist/lib/product.d.ts +3 -0
  126. package/dist/lib/product.d.ts.map +1 -0
  127. package/dist/lib/product.js +5 -0
  128. package/dist/lib/product.js.map +1 -0
  129. package/dist/lib/repo-picker.d.ts +1 -0
  130. package/dist/lib/repo-picker.d.ts.map +1 -1
  131. package/dist/lib/repo-picker.js +50 -33
  132. package/dist/lib/repo-picker.js.map +1 -1
  133. package/dist/lib/review-models.d.ts +2 -2
  134. package/dist/lib/review-models.d.ts.map +1 -1
  135. package/dist/lib/review-models.js +6 -1
  136. package/dist/lib/review-models.js.map +1 -1
  137. package/dist/lib/runner.d.ts +19 -1
  138. package/dist/lib/runner.d.ts.map +1 -1
  139. package/dist/lib/runner.js +338 -55
  140. package/dist/lib/runner.js.map +1 -1
  141. package/dist/lib/scopes.js +1 -1
  142. package/dist/lib/scopes.js.map +1 -1
  143. package/dist/lib/smart-switch.js +1 -1
  144. package/dist/lib/smart-switch.js.map +1 -1
  145. package/dist/lib/vendor.d.ts +4 -0
  146. package/dist/lib/vendor.d.ts.map +1 -0
  147. package/dist/lib/vendor.js +14 -0
  148. package/dist/lib/vendor.js.map +1 -0
  149. package/dist/lib/workflow.d.ts +5 -0
  150. package/dist/lib/workflow.d.ts.map +1 -1
  151. package/dist/lib/workflow.js.map +1 -1
  152. package/dist/reviewers/claude.d.ts +3 -1
  153. package/dist/reviewers/claude.d.ts.map +1 -1
  154. package/dist/reviewers/claude.js +15 -10
  155. package/dist/reviewers/claude.js.map +1 -1
  156. package/dist/reviewers/codex.d.ts +1 -1
  157. package/dist/reviewers/codex.d.ts.map +1 -1
  158. package/dist/reviewers/codex.js +7 -10
  159. package/dist/reviewers/codex.js.map +1 -1
  160. package/dist/reviewers/conflict-resolve.d.ts +1 -1
  161. package/dist/reviewers/conflict-resolve.d.ts.map +1 -1
  162. package/dist/reviewers/conflict-resolve.js +3 -2
  163. package/dist/reviewers/conflict-resolve.js.map +1 -1
  164. package/dist/reviewers/fix.d.ts +5 -1
  165. package/dist/reviewers/fix.d.ts.map +1 -1
  166. package/dist/reviewers/fix.js +68 -2
  167. package/dist/reviewers/fix.js.map +1 -1
  168. package/dist/reviewers/tier-timeouts.d.ts +5 -0
  169. package/dist/reviewers/tier-timeouts.d.ts.map +1 -0
  170. package/dist/reviewers/tier-timeouts.js +14 -0
  171. package/dist/reviewers/tier-timeouts.js.map +1 -0
  172. package/docs/fixture-pr.md +112 -0
  173. package/docs/proof-demo.md +102 -0
  174. package/get-started.md +128 -31
  175. package/get-started.zh.md +7 -1
  176. package/package.json +4 -2
package/get-started.md CHANGED
@@ -9,8 +9,8 @@
9
9
  - [Prerequisites](#prerequisites)
10
10
  - [Install](#install)
11
11
  - [Environment variables](#environment-variables)
12
- - [Step 1 — Check your environment](#step-1--check-your-environment)
13
- - [Step 2 — Test with a single PR](#step-2--test-with-a-single-pr)
12
+ - [Step 1 — Check your setup](#step-1--check-your-setup)
13
+ - [Step 2 — Get one useful review](#step-2--get-one-useful-review)
14
14
  - [Step 3 — Choose a deployment mode](#step-3--choose-a-deployment-mode)
15
15
  - [Step 4 — Verify it's working](#step-4--verify-its-working)
16
16
  - [Commands](#commands)
@@ -34,7 +34,7 @@
34
34
 
35
35
  ## Prerequisites
36
36
 
37
- You need three CLIs installed and authenticated before crosscheck can run reviews.
37
+ You need GitHub CLI and at least one authenticated AI reviewer CLI before crosscheck can run a one-shot review. Install both Claude Code and Codex only if you want cross-vendor review routing.
38
38
 
39
39
  ### Claude Code
40
40
 
@@ -143,40 +143,50 @@ export CROSSCHECK_WEBHOOK_SECRET=your-secret
143
143
 
144
144
  ---
145
145
 
146
- ## Step 1 — Set up crosscheck
146
+ ## Step 1 — Check your setup
147
147
 
148
148
  ```bash
149
- crosscheck onboard
149
+ crosscheck status
150
150
  ```
151
151
 
152
- `crosscheck onboard` is the recommended first step. It checks your CLIs, walks you through deployment mode, repo selection, review mode, and workflow pipeline, then writes a ready-to-use config all in one session. See the [`crosscheck onboard`](#crosscheck-onboard) command reference for the full six-step walkthrough.
152
+ `crosscheck status` prints the active config path, GitHub auth source, usable reviewer CLIs, webhook-secret handling, and current logs. A webhook secret is auto-managed for `watch` and `serve`, so it does not need to be set before a one-shot review.
153
153
 
154
- Once it completes, go straight to `crosscheck watch`. There is no separate init step required.
154
+ If you prefer to create a starter config without the full wizard:
155
155
 
156
- > If you prefer to skip the wizard and configure manually, run `crosscheck init` to generate a starter config, then edit `~/.crosscheck/config.yml` directly.
157
-
158
- ---
156
+ ```bash
157
+ crosscheck init
158
+ ```
159
159
 
160
- ## Step 2 — Test with a single PR
160
+ ## Step 2 — Get one useful review
161
161
 
162
- Before running continuously, verify end-to-end with one PR:
162
+ Before running continuously, verify end-to-end with one low-risk PR:
163
163
 
164
164
  ```bash
165
165
  crosscheck review https://github.com/owner/repo/pull/123 --reviewer codex
166
166
  ```
167
167
 
168
- This clones the PR branch, runs Codex review against the base branch, and posts a comment to the PR. If it completes without error, your setup is working.
169
-
170
- Try Claude as reviewer too:
168
+ This clones the PR branch, runs Codex review against the base branch, and posts a comment to the PR. If Claude Code is your authenticated reviewer, use:
171
169
 
172
170
  ```bash
173
171
  crosscheck review https://github.com/owner/repo/pull/123 --reviewer claude
174
172
  ```
175
173
 
176
- ---
174
+ If this step fails, fix the specific auth, clone, reviewer, or comment-posting error before enabling `watch` or `serve`.
177
175
 
178
176
  ## Step 3 — Choose a deployment mode
179
177
 
178
+ After one-shot review works, run the guided setup:
179
+
180
+ ```bash
181
+ crosscheck onboard
182
+ ```
183
+
184
+ `crosscheck onboard` checks your CLIs, walks you through deployment mode, repo selection, review mode, workflow pipeline, and connection settings, then writes a ready-to-use config. See the [`crosscheck onboard`](#crosscheck-onboard) command reference for the full walkthrough.
185
+
186
+ Once it completes, go straight to `crosscheck watch`. There is no separate init step required.
187
+
188
+ > If you prefer to skip the wizard and configure manually, run `crosscheck init` to generate a starter config, then edit `~/.crosscheck/config.yml` directly.
189
+
180
190
  ### Personal vs team
181
191
 
182
192
  On first run, `crosscheck watch` (or `crosscheck serve`) will ask how you're using it:
@@ -344,7 +354,7 @@ crosscheck init
344
354
  crosscheck init --config /path/to/crosscheck.config.yml
345
355
  ```
346
356
 
347
- What it checks: `codex` CLI, `claude` CLI, `gh` CLI, `GITHUB_TOKEN`, `CROSSCHECK_WEBHOOK_SECRET`.
357
+ What it checks: `codex` CLI, `claude` CLI, `gh` CLI, GitHub auth, and webhook-secret handling. The webhook secret is auto-managed at `~/.crosscheck/webhook-secret` for `watch` and `serve`.
348
358
 
349
359
  | Flag | Description |
350
360
  |---|---|
@@ -354,7 +364,7 @@ What it checks: `codex` CLI, `claude` CLI, `gh` CLI, `GITHUB_TOKEN`, `CROSSCHECK
354
364
 
355
365
  ### `crosscheck onboard`
356
366
 
357
- The recommended first-time setup command. Walks through seven steps interactively and writes a ready-to-use config.
367
+ The recommended first-time setup command. Walks through ten steps interactively and writes a ready-to-use config.
358
368
 
359
369
  ```bash
360
370
  crosscheck onboard
@@ -364,7 +374,7 @@ crosscheck onboard --team # force team mode for this session
364
374
  crosscheck onboard --reconfigure # re-run setup even if config already exists
365
375
  ```
366
376
 
367
- **The seven steps:**
377
+ **The ten steps:**
368
378
 
369
379
  **Step 1 — Environment check.** Verifies codex CLI, claude CLI, gh CLI, and GitHub token. At least one AI CLI must be authenticated; gh auth is always required. Prints ✓/✗ with fix hints.
370
380
 
@@ -378,7 +388,11 @@ crosscheck onboard --reconfigure # re-run setup even if config already exists
378
388
  - `cross-vendor` — Claude reviews Codex PRs; Codex reviews Claude PRs (recommended when using both agents)
379
389
  - `single-vendor` — one AI reviews all PRs (default when only one CLI is installed)
380
390
 
381
- **Step 5 — Workflow pipeline.** Choose what happens after a review:
391
+ **Step 5 — Primary author.** In personal cross-vendor mode, choose which agent usually authors your PRs so Crosscheck can route reviews to the other vendor.
392
+
393
+ **Step 6 — Review quality.** Choose the speed/thoroughness tier for review prompts and reviewer timeouts.
394
+
395
+ **Step 7 — Workflow pipeline.** Choose what happens after a review:
382
396
 
383
397
  ```
384
398
  [1] review only — AI posts a comment; you handle fixes
@@ -388,11 +402,17 @@ crosscheck onboard --reconfigure # re-run setup even if config already exists
388
402
 
389
403
  The `review → fix → re-check` option writes a `~/.crosscheck/workflow.yml` with all three pipeline steps configured.
390
404
 
391
- **Step 6Connection type.** Choose how GitHub webhooks reach your local server:
405
+ **Step 8Fix -> recheck rounds.** When the full loop is selected, choose how many fix/recheck rounds Crosscheck can run before stopping.
406
+
407
+ **Step 9 — Auto conflict-resolve.** Optionally add a merge-conflict resolution step before review.
408
+
409
+ **Step 10 — Connection type.** Choose how GitHub webhooks reach your local server:
392
410
  - `localhost.run` — zero-config SSH tunnel; reconnects automatically, no install required *(default)*
393
411
  - `smee.io` — webhook relay; events queued while offline, stable channel URL (requires `npm install -g smee-client` and `tunnel.smee_channel` in config)
394
412
 
395
- **Step 7Review and write config.** Shows a summary of all choices and writes `~/.crosscheck/config.yml` (and `workflow.yml` if re-check was selected).
413
+ **Step 11Git clone protocol.** Choose SSH or HTTPS for PR checkout.
414
+
415
+ **Step 12 — Review and write config.** Shows a summary of all choices and writes `~/.crosscheck/config.yml` and `~/.crosscheck/workflow.yml`.
396
416
 
397
417
  ```
398
418
  crosscheck onboard
@@ -417,21 +437,45 @@ crosscheck onboard
417
437
  [1] cross-vendor [2] single-vendor
418
438
  Choice [1]: 1
419
439
 
420
- Step 5 — workflow pipeline
440
+ Step 5 — primary author
441
+ [1] Claude [2] Codex [3] both
442
+ Choice [3]: 3
443
+
444
+ Step 6 — review quality
445
+ [1] fast [2] balanced [3] thorough
446
+ Choice [2]: 2
447
+
448
+ Step 7 — workflow pipeline
421
449
  [1] review only [2] review → fix [3] review → fix → re-check
422
450
  Choice [2]: 3
423
451
 
424
- Step 6connection type
452
+ Step 8fix → re-check rounds
453
+ [1] 1 round [2] 2 rounds [3] 3 rounds
454
+ Choice [1]: 1
455
+
456
+ Step 9 — auto conflict-resolve
457
+ [1] disabled [2] enabled
458
+ Choice [1]: 1
459
+
460
+ Step 10 — connection type
425
461
  [1] localhost.run [2] smee.io
426
462
  Choice [1]: 1
427
463
 
428
- Step 7review and write config
464
+ Step 11git clone protocol
465
+ [1] SSH [2] HTTPS
466
+ Choice [1]: 1
467
+
468
+ Step 12 — review and write config
429
469
  deployment personal
430
470
  connection localhost.run
471
+ clone ssh
431
472
  orgs humanbased-ai
432
473
  users your-github-login (8 repos)
433
474
  mode cross-vendor
475
+ quality balanced
434
476
  pipeline review-fix-recheck
477
+ max rounds 1
478
+ conflict-resolve no
435
479
  config ~/.crosscheck/config.yml
436
480
 
437
481
  ✓ config written to ~/.crosscheck/config.yml
@@ -471,24 +515,31 @@ crosscheck review https://github.com/owner/repo/pull/123 --reviewer claude
471
515
 
472
516
  ### `crosscheck run <pr-url>`
473
517
 
474
- Executes the full configured workflow against a single PR: review → auto-fix → recheck. Where `crosscheck review` stops after posting a comment, `crosscheck run` closes the loop if issues are found, the authoring agent opens a fix PR and crosscheck re-reviews it.
518
+ Runs the full configured workflow against a single PR: review → (fix → recheck) × `max_rounds`. Without `--steps`, `detect-step` determines where to resume from live PR history (skipping steps already completed for the current HEAD), then runs all remaining steps from that point. Pass `--steps` explicitly to restrict to specific steps.
475
519
 
476
520
  ```bash
477
521
  crosscheck run https://github.com/owner/repo/pull/123
478
522
  crosscheck run https://github.com/owner/repo/pull/123 --reviewer claude
523
+ crosscheck run https://github.com/owner/repo/pull/123 --fixer claude
524
+ crosscheck run https://github.com/owner/repo/pull/123 --vendor claude
479
525
  crosscheck run https://github.com/owner/repo/pull/123 --steps review,fix
480
526
  crosscheck run https://github.com/owner/repo/pull/123 --dry-run
481
- crosscheck run https://github.com/owner/repo/pull/123 --expected-head-sha abc1234
527
+ crosscheck run https://github.com/owner/repo/pull/123 --crazy # loop until APPROVE
528
+ crosscheck run https://github.com/owner/repo/pull/123 --halfcrazy
482
529
  ```
483
530
 
484
- The workflow executed is loaded from `.crosscheck/workflow.yml` in the repo root (if present) or falls back to the built-in default pipeline (review only). Use `crosscheck run` to test your full pipeline end-to-end against a real PR.
531
+ The workflow executed is loaded from `.crosscheck/workflow.yml` in the operator repo root if present, then `~/.crosscheck/workflow.yml`, and otherwise falls back to the built-in default pipeline: review, then fix when the verdict is not `APPROVE`. Use `crosscheck run` to test your full pipeline end-to-end against a real PR.
485
532
 
486
533
  | Flag | Description |
487
534
  |---|---|
488
- | `-r, --reviewer codex\|claude` | Force a specific reviewer; skip auto-detection |
535
+ | `-r, --reviewer codex\|claude` | Force review/recheck steps to use this vendor; skip auto-detection for review routing |
536
+ | `--fixer codex\|claude` | Force fix steps to use this vendor |
537
+ | `--vendor codex\|claude` | Force review, recheck, and fix steps to use this vendor |
489
538
  | `--steps <list>` | Run only the listed step types, comma-separated: `review`, `fix`, `recheck` |
490
539
  | `--dry-run` | Run the review but do not post a comment or apply fixes |
491
540
  | `--expected-head-sha <sha>` | Skip if the PR head changed since the command was queued |
541
+ | `--crazy` | After the initial run, loop fix→recheck until APPROVE (ceiling: 2 rounds) |
542
+ | `--halfcrazy` | After the initial run, loop until verdict is not BLOCK — stops at NEEDS\_WORK or APPROVE |
492
543
  | `-c, --config <path>` | Use a specific config file |
493
544
 
494
545
  ---
@@ -515,18 +566,60 @@ crosscheck scan --json
515
566
 
516
567
  ### `crosscheck kickass`
517
568
 
518
- Selects stale PRs from the operator queue and advances each one with the safest next action: review, fix, recheck, or merge. The command revalidates the PR head before each mutation and prints an execution summary when it finishes.
569
+ Selects all actionable PRs (any PR where a next step is needed: review, fix, recheck) and advances each one. Stale PRs are shown first. APPROVE PRs appear as a read-only "needs merge (manual)" section — visible so you know what's ready, but not dispatched automatically. The command revalidates the PR head before each mutation and prints an execution summary when it finishes.
570
+
571
+ Each PR dispatch uses `detect-step` to read live PR comment history and advances **exactly the next needed step** — kickass drives one step per PR, then `watch` picks up continuation via the webhooks that step produces.
519
572
 
520
573
  ```bash
521
574
  crosscheck kickass --dry-run
522
575
  crosscheck kickass --force --stale-after 2h
576
+ crosscheck kickass --crazy # loop fix→recheck until APPROVE (ceiling: 2 rounds)
577
+ crosscheck kickass --halfcrazy # loop until verdict is not BLOCK
523
578
  ```
524
579
 
525
580
  | Flag | Description |
526
581
  |---|---|
527
582
  | `--dry-run` | Print the selected actions without mutating PRs |
528
583
  | `--force` | Bypass the short-lived scan cache |
529
- | `--stale-after <duration>` | Only queue PRs stale for at least this duration |
584
+ | `--stale-after <duration>` | Only show PRs stale for at least this duration |
585
+ | `--crazy` | Autonomous loop: keep running fix→recheck cycles until APPROVE (ceiling: 2 rounds per PR) |
586
+ | `--halfcrazy` | Autonomous loop: keep running until verdict is not BLOCK — NEEDS\_WORK is acceptable |
587
+
588
+ #### `kickass` + `watch` combo
589
+
590
+ When a batch of PRs is stuck — timed out, or stopped before `watch` was running — use both commands together for hands-free recovery:
591
+
592
+ ```bash
593
+ # terminal 1 — keep running to handle continuations
594
+ crosscheck watch
595
+
596
+ # terminal 2 — kick each stuck PR one step forward
597
+ crosscheck scan --force
598
+ crosscheck kickass
599
+ ```
600
+
601
+ How they divide the work:
602
+
603
+ ```
604
+ crosscheck kickass
605
+ └─ ck run <url> --trigger kickass (one step; detect-step finds where to start)
606
+ └─ detect-step → "review" run review only → posts comment
607
+ └─ detect-step → "fix" run fix only → pushes commit
608
+ └─ detect-step → "recheck" run recheck only → posts verdict
609
+
610
+ crosscheck watch
611
+ ├─ issue_comment (type=review) → pick up fix step automatically
612
+ └─ synchronize (fix commit) → pick up recheck step automatically
613
+ ```
614
+
615
+ > **Note:** `ck run <url>` invoked directly (without `--trigger kickass`) runs the **full remaining pipeline** from the detected starting step. The one-step behaviour above applies only when kickass dispatches it.
616
+
617
+ `kickass` advances each PR exactly one step using live `detect-step` detection. `watch` owns all continuation via webhooks:
618
+
619
+ - A posted review fires an `issue_comment` webhook → `watch` starts the fix step.
620
+ - A fix commit fires a `synchronize` webhook → `watch` starts the recheck step.
621
+
622
+ No second `kickass` run is needed. Once `kickass` kicks the first step, the pipeline advances on its own as long as `watch` is running. (Introduced in [#193](https://github.com/Motivation-Labs/crosscheck/pull/193).)
530
623
 
531
624
  ---
532
625
 
@@ -841,6 +934,8 @@ crosscheck stores its config in `~/.crosscheck/config.yml` by default — persis
841
934
  2. `./crosscheck.config.yml`
842
935
  3. `./.crosscheck.yml`
843
936
 
937
+ If `~/.crosscheck/config.yml` exists, it wins over local project files. Pass `--config ./crosscheck.config.yml` when you deliberately want to test a project-local config.
938
+
844
939
  Run `crosscheck init` to generate `~/.crosscheck/config.yml` with all options documented.
845
940
 
846
941
  Logs are written to `~/.crosscheck/logs/YYYY-MM-DD.ndjson` and retained for 30 days by default.
@@ -872,11 +967,13 @@ vendors:
872
967
  enabled: true
873
968
  auth: subscription # subscription | api-key
874
969
  model: o4-mini # only used when auth: api-key
970
+ # timeout_sec: 1200 # max seconds per CLI call; unset = tier-based (300/600/1200)
875
971
 
876
972
  claude:
877
973
  enabled: true
878
974
  model: sonnet # haiku | sonnet | opus
879
975
  effort: medium # low | medium | high | max
976
+ # timeout_sec: 1200 # max seconds per CLI call; unset = tier-based (300/600/1200)
880
977
 
881
978
  # ── Quality ───────────────────────────────────────────────────────────────────
882
979
  quality:
package/get-started.zh.md CHANGED
@@ -476,6 +476,8 @@ crosscheck review https://github.com/owner/repo/pull/123 --reviewer claude
476
476
  ```bash
477
477
  crosscheck run https://github.com/owner/repo/pull/123
478
478
  crosscheck run https://github.com/owner/repo/pull/123 --reviewer claude
479
+ crosscheck run https://github.com/owner/repo/pull/123 --fixer claude
480
+ crosscheck run https://github.com/owner/repo/pull/123 --vendor claude
479
481
  crosscheck run https://github.com/owner/repo/pull/123 --steps review,fix
480
482
  crosscheck run https://github.com/owner/repo/pull/123 --dry-run
481
483
  ```
@@ -484,7 +486,9 @@ crosscheck run https://github.com/owner/repo/pull/123 --dry-run
484
486
 
485
487
  | 参数 | 说明 |
486
488
  |---|---|
487
- | `-r, --reviewer codex\|claude` | 强制使用指定审查者,跳过自动检测 |
489
+ | `-r, --reviewer codex\|claude` | 强制 review/recheck 步骤使用该 vendor,并跳过审查路由自动检测 |
490
+ | `--fixer codex\|claude` | 强制 fix 步骤使用该 vendor |
491
+ | `--vendor codex\|claude` | 强制 review、recheck、fix 步骤都使用该 vendor |
488
492
  | `--steps <list>` | 只运行列出的步骤类型,逗号分隔:`review`、`fix`、`recheck` |
489
493
  | `--dry-run` | 运行审查但不发布评论或应用修复 |
490
494
  | `-c, --config <path>` | 使用指定配置文件 |
@@ -823,11 +827,13 @@ vendors:
823
827
  enabled: true
824
828
  auth: subscription # subscription | api-key
825
829
  model: o4-mini # 仅在 auth: api-key 时生效
830
+ # timeout_sec: 1200 # 单次 CLI 调用最大秒数;不设 = 按 tier(300/600/1200)
826
831
 
827
832
  claude:
828
833
  enabled: true
829
834
  model: sonnet # haiku | sonnet | opus
830
835
  effort: medium # low | medium | high | max
836
+ # timeout_sec: 1200 # 单次 CLI 调用最大秒数;不设 = 180。大 PR 可调高。
831
837
 
832
838
  # ── 质量 ───────────────────────────────────────────────────────────────────
833
839
  quality:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@humanbased/crosscheck",
3
- "version": "0.14.0",
3
+ "version": "0.15.0-beta.145",
4
4
  "description": "AI code review pipeline that turns agent-written PRs into merge-ready patches",
5
5
  "bin": {
6
6
  "crosscheck": "dist/cli.js",
@@ -16,6 +16,8 @@
16
16
  "README.zh.md",
17
17
  "get-started.md",
18
18
  "get-started.zh.md",
19
+ "docs/fixture-pr.md",
20
+ "docs/proof-demo.md",
19
21
  "assets"
20
22
  ],
21
23
  "engines": {
@@ -70,6 +72,6 @@
70
72
  "bugs": {
71
73
  "url": "https://github.com/humanbased-ai/crosscheck/issues"
72
74
  },
73
- "author": "HumanBased AI",
75
+ "author": "Humanbased PTE LTD",
74
76
  "license": "MIT"
75
77
  }