@humanbased/crosscheck 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENT.md +207 -0
- package/ISSUE.md +234 -0
- package/LICENSE +21 -0
- package/README.md +234 -0
- package/README.zh.md +169 -0
- package/assets/logo.png +0 -0
- package/assets/screenshot-watch-timing.png +0 -0
- package/assets/screenshot-watch-timing.svg +1 -0
- package/assets/screenshot-watch.png +0 -0
- package/crosscheck.config.example.yml +214 -0
- package/dist/__tests__/annotation.test.d.ts +2 -0
- package/dist/__tests__/annotation.test.d.ts.map +1 -0
- package/dist/__tests__/annotation.test.js +134 -0
- package/dist/__tests__/annotation.test.js.map +1 -0
- package/dist/__tests__/backtrace.test.d.ts +2 -0
- package/dist/__tests__/backtrace.test.d.ts.map +1 -0
- package/dist/__tests__/backtrace.test.js +280 -0
- package/dist/__tests__/backtrace.test.js.map +1 -0
- package/dist/__tests__/board.test.d.ts +2 -0
- package/dist/__tests__/board.test.d.ts.map +1 -0
- package/dist/__tests__/board.test.js +149 -0
- package/dist/__tests__/board.test.js.map +1 -0
- package/dist/__tests__/codex.test.d.ts +2 -0
- package/dist/__tests__/codex.test.d.ts.map +1 -0
- package/dist/__tests__/codex.test.js +92 -0
- package/dist/__tests__/codex.test.js.map +1 -0
- package/dist/__tests__/comment-bodies.test.d.ts +2 -0
- package/dist/__tests__/comment-bodies.test.d.ts.map +1 -0
- package/dist/__tests__/comment-bodies.test.js +75 -0
- package/dist/__tests__/comment-bodies.test.js.map +1 -0
- package/dist/__tests__/conflict-resolve.test.d.ts +2 -0
- package/dist/__tests__/conflict-resolve.test.d.ts.map +1 -0
- package/dist/__tests__/conflict-resolve.test.js +123 -0
- package/dist/__tests__/conflict-resolve.test.js.map +1 -0
- package/dist/__tests__/crosscheck-commit.test.d.ts +2 -0
- package/dist/__tests__/crosscheck-commit.test.d.ts.map +1 -0
- package/dist/__tests__/crosscheck-commit.test.js +13 -0
- package/dist/__tests__/crosscheck-commit.test.js.map +1 -0
- package/dist/__tests__/detector.test.d.ts +2 -0
- package/dist/__tests__/detector.test.d.ts.map +1 -0
- package/dist/__tests__/detector.test.js +112 -0
- package/dist/__tests__/detector.test.js.map +1 -0
- package/dist/__tests__/diagnose.test.d.ts +2 -0
- package/dist/__tests__/diagnose.test.d.ts.map +1 -0
- package/dist/__tests__/diagnose.test.js +164 -0
- package/dist/__tests__/diagnose.test.js.map +1 -0
- package/dist/__tests__/diff-hash.test.d.ts +2 -0
- package/dist/__tests__/diff-hash.test.d.ts.map +1 -0
- package/dist/__tests__/diff-hash.test.js +126 -0
- package/dist/__tests__/diff-hash.test.js.map +1 -0
- package/dist/__tests__/durations.test.d.ts +2 -0
- package/dist/__tests__/durations.test.d.ts.map +1 -0
- package/dist/__tests__/durations.test.js +26 -0
- package/dist/__tests__/durations.test.js.map +1 -0
- package/dist/__tests__/event-fields.test.d.ts +2 -0
- package/dist/__tests__/event-fields.test.d.ts.map +1 -0
- package/dist/__tests__/event-fields.test.js +50 -0
- package/dist/__tests__/event-fields.test.js.map +1 -0
- package/dist/__tests__/filter.test.d.ts +2 -0
- package/dist/__tests__/filter.test.d.ts.map +1 -0
- package/dist/__tests__/filter.test.js +21 -0
- package/dist/__tests__/filter.test.js.map +1 -0
- package/dist/__tests__/fix.test.d.ts +2 -0
- package/dist/__tests__/fix.test.d.ts.map +1 -0
- package/dist/__tests__/fix.test.js +124 -0
- package/dist/__tests__/fix.test.js.map +1 -0
- package/dist/__tests__/github-client.test.d.ts +2 -0
- package/dist/__tests__/github-client.test.d.ts.map +1 -0
- package/dist/__tests__/github-client.test.js +22 -0
- package/dist/__tests__/github-client.test.js.map +1 -0
- package/dist/__tests__/github-scan-client.test.d.ts +2 -0
- package/dist/__tests__/github-scan-client.test.d.ts.map +1 -0
- package/dist/__tests__/github-scan-client.test.js +100 -0
- package/dist/__tests__/github-scan-client.test.js.map +1 -0
- package/dist/__tests__/is-fresh-review-comment.test.d.ts +2 -0
- package/dist/__tests__/is-fresh-review-comment.test.d.ts.map +1 -0
- package/dist/__tests__/is-fresh-review-comment.test.js +86 -0
- package/dist/__tests__/is-fresh-review-comment.test.js.map +1 -0
- package/dist/__tests__/issue.test.d.ts +2 -0
- package/dist/__tests__/issue.test.d.ts.map +1 -0
- package/dist/__tests__/issue.test.js +259 -0
- package/dist/__tests__/issue.test.js.map +1 -0
- package/dist/__tests__/kickass.test.d.ts +2 -0
- package/dist/__tests__/kickass.test.d.ts.map +1 -0
- package/dist/__tests__/kickass.test.js +268 -0
- package/dist/__tests__/kickass.test.js.map +1 -0
- package/dist/__tests__/loader.test.d.ts +2 -0
- package/dist/__tests__/loader.test.d.ts.map +1 -0
- package/dist/__tests__/loader.test.js +180 -0
- package/dist/__tests__/loader.test.js.map +1 -0
- package/dist/__tests__/onboard-preservation.test.d.ts +2 -0
- package/dist/__tests__/onboard-preservation.test.d.ts.map +1 -0
- package/dist/__tests__/onboard-preservation.test.js +506 -0
- package/dist/__tests__/onboard-preservation.test.js.map +1 -0
- package/dist/__tests__/optimize.test.d.ts +2 -0
- package/dist/__tests__/optimize.test.d.ts.map +1 -0
- package/dist/__tests__/optimize.test.js +101 -0
- package/dist/__tests__/optimize.test.js.map +1 -0
- package/dist/__tests__/post-review-comment.test.d.ts +2 -0
- package/dist/__tests__/post-review-comment.test.d.ts.map +1 -0
- package/dist/__tests__/post-review-comment.test.js +44 -0
- package/dist/__tests__/post-review-comment.test.js.map +1 -0
- package/dist/__tests__/pr-lock.test.d.ts +2 -0
- package/dist/__tests__/pr-lock.test.d.ts.map +1 -0
- package/dist/__tests__/pr-lock.test.js +115 -0
- package/dist/__tests__/pr-lock.test.js.map +1 -0
- package/dist/__tests__/pr-picker.test.d.ts +2 -0
- package/dist/__tests__/pr-picker.test.d.ts.map +1 -0
- package/dist/__tests__/pr-picker.test.js +57 -0
- package/dist/__tests__/pr-picker.test.js.map +1 -0
- package/dist/__tests__/pr-status-scan.test.d.ts +2 -0
- package/dist/__tests__/pr-status-scan.test.d.ts.map +1 -0
- package/dist/__tests__/pr-status-scan.test.js +92 -0
- package/dist/__tests__/pr-status-scan.test.js.map +1 -0
- package/dist/__tests__/pr-status.test.d.ts +2 -0
- package/dist/__tests__/pr-status.test.d.ts.map +1 -0
- package/dist/__tests__/pr-status.test.js +346 -0
- package/dist/__tests__/pr-status.test.js.map +1 -0
- package/dist/__tests__/repo-picker.test.d.ts +2 -0
- package/dist/__tests__/repo-picker.test.d.ts.map +1 -0
- package/dist/__tests__/repo-picker.test.js +115 -0
- package/dist/__tests__/repo-picker.test.js.map +1 -0
- package/dist/__tests__/review-comment-body.test.d.ts +2 -0
- package/dist/__tests__/review-comment-body.test.d.ts.map +1 -0
- package/dist/__tests__/review-comment-body.test.js +54 -0
- package/dist/__tests__/review-comment-body.test.js.map +1 -0
- package/dist/__tests__/review-models.test.d.ts +2 -0
- package/dist/__tests__/review-models.test.d.ts.map +1 -0
- package/dist/__tests__/review-models.test.js +39 -0
- package/dist/__tests__/review-models.test.js.map +1 -0
- package/dist/__tests__/review-status.test.d.ts +2 -0
- package/dist/__tests__/review-status.test.d.ts.map +1 -0
- package/dist/__tests__/review-status.test.js +95 -0
- package/dist/__tests__/review-status.test.js.map +1 -0
- package/dist/__tests__/runner.test.d.ts +2 -0
- package/dist/__tests__/runner.test.d.ts.map +1 -0
- package/dist/__tests__/runner.test.js +204 -0
- package/dist/__tests__/runner.test.js.map +1 -0
- package/dist/__tests__/scan-cache.test.d.ts +2 -0
- package/dist/__tests__/scan-cache.test.d.ts.map +1 -0
- package/dist/__tests__/scan-cache.test.js +59 -0
- package/dist/__tests__/scan-cache.test.js.map +1 -0
- package/dist/__tests__/scan-client.test.d.ts +2 -0
- package/dist/__tests__/scan-client.test.d.ts.map +1 -0
- package/dist/__tests__/scan-client.test.js +30 -0
- package/dist/__tests__/scan-client.test.js.map +1 -0
- package/dist/__tests__/scan.test.d.ts +2 -0
- package/dist/__tests__/scan.test.d.ts.map +1 -0
- package/dist/__tests__/scan.test.js +115 -0
- package/dist/__tests__/scan.test.js.map +1 -0
- package/dist/__tests__/scopes.test.d.ts +2 -0
- package/dist/__tests__/scopes.test.d.ts.map +1 -0
- package/dist/__tests__/scopes.test.js +101 -0
- package/dist/__tests__/scopes.test.js.map +1 -0
- package/dist/__tests__/sha-cache.test.d.ts +2 -0
- package/dist/__tests__/sha-cache.test.d.ts.map +1 -0
- package/dist/__tests__/sha-cache.test.js +40 -0
- package/dist/__tests__/sha-cache.test.js.map +1 -0
- package/dist/__tests__/smart-switch.test.d.ts +2 -0
- package/dist/__tests__/smart-switch.test.d.ts.map +1 -0
- package/dist/__tests__/smart-switch.test.js +145 -0
- package/dist/__tests__/smart-switch.test.js.map +1 -0
- package/dist/ck.d.ts +3 -0
- package/dist/ck.d.ts.map +1 -0
- package/dist/ck.js +8 -0
- package/dist/ck.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +132 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/diagnose.d.ts +54 -0
- package/dist/commands/diagnose.d.ts.map +1 -0
- package/dist/commands/diagnose.js +294 -0
- package/dist/commands/diagnose.js.map +1 -0
- package/dist/commands/impact.d.ts +38 -0
- package/dist/commands/impact.d.ts.map +1 -0
- package/dist/commands/impact.js +210 -0
- package/dist/commands/impact.js.map +1 -0
- package/dist/commands/init.d.ts +12 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +183 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/issue.d.ts +25 -0
- package/dist/commands/issue.d.ts.map +1 -0
- package/dist/commands/issue.js +445 -0
- package/dist/commands/issue.js.map +1 -0
- package/dist/commands/kickass.d.ts +59 -0
- package/dist/commands/kickass.d.ts.map +1 -0
- package/dist/commands/kickass.js +288 -0
- package/dist/commands/kickass.js.map +1 -0
- package/dist/commands/onboard.d.ts +70 -0
- package/dist/commands/onboard.d.ts.map +1 -0
- package/dist/commands/onboard.js +883 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/commands/optimize.d.ts +16 -0
- package/dist/commands/optimize.d.ts.map +1 -0
- package/dist/commands/optimize.js +244 -0
- package/dist/commands/optimize.js.map +1 -0
- package/dist/commands/review.d.ts +2 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +118 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/run.d.ts +13 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +243 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/scan.d.ts +94 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +276 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/serve.d.ts +9 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +402 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +89 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/watch.d.ts +9 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +902 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/config/loader.d.ts +47 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +334 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +814 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +152 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/github/client.d.ts +139 -0
- package/dist/github/client.d.ts.map +1 -0
- package/dist/github/client.js +711 -0
- package/dist/github/client.js.map +1 -0
- package/dist/github/detector.d.ts +12 -0
- package/dist/github/detector.d.ts.map +1 -0
- package/dist/github/detector.js +120 -0
- package/dist/github/detector.js.map +1 -0
- package/dist/github/merge.d.ts +9 -0
- package/dist/github/merge.d.ts.map +1 -0
- package/dist/github/merge.js +33 -0
- package/dist/github/merge.js.map +1 -0
- package/dist/github/review-status.d.ts +6 -0
- package/dist/github/review-status.d.ts.map +1 -0
- package/dist/github/review-status.js +51 -0
- package/dist/github/review-status.js.map +1 -0
- package/dist/github/webhook.d.ts +41 -0
- package/dist/github/webhook.d.ts.map +1 -0
- package/dist/github/webhook.js +50 -0
- package/dist/github/webhook.js.map +1 -0
- package/dist/lib/annotation.d.ts +23 -0
- package/dist/lib/annotation.d.ts.map +1 -0
- package/dist/lib/annotation.js +103 -0
- package/dist/lib/annotation.js.map +1 -0
- package/dist/lib/backtrace.d.ts +40 -0
- package/dist/lib/backtrace.d.ts.map +1 -0
- package/dist/lib/backtrace.js +169 -0
- package/dist/lib/backtrace.js.map +1 -0
- package/dist/lib/board.d.ts +74 -0
- package/dist/lib/board.d.ts.map +1 -0
- package/dist/lib/board.js +640 -0
- package/dist/lib/board.js.map +1 -0
- package/dist/lib/clone.d.ts +12 -0
- package/dist/lib/clone.d.ts.map +1 -0
- package/dist/lib/clone.js +30 -0
- package/dist/lib/clone.js.map +1 -0
- package/dist/lib/comment-bodies.d.ts +17 -0
- package/dist/lib/comment-bodies.d.ts.map +1 -0
- package/dist/lib/comment-bodies.js +51 -0
- package/dist/lib/comment-bodies.js.map +1 -0
- package/dist/lib/crosscheck-commit.d.ts +2 -0
- package/dist/lib/crosscheck-commit.d.ts.map +1 -0
- package/dist/lib/crosscheck-commit.js +4 -0
- package/dist/lib/crosscheck-commit.js.map +1 -0
- package/dist/lib/diff-hash.d.ts +16 -0
- package/dist/lib/diff-hash.d.ts.map +1 -0
- package/dist/lib/diff-hash.js +71 -0
- package/dist/lib/diff-hash.js.map +1 -0
- package/dist/lib/durations.d.ts +5 -0
- package/dist/lib/durations.d.ts.map +1 -0
- package/dist/lib/durations.js +39 -0
- package/dist/lib/durations.js.map +1 -0
- package/dist/lib/event-fields.d.ts +6 -0
- package/dist/lib/event-fields.d.ts.map +1 -0
- package/dist/lib/event-fields.js +20 -0
- package/dist/lib/event-fields.js.map +1 -0
- package/dist/lib/filter.d.ts +2 -0
- package/dist/lib/filter.d.ts.map +1 -0
- package/dist/lib/filter.js +4 -0
- package/dist/lib/filter.js.map +1 -0
- package/dist/lib/fortune.d.ts +2 -0
- package/dist/lib/fortune.d.ts.map +1 -0
- package/dist/lib/fortune.js +26 -0
- package/dist/lib/fortune.js.map +1 -0
- package/dist/lib/languages.d.ts +3 -0
- package/dist/lib/languages.d.ts.map +1 -0
- package/dist/lib/languages.js +26 -0
- package/dist/lib/languages.js.map +1 -0
- package/dist/lib/log-analysis.d.ts +17 -0
- package/dist/lib/log-analysis.d.ts.map +1 -0
- package/dist/lib/log-analysis.js +72 -0
- package/dist/lib/log-analysis.js.map +1 -0
- package/dist/lib/logger.d.ts +14 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +84 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/port.d.ts +2 -0
- package/dist/lib/port.d.ts.map +1 -0
- package/dist/lib/port.js +21 -0
- package/dist/lib/port.js.map +1 -0
- package/dist/lib/pr-lock.d.ts +4 -0
- package/dist/lib/pr-lock.d.ts.map +1 -0
- package/dist/lib/pr-lock.js +91 -0
- package/dist/lib/pr-lock.js.map +1 -0
- package/dist/lib/pr-picker.d.ts +10 -0
- package/dist/lib/pr-picker.d.ts.map +1 -0
- package/dist/lib/pr-picker.js +80 -0
- package/dist/lib/pr-picker.js.map +1 -0
- package/dist/lib/pr-status.d.ts +206 -0
- package/dist/lib/pr-status.d.ts.map +1 -0
- package/dist/lib/pr-status.js +613 -0
- package/dist/lib/pr-status.js.map +1 -0
- package/dist/lib/repo-picker.d.ts +23 -0
- package/dist/lib/repo-picker.d.ts.map +1 -0
- package/dist/lib/repo-picker.js +411 -0
- package/dist/lib/repo-picker.js.map +1 -0
- package/dist/lib/review-models.d.ts +7 -0
- package/dist/lib/review-models.d.ts.map +1 -0
- package/dist/lib/review-models.js +32 -0
- package/dist/lib/review-models.js.map +1 -0
- package/dist/lib/runner.d.ts +65 -0
- package/dist/lib/runner.d.ts.map +1 -0
- package/dist/lib/runner.js +710 -0
- package/dist/lib/runner.js.map +1 -0
- package/dist/lib/scan-cache.d.ts +31 -0
- package/dist/lib/scan-cache.d.ts.map +1 -0
- package/dist/lib/scan-cache.js +112 -0
- package/dist/lib/scan-cache.js.map +1 -0
- package/dist/lib/scopes.d.ts +16 -0
- package/dist/lib/scopes.d.ts.map +1 -0
- package/dist/lib/scopes.js +37 -0
- package/dist/lib/scopes.js.map +1 -0
- package/dist/lib/sha-cache.d.ts +7 -0
- package/dist/lib/sha-cache.d.ts.map +1 -0
- package/dist/lib/sha-cache.js +44 -0
- package/dist/lib/sha-cache.js.map +1 -0
- package/dist/lib/smart-switch.d.ts +44 -0
- package/dist/lib/smart-switch.d.ts.map +1 -0
- package/dist/lib/smart-switch.js +145 -0
- package/dist/lib/smart-switch.js.map +1 -0
- package/dist/lib/verdict.d.ts +9 -0
- package/dist/lib/verdict.d.ts.map +1 -0
- package/dist/lib/verdict.js +52 -0
- package/dist/lib/verdict.js.map +1 -0
- package/dist/lib/workflow.d.ts +85 -0
- package/dist/lib/workflow.d.ts.map +1 -0
- package/dist/lib/workflow.js +116 -0
- package/dist/lib/workflow.js.map +1 -0
- package/dist/reviewers/address.d.ts +5 -0
- package/dist/reviewers/address.d.ts.map +1 -0
- package/dist/reviewers/address.js +87 -0
- package/dist/reviewers/address.js.map +1 -0
- package/dist/reviewers/claude.d.ts +12 -0
- package/dist/reviewers/claude.d.ts.map +1 -0
- package/dist/reviewers/claude.js +78 -0
- package/dist/reviewers/claude.js.map +1 -0
- package/dist/reviewers/codex.d.ts +9 -0
- package/dist/reviewers/codex.d.ts.map +1 -0
- package/dist/reviewers/codex.js +121 -0
- package/dist/reviewers/codex.js.map +1 -0
- package/dist/reviewers/conflict-resolve.d.ts +15 -0
- package/dist/reviewers/conflict-resolve.d.ts.map +1 -0
- package/dist/reviewers/conflict-resolve.js +219 -0
- package/dist/reviewers/conflict-resolve.js.map +1 -0
- package/dist/reviewers/fix.d.ts +7 -0
- package/dist/reviewers/fix.d.ts.map +1 -0
- package/dist/reviewers/fix.js +197 -0
- package/dist/reviewers/fix.js.map +1 -0
- package/get-started.md +1271 -0
- package/get-started.zh.md +1208 -0
- package/package.json +75 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { isFreshReviewComment } from '../github/client.js';
|
|
3
|
+
describe('isFreshReviewComment', () => {
|
|
4
|
+
it('returns true for a current review annotation', () => {
|
|
5
|
+
expect(isFreshReviewComment('### Code Review by ⚡ Codex\n\nbody\n\n<!-- crosscheck: origin=claude reviewer=codex verdict=BLOCK type=review -->')).toBe(true);
|
|
6
|
+
});
|
|
7
|
+
it('returns true for a v2 review annotation with model, round, and service', () => {
|
|
8
|
+
expect(isFreshReviewComment('### Code Review by ⚡ Codex\n\nbody\n\n<!-- crosscheck: origin=claude reviewer=codex model=gpt-5 type=review round=2 verdict=BLOCK service=crosscheck -->')).toBe(true);
|
|
9
|
+
});
|
|
10
|
+
it('returns false for a recheck annotation', () => {
|
|
11
|
+
expect(isFreshReviewComment('> Recheck of [original review](#issuecomment-1)\n\n### Code Review by ⚡ Codex\n\nbody\n\n<!-- crosscheck: origin=claude reviewer=codex verdict=NEEDS_WORK type=recheck -->')).toBe(false);
|
|
12
|
+
});
|
|
13
|
+
it('returns true for a verdict-less review annotation from a null-verdict run', () => {
|
|
14
|
+
expect(isFreshReviewComment('### Code Review by ⚡ Codex\n\nbody\n\n<!-- crosscheck: origin=claude reviewer=codex type=review -->')).toBe(true);
|
|
15
|
+
});
|
|
16
|
+
it('returns false for a fix_failed annotation', () => {
|
|
17
|
+
expect(isFreshReviewComment('⚠️ **Auto-fix failed**\n\nblah\n\n<!-- crosscheck: fix_failed -->')).toBe(false);
|
|
18
|
+
});
|
|
19
|
+
// Guards the regression Codex flagged on PR #149: the summary cards emitted by
|
|
20
|
+
// commit-mode fix and conflict-resolve must NOT classify as fresh reviews, or
|
|
21
|
+
// subsequent rechecks will backlink to the summary instead of the actual review.
|
|
22
|
+
it('returns false for a fix_applied summary annotation', () => {
|
|
23
|
+
expect(isFreshReviewComment('### ✅ Auto-fix applied\n\nPushed [`abc1234`](...)\n\n<!-- crosscheck: fix_applied -->')).toBe(false);
|
|
24
|
+
});
|
|
25
|
+
it('returns false for a conflict_resolved summary annotation', () => {
|
|
26
|
+
expect(isFreshReviewComment('### 🔀 Conflicts resolved\n\nResolved 2 conflicts\n\n<!-- crosscheck: conflict_resolved -->')).toBe(false);
|
|
27
|
+
});
|
|
28
|
+
it('returns false for a no_diff_change notice', () => {
|
|
29
|
+
expect(isFreshReviewComment('✓ No diff change since the last review (was `abc1234`, now `def5678`). Skipping re-review.\n\n<!-- crosscheck: no_diff_change prev_sha=abc sha=def -->')).toBe(false);
|
|
30
|
+
});
|
|
31
|
+
// Defensive: the annotation is the source of truth. Even when the body happens
|
|
32
|
+
// to contain the legacy "### Code Review by" header, a non-review annotation
|
|
33
|
+
// wins. This guards against any future bare annotation accidentally falling
|
|
34
|
+
// through to the legacy header check.
|
|
35
|
+
it('rejects a summary card even when the body coincidentally contains the legacy review header', () => {
|
|
36
|
+
expect(isFreshReviewComment('### ✅ Auto-fix applied\n\nFix references "### Code Review by ⚡ Codex" in passing.\n\n<!-- crosscheck: fix_applied -->')).toBe(false);
|
|
37
|
+
});
|
|
38
|
+
it('returns true for a legacy (pre-annotation) review with the header and no recheck prefix', () => {
|
|
39
|
+
expect(isFreshReviewComment('### Code Review by ⚡ Codex\n\nbody, no annotation')).toBe(true);
|
|
40
|
+
});
|
|
41
|
+
it('returns false for a legacy recheck identified by the "> Recheck of" prefix', () => {
|
|
42
|
+
expect(isFreshReviewComment('> Recheck of [original review](#issuecomment-1)\n\n### Code Review by ⚡ Codex\n\nbody, no annotation')).toBe(false);
|
|
43
|
+
});
|
|
44
|
+
// Guards Codex's PR #149 [P2]: 2026-05-18 annotated reviews (between commits
|
|
45
|
+
// 9a0c324 and 36c915d) carry `<!-- crosscheck: origin reviewer verdict -->`
|
|
46
|
+
// without a `type=` field. They must still classify as fresh reviews so
|
|
47
|
+
// recheck backlink discovery survives the upgrade.
|
|
48
|
+
it('returns true for a pre-type-era annotated review (annotation without type=, has reviewer=, has header)', () => {
|
|
49
|
+
expect(isFreshReviewComment('### Code Review by ⚡ Codex\n\nbody\n\n<!-- crosscheck: origin=claude reviewer=codex verdict=BLOCK -->')).toBe(true);
|
|
50
|
+
});
|
|
51
|
+
it('returns false for a pre-type-era annotated recheck (no type=, has reviewer=, "> Recheck of" prefix)', () => {
|
|
52
|
+
expect(isFreshReviewComment('> Recheck of [original review](#issuecomment-1)\n\n### Code Review by ⚡ Codex\n\nbody\n\n<!-- crosscheck: origin=claude reviewer=codex verdict=NEEDS_WORK -->')).toBe(false);
|
|
53
|
+
});
|
|
54
|
+
it('does not treat parser defaults alone as proof of a fresh review', () => {
|
|
55
|
+
expect(isFreshReviewComment('Status note without the review header.\n\n<!-- crosscheck: origin=claude reviewer=codex verdict=BLOCK -->')).toBe(false);
|
|
56
|
+
});
|
|
57
|
+
it('returns false for an unrelated human comment with neither annotation nor header', () => {
|
|
58
|
+
expect(isFreshReviewComment('LGTM, merging now.')).toBe(false);
|
|
59
|
+
});
|
|
60
|
+
// Guards Codex's PR #149 second-recheck [P2]: review bodies often quote
|
|
61
|
+
// other crosscheck marker names as part of the finding text (Codex itself
|
|
62
|
+
// referenced `<!-- crosscheck: fix_applied -->` while reviewing this PR).
|
|
63
|
+
// Classification must read the FOOTER annotation appended by
|
|
64
|
+
// postReviewComment, not the first occurrence in the body.
|
|
65
|
+
it('classifies by the footer annotation, ignoring earlier quoted markers in the body', () => {
|
|
66
|
+
const body = '### Code Review by ⚡ Codex\n\n'
|
|
67
|
+
+ 'The finding references `<!-- crosscheck: fix_applied -->` as an example of '
|
|
68
|
+
+ 'a non-review annotation.\n\n'
|
|
69
|
+
+ '<!-- crosscheck: origin=claude reviewer=codex verdict=BLOCK type=review -->';
|
|
70
|
+
expect(isFreshReviewComment(body)).toBe(true);
|
|
71
|
+
});
|
|
72
|
+
it('classifies as recheck when the footer says recheck even if an earlier quoted annotation looks like a review', () => {
|
|
73
|
+
const body = '> Recheck of [original review](#issuecomment-1)\n\n'
|
|
74
|
+
+ '### Code Review by ⚡ Codex\n\n'
|
|
75
|
+
+ 'Quote of the prior review annotation: `<!-- crosscheck: origin=claude reviewer=codex verdict=BLOCK type=review -->`\n\n'
|
|
76
|
+
+ '<!-- crosscheck: origin=claude reviewer=codex verdict=NEEDS_WORK type=recheck -->';
|
|
77
|
+
expect(isFreshReviewComment(body)).toBe(false);
|
|
78
|
+
});
|
|
79
|
+
// Guards the Codex PR #155 [P2]: an explicit but unrecognized type (emitted by
|
|
80
|
+
// a future minor version) must not be treated as a review — the annotation
|
|
81
|
+
// contract says any explicit type other than 'review' is not a fresh review.
|
|
82
|
+
it('returns false for an annotation with an explicit but unrecognized step type', () => {
|
|
83
|
+
expect(isFreshReviewComment('### Code Review by ⚡ Codex\n\nbody\n\n<!-- crosscheck: origin=claude reviewer=codex verdict=BLOCK type=future-step -->')).toBe(false);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=is-fresh-review-comment.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-fresh-review-comment.test.js","sourceRoot":"","sources":["../../src/__tests__/is-fresh-review-comment.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/issue.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { sanitizeEntry, loadErrorEntriesForPattern, sanitizeDraftContent } from '../lib/log-analysis.js';
|
|
5
|
+
import { parseDraft, buildIssueContent } from '../commands/issue.js';
|
|
6
|
+
const FIXTURES_DIR = join(fileURLToPath(import.meta.url), '..', 'fixtures');
|
|
7
|
+
// ──────────────────────────────────────────────────────
|
|
8
|
+
// sanitizeEntry
|
|
9
|
+
// ──────────────────────────────────────────────────────
|
|
10
|
+
describe('sanitizeEntry', () => {
|
|
11
|
+
it('replaces repo field with [repo]', () => {
|
|
12
|
+
const entry = { ts: '', level: 'error', event: 'error', repo: 'acme/api' };
|
|
13
|
+
expect(sanitizeEntry(entry).repo).toBe('[repo]');
|
|
14
|
+
});
|
|
15
|
+
it('leaves repo undefined when absent', () => {
|
|
16
|
+
const entry = { ts: '', level: 'error', event: 'error' };
|
|
17
|
+
expect(sanitizeEntry(entry).repo).toBeUndefined();
|
|
18
|
+
});
|
|
19
|
+
it('sanitizes owner/repo pattern in message', () => {
|
|
20
|
+
const entry = {
|
|
21
|
+
ts: '', level: 'error', event: 'error',
|
|
22
|
+
message: 'failed cloning motivation-labs/crosscheck',
|
|
23
|
+
};
|
|
24
|
+
expect(sanitizeEntry(entry).message).toContain('[repo]');
|
|
25
|
+
expect(sanitizeEntry(entry).message).not.toContain('motivation-labs/crosscheck');
|
|
26
|
+
});
|
|
27
|
+
it('sanitizes GitHub URLs in message', () => {
|
|
28
|
+
const entry = {
|
|
29
|
+
ts: '', level: 'error', event: 'error',
|
|
30
|
+
message: 'see https://github.com/owner/repo/issues/42',
|
|
31
|
+
};
|
|
32
|
+
expect(sanitizeEntry(entry).message).toContain('[github-url]');
|
|
33
|
+
expect(sanitizeEntry(entry).message).not.toContain('github.com');
|
|
34
|
+
});
|
|
35
|
+
it('sanitizes @username in message', () => {
|
|
36
|
+
const entry = {
|
|
37
|
+
ts: '', level: 'error', event: 'error',
|
|
38
|
+
message: 'PR opened by @johndoe',
|
|
39
|
+
};
|
|
40
|
+
expect(sanitizeEntry(entry).message).toContain('[username]');
|
|
41
|
+
expect(sanitizeEntry(entry).message).not.toContain('@johndoe');
|
|
42
|
+
});
|
|
43
|
+
it('sanitizes absolute file paths in message', () => {
|
|
44
|
+
const entry = {
|
|
45
|
+
ts: '', level: 'error', event: 'error',
|
|
46
|
+
message: 'Error reading /home/user/project/src/index.ts',
|
|
47
|
+
};
|
|
48
|
+
expect(sanitizeEntry(entry).message).toContain('[file-path]');
|
|
49
|
+
});
|
|
50
|
+
it('leaves non-sensitive fields unchanged', () => {
|
|
51
|
+
const entry = { ts: '2026-01-01T00:00:00Z', level: 'error', event: 'error', pr: 42 };
|
|
52
|
+
const out = sanitizeEntry(entry);
|
|
53
|
+
expect(out.ts).toBe('2026-01-01T00:00:00Z');
|
|
54
|
+
expect(out.pr).toBe(42);
|
|
55
|
+
});
|
|
56
|
+
it('sanitizes stack trace with file paths', () => {
|
|
57
|
+
const entry = {
|
|
58
|
+
ts: '', level: 'error', event: 'error',
|
|
59
|
+
stack: 'Error: failed\n at Object.<anonymous> (/Users/user/projects/app/src/index.ts:10:5)',
|
|
60
|
+
};
|
|
61
|
+
expect(sanitizeEntry(entry).stack).not.toContain('/Users/user/projects/app/src/index.ts');
|
|
62
|
+
expect(sanitizeEntry(entry).stack).toContain('[file-path]');
|
|
63
|
+
});
|
|
64
|
+
it('sanitizes stderr field with repo name', () => {
|
|
65
|
+
const entry = {
|
|
66
|
+
ts: '', level: 'error', event: 'error',
|
|
67
|
+
stderr: 'fatal: repository acme/backend not found',
|
|
68
|
+
};
|
|
69
|
+
expect(sanitizeEntry(entry).stderr).not.toContain('acme/backend');
|
|
70
|
+
expect(sanitizeEntry(entry).stderr).toContain('[repo]');
|
|
71
|
+
});
|
|
72
|
+
it('sanitizes command field with file path', () => {
|
|
73
|
+
const entry = {
|
|
74
|
+
ts: '', level: 'error', event: 'error',
|
|
75
|
+
command: 'codex review /tmp/crosscheck-abc123/acme-api/src/main.ts',
|
|
76
|
+
};
|
|
77
|
+
expect(sanitizeEntry(entry).command).not.toContain('/tmp/crosscheck-abc123/acme-api/src/main.ts');
|
|
78
|
+
expect(sanitizeEntry(entry).command).toContain('[file-path]');
|
|
79
|
+
});
|
|
80
|
+
it('does not mutate the original entry', () => {
|
|
81
|
+
const entry = { ts: '', level: 'error', event: 'error', repo: 'acme/api' };
|
|
82
|
+
sanitizeEntry(entry);
|
|
83
|
+
expect(entry.repo).toBe('acme/api');
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
// ──────────────────────────────────────────────────────
|
|
87
|
+
// sanitizeDraftContent
|
|
88
|
+
// ──────────────────────────────────────────────────────
|
|
89
|
+
describe('sanitizeDraftContent', () => {
|
|
90
|
+
it('strips repo name from title', () => {
|
|
91
|
+
const { title } = sanitizeDraftContent('Bug in acme/api causes crash', '');
|
|
92
|
+
expect(title).not.toContain('acme/api');
|
|
93
|
+
expect(title).toContain('[repo]');
|
|
94
|
+
});
|
|
95
|
+
it('strips GitHub URL from body', () => {
|
|
96
|
+
const { body } = sanitizeDraftContent('', 'See https://github.com/acme/api/issues/12 for context.');
|
|
97
|
+
expect(body).not.toContain('github.com');
|
|
98
|
+
expect(body).toContain('[github-url]');
|
|
99
|
+
});
|
|
100
|
+
it('strips file path from body', () => {
|
|
101
|
+
const { body } = sanitizeDraftContent('', 'Error at /home/user/project/src/index.ts:42');
|
|
102
|
+
expect(body).toContain('[file-path]');
|
|
103
|
+
});
|
|
104
|
+
it('leaves clean content unchanged', () => {
|
|
105
|
+
const { title, body } = sanitizeDraftContent('codex reviewer exits with command not found', '## Description\nThe reviewer fails.');
|
|
106
|
+
expect(title).toBe('codex reviewer exits with command not found');
|
|
107
|
+
expect(body).toContain('## Description');
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
// ──────────────────────────────────────────────────────
|
|
111
|
+
// loadErrorEntriesForPattern
|
|
112
|
+
// ──────────────────────────────────────────────────────
|
|
113
|
+
describe('loadErrorEntriesForPattern', () => {
|
|
114
|
+
it('returns empty array when log dir does not exist', () => {
|
|
115
|
+
const result = loadErrorEntriesForPattern('command_not_found', 'tsc', undefined, '/nonexistent');
|
|
116
|
+
expect(result).toHaveLength(0);
|
|
117
|
+
});
|
|
118
|
+
it('returns matching entries for command_not_found tsc from fixtures', () => {
|
|
119
|
+
const result = loadErrorEntriesForPattern('command_not_found', 'tsc', undefined, FIXTURES_DIR);
|
|
120
|
+
expect(result.length).toBeGreaterThan(0);
|
|
121
|
+
expect(result.every(e => e.event === 'error')).toBe(true);
|
|
122
|
+
expect(result.every(e => e.message?.includes('tsc'))).toBe(true);
|
|
123
|
+
});
|
|
124
|
+
it('returns entries for jest command_not_found from fixtures', () => {
|
|
125
|
+
const result = loadErrorEntriesForPattern('command_not_found', 'jest', undefined, FIXTURES_DIR);
|
|
126
|
+
expect(result.length).toBeGreaterThan(0);
|
|
127
|
+
expect(result.every(e => e.message?.includes('jest'))).toBe(true);
|
|
128
|
+
});
|
|
129
|
+
it('returns empty for a pattern not present in fixtures', () => {
|
|
130
|
+
const result = loadErrorEntriesForPattern('auth_failure', undefined, undefined, FIXTURES_DIR);
|
|
131
|
+
expect(result).toHaveLength(0);
|
|
132
|
+
});
|
|
133
|
+
it('caps results at 5 entries', () => {
|
|
134
|
+
// Generate a logDir with many matching entries to verify the cap
|
|
135
|
+
// Use fixtures — has at most a few so won't exceed 5 anyway, but test the cap holds
|
|
136
|
+
const result = loadErrorEntriesForPattern('command_not_found', 'tsc', undefined, FIXTURES_DIR);
|
|
137
|
+
expect(result.length).toBeLessThanOrEqual(5);
|
|
138
|
+
});
|
|
139
|
+
it('respects since filter', () => {
|
|
140
|
+
// Only 2026-01-11 entries
|
|
141
|
+
const result = loadErrorEntriesForPattern('command_not_found', undefined, '2026-01-11', FIXTURES_DIR);
|
|
142
|
+
// 2026-01-10 has tsc and jest errors, 2026-01-11 has base_branch errors
|
|
143
|
+
// so command_not_found from 2026-01-11 only should be empty or fewer
|
|
144
|
+
expect(result.length).toBeLessThanOrEqual(5);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
// ──────────────────────────────────────────────────────
|
|
148
|
+
// parseDraft
|
|
149
|
+
// ──────────────────────────────────────────────────────
|
|
150
|
+
describe('parseDraft', () => {
|
|
151
|
+
it('extracts title and body from well-formed output', () => {
|
|
152
|
+
const output = [
|
|
153
|
+
'TITLE: codex reviewer fails on TypeScript repos',
|
|
154
|
+
'---',
|
|
155
|
+
'## Description',
|
|
156
|
+
'The codex reviewer exits with command not found.',
|
|
157
|
+
].join('\n');
|
|
158
|
+
const result = parseDraft(output);
|
|
159
|
+
expect(result).not.toBeNull();
|
|
160
|
+
expect(result.title).toBe('codex reviewer fails on TypeScript repos');
|
|
161
|
+
expect(result.body).toContain('## Description');
|
|
162
|
+
});
|
|
163
|
+
it('handles leading blank lines before TITLE', () => {
|
|
164
|
+
const output = '\n\nTITLE: my title\n---\nbody here';
|
|
165
|
+
const result = parseDraft(output);
|
|
166
|
+
expect(result?.title).toBe('my title');
|
|
167
|
+
expect(result?.body).toBe('body here');
|
|
168
|
+
});
|
|
169
|
+
it('returns null when TITLE line is missing', () => {
|
|
170
|
+
const output = 'no title line here\n---\nbody';
|
|
171
|
+
expect(parseDraft(output)).toBeNull();
|
|
172
|
+
});
|
|
173
|
+
it('returns null when separator is missing', () => {
|
|
174
|
+
const output = 'TITLE: some title\nbody without separator';
|
|
175
|
+
expect(parseDraft(output)).toBeNull();
|
|
176
|
+
});
|
|
177
|
+
it('returns null when title is empty', () => {
|
|
178
|
+
const output = 'TITLE: \n---\nbody';
|
|
179
|
+
expect(parseDraft(output)).toBeNull();
|
|
180
|
+
});
|
|
181
|
+
it('returns null when body is empty', () => {
|
|
182
|
+
const output = 'TITLE: title\n---\n ';
|
|
183
|
+
expect(parseDraft(output)).toBeNull();
|
|
184
|
+
});
|
|
185
|
+
it('handles multi-line body', () => {
|
|
186
|
+
const body = '## Description\nline one\nline two\n\n## Steps\n1. step one';
|
|
187
|
+
const output = `TITLE: title\n---\n${body}`;
|
|
188
|
+
const result = parseDraft(output);
|
|
189
|
+
expect(result?.body).toBe(body);
|
|
190
|
+
});
|
|
191
|
+
it('uses the first --- separator after the TITLE line', () => {
|
|
192
|
+
const output = 'TITLE: t\n---\n## Section\nsome --- in content\nmore content';
|
|
193
|
+
const result = parseDraft(output);
|
|
194
|
+
expect(result?.body).toContain('some --- in content');
|
|
195
|
+
});
|
|
196
|
+
it('parses LABELS line between TITLE and separator', () => {
|
|
197
|
+
const output = 'TITLE: my title\nLABELS: bug, priority:high\n---\nbody text';
|
|
198
|
+
const result = parseDraft(output);
|
|
199
|
+
expect(result?.labels).toEqual(['bug', 'priority:high']);
|
|
200
|
+
});
|
|
201
|
+
it('returns undefined labels when LABELS line is absent', () => {
|
|
202
|
+
const output = 'TITLE: my title\n---\nbody text';
|
|
203
|
+
const result = parseDraft(output);
|
|
204
|
+
expect(result?.labels).toBeUndefined();
|
|
205
|
+
});
|
|
206
|
+
it('ignores empty label values in LABELS line', () => {
|
|
207
|
+
const output = 'TITLE: my title\nLABELS: bug, ,improvement\n---\nbody';
|
|
208
|
+
const result = parseDraft(output);
|
|
209
|
+
expect(result?.labels).toEqual(['bug', 'improvement']);
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
// ──────────────────────────────────────────────────────
|
|
213
|
+
// buildIssueContent
|
|
214
|
+
// ──────────────────────────────────────────────────────
|
|
215
|
+
describe('buildIssueContent', () => {
|
|
216
|
+
const draft = {
|
|
217
|
+
title: 'codex fails on tsc',
|
|
218
|
+
body: '## Description\nSomething broke.',
|
|
219
|
+
};
|
|
220
|
+
it('preserves the title unchanged', () => {
|
|
221
|
+
const { title } = buildIssueContent(draft, {
|
|
222
|
+
reproducibility: 'Every time',
|
|
223
|
+
trigger: 'watch',
|
|
224
|
+
impact: 'Blocked',
|
|
225
|
+
});
|
|
226
|
+
expect(title).toBe('codex fails on tsc');
|
|
227
|
+
});
|
|
228
|
+
it('appends User Context section to body', () => {
|
|
229
|
+
const { body } = buildIssueContent(draft, {
|
|
230
|
+
reproducibility: 'Sometimes',
|
|
231
|
+
trigger: 'watch',
|
|
232
|
+
impact: 'Degraded',
|
|
233
|
+
});
|
|
234
|
+
expect(body).toContain('## User Context');
|
|
235
|
+
expect(body).toContain('Sometimes');
|
|
236
|
+
expect(body).toContain('watch');
|
|
237
|
+
expect(body).toContain('Degraded');
|
|
238
|
+
});
|
|
239
|
+
it('original draft body is preserved in output', () => {
|
|
240
|
+
const { body } = buildIssueContent(draft, {
|
|
241
|
+
reproducibility: 'Once',
|
|
242
|
+
trigger: 'review',
|
|
243
|
+
impact: 'Cosmetic',
|
|
244
|
+
});
|
|
245
|
+
expect(body).toContain('## Description');
|
|
246
|
+
expect(body).toContain('Something broke.');
|
|
247
|
+
});
|
|
248
|
+
it('all three answer fields appear in User Context', () => {
|
|
249
|
+
const { body } = buildIssueContent(draft, {
|
|
250
|
+
reproducibility: 'Every time',
|
|
251
|
+
trigger: 'serve',
|
|
252
|
+
impact: 'Blocked',
|
|
253
|
+
});
|
|
254
|
+
expect(body).toContain('Every time');
|
|
255
|
+
expect(body).toContain('serve');
|
|
256
|
+
expect(body).toContain('Blocked');
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
//# sourceMappingURL=issue.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue.test.js","sourceRoot":"","sources":["../../src/__tests__/issue.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kickass.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/kickass.test.ts"],"names":[],"mappings":""}
|