@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/get-started.md
CHANGED
|
@@ -22,7 +22,6 @@
|
|
|
22
22
|
- [Multi-PR syntax](#multi-pr-syntax)
|
|
23
23
|
- [watch](#crosscheck-watch)
|
|
24
24
|
- [status](#crosscheck-status)
|
|
25
|
-
- [skill install](#crosscheck-skill-install-source)
|
|
26
25
|
- [diagnose](#crosscheck-diagnose)
|
|
27
26
|
- [optimize](#crosscheck-optimize)
|
|
28
27
|
- [impact](#crosscheck-impact)
|
|
@@ -157,52 +156,6 @@ export LINEAR_API_KEY=lin_api_...
|
|
|
157
156
|
If it's unset while enrichment is on, crosscheck just skips enrichment and
|
|
158
157
|
reviews the diff as usual — it never errors.
|
|
159
158
|
|
|
160
|
-
### Linear identity — for writing back to Linear (optional)
|
|
161
|
-
|
|
162
|
-
Separate from enrichment above, which only *reads*. When `linear.enabled: true`,
|
|
163
|
-
crosscheck mirrors each review verdict onto the PR's Linear issue.
|
|
164
|
-
|
|
165
|
-
`crosscheck onboard` asks which rung of the attribution ladder you want and writes
|
|
166
|
-
the config for you.
|
|
167
|
-
|
|
168
|
-
**Start with `api_key`.** It reuses `LINEAR_API_KEY`, works immediately, and posts
|
|
169
|
-
the comment — the feature is fully functional. Comments attribute to your Linear
|
|
170
|
-
account, led by a `🤖 crosscheck · <model>` signature line.
|
|
171
|
-
|
|
172
|
-
Climb to `client_credentials` when more than one thing writes to your workspace and
|
|
173
|
-
you need them told apart. It uses an OAuth app — one per workspace, not per user —
|
|
174
|
-
so comments post as crosscheck itself with its own icon:
|
|
175
|
-
|
|
176
|
-
```bash
|
|
177
|
-
export LINEAR_CLIENT_ID=...
|
|
178
|
-
export LINEAR_CLIENT_SECRET=...
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
A failed T1 token mint aborts the run rather than falling back to `api_key` —
|
|
182
|
-
a silent downgrade would put agent writes back under a human's name.
|
|
183
|
-
|
|
184
|
-
`crosscheck onboard` walks you through the choice:
|
|
185
|
-
|
|
186
|
-
<p align="center">
|
|
187
|
-
<img src="./assets/linear-onboard.svg" alt="crosscheck onboard — choosing a Linear attribution rung" width="700" />
|
|
188
|
-
</p>
|
|
189
|
-
|
|
190
|
-
Before opening a PR, `crosscheck linear-test` exercises the whole path and posts nothing —
|
|
191
|
-
identity, issue lookup, verdict filter, and the exact comment body:
|
|
192
|
-
|
|
193
|
-
<p align="center">
|
|
194
|
-
<img src="./assets/linear-test.svg" alt="crosscheck linear-test — dry-run verification" width="700" />
|
|
195
|
-
</p>
|
|
196
|
-
|
|
197
|
-
`crosscheck status` shows which rung is active whenever `linear.enabled` is true:
|
|
198
|
-
|
|
199
|
-
<p align="center">
|
|
200
|
-
<img src="./assets/linear-status.svg" alt="crosscheck status — the Linear identity section" width="620" />
|
|
201
|
-
</p>
|
|
202
|
-
|
|
203
|
-
Full walkthrough, including the two Linear UI gotchas that trip people up:
|
|
204
|
-
[docs/linear-identity.md](docs/linear-identity.md).
|
|
205
|
-
|
|
206
159
|
---
|
|
207
160
|
|
|
208
161
|
## Step 1 — Check your setup
|
|
@@ -392,8 +345,6 @@ crosscheck onboard --reconfigure # re-run setup even if config already exists
|
|
|
392
345
|
|
|
393
346
|
**Step 6 — Review quality.** Choose the speed/thoroughness tier for review prompts and reviewer timeouts.
|
|
394
347
|
|
|
395
|
-
**Step 6.5 — Agent skills.** Choose which preloaded or custom-installed skills are enabled for coding agents. New setups preselect `code-review-skill (by @awesome-skills, MIT)` and `diagnosing-bugs (by @mattpocock, MIT)`. Matt Pocock's `code-review` and `codebase-design` are available but off by default. Re-running onboard preserves your selection. Skills are made available across workflow operations, and each skill's description plus the coding agent decides when it applies.
|
|
396
|
-
|
|
397
348
|
**Step 7 — Workflow pipeline.** Choose what happens after a review:
|
|
398
349
|
|
|
399
350
|
```
|
|
@@ -447,12 +398,6 @@ crosscheck onboard
|
|
|
447
398
|
[1] fast [2] balanced [3] thorough
|
|
448
399
|
Choice [2]: 2
|
|
449
400
|
|
|
450
|
-
Step 6.5 — agent skills
|
|
451
|
-
[ ] code-review (by @mattpocock, MIT)
|
|
452
|
-
[x] code-review-skill (by @awesome-skills, MIT)
|
|
453
|
-
[x] codebase-design (by @mattpocock, MIT)
|
|
454
|
-
[x] diagnosing-bugs (by @mattpocock, MIT)
|
|
455
|
-
|
|
456
401
|
Step 7 — workflow pipeline
|
|
457
402
|
[1] review only [2] review → fix [3] review → fix → re-check
|
|
458
403
|
Choice [2]: 3
|
|
@@ -776,8 +721,6 @@ crosscheck status
|
|
|
776
721
|
Config
|
|
777
722
|
mode cross-vendor
|
|
778
723
|
quality tier balanced
|
|
779
|
-
installed skills code-review (by @mattpocock, MIT), code-review-skill (by @awesome-skills, MIT), codebase-design (by @mattpocock, MIT), diagnosing-bugs (by @mattpocock, MIT)
|
|
780
|
-
enabled skills code-review-skill (by @awesome-skills, MIT), diagnosing-bugs (by @mattpocock, MIT)
|
|
781
724
|
codex auth subscription
|
|
782
725
|
claude model sonnet
|
|
783
726
|
per-review budget $2.00/review
|
|
@@ -801,41 +744,6 @@ crosscheck status
|
|
|
801
744
|
|
|
802
745
|
---
|
|
803
746
|
|
|
804
|
-
### `crosscheck skill install <source>`
|
|
805
|
-
|
|
806
|
-
Installs an Agent Skill from a Git URL or local directory into `~/.crosscheck/skills`. Crosscheck validates `SKILL.md`, rejects unsafe names and symbolic links, and records source, revision, author, license, and package integrity. Installation does not enable a skill automatically.
|
|
807
|
-
|
|
808
|
-
Crosscheck itself ships with this preloaded catalog:
|
|
809
|
-
|
|
810
|
-
| Skill | Onboarding default | Best fit |
|
|
811
|
-
|---|---:|---|
|
|
812
|
-
| [`code-review-skill`](https://github.com/awesome-skills/code-review-skill) (by `@awesome-skills`, MIT) | On | General default: broad language, correctness, security, performance, and architecture coverage |
|
|
813
|
-
| [`codebase-design`](https://github.com/mattpocock/skills/tree/main/skills/engineering/codebase-design) (by `@mattpocock`, MIT) | On | Architecture-heavy changes: deep modules, small interfaces, clean seams, and testability |
|
|
814
|
-
| [`diagnosing-bugs`](https://github.com/mattpocock/skills/tree/main/skills/engineering/diagnosing-bugs) (by `@mattpocock`, MIT) | On | Hard bugs and regressions: reproducible signals, ranked hypotheses, and regression evidence |
|
|
815
|
-
| [`code-review`](https://github.com/mattpocock/skills/tree/main/skills/engineering/code-review) (by `@mattpocock`, MIT) | Off | Evidence-rich repositories: separately checks documented standards and issue/PRD fidelity |
|
|
816
|
-
|
|
817
|
-
`code-review` and `code-review-skill` are competing review baselines. The onboarding picker highlights the conflict and will not enable one until the selected counterpart is deselected; the runtime broker also rejects activation of a second baseline. The other bundled skills are complementary.
|
|
818
|
-
|
|
819
|
-
```bash
|
|
820
|
-
crosscheck skill install https://github.com/owner/my-skill.git
|
|
821
|
-
crosscheck skill install /path/to/my-skill
|
|
822
|
-
crosscheck onboard # enable installed skills
|
|
823
|
-
```
|
|
824
|
-
|
|
825
|
-
The Git repository or local directory must have `SKILL.md` at its root. For a skill nested in a monorepo, clone it and pass the nested local directory.
|
|
826
|
-
|
|
827
|
-
`crosscheck status` distinguishes the full installed catalog from the enabled selection and renders attributed identities as `skill-name (by @author, license)`.
|
|
828
|
-
|
|
829
|
-
At runtime, Crosscheck distinguishes three states: **installed** skills are in the catalog, **enabled** skills are available to agents, and **activated** skills were actually loaded for one workflow step. A skill becomes activated only when the agent successfully calls the Crosscheck broker's `activate_skill` tool for an enabled skill and receives its `SKILL.md` instructions. Listing enabled skills, seeing a skill description, or merely enabling a skill does not count.
|
|
830
|
-
|
|
831
|
-
Activation is scoped to one step session, such as review, fix, recheck, or conflict resolution. Repeated activation in that session is idempotent, and the receipt survives retries or a reviewer fallback within the same step. Every later step gets a separate empty session, and Crosscheck deletes all step sessions when the workflow run ends. The terminal, logs, and PR comment preserve the completed step's attribution as historical evidence; they do not pre-activate future sessions. For example: `code-review-skill (by @awesome-skills, MIT)`.
|
|
832
|
-
|
|
833
|
-
Upgrading from an earlier Crosscheck release is opt-in: existing configs default to `skills.enabled: []`. Re-run `crosscheck onboard` to choose the recommended bundle or any additional installed skills.
|
|
834
|
-
|
|
835
|
-
Review and recheck also honor repository practices in `AGENTS.md` and `CLAUDE.md`. These repository-defined practices take precedence over bundled skill advice. Crosscheck reads the root files plus any nested files whose directory contains a changed path, orders them from broadest to most specific, and lets nested guidance override root guidance. It reads these files from the PR's base branch and disables vendor-native discovery for the run, so guidance added or modified by the PR cannot influence its own review.
|
|
836
|
-
|
|
837
|
-
---
|
|
838
|
-
|
|
839
747
|
### `crosscheck diagnose`
|
|
840
748
|
|
|
841
749
|
Reads `~/.crosscheck/logs/` and surfaces failure patterns, reviewer performance, and improvement suggestions.
|
|
@@ -1057,7 +965,7 @@ If no errors are found in recent logs, crosscheck prints `No errors found in rec
|
|
|
1057
965
|
|
|
1058
966
|
On re-runs, `onboard` updates only the fields it collected answers for. Everything else survives unchanged.
|
|
1059
967
|
|
|
1060
|
-
**Updated on every run:** `deployment`, `orgs`, `repos`, `mode`, `clone_protocol`, `vendors.*.enabled`, `vendors.*.effort`, `quality.tier`, `
|
|
968
|
+
**Updated on every run:** `deployment`, `orgs`, `repos`, `mode`, `clone_protocol`, `vendors.*.enabled`, `vendors.*.effort`, `quality.tier`, `tunnel.*`, `post_review.auto_fix.*`
|
|
1061
969
|
|
|
1062
970
|
**Never touched by onboard:** per-repo overrides in `~/.crosscheck/workflows/` (owned by `crosscheck alter`), and `~/.crosscheck/workflow.yml` after its first write
|
|
1063
971
|
|
|
@@ -1107,8 +1015,7 @@ vendors:
|
|
|
1107
1015
|
codex:
|
|
1108
1016
|
enabled: true
|
|
1109
1017
|
auth: subscription # subscription | api-key
|
|
1110
|
-
model: gpt-5.6-terra #
|
|
1111
|
-
effort: medium # low | medium | high | xhigh | max | ultra (ultra: terra/sol only)
|
|
1018
|
+
model: gpt-5.6-terra # only used when auth: api-key
|
|
1112
1019
|
# timeout_sec: 1200 # max seconds per CLI call; unset = tier-based (300/600/1200)
|
|
1113
1020
|
|
|
1114
1021
|
claude:
|
|
@@ -1119,8 +1026,7 @@ vendors:
|
|
|
1119
1026
|
|
|
1120
1027
|
# ── Quality ───────────────────────────────────────────────────────────────────
|
|
1121
1028
|
quality:
|
|
1122
|
-
|
|
1123
|
-
tier: balanced # fast | balanced | thorough (fallback under smart)
|
|
1029
|
+
tier: balanced # fast | balanced | thorough
|
|
1124
1030
|
focus: # narrows review scope (optional)
|
|
1125
1031
|
- security
|
|
1126
1032
|
- types
|
|
@@ -1128,16 +1034,6 @@ quality:
|
|
|
1128
1034
|
custom_prompt: | # appended to every review prompt
|
|
1129
1035
|
Be concise. Flag only issues that would block a merge.
|
|
1130
1036
|
|
|
1131
|
-
# ── Agent skills ──────────────────────────────────────────────────────────────
|
|
1132
|
-
# Enabled means available to every coding-agent operation. The skill description
|
|
1133
|
-
# and agent decide whether to activate it for a particular step.
|
|
1134
|
-
skills:
|
|
1135
|
-
enabled:
|
|
1136
|
-
- code-review-skill # recommended · @awesome-skills, MIT
|
|
1137
|
-
- diagnosing-bugs # recommended · @mattpocock, MIT
|
|
1138
|
-
# - code-review # preloaded, opt-in · @mattpocock, MIT
|
|
1139
|
-
# - codebase-design # preloaded, opt-in · @mattpocock, MIT
|
|
1140
|
-
|
|
1141
1037
|
# ── Budget ────────────────────────────────────────────────────────────────────
|
|
1142
1038
|
budget:
|
|
1143
1039
|
codex_monthly_usd: 20 # null = unlimited; only applies when auth: api-key
|
|
@@ -1248,93 +1144,15 @@ post_review:
|
|
|
1248
1144
|
server:
|
|
1249
1145
|
port: 7891
|
|
1250
1146
|
webhook_path: /webhook
|
|
1251
|
-
|
|
1252
|
-
linear: # write review verdicts back to a Linear issue (opt-in)
|
|
1253
|
-
enabled: false
|
|
1254
|
-
auth:
|
|
1255
|
-
mode: api_key # api_key | client_credentials
|
|
1256
|
-
api_key_env: LINEAR_API_KEY
|
|
1257
|
-
client_id_env: LINEAR_CLIENT_ID
|
|
1258
|
-
client_secret_env: LINEAR_CLIENT_SECRET
|
|
1259
|
-
scopes: "read,write" # comma-separated; initiative:* are separate scopes
|
|
1260
|
-
identity:
|
|
1261
|
-
actor: crosscheck
|
|
1262
|
-
signature: "🤖 {actor} · {model}" # {actor} {product} {model} {reviewer} {icon}
|
|
1263
|
-
icon_url: "" # rendered where {icon} appears; app avatar is preferred
|
|
1264
|
-
per_step_actor: true # crosscheck/review vs crosscheck/fix in Linear
|
|
1265
|
-
comment_on: # verdicts mirrored to the issue (default omits APPROVE)
|
|
1266
|
-
- NEEDS_WORK
|
|
1267
|
-
- BLOCK
|
|
1268
|
-
team_keys: [] # e.g. [IN] — required to match bare refs like IN-42
|
|
1269
|
-
```
|
|
1270
|
-
|
|
1271
|
-
### Review thoroughness
|
|
1272
|
-
|
|
1273
|
-
**`quality.mode: smart` is the default.** Crosscheck classifies each PR from its
|
|
1274
|
-
changed-file list and adjusts model and effort to match, rather than applying one
|
|
1275
|
-
tier to everything. Classification runs on the already-cloned working copy, so it
|
|
1276
|
-
costs one `git diff` and no API call. Set `mode: fixed` to opt out.
|
|
1277
|
-
|
|
1278
|
-
| # | PR class | Detected by | Tier | Steps |
|
|
1279
|
-
|---|---|---|---|---|
|
|
1280
|
-
| 1 | Generated / vendored | every file is a lockfile or build output | — | **PR skipped** |
|
|
1281
|
-
| 2 | Security / data-critical | auth, crypto, payment, migration paths; `risk:T3`; hotfix→default | `thorough` | full loop |
|
|
1282
|
-
| 3 | Deletion-only | ≤ 5 additions with ≥ 20 deletions | `fast` | review |
|
|
1283
|
-
| 4 | Docs / spec | ≥ 50% Markdown | `balanced` | review |
|
|
1284
|
-
| 5 | Test-only | every file is a test | `fast` | review, fix |
|
|
1285
|
-
| 6 | Config / infra | ≥ 50% config, no source | `balanced` | full loop |
|
|
1286
|
-
| 7 | Trivial | ≤ 3 files, ≤ 150 lines | `fast` | review, fix |
|
|
1287
|
-
| 8 | Standard | everything else | `balanced` | full loop |
|
|
1288
|
-
|
|
1289
|
-
First match wins, and security sits second so it dominates every cheapening rule
|
|
1290
|
-
below it — a deletion that removes auth code, or a two-file migration, is never
|
|
1291
|
-
routed to `fast`.
|
|
1292
|
-
|
|
1293
|
-
The class's step set narrows the configured pipeline and never widens it, so a
|
|
1294
|
-
repo pinned to review-only with `crosscheck alter` stays review-only. Rounds past
|
|
1295
|
-
the first escalate on measured non-convergence: effort rises where the model
|
|
1296
|
-
supports it, the tier is promoted where it does not.
|
|
1297
|
-
|
|
1298
|
-
Note that classes 3 and 4 narrow to `review` alone, which also drops
|
|
1299
|
-
`conflict-resolve` — review-only never touches code, and auto-conflict-resolve
|
|
1300
|
-
is code modification. That rule normally follows an operator's explicit
|
|
1301
|
-
`crosscheck alter --review-only`; under smart mode the *classifier* can reach it
|
|
1302
|
-
too, so a docs-only or deletion-only PR with a merge conflict is reviewed but not
|
|
1303
|
-
auto-resolved. Set `mode: fixed` if you want auto-conflict-resolve on every PR.
|
|
1304
|
-
|
|
1305
|
-
Every comment cites the policy that produced it:
|
|
1306
|
-
|
|
1307
|
-
```
|
|
1308
|
-
<!-- crosscheck: … verdict=BLOCK strategy=1.1.0 class=risky tier=thorough … -->
|
|
1309
|
-
```
|
|
1310
|
-
|
|
1311
|
-
> **Leave `vendors.*.model` unset under smart mode.** An explicit model outranks
|
|
1312
|
-
> the strategy, so pinning one makes per-PR selection a no-op. When that happens
|
|
1313
|
-
> crosscheck **withholds** the tier from the comment rather than citing one that
|
|
1314
|
-
> did not run. `crosscheck onboard` clears the pin — and prints what it cleared —
|
|
1315
|
-
> when you choose smart.
|
|
1316
|
-
|
|
1317
|
-
Verify the policy is current with `npm run verify:strategy`. Full rationale:
|
|
1318
|
-
[docs/dynamic-thoroughness.md](./docs/dynamic-thoroughness.md).
|
|
1147
|
+
```
|
|
1319
1148
|
|
|
1320
1149
|
### Quality tiers
|
|
1321
1150
|
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
|
1326
|
-
|
|
1327
|
-
| `fast` | Haiku 4.5 | GPT-5.6 Luna | $0.24 · $0.06 | High-volume repos, draft PRs |
|
|
1328
|
-
| `balanced` | Sonnet 5 | GPT-5.6 Terra | $0.72 · $0.58 | Default for most teams |
|
|
1329
|
-
| `thorough` | Opus 5 | GPT-5.6 Sol | $1.20 · $1.44 | Before merging to main |
|
|
1330
|
-
|
|
1331
|
-
Cost is output-token cost at 48k output tokens, the measured median for one
|
|
1332
|
-
review. A review is an agentic session, not a single call — expect 10–16 minutes
|
|
1333
|
-
of wall clock (median 643s, p90 984s across 43 logged runs). Tier changes depth
|
|
1334
|
-
and the subprocess timeout, not seconds-scale latency.
|
|
1335
|
-
|
|
1336
|
-
`claude-fable-5` is banned from review: 2× Opus 5's price for a lower coding
|
|
1337
|
-
benchmark score.
|
|
1151
|
+
| Tier | Speed | Depth | Best for |
|
|
1152
|
+
|---|---|---|---|
|
|
1153
|
+
| `fast` | ~10s | Top issues only | High-volume repos, draft PRs |
|
|
1154
|
+
| `balanced` | ~30s | Full review, all issues explained | Default for most teams |
|
|
1155
|
+
| `thorough` | ~60–90s | Deep multi-pass, architecture + security | Before merging to main |
|
|
1338
1156
|
|
|
1339
1157
|
### Issue enrichment
|
|
1340
1158
|
|
|
@@ -1456,9 +1274,7 @@ If none match, origin is `human` and the PR is skipped in cross-vendor mode.
|
|
|
1456
1274
|
codex review --base <base-branch> --title "<pr-title>"
|
|
1457
1275
|
```
|
|
1458
1276
|
|
|
1459
|
-
The `--base` flag diffs current HEAD against the base branch — exactly the PR diff.
|
|
1460
|
-
|
|
1461
|
-
Reasoning effort comes from `vendors.codex.effort` and is always passed through as `-c model_reasoning_effort=...` — for the review step and for the auto-fix step (`codex exec`) alike. The values match the codex CLI tiers 1:1 — `low` (Light), `medium`, `high`, `xhigh` (Extra High), `max`, `ultra`. Not every model supports every tier: `ultra` is terra/sol only, and pre-5.6 models stop at `xhigh` — the CLI rejects unsupported combinations. Higher tiers can multiply review wall-clock time; pair them with `timeout_sec`.
|
|
1277
|
+
The `--base` flag diffs current HEAD against the base branch — exactly the PR diff. With `auth: subscription`, no model flag is passed. With `auth: api-key`, the model is selected by quality tier (`fast` → `gpt-5.6-luna`, `balanced` → `gpt-5.6-terra`, `thorough` → `gpt-5.6-sol`).
|
|
1462
1278
|
|
|
1463
1279
|
### How Claude reviews run
|
|
1464
1280
|
|
|
@@ -1473,16 +1289,7 @@ claude \
|
|
|
1473
1289
|
"<prompt>"
|
|
1474
1290
|
```
|
|
1475
1291
|
|
|
1476
|
-
`--bare` makes execution fast and deterministic. `--allowedTools` limits Claude to read-only git operations on the cloned repo.
|
|
1477
|
-
|
|
1478
|
-
Every comment crosscheck posts closes with the model and effort the step actually ran with, plus any skills the agent activated:
|
|
1479
|
-
|
|
1480
|
-
```
|
|
1481
|
-
---
|
|
1482
|
-
_Reviewed with Claude Code via Crosscheck_ _(Opus 5 · high effort)_
|
|
1483
|
-
|
|
1484
|
-
_Skills: code-review-skill (by @awesome-skills, MIT)_
|
|
1485
|
-
```
|
|
1292
|
+
`--bare` makes execution fast and deterministic. `--allowedTools` limits Claude to read-only git operations on the cloned repo.
|
|
1486
1293
|
|
|
1487
1294
|
### Deduplication
|
|
1488
1295
|
|
|
@@ -1502,9 +1309,6 @@ The fix (file lock for same-machine + GitHub commit status for cross-machine) is
|
|
|
1502
1309
|
- **Temp isolation** — each PR cloned into a fresh temp dir, deleted after review
|
|
1503
1310
|
- **Read-only tools** — Claude restricted to `git diff` and `git log` only
|
|
1504
1311
|
- **Temp credential isolation** — with `clone_protocol: ssh` (default) no tokens touch disk; with `clone_protocol: https` a short-lived token is embedded in the temp clone's remote URL and removed when the temp dir is deleted after review
|
|
1505
|
-
- **Skill package validation** — installs reject unsafe names, attribution injection, symbolic links, packages over 1,000 files or 10 MiB, and collisions; Git sources record their checked-out commit
|
|
1506
|
-
- **Skill integrity** — Crosscheck verifies every installed package against its SHA-256 receipt before exposing it to agents; modified or malformed packages fail closed and appear as unavailable in `crosscheck status`
|
|
1507
|
-
- **Skill execution boundary** — the activation broker exposes instructions and referenced files but never executes bundled scripts itself. Skills are third-party instructions: inspect their source and license before enabling them; the selected coding agent still operates under its normal sandbox and permissions
|
|
1508
1312
|
|
|
1509
1313
|
---
|
|
1510
1314
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@humanbased/crosscheck",
|
|
3
|
-
"version": "1.2.0
|
|
3
|
+
"version": "1.2.0",
|
|
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",
|
|
@@ -23,13 +23,12 @@
|
|
|
23
23
|
"node": ">=18"
|
|
24
24
|
},
|
|
25
25
|
"scripts": {
|
|
26
|
-
"build": "tsc && rm -rf dist/harness && cp -r src/harness dist/harness && cp src/config/review-model-tiers.json dist/config/review-model-tiers.json &&
|
|
26
|
+
"build": "tsc && rm -rf dist/harness && cp -r src/harness dist/harness && cp src/config/review-model-tiers.json dist/config/review-model-tiers.json && chmod +x dist/cli.js dist/ck.js",
|
|
27
27
|
"dev": "tsx src/cli.ts",
|
|
28
28
|
"typecheck": "tsc --noEmit",
|
|
29
29
|
"test": "vitest run",
|
|
30
30
|
"lint": "eslint src --ext .ts",
|
|
31
|
-
"prepublishOnly": "npm run typecheck && npm run build"
|
|
32
|
-
"verify:strategy": "node scripts/verify-review-strategy.mjs"
|
|
31
|
+
"prepublishOnly": "npm run typecheck && npm run build"
|
|
33
32
|
},
|
|
34
33
|
"dependencies": {
|
|
35
34
|
"chalk": "^5.3.0",
|
package/assets/icon-256.png
DELETED
|
Binary file
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
<svg xmlns='http://www.w3.org/2000/svg' width='760' height='270' viewBox='0 0 760 270' font-family='-apple-system, BlinkMacSystemFont, Inter, Segoe UI, sans-serif'>
|
|
2
|
-
<rect width='760' height='270' rx='10' fill='#191b22'/>
|
|
3
|
-
<rect x='0.5' y='0.5' width='759' height='269' rx='10' fill='none' stroke='#2b2f3a'/>
|
|
4
|
-
<clipPath id='c'><circle cx='38' cy='42' r='16'/></clipPath>
|
|
5
|
-
<image href='data:image/png;base64,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' x='22' y='26' width='32' height='32' clip-path='url(#c)'/>
|
|
6
|
-
<text x='68' y='40' fill='#e6e8ee' font-size='14.5' font-weight='600'>crosscheck/review</text>
|
|
7
|
-
<rect x='200' y='28' width='34' height='17' rx='4' fill='#2f3550'/>
|
|
8
|
-
<text x='217' y='40.5' fill='#93a4ff' font-size='10.5' font-weight='600' text-anchor='middle'>APP</text>
|
|
9
|
-
<text x='246' y='40' fill='#767c8b' font-size='12.5'>commented just now</text>
|
|
10
|
-
<line x1='22' y1='62' x2='738' y2='62' stroke='#252932'/>
|
|
11
|
-
<text x='22' y='90' fill='#8b93a3' font-size='13'>🤖 crosscheck/review · crosscheck · <tspan fill='#b6bdcc'>gpt-5.6-terra</tspan></text>
|
|
12
|
-
<text x='22' y='126' font-size='14.5'><tspan fill='#e5c07b' font-weight='700'>NEEDS_WORK</tspan><tspan fill='#c3c9d6'> — codex (gpt-5.6-terra) review of </tspan><tspan fill='#6ea8fe' text-decoration='underline'>feat: add rate limiting to the public API</tspan></text>
|
|
13
|
-
<text x='22' y='162' fill='#c3c9d6' font-size='13.5'>2 blocking findings — unbounded retry loop in <tspan font-family='ui-monospace,Menlo,monospace' fill='#e06c75' font-size='12.5'>limiter.ts:88</tspan>, and the 429</text>
|
|
14
|
-
<text x='22' y='183' fill='#c3c9d6' font-size='13.5'>response omits <tspan font-family='ui-monospace,Menlo,monospace' fill='#e06c75' font-size='12.5'>Retry-After</tspan>.</text>
|
|
15
|
-
<line x1='22' y1='210' x2='738' y2='210' stroke='#252932'/>
|
|
16
|
-
<text x='22' y='232' fill='#5c6373' font-size='11.5' font-family='ui-monospace,Menlo,monospace'><!-- crosscheck: origin=claude reviewer=codex model=gpt-5.6-terra type=review … --></text>
|
|
17
|
-
<text x='738' y='232' fill='#4a505e' font-size='11' text-anchor='end'>hidden in rendered view</text>
|
|
18
|
-
</svg>
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="776" height="490" viewBox="0 0 776 490" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="13.5">
|
|
2
|
-
<rect width="776" height="490" rx="8" fill="#21252b"/>
|
|
3
|
-
<rect width="776" height="34" rx="8" fill="#2c313a"/>
|
|
4
|
-
<rect y="26" width="776" height="8" fill="#2c313a"/>
|
|
5
|
-
<circle cx="20" cy="17" r="6" fill="#ff5f58"/>
|
|
6
|
-
<circle cx="40" cy="17" r="6" fill="#ffbd2e"/>
|
|
7
|
-
<circle cx="60" cy="17" r="6" fill="#18c132"/>
|
|
8
|
-
<text x="388" y="22" fill="#8b919b" font-size="12" text-anchor="middle">crosscheck onboard</text>
|
|
9
|
-
<text x="18.0" y="52" fill="#c8ccd4" textLength="335.4" lengthAdjust="spacing" font-weight="600" xml:space="preserve">Step 9.5 — Linear write-back (optional)</text>
|
|
10
|
-
<text x="35.2" y="72" fill="#c8ccd4" textLength="533.2" lengthAdjust="spacing" opacity="0.55" xml:space="preserve">Post the review verdict onto the Linear issue a PR belongs to.</text>
|
|
11
|
-
|
|
12
|
-
<text x="35.2" y="112" fill="#c8ccd4" textLength="326.8" lengthAdjust="spacing" xml:space="preserve">[1] off — leave Linear alone</text>
|
|
13
|
-
<text x="35.2" y="132" fill="#c8ccd4" textLength="507.4" lengthAdjust="spacing" xml:space="preserve">[2] api key — works immediately. Comments post under </text><text x="542.6" y="132" fill="#c8ccd4" textLength="197.8" lengthAdjust="spacing" opacity="0.55" xml:space="preserve">your own Linear account</text>
|
|
14
|
-
<text x="35.2" y="152" fill="#c8ccd4" textLength="318.2" lengthAdjust="spacing" xml:space="preserve">[3] workspace app — comments post as </text><text x="353.4" y="152" fill="#56b6c2" textLength="86.0" lengthAdjust="spacing" xml:space="preserve">crosscheck</text><text x="448.0" y="152" fill="#c8ccd4" textLength="215.0" lengthAdjust="spacing" xml:space="preserve">itself, with its own icon</text>
|
|
15
|
-
<text x="207.2" y="172" fill="#c8ccd4" textLength="507.4" lengthAdjust="spacing" opacity="0.55" xml:space="preserve">one app per workspace, ~5 min, needs Linear settings access</text>
|
|
16
|
-
|
|
17
|
-
<text x="35.2" y="212" fill="#c8ccd4" textLength="103.2" lengthAdjust="spacing" opacity="0.55" xml:space="preserve">Current: off</text>
|
|
18
|
-
|
|
19
|
-
<text x="35.2" y="252" fill="#c8ccd4" textLength="111.8" lengthAdjust="spacing" xml:space="preserve">Choice [1]: 3</text>
|
|
20
|
-
<text x="35.2" y="272" fill="#c8ccd4" textLength="653.6" lengthAdjust="spacing" opacity="0.55" xml:space="preserve">Your Linear team key prefixes, so refs like ENG-42 in a branch name resolve.</text>
|
|
21
|
-
<text x="35.2" y="292" fill="#c8ccd4" textLength="567.6" lengthAdjust="spacing" opacity="0.55" xml:space="preserve">Comma-separated. Leave blank to only follow full linear.app links.</text>
|
|
22
|
-
<text x="35.2" y="312" fill="#c8ccd4" textLength="111.8" lengthAdjust="spacing" xml:space="preserve">team keys: IN</text>
|
|
23
|
-
|
|
24
|
-
<text x="35.2" y="352" fill="#c8ccd4" textLength="576.2" lengthAdjust="spacing" opacity="0.55" xml:space="preserve">Create the app, then set LINEAR_CLIENT_ID and LINEAR_CLIENT_SECRET.</text>
|
|
25
|
-
<text x="35.2" y="372" fill="#c8ccd4" textLength="309.6" lengthAdjust="spacing" opacity="0.55" xml:space="preserve">Walkthrough: docs/linear-identity.md</text>
|
|
26
|
-
|
|
27
|
-
<text x="18.0" y="412" fill="#c8ccd4" textLength="283.8" lengthAdjust="spacing" font-weight="600" xml:space="preserve">Step 10 — review and write config</text>
|
|
28
|
-
|
|
29
|
-
<text x="35.2" y="452" fill="#c8ccd4" textLength="111.8" lengthAdjust="spacing" xml:space="preserve">linear </text><text x="147.0" y="452" fill="#56b6c2" textLength="154.8" lengthAdjust="spacing" xml:space="preserve">client_credentials</text><text x="310.4" y="452" fill="#c8ccd4" textLength="34.4" lengthAdjust="spacing" opacity="0.55" xml:space="preserve">(IN)</text>
|
|
30
|
-
</svg>
|
package/assets/linear-status.svg
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="578" height="350" viewBox="0 0 578 350" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="13.5">
|
|
2
|
-
<rect width="578" height="350" rx="8" fill="#21252b"/>
|
|
3
|
-
<rect width="578" height="34" rx="8" fill="#2c313a"/>
|
|
4
|
-
<rect y="26" width="578" height="8" fill="#2c313a"/>
|
|
5
|
-
<circle cx="20" cy="17" r="6" fill="#ff5f58"/>
|
|
6
|
-
<circle cx="40" cy="17" r="6" fill="#ffbd2e"/>
|
|
7
|
-
<circle cx="60" cy="17" r="6" fill="#18c132"/>
|
|
8
|
-
<text x="289" y="22" fill="#8b919b" font-size="12" text-anchor="middle">crosscheck status</text>
|
|
9
|
-
<text x="35.2" y="52" fill="#c8ccd4" textLength="51.6" lengthAdjust="spacing" opacity="0.55" xml:space="preserve">Config</text>
|
|
10
|
-
<text x="52.4" y="72" fill="#c8ccd4" textLength="189.2" lengthAdjust="spacing" font-weight="600" xml:space="preserve">config path </text><text x="250.2" y="72" fill="#c8ccd4" textLength="206.4" lengthAdjust="spacing" xml:space="preserve">~/.crosscheck/config.yml</text>
|
|
11
|
-
<text x="52.4" y="92" fill="#c8ccd4" textLength="189.2" lengthAdjust="spacing" font-weight="600" xml:space="preserve">mode </text><text x="250.2" y="92" fill="#c8ccd4" textLength="103.2" lengthAdjust="spacing" xml:space="preserve">cross-vendor</text>
|
|
12
|
-
<text x="52.4" y="112" fill="#c8ccd4" textLength="189.2" lengthAdjust="spacing" font-weight="600" xml:space="preserve">quality tier </text><text x="250.2" y="112" fill="#c8ccd4" textLength="68.8" lengthAdjust="spacing" xml:space="preserve">balanced</text>
|
|
13
|
-
<text x="52.4" y="132" fill="#c8ccd4" textLength="189.2" lengthAdjust="spacing" font-weight="600" xml:space="preserve">codex auth </text><text x="250.2" y="132" fill="#c8ccd4" textLength="103.2" lengthAdjust="spacing" xml:space="preserve">subscription</text>
|
|
14
|
-
<text x="52.4" y="152" fill="#c8ccd4" textLength="189.2" lengthAdjust="spacing" font-weight="600" xml:space="preserve">codex model </text><text x="250.2" y="152" fill="#c8ccd4" textLength="120.4" lengthAdjust="spacing" xml:space="preserve">auto (by tier)</text>
|
|
15
|
-
<text x="52.4" y="172" fill="#c8ccd4" textLength="189.2" lengthAdjust="spacing" font-weight="600" xml:space="preserve">claude model </text><text x="250.2" y="172" fill="#c8ccd4" textLength="60.2" lengthAdjust="spacing" xml:space="preserve">default</text>
|
|
16
|
-
<text x="52.4" y="192" fill="#c8ccd4" textLength="189.2" lengthAdjust="spacing" font-weight="600" xml:space="preserve">per-review budget </text><text x="250.2" y="192" fill="#c8ccd4" textLength="206.4" lengthAdjust="spacing" xml:space="preserve">subscription (unlimited)</text>
|
|
17
|
-
|
|
18
|
-
<text x="35.2" y="232" fill="#c8ccd4" textLength="51.6" lengthAdjust="spacing" opacity="0.55" xml:space="preserve">Linear</text>
|
|
19
|
-
<text x="35.2" y="252" fill="#98c379" textLength="17.2" lengthAdjust="spacing" xml:space="preserve">✓</text><text x="61.0" y="252" fill="#c8ccd4" textLength="189.2" lengthAdjust="spacing" font-weight="600" xml:space="preserve">auth mode </text><text x="258.8" y="252" fill="#c8ccd4" textLength="60.2" lengthAdjust="spacing" xml:space="preserve">api_key</text>
|
|
20
|
-
<text x="52.4" y="272" fill="#c8ccd4" textLength="189.2" lengthAdjust="spacing" font-weight="600" xml:space="preserve">organization </text><text x="250.2" y="272" fill="#c8ccd4" textLength="146.2" lengthAdjust="spacing" xml:space="preserve">Inductive Network</text>
|
|
21
|
-
<text x="52.4" y="292" fill="#c8ccd4" textLength="189.2" lengthAdjust="spacing" font-weight="600" xml:space="preserve">writes as </text><text x="250.2" y="292" fill="#c8ccd4" textLength="180.6" lengthAdjust="spacing" xml:space="preserve">yi@inductive.network </text><text x="430.8" y="292" fill="#c8ccd4" textLength="77.4" lengthAdjust="spacing" opacity="0.55" xml:space="preserve">(api key)</text>
|
|
22
|
-
<text x="52.4" y="312" fill="#c8ccd4" textLength="490.2" lengthAdjust="spacing" opacity="0.55" xml:space="preserve">to post as crosscheck itself, see docs/linear-identity.md</text>
|
|
23
|
-
</svg>
|
package/assets/linear-test.svg
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="733" height="570" viewBox="0 0 733 570" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="13.5">
|
|
2
|
-
<rect width="733" height="570" rx="8" fill="#21252b"/>
|
|
3
|
-
<rect width="733" height="34" rx="8" fill="#2c313a"/>
|
|
4
|
-
<rect y="26" width="733" height="8" fill="#2c313a"/>
|
|
5
|
-
<circle cx="20" cy="17" r="6" fill="#ff5f58"/>
|
|
6
|
-
<circle cx="40" cy="17" r="6" fill="#ffbd2e"/>
|
|
7
|
-
<circle cx="60" cy="17" r="6" fill="#18c132"/>
|
|
8
|
-
<text x="366.5" y="22" fill="#8b919b" font-size="12" text-anchor="middle">crosscheck linear-test</text>
|
|
9
|
-
|
|
10
|
-
<text x="18.0" y="72" fill="#c8ccd4" textLength="189.2" lengthAdjust="spacing" font-weight="600" xml:space="preserve">crosscheck linear-test</text>
|
|
11
|
-
|
|
12
|
-
<text x="18.0" y="112" fill="#98c379" textLength="17.2" lengthAdjust="spacing" xml:space="preserve">✓</text><text x="43.8" y="112" fill="#c8ccd4" textLength="404.2" lengthAdjust="spacing" xml:space="preserve">identity api_key — writes as you@acme.com </text><text x="448.0" y="112" fill="#c8ccd4" textLength="77.4" lengthAdjust="spacing" opacity="0.55" xml:space="preserve">(api key)</text>
|
|
13
|
-
<text x="18.0" y="132" fill="#98c379" textLength="17.2" lengthAdjust="spacing" xml:space="preserve">✓</text><text x="43.8" y="132" fill="#c8ccd4" textLength="154.8" lengthAdjust="spacing" xml:space="preserve">workspace Acme</text>
|
|
14
|
-
<text x="18.0" y="152" fill="#98c379" textLength="17.2" lengthAdjust="spacing" xml:space="preserve">✓</text><text x="43.8" y="152" fill="#c8ccd4" textLength="189.2" lengthAdjust="spacing" xml:space="preserve">reference IN-2269 </text><text x="233.0" y="152" fill="#c8ccd4" textLength="120.4" lengthAdjust="spacing" opacity="0.55" xml:space="preserve">(via argument)</text>
|
|
15
|
-
<text x="18.0" y="172" fill="#98c379" textLength="17.2" lengthAdjust="spacing" xml:space="preserve">✓</text><text x="43.8" y="172" fill="#c8ccd4" textLength="576.2" lengthAdjust="spacing" xml:space="preserve">lookup https://linear.app/acme/issue/IN-2269/tiered-identity</text>
|
|
16
|
-
<text x="18.0" y="192" fill="#98c379" textLength="17.2" lengthAdjust="spacing" xml:space="preserve">✓</text><text x="43.8" y="192" fill="#c8ccd4" textLength="352.6" lengthAdjust="spacing" xml:space="preserve">filter NEEDS_WORK is in comment_on</text>
|
|
17
|
-
|
|
18
|
-
<text x="35.2" y="232" fill="#c8ccd4" textLength="653.6" lengthAdjust="spacing" opacity="0.55" xml:space="preserve">── comment that would be posted ────────────────────────────────────────────</text>
|
|
19
|
-
|
|
20
|
-
<text x="35.2" y="272" fill="#c8ccd4" textLength="309.6" lengthAdjust="spacing" xml:space="preserve">🤖 crosscheck/review · gpt-5.6-terra</text>
|
|
21
|
-
|
|
22
|
-
<text x="35.2" y="312" fill="#c8ccd4" textLength="576.2" lengthAdjust="spacing" xml:space="preserve">**NEEDS_WORK** — codex (gpt-5.6-terra) review of [example: a sample</text>
|
|
23
|
-
<text x="35.2" y="332" fill="#c8ccd4" textLength="344.0" lengthAdjust="spacing" xml:space="preserve">PR](https://github.com/acme/app/pull/42)</text>
|
|
24
|
-
|
|
25
|
-
<text x="35.2" y="372" fill="#c8ccd4" textLength="473.0" lengthAdjust="spacing" xml:space="preserve">Example summary — a real run puts the review text here.</text>
|
|
26
|
-
|
|
27
|
-
<text x="35.2" y="412" fill="#c8ccd4" textLength="662.2" lengthAdjust="spacing" xml:space="preserve"><!-- crosscheck: origin=claude reviewer=codex model=gpt-5.6-terra type=review</text>
|
|
28
|
-
<text x="35.2" y="432" fill="#c8ccd4" textLength="524.6" lengthAdjust="spacing" xml:space="preserve">round=1 verdict=NEEDS_WORK service=crosscheck sha=abc1234 --></text>
|
|
29
|
-
|
|
30
|
-
<text x="35.2" y="472" fill="#c8ccd4" textLength="653.6" lengthAdjust="spacing" opacity="0.55" xml:space="preserve">────────────────────────────────────────────────────────────────────────────</text>
|
|
31
|
-
|
|
32
|
-
<text x="18.0" y="512" fill="#98c379" textLength="369.8" lengthAdjust="spacing" xml:space="preserve">✓ Nothing was posted — this was a dry run.</text>
|
|
33
|
-
|
|
34
|
-
</svg>
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"schemaVersion": 1,
|
|
3
|
-
"name": "code-review",
|
|
4
|
-
"author": "mattpocock",
|
|
5
|
-
"license": "MIT",
|
|
6
|
-
"source": "https://github.com/mattpocock/skills",
|
|
7
|
-
"revision": "2ab958093e83e0ec752e6c1c5932da465bf23e0c",
|
|
8
|
-
"integrity": "sha256:59eecd403b82ae0823cad21aa585efa62ac6d00f800137dee4d673b6092c20c6"
|
|
9
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 Matt Pocock
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: code-review
|
|
3
|
-
description: Review the changes since a fixed point (commit, branch, tag, or merge-base) along two axes — Standards (does the code follow this repo's documented coding standards?) and Spec (does the code match what the originating issue/PRD asked for?). Runs both reviews in parallel sub-agents and reports them side by side. Use when the user wants to review a branch, a PR, work-in-progress changes, or asks to "review since X".
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
Two-axis review of the diff between `HEAD` and a fixed point the user supplies:
|
|
7
|
-
|
|
8
|
-
- **Standards** — does the code conform to this repo's documented coding standards?
|
|
9
|
-
- **Spec** — does the code faithfully implement the originating issue / PRD / spec?
|
|
10
|
-
|
|
11
|
-
Both axes run as **parallel sub-agents** so they don't pollute each other's context, then this skill aggregates their findings.
|
|
12
|
-
|
|
13
|
-
The issue tracker should have been provided to you — run `/setup-matt-pocock-skills` if `docs/agents/issue-tracker.md` is missing.
|
|
14
|
-
|
|
15
|
-
## Process
|
|
16
|
-
|
|
17
|
-
### 1. Pin the fixed point
|
|
18
|
-
|
|
19
|
-
Whatever the user said is the fixed point — a commit SHA, branch name, tag, `main`, `HEAD~5`, etc. If they didn't specify one, ask for it.
|
|
20
|
-
|
|
21
|
-
Capture the diff command once: `git diff <fixed-point>...HEAD` (three-dot, so the comparison is against the merge-base). Also note the list of commits via `git log <fixed-point>..HEAD --oneline`.
|
|
22
|
-
|
|
23
|
-
Before going further, confirm the fixed point resolves (`git rev-parse <fixed-point>`) and the diff is non-empty. A bad ref or empty diff should fail here — not inside two parallel sub-agents.
|
|
24
|
-
|
|
25
|
-
### 2. Identify the spec source
|
|
26
|
-
|
|
27
|
-
Look for the originating spec, in this order:
|
|
28
|
-
|
|
29
|
-
1. Issue references in the commit messages (`#123`, `Closes #45`, GitLab `!67`, etc.) — fetch via the workflow in `docs/agents/issue-tracker.md`.
|
|
30
|
-
2. A path the user passed as an argument.
|
|
31
|
-
3. A PRD/spec file under `docs/`, `specs/`, or `.scratch/` matching the branch name or feature.
|
|
32
|
-
4. If nothing is found, ask the user where the spec is. If they say there isn't one, the **Spec** sub-agent will skip and report "no spec available".
|
|
33
|
-
|
|
34
|
-
### 3. Identify the standards sources
|
|
35
|
-
|
|
36
|
-
Anything in the repo that documents how code should be written, such as `CODING_STANDARDS.md` or `CONTRIBUTING.md`.
|
|
37
|
-
|
|
38
|
-
On top of whatever the repo documents, the Standards axis always carries the **smell baseline** below — a fixed set of Fowler code smells (_Refactoring_, ch.3) that applies even when a repo documents nothing. Two rules bind it:
|
|
39
|
-
|
|
40
|
-
- **The repo overrides.** A documented repo standard always wins; where it endorses something the baseline would flag, suppress the smell.
|
|
41
|
-
- **Always a judgement call.** Each smell is a labelled heuristic ("possible Feature Envy"), never a hard violation — and, like any standard here, skip anything tooling already enforces.
|
|
42
|
-
|
|
43
|
-
Each smell reads *what it is* → *how to fix*; match it against the diff:
|
|
44
|
-
|
|
45
|
-
- **Mysterious Name** — a function, variable, or type whose name doesn't reveal what it does or holds. → rename it; if no honest name comes, the design's murky.
|
|
46
|
-
- **Duplicated Code** — the same logic shape appears in more than one hunk or file in the change. → extract the shared shape, call it from both.
|
|
47
|
-
- **Feature Envy** — a method that reaches into another object's data more than its own. → move the method onto the data it envies.
|
|
48
|
-
- **Data Clumps** — the same few fields or params keep travelling together (a type wanting to be born). → bundle them into one type, pass that.
|
|
49
|
-
- **Primitive Obsession** — a primitive or string standing in for a domain concept that deserves its own type. → give the concept its own small type.
|
|
50
|
-
- **Repeated Switches** — the same `switch`/`if`-cascade on the same type recurs across the change. → replace with polymorphism, or one map both sites share.
|
|
51
|
-
- **Shotgun Surgery** — one logical change forces scattered edits across many files in the diff. → gather what changes together into one module.
|
|
52
|
-
- **Divergent Change** — one file or module is edited for several unrelated reasons. → split so each module changes for one reason.
|
|
53
|
-
- **Speculative Generality** — abstraction, parameters, or hooks added for needs the spec doesn't have. → delete it; inline back until a real need shows.
|
|
54
|
-
- **Message Chains** — long `a.b().c().d()` navigation the caller shouldn't depend on. → hide the walk behind one method on the first object.
|
|
55
|
-
- **Middle Man** — a class or function that mostly just delegates onward. → cut it, call the real target direct.
|
|
56
|
-
- **Refused Bequest** — a subclass or implementer that ignores or overrides most of what it inherits. → drop the inheritance, use composition.
|
|
57
|
-
|
|
58
|
-
### 4. Spawn both sub-agents in parallel
|
|
59
|
-
|
|
60
|
-
Send a single message with two `Agent` tool calls. Use the `general-purpose` subagent for both.
|
|
61
|
-
|
|
62
|
-
**Standards sub-agent prompt** — include:
|
|
63
|
-
|
|
64
|
-
- The full diff command and commit list.
|
|
65
|
-
- The list of standards-source files you found in step 3, **plus the smell baseline from step 3** pasted in full — the sub-agent has no other access to it.
|
|
66
|
-
- The brief: "Report — per file/hunk where relevant — (a) every place the diff violates a documented standard: cite the standard (file + the rule); and (b) any baseline smell you spot: name it and quote the hunk. Distinguish hard violations from judgement calls — documented-standard breaches can be hard, but baseline smells are always judgement calls, and a documented repo standard overrides the baseline. Skip anything tooling enforces. Under 400 words."
|
|
67
|
-
|
|
68
|
-
**Spec sub-agent prompt** — include:
|
|
69
|
-
|
|
70
|
-
- The diff command and commit list.
|
|
71
|
-
- The path or fetched contents of the spec.
|
|
72
|
-
- The brief: "Report: (a) requirements the spec asked for that are missing or partial; (b) behaviour in the diff that wasn't asked for (scope creep); (c) requirements that look implemented but where the implementation looks wrong. Quote the spec line for each finding. Under 400 words."
|
|
73
|
-
|
|
74
|
-
If the spec is missing, skip the Spec sub-agent and note this in the final report.
|
|
75
|
-
|
|
76
|
-
### 5. Aggregate
|
|
77
|
-
|
|
78
|
-
Present the two reports under `## Standards` and `## Spec` headings, verbatim or lightly cleaned. Do **not** merge or rerank findings — the two axes are deliberately separate (see _Why two axes_).
|
|
79
|
-
|
|
80
|
-
End with a one-line summary: total findings per axis, and the worst issue _within each axis_ (if any). Don't pick a single winner across axes — that's the reranking the separation exists to prevent.
|
|
81
|
-
|
|
82
|
-
## Why two axes
|
|
83
|
-
|
|
84
|
-
A change can pass one axis and fail the other:
|
|
85
|
-
|
|
86
|
-
- Code that follows every standard but implements the wrong thing → **Standards pass, Spec fail.**
|
|
87
|
-
- Code that does exactly what the issue asked but breaks the project's conventions → **Spec pass, Standards fail.**
|
|
88
|
-
|
|
89
|
-
Reporting them separately stops one axis from masking the other.
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"schemaVersion": 1,
|
|
3
|
-
"name": "code-review-skill",
|
|
4
|
-
"author": "awesome-skills",
|
|
5
|
-
"license": "MIT",
|
|
6
|
-
"source": "https://github.com/awesome-skills/code-review-skill",
|
|
7
|
-
"revision": "95c707b999295f6c8ee2d0d3d1c61cc0c2e1a52c",
|
|
8
|
-
"integrity": "sha256:27a9e6b964e270ded1bb11c7bab31fccc7ed76c7a9a86fd80e330553c8677d75"
|
|
9
|
-
}
|