@humanbased/crosscheck 1.3.1-beta.7 → 1.6.0-beta.11

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 (165) hide show
  1. package/README.md +16 -1
  2. package/assets/demo-block-to-approve.gif +0 -0
  3. package/assets/demo-block-to-approve.mp4 +0 -0
  4. package/dist/__tests__/base-ref-recovery.test.d.ts +2 -0
  5. package/dist/__tests__/base-ref-recovery.test.d.ts.map +1 -0
  6. package/dist/__tests__/base-ref-recovery.test.js +102 -0
  7. package/dist/__tests__/base-ref-recovery.test.js.map +1 -0
  8. package/dist/__tests__/board.test.js +510 -20
  9. package/dist/__tests__/board.test.js.map +1 -1
  10. package/dist/__tests__/codex-env.test.js +4 -0
  11. package/dist/__tests__/codex-env.test.js.map +1 -1
  12. package/dist/__tests__/credential-free-origin.test.js +134 -2
  13. package/dist/__tests__/credential-free-origin.test.js.map +1 -1
  14. package/dist/__tests__/demo-arc.test.d.ts +2 -0
  15. package/dist/__tests__/demo-arc.test.d.ts.map +1 -0
  16. package/dist/__tests__/demo-arc.test.js +73 -0
  17. package/dist/__tests__/demo-arc.test.js.map +1 -0
  18. package/dist/__tests__/doc-only-verdict.test.d.ts +2 -0
  19. package/dist/__tests__/doc-only-verdict.test.d.ts.map +1 -0
  20. package/dist/__tests__/doc-only-verdict.test.js +79 -0
  21. package/dist/__tests__/doc-only-verdict.test.js.map +1 -0
  22. package/dist/__tests__/error-classification.test.js +14 -0
  23. package/dist/__tests__/error-classification.test.js.map +1 -1
  24. package/dist/__tests__/fix-requires-recheck.test.d.ts +2 -0
  25. package/dist/__tests__/fix-requires-recheck.test.d.ts.map +1 -0
  26. package/dist/__tests__/fix-requires-recheck.test.js +56 -0
  27. package/dist/__tests__/fix-requires-recheck.test.js.map +1 -0
  28. package/dist/__tests__/human-feedback.test.d.ts +2 -0
  29. package/dist/__tests__/human-feedback.test.d.ts.map +1 -0
  30. package/dist/__tests__/human-feedback.test.js +132 -0
  31. package/dist/__tests__/human-feedback.test.js.map +1 -0
  32. package/dist/__tests__/inconclusive-review.test.d.ts +2 -0
  33. package/dist/__tests__/inconclusive-review.test.d.ts.map +1 -0
  34. package/dist/__tests__/inconclusive-review.test.js +110 -0
  35. package/dist/__tests__/inconclusive-review.test.js.map +1 -0
  36. package/dist/__tests__/lock-ownership.test.d.ts +2 -0
  37. package/dist/__tests__/lock-ownership.test.d.ts.map +1 -0
  38. package/dist/__tests__/lock-ownership.test.js +167 -0
  39. package/dist/__tests__/lock-ownership.test.js.map +1 -0
  40. package/dist/__tests__/merge-gate.test.d.ts +2 -0
  41. package/dist/__tests__/merge-gate.test.d.ts.map +1 -0
  42. package/dist/__tests__/merge-gate.test.js +220 -0
  43. package/dist/__tests__/merge-gate.test.js.map +1 -0
  44. package/dist/__tests__/no-verdict.test.d.ts +2 -0
  45. package/dist/__tests__/no-verdict.test.d.ts.map +1 -0
  46. package/dist/__tests__/no-verdict.test.js +415 -0
  47. package/dist/__tests__/no-verdict.test.js.map +1 -0
  48. package/dist/__tests__/pr-spec.test.js +37 -0
  49. package/dist/__tests__/pr-spec.test.js.map +1 -1
  50. package/dist/__tests__/run.test.js +50 -1
  51. package/dist/__tests__/run.test.js.map +1 -1
  52. package/dist/__tests__/runner.test.js +82 -1
  53. package/dist/__tests__/runner.test.js.map +1 -1
  54. package/dist/__tests__/standing-verdict-history.test.d.ts +2 -0
  55. package/dist/__tests__/standing-verdict-history.test.d.ts.map +1 -0
  56. package/dist/__tests__/standing-verdict-history.test.js +109 -0
  57. package/dist/__tests__/standing-verdict-history.test.js.map +1 -0
  58. package/dist/__tests__/step-plan.test.d.ts +2 -0
  59. package/dist/__tests__/step-plan.test.d.ts.map +1 -0
  60. package/dist/__tests__/step-plan.test.js +129 -0
  61. package/dist/__tests__/step-plan.test.js.map +1 -0
  62. package/dist/cli.js +14 -1
  63. package/dist/cli.js.map +1 -1
  64. package/dist/commands/merge.d.ts +11 -0
  65. package/dist/commands/merge.d.ts.map +1 -0
  66. package/dist/commands/merge.js +188 -0
  67. package/dist/commands/merge.js.map +1 -0
  68. package/dist/commands/review.d.ts +3 -1
  69. package/dist/commands/review.d.ts.map +1 -1
  70. package/dist/commands/review.js +117 -9
  71. package/dist/commands/review.js.map +1 -1
  72. package/dist/commands/run.d.ts +53 -0
  73. package/dist/commands/run.d.ts.map +1 -1
  74. package/dist/commands/run.js +218 -36
  75. package/dist/commands/run.js.map +1 -1
  76. package/dist/commands/watch.d.ts.map +1 -1
  77. package/dist/commands/watch.js +41 -26
  78. package/dist/commands/watch.js.map +1 -1
  79. package/dist/config/loader.d.ts +4 -0
  80. package/dist/config/loader.d.ts.map +1 -1
  81. package/dist/config/loader.js +8 -0
  82. package/dist/config/loader.js.map +1 -1
  83. package/dist/config/review-strategy.json +5 -5
  84. package/dist/github/client.d.ts +18 -1
  85. package/dist/github/client.d.ts.map +1 -1
  86. package/dist/github/client.js +19 -3
  87. package/dist/github/client.js.map +1 -1
  88. package/dist/github/merge.d.ts +28 -0
  89. package/dist/github/merge.d.ts.map +1 -1
  90. package/dist/github/merge.js +41 -0
  91. package/dist/github/merge.js.map +1 -1
  92. package/dist/github/review-status.d.ts +33 -0
  93. package/dist/github/review-status.d.ts.map +1 -1
  94. package/dist/github/review-status.js +94 -9
  95. package/dist/github/review-status.js.map +1 -1
  96. package/dist/github/webhook.d.ts +1 -0
  97. package/dist/github/webhook.d.ts.map +1 -1
  98. package/dist/github/webhook.js.map +1 -1
  99. package/dist/lib/board.d.ts +60 -4
  100. package/dist/lib/board.d.ts.map +1 -1
  101. package/dist/lib/board.js +357 -65
  102. package/dist/lib/board.js.map +1 -1
  103. package/dist/lib/clone.d.ts +65 -1
  104. package/dist/lib/clone.d.ts.map +1 -1
  105. package/dist/lib/clone.js +252 -16
  106. package/dist/lib/clone.js.map +1 -1
  107. package/dist/lib/human-feedback.d.ts +9 -0
  108. package/dist/lib/human-feedback.d.ts.map +1 -0
  109. package/dist/lib/human-feedback.js +83 -0
  110. package/dist/lib/human-feedback.js.map +1 -0
  111. package/dist/lib/logger.d.ts +1 -1
  112. package/dist/lib/logger.d.ts.map +1 -1
  113. package/dist/lib/logger.js +6 -0
  114. package/dist/lib/logger.js.map +1 -1
  115. package/dist/lib/merge-gate.d.ts +70 -0
  116. package/dist/lib/merge-gate.d.ts.map +1 -0
  117. package/dist/lib/merge-gate.js +138 -0
  118. package/dist/lib/merge-gate.js.map +1 -0
  119. package/dist/lib/no-verdict.d.ts +104 -0
  120. package/dist/lib/no-verdict.d.ts.map +1 -0
  121. package/dist/lib/no-verdict.js +262 -0
  122. package/dist/lib/no-verdict.js.map +1 -0
  123. package/dist/lib/pr-lock.d.ts +37 -1
  124. package/dist/lib/pr-lock.d.ts.map +1 -1
  125. package/dist/lib/pr-lock.js +176 -29
  126. package/dist/lib/pr-lock.js.map +1 -1
  127. package/dist/lib/pr-spec.d.ts +7 -0
  128. package/dist/lib/pr-spec.d.ts.map +1 -1
  129. package/dist/lib/pr-spec.js +12 -1
  130. package/dist/lib/pr-spec.js.map +1 -1
  131. package/dist/lib/pr-workflow-state.d.ts +39 -0
  132. package/dist/lib/pr-workflow-state.d.ts.map +1 -1
  133. package/dist/lib/pr-workflow-state.js +73 -1
  134. package/dist/lib/pr-workflow-state.js.map +1 -1
  135. package/dist/lib/review-strategy.d.ts +14 -0
  136. package/dist/lib/review-strategy.d.ts.map +1 -1
  137. package/dist/lib/review-strategy.js +32 -1
  138. package/dist/lib/review-strategy.js.map +1 -1
  139. package/dist/lib/runner.d.ts +51 -2
  140. package/dist/lib/runner.d.ts.map +1 -1
  141. package/dist/lib/runner.js +211 -105
  142. package/dist/lib/runner.js.map +1 -1
  143. package/dist/lib/tips.d.ts.map +1 -1
  144. package/dist/lib/tips.js +1 -0
  145. package/dist/lib/tips.js.map +1 -1
  146. package/dist/lib/verdict.d.ts +30 -1
  147. package/dist/lib/verdict.d.ts.map +1 -1
  148. package/dist/lib/verdict.js +94 -9
  149. package/dist/lib/verdict.js.map +1 -1
  150. package/dist/reviewers/codex-env.d.ts.map +1 -1
  151. package/dist/reviewers/codex-env.js +2 -0
  152. package/dist/reviewers/codex-env.js.map +1 -1
  153. package/dist/reviewers/codex.d.ts.map +1 -1
  154. package/dist/reviewers/codex.js +3 -1
  155. package/dist/reviewers/codex.js.map +1 -1
  156. package/dist/reviewers/fix.d.ts +2 -2
  157. package/dist/reviewers/fix.d.ts.map +1 -1
  158. package/dist/reviewers/fix.js +10 -4
  159. package/dist/reviewers/fix.js.map +1 -1
  160. package/docs/growth/launch/README.md +59 -0
  161. package/docs/growth/launch/essay-stop-letting-one-agent-review-its-own-code.md +118 -0
  162. package/docs/growth/launch/posts.md +175 -0
  163. package/docs/trust.md +16 -1
  164. package/get-started.md +17 -0
  165. package/package.json +11 -3
package/README.md CHANGED
@@ -17,7 +17,17 @@
17
17
  </p>
18
18
 
19
19
  <p align="center">
20
- <img src="./assets/screenshot-watch.png" alt="crosscheck watch live pipeline view" width="860" />
20
+ <img src="./assets/demo-block-to-approve.gif" alt="crosscheck reviewing a PR: a BLOCK on a dropped ownership filter, an auto-fix, and the verdict on the repair" width="900" />
21
+ </p>
22
+
23
+ <p align="center">
24
+ <strong>The run above is real</strong> — a public fixture PR, every comment permanently linked:<br />
25
+ <a href="https://github.com/humanbased-ai/crosscheck-proof-fixture/pull/2">the whole thread</a>
26
+ &nbsp;·&nbsp; <a href="./demo/README.md">how the recording was made</a>
27
+ </p>
28
+
29
+ <p align="center">
30
+ <sub>A pagination change that passed CI and dropped <code>ownerId</code> from the transaction query — any caller could read another user's transactions. Reviewed by Codex, repaired by Claude, and re-judged against the repair.</sub>
21
31
  </p>
22
32
 
23
33
  ---
@@ -173,6 +183,7 @@ Full walkthrough: **[docs/linear-identity.md](./docs/linear-identity.md)**.
173
183
  | `crosscheck review <pr>` | One-shot review, posts a comment |
174
184
  | `crosscheck run <pr>` | Full pipeline for a PR — review, fix, recheck |
175
185
  | `crosscheck recheck` / `fix` / `resolve` | Run one step in isolation |
186
+ | `crosscheck merge <pr>` | Merge a PR once the verdict allows it — `--loose` / `--tight` / `--force` |
176
187
  | `crosscheck watch` | Listen for PR events and run the pipeline automatically |
177
188
  | `crosscheck scan` | Show open PRs with stale crosscheck state |
178
189
  | `crosscheck kickass` | Pick a stale PR and drive it to its next step |
@@ -304,6 +315,10 @@ Every option, annotated: **[crosscheck.config.example.yml](./crosscheck.config.e
304
315
  crosscheck onboard && crosscheck watch
305
316
  ```
306
317
 
318
+ <p align="center">
319
+ <img src="./assets/screenshot-watch.png" alt="crosscheck watch — live pipeline view" width="860" />
320
+ </p>
321
+
307
322
  **On a server** — one always-on watcher for a team, with per-repo depth where it matters.
308
323
 
309
324
  ```bash
Binary file
Binary file
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=base-ref-recovery.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-ref-recovery.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/base-ref-recovery.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,102 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { execFileSync } from 'child_process';
3
+ import { mkdtempSync, rmSync, writeFileSync } from 'fs';
4
+ import { join } from 'path';
5
+ import { tmpdir } from 'os';
6
+ import { resolveBaseRef, BaseRefUnavailableError, isBaseRefUnavailableError } from '../lib/clone.js';
7
+ // Exercised against a real local origin rather than a mock: the whole point of the
8
+ // recovery chain is which git invocations actually put a ref in place, and a mock
9
+ // that answers "fetched" proves nothing about git.
10
+ describe('resolveBaseRef', () => {
11
+ let originDir;
12
+ let workDir;
13
+ let baseSha;
14
+ const git = (dir, ...args) => execFileSync('git', args, { cwd: dir, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] }).trim();
15
+ const commit = (dir, file, message) => {
16
+ writeFileSync(join(dir, file), `${message}\n`);
17
+ git(dir, 'add', '-A');
18
+ git(dir, '-c', 'user.email=t@t.t', '-c', 'user.name=t', 'commit', '-m', message);
19
+ return git(dir, 'rev-parse', 'HEAD');
20
+ };
21
+ beforeEach(() => {
22
+ // origin: a normal repo with a `main` and a `feature-base` the PR targets.
23
+ originDir = mkdtempSync(join(tmpdir(), 'crosscheck-origin-'));
24
+ git(originDir, 'init', '--initial-branch=main', '.');
25
+ commit(originDir, 'a.txt', 'root');
26
+ git(originDir, 'checkout', '-b', 'feature-base');
27
+ baseSha = commit(originDir, 'b.txt', 'base work');
28
+ git(originDir, 'checkout', '-b', 'pr-head');
29
+ commit(originDir, 'c.txt', 'pr work');
30
+ git(originDir, 'checkout', 'main');
31
+ // The consumer clone, with the PR head checked out — never the base branch.
32
+ workDir = mkdtempSync(join(tmpdir(), 'crosscheck-work-'));
33
+ git(workDir, 'clone', originDir, '.');
34
+ git(workDir, 'checkout', '-b', 'pr-1', 'origin/pr-head');
35
+ // Drop the tracking ref the clone created, so each case starts from "absent".
36
+ git(workDir, 'update-ref', '-d', 'refs/remotes/origin/feature-base');
37
+ });
38
+ afterEach(() => {
39
+ rmSync(originDir, { force: true, recursive: true });
40
+ rmSync(workDir, { force: true, recursive: true });
41
+ });
42
+ it('fetches the base by name when the branch exists', async () => {
43
+ const status = await resolveBaseRef({ tmpDir: workDir, baseRef: 'feature-base', prNumber: 1 });
44
+ expect(status).toBe('fetched');
45
+ expect(git(workDir, 'rev-parse', 'refs/remotes/origin/feature-base')).toBe(baseSha);
46
+ });
47
+ it('recovers by commit when the base branch has been deleted', async () => {
48
+ // The incident: PR #3649's base branch was gone by the time the review ran.
49
+ git(originDir, 'branch', '-D', 'feature-base');
50
+ const recovered = [];
51
+ const status = await resolveBaseRef({
52
+ tmpDir: workDir, baseRef: 'feature-base', prNumber: 1, baseSha,
53
+ onBaseRefRecovered: s => recovered.push(s),
54
+ });
55
+ expect(status).toBe('recovered_by_sha');
56
+ expect(recovered).toEqual(['recovered_by_sha']);
57
+ // The ref must actually resolve — the whole failure was trusting an exit code.
58
+ expect(git(workDir, 'rev-parse', 'refs/remotes/origin/feature-base')).toBe(baseSha);
59
+ });
60
+ it("recovers via the PR's merge ref when the base commit is not fetchable by name", async () => {
61
+ // GitHub keeps refs/pull/<n>/merge for an open PR; its first parent is the base.
62
+ const mergeSha = git(originDir, 'commit-tree', `${baseSha}^{tree}`, '-p', baseSha, '-p', git(originDir, 'rev-parse', 'pr-head'), '-m', 'merge');
63
+ git(originDir, 'update-ref', 'refs/pull/1/merge', mergeSha);
64
+ git(originDir, 'branch', '-D', 'feature-base');
65
+ const status = await resolveBaseRef({
66
+ tmpDir: workDir, baseRef: 'feature-base', prNumber: 1,
67
+ // No baseSha, so recovery 1 cannot run and recovery 2 must carry it.
68
+ });
69
+ expect(status).toBe('recovered_by_merge_ref');
70
+ expect(git(workDir, 'rev-parse', 'refs/remotes/origin/feature-base')).toBe(baseSha);
71
+ });
72
+ it('reports unavailable when no recovery path exists', async () => {
73
+ git(originDir, 'branch', '-D', 'feature-base');
74
+ const failed = [];
75
+ const status = await resolveBaseRef({
76
+ tmpDir: workDir, baseRef: 'feature-base', prNumber: 1,
77
+ onBaseFetchFailed: () => failed.push(1),
78
+ });
79
+ expect(status).toBe('unavailable');
80
+ expect(failed.length).toBeGreaterThan(0);
81
+ });
82
+ it('reports unavailable when a stale base sha no longer resolves', async () => {
83
+ git(originDir, 'branch', '-D', 'feature-base');
84
+ const status = await resolveBaseRef({
85
+ tmpDir: workDir, baseRef: 'feature-base', prNumber: 1,
86
+ baseSha: '0'.repeat(40),
87
+ });
88
+ expect(status).toBe('unavailable');
89
+ });
90
+ });
91
+ describe('BaseRefUnavailableError', () => {
92
+ it('names the ref and says what to do', () => {
93
+ const err = new BaseRefUnavailableError('chore/in-4439-registry-machine-ownership');
94
+ expect(err.message).toContain('origin/chore/in-4439-registry-machine-ownership');
95
+ expect(err.message).toContain('Retarget the PR');
96
+ });
97
+ it('is identifiable through the guard', () => {
98
+ expect(isBaseRefUnavailableError(new BaseRefUnavailableError('x'))).toBe(true);
99
+ expect(isBaseRefUnavailableError(new Error('x'))).toBe(false);
100
+ });
101
+ });
102
+ //# sourceMappingURL=base-ref-recovery.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-ref-recovery.test.js","sourceRoot":"","sources":["../../src/__tests__/base-ref-recovery.test.ts"],"names":[],"mappings":"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"}