@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,243 @@
|
|
|
1
|
+
import { mkdtempSync, rmSync } from 'fs';
|
|
2
|
+
import { tmpdir } from 'os';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import ora from 'ora';
|
|
6
|
+
import { createGithubClient } from '../github/client.js';
|
|
7
|
+
import { detectOriginFull, assignReviewer } from '../github/detector.js';
|
|
8
|
+
import { loadConfig, getGithubToken } from '../config/loader.js';
|
|
9
|
+
import { initLogger, log as fileLog, logError } from '../lib/logger.js';
|
|
10
|
+
import { runWorkflow } from '../lib/runner.js';
|
|
11
|
+
import { loadWorkflow } from '../lib/workflow.js';
|
|
12
|
+
import { formatVerdict } from '../lib/verdict.js';
|
|
13
|
+
import { clonePRForReview } from '../lib/clone.js';
|
|
14
|
+
import { acquirePRLock, releasePRLock } from '../lib/pr-lock.js';
|
|
15
|
+
import { checkRemoteLock, acquireRemoteLock, releaseRemoteLock, startRemoteLockHeartbeat } from '../github/review-status.js';
|
|
16
|
+
function parsePRUrl(url) {
|
|
17
|
+
const m = url.match(/github\.com\/([^/]+)\/([^/]+)\/pull\/(\d+)/);
|
|
18
|
+
if (!m)
|
|
19
|
+
return null;
|
|
20
|
+
return { owner: m[1], repo: m[2], number: parseInt(m[3], 10) };
|
|
21
|
+
}
|
|
22
|
+
export async function runRun(prUrl, opts = {}) {
|
|
23
|
+
const config = loadConfig(opts.config);
|
|
24
|
+
initLogger(config.logs);
|
|
25
|
+
fileLog({ level: 'info', event: 'session_start', command: 'run', pr_url: prUrl });
|
|
26
|
+
let token;
|
|
27
|
+
try {
|
|
28
|
+
token = getGithubToken();
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
logError({ command: 'run', phase: 'auth' }, err);
|
|
32
|
+
console.error(chalk.red(`✗ ${err instanceof Error ? err.message : String(err)}`));
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
const parsed = parsePRUrl(prUrl);
|
|
36
|
+
if (!parsed) {
|
|
37
|
+
console.error(chalk.red('Invalid PR URL. Expected: https://github.com/owner/repo/pull/123'));
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
const { owner, repo, number } = parsed;
|
|
41
|
+
const spinner = ora(`Fetching PR #${number}...`).start();
|
|
42
|
+
const octokit = createGithubClient(token);
|
|
43
|
+
const { data: prData } = await octokit.rest.pulls.get({ owner, repo, pull_number: number });
|
|
44
|
+
if (opts.expectedHeadSha !== undefined && prData.head.sha !== opts.expectedHeadSha) {
|
|
45
|
+
spinner.warn(`PR #${number} head changed since selection — skipping stale_signature`);
|
|
46
|
+
fileLog({ level: 'info', event: 'pr_skipped', repo: `${owner}/${repo}`, pr: number, reason: 'stale_signature', expected_sha: opts.expectedHeadSha, actual_sha: prData.head.sha });
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
spinner.succeed(`PR #${number}: ${prData.title}`);
|
|
50
|
+
fileLog({ level: 'info', event: 'pr_received', repo: `${owner}/${repo}`, pr: number, sha: prData.head.sha });
|
|
51
|
+
// Resolve origin and reviewer
|
|
52
|
+
let origin;
|
|
53
|
+
if (opts.reviewer === 'codex' || opts.reviewer === 'claude') {
|
|
54
|
+
// --reviewer forces the origin to the opposite vendor (cross-vendor semantics)
|
|
55
|
+
origin = opts.reviewer === 'codex' ? 'claude' : 'codex';
|
|
56
|
+
console.log(chalk.dim(` reviewer: ${opts.reviewer} (forced)`));
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const { origin: detectedOrigin, method } = await detectOriginFull(prData.body ?? '', prData.head.ref, owner, repo, number, config, token, prData.user?.login);
|
|
60
|
+
origin = detectedOrigin;
|
|
61
|
+
console.log(chalk.dim(` PR origin: ${origin} (via ${method})`));
|
|
62
|
+
}
|
|
63
|
+
const assignedReviewer = opts.reviewer === 'codex' || opts.reviewer === 'claude'
|
|
64
|
+
? opts.reviewer
|
|
65
|
+
: await assignReviewer(origin, config);
|
|
66
|
+
if (!assignedReviewer) {
|
|
67
|
+
console.log(chalk.dim(` no reviewer assigned for origin "${origin}" — use --reviewer codex|claude to force`));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (!opts.reviewer) {
|
|
71
|
+
console.log(chalk.dim(` assigned reviewer: ${assignedReviewer}`));
|
|
72
|
+
}
|
|
73
|
+
// Resolve steps — filter from workflow.yml by type if --steps is specified, then pin the
|
|
74
|
+
// resolved reviewer on every review/recheck step so runWorkflow doesn't re-derive it
|
|
75
|
+
const allSteps = loadWorkflow(process.cwd());
|
|
76
|
+
const stepFilter = opts.steps?.split(',').map(s => s.trim().toLowerCase());
|
|
77
|
+
const filteredSteps = (stepFilter
|
|
78
|
+
? allSteps.filter(s => stepFilter.includes(s.type) || stepFilter.includes(s.name))
|
|
79
|
+
: allSteps).map(s => s.type === 'review' || s.type === 'recheck' ? { ...s, reviewer: assignedReviewer } : s);
|
|
80
|
+
if (opts.dryRun) {
|
|
81
|
+
console.log(chalk.dim(' dry-run: review will run but no comment will be posted; fix step skipped'));
|
|
82
|
+
}
|
|
83
|
+
// Build the PREvent['pull_request'] shape from the GitHub API response
|
|
84
|
+
const pr = {
|
|
85
|
+
title: prData.title,
|
|
86
|
+
body: prData.body ?? '',
|
|
87
|
+
head: {
|
|
88
|
+
ref: prData.head.ref,
|
|
89
|
+
sha: prData.head.sha,
|
|
90
|
+
repo: prData.head.repo ? { full_name: prData.head.repo.full_name } : null,
|
|
91
|
+
},
|
|
92
|
+
base: {
|
|
93
|
+
ref: prData.base.ref,
|
|
94
|
+
repo: { full_name: `${owner}/${repo}` },
|
|
95
|
+
},
|
|
96
|
+
html_url: prData.html_url,
|
|
97
|
+
user: { login: prData.user?.login ?? '' },
|
|
98
|
+
};
|
|
99
|
+
const { sha } = prData.head;
|
|
100
|
+
if (!acquirePRLock(owner, repo, number, sha)) {
|
|
101
|
+
fileLog({ level: 'info', event: 'pr_skipped', repo: `${owner}/${repo}`, pr: number, reason: 'in_progress_local' });
|
|
102
|
+
console.log(chalk.yellow(`⚠ PR #${number} is already being reviewed by another process on this machine — skipping`));
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
// Track which resources have actually been allocated so the SIGINT/SIGTERM
|
|
106
|
+
// handler only releases what exists. The handler must be installed BEFORE
|
|
107
|
+
// calling acquireRemoteLock: GitHub may create the pending status server-side
|
|
108
|
+
// even if the network round-trip is interrupted, and without an installed
|
|
109
|
+
// listener pr-lock would re-raise the signal and orphan the pending status
|
|
110
|
+
// until it goes stale.
|
|
111
|
+
let lockAttemptStarted = false;
|
|
112
|
+
let acquiredTmpDir;
|
|
113
|
+
let stopHeartbeat = () => { };
|
|
114
|
+
// Shared with runWorkflow — the runner appends every sha for which it set
|
|
115
|
+
// a remote pending status (e.g. after a conflict-resolve push). On normal
|
|
116
|
+
// completion or workflow error, the runner's own finally releases them;
|
|
117
|
+
// but if a signal fires mid-workflow we exit via process.exit and bypass
|
|
118
|
+
// that finally, so the signal handler iterates this array too.
|
|
119
|
+
const pushedShas = [];
|
|
120
|
+
const onSignal = (signal) => {
|
|
121
|
+
void (async () => {
|
|
122
|
+
try {
|
|
123
|
+
stopHeartbeat();
|
|
124
|
+
if (!opts.dryRun && lockAttemptStarted) {
|
|
125
|
+
await releaseRemoteLock(octokit, owner, repo, sha, 'failure');
|
|
126
|
+
// Drain the shared array via shift() so the runner's finally (which
|
|
127
|
+
// also drains via shift) doesn't double-release. Whichever loop
|
|
128
|
+
// shifts a sha first owns its release; the other sees a shorter
|
|
129
|
+
// array. This also prevents the reverse race — a signal arriving
|
|
130
|
+
// after the runner has already released a sha as 'success' would
|
|
131
|
+
// otherwise overwrite it with 'failure' here.
|
|
132
|
+
while (pushedShas.length > 0) {
|
|
133
|
+
const s = pushedShas.shift();
|
|
134
|
+
try {
|
|
135
|
+
await releaseRemoteLock(octokit, owner, repo, s, 'failure');
|
|
136
|
+
}
|
|
137
|
+
catch { /* best-effort per sha */ }
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch { /* best-effort — must still exit even if remote release fails */ }
|
|
142
|
+
try {
|
|
143
|
+
releasePRLock(owner, repo, number, sha);
|
|
144
|
+
}
|
|
145
|
+
catch { /* ignore */ }
|
|
146
|
+
if (acquiredTmpDir)
|
|
147
|
+
try {
|
|
148
|
+
rmSync(acquiredTmpDir, { force: true, recursive: true });
|
|
149
|
+
}
|
|
150
|
+
catch { /* ignore */ }
|
|
151
|
+
// 128 + signal number (SIGINT=2 → 130, SIGTERM=15 → 143) per POSIX convention
|
|
152
|
+
process.exit(signal === 'SIGTERM' ? 143 : 130);
|
|
153
|
+
})();
|
|
154
|
+
};
|
|
155
|
+
process.on('SIGINT', onSignal);
|
|
156
|
+
process.on('SIGTERM', onSignal);
|
|
157
|
+
try {
|
|
158
|
+
if (!opts.dryRun) {
|
|
159
|
+
if (await checkRemoteLock(octokit, owner, repo, sha)) {
|
|
160
|
+
releasePRLock(owner, repo, number, sha);
|
|
161
|
+
fileLog({ level: 'info', event: 'pr_skipped', repo: `${owner}/${repo}`, pr: number, reason: 'in_progress_remote' });
|
|
162
|
+
console.log(chalk.yellow(`⚠ PR #${number} is already being reviewed on another machine — skipping`));
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
try {
|
|
166
|
+
// Set the flag BEFORE the await so a signal that interrupts the in-flight
|
|
167
|
+
// request still triggers releaseRemoteLock (GitHub may have already
|
|
168
|
+
// created the pending status server-side).
|
|
169
|
+
lockAttemptStarted = true;
|
|
170
|
+
await acquireRemoteLock(octokit, owner, repo, sha);
|
|
171
|
+
}
|
|
172
|
+
catch (err) {
|
|
173
|
+
releasePRLock(owner, repo, number, sha);
|
|
174
|
+
throw err;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Clone the repo
|
|
178
|
+
const tmpDir = mkdtempSync(join(tmpdir(), 'crosscheck-run-'));
|
|
179
|
+
acquiredTmpDir = tmpDir;
|
|
180
|
+
const cloneSpinner = ora('Cloning repo...').start();
|
|
181
|
+
try {
|
|
182
|
+
clonePRForReview({
|
|
183
|
+
owner, repo, prNumber: number, baseRef: prData.base.ref,
|
|
184
|
+
tmpDir, token, protocol: config.clone_protocol,
|
|
185
|
+
onBaseFetchFailed: () => fileLog({ level: 'warn', event: 'base_branch_fetch_skipped', repo: `${owner}/${repo}`, pr: number, base: prData.base.ref }),
|
|
186
|
+
});
|
|
187
|
+
cloneSpinner.succeed('Repo ready');
|
|
188
|
+
if (!opts.dryRun)
|
|
189
|
+
stopHeartbeat = startRemoteLockHeartbeat(octokit, owner, repo, sha);
|
|
190
|
+
let activeSpinner = ora('').start();
|
|
191
|
+
const { verdict } = await runWorkflow({
|
|
192
|
+
owner,
|
|
193
|
+
repoName: repo,
|
|
194
|
+
prNumber: number,
|
|
195
|
+
pr,
|
|
196
|
+
tmpDir,
|
|
197
|
+
token,
|
|
198
|
+
config,
|
|
199
|
+
origin,
|
|
200
|
+
reviewStart: Date.now(),
|
|
201
|
+
log: (msg) => { activeSpinner.stop(); console.log(msg); activeSpinner = ora('').start(); },
|
|
202
|
+
onPhaseChange: (label) => { activeSpinner.text = label; },
|
|
203
|
+
crosscheckShas: new Set(),
|
|
204
|
+
pushedShas,
|
|
205
|
+
dryRun: opts.dryRun,
|
|
206
|
+
steps: filteredSteps,
|
|
207
|
+
initialReviewComment: opts.initialReviewComment,
|
|
208
|
+
});
|
|
209
|
+
activeSpinner.stop();
|
|
210
|
+
console.log(`\n ${formatVerdict(verdict)}`);
|
|
211
|
+
if (!opts.dryRun) {
|
|
212
|
+
console.log(chalk.green(`\n✓ Workflow complete — ${prUrl}\n`));
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
console.log(chalk.dim(`\n dry-run complete — no changes posted\n`));
|
|
216
|
+
}
|
|
217
|
+
stopHeartbeat();
|
|
218
|
+
if (!opts.dryRun)
|
|
219
|
+
await releaseRemoteLock(octokit, owner, repo, sha, 'success');
|
|
220
|
+
}
|
|
221
|
+
catch (err) {
|
|
222
|
+
stopHeartbeat();
|
|
223
|
+
if (!opts.dryRun)
|
|
224
|
+
await releaseRemoteLock(octokit, owner, repo, sha, 'failure');
|
|
225
|
+
logError({ repo: `${owner}/${repo}`, pr: number, phase: 'run' }, err);
|
|
226
|
+
console.error(chalk.red(`\n✗ ${err instanceof Error ? err.message : String(err)}\n`));
|
|
227
|
+
releasePRLock(owner, repo, number, sha);
|
|
228
|
+
if (acquiredTmpDir)
|
|
229
|
+
rmSync(acquiredTmpDir, { force: true, recursive: true });
|
|
230
|
+
process.exit(2);
|
|
231
|
+
}
|
|
232
|
+
finally {
|
|
233
|
+
releasePRLock(owner, repo, number, sha);
|
|
234
|
+
if (acquiredTmpDir)
|
|
235
|
+
rmSync(acquiredTmpDir, { force: true, recursive: true });
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
finally {
|
|
239
|
+
process.removeListener('SIGINT', onSignal);
|
|
240
|
+
process.removeListener('SIGTERM', onSignal);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { type ScanResult } from '../lib/pr-status.js';
|
|
2
|
+
export interface ScanOpts {
|
|
3
|
+
tidy?: boolean;
|
|
4
|
+
force?: boolean;
|
|
5
|
+
staleAfter?: string;
|
|
6
|
+
json?: boolean;
|
|
7
|
+
}
|
|
8
|
+
interface LoadScanOptions {
|
|
9
|
+
force?: boolean;
|
|
10
|
+
staleAfterMs: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function loadScanResult(options: LoadScanOptions): Promise<ScanResult>;
|
|
13
|
+
export declare function runScan(opts?: ScanOpts): Promise<void>;
|
|
14
|
+
export declare function printScanResult(result: ScanResult, tidy: boolean): void;
|
|
15
|
+
export declare function handleScanError(command: string, err: unknown): never;
|
|
16
|
+
type ReviewState = 'PR' | 'APPROVE' | 'NEEDS_WORK' | 'BLOCK';
|
|
17
|
+
type StepType = 'review' | 'fix' | 'recheck';
|
|
18
|
+
export interface ScanTokens {
|
|
19
|
+
review: number;
|
|
20
|
+
fix: number;
|
|
21
|
+
recheck: number;
|
|
22
|
+
total: number;
|
|
23
|
+
}
|
|
24
|
+
export interface ScanAnnotationMetadata {
|
|
25
|
+
commentId: number;
|
|
26
|
+
commentCreatedAt: string;
|
|
27
|
+
raw: string;
|
|
28
|
+
origin?: string;
|
|
29
|
+
reviewer?: string;
|
|
30
|
+
verdict?: ReviewState;
|
|
31
|
+
type?: string;
|
|
32
|
+
isRecheck?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface ScanRow {
|
|
35
|
+
repo: string;
|
|
36
|
+
pr: number;
|
|
37
|
+
title: string;
|
|
38
|
+
author: string;
|
|
39
|
+
branch: string;
|
|
40
|
+
headSha: string;
|
|
41
|
+
headShaShort: string;
|
|
42
|
+
url: string;
|
|
43
|
+
createdAt: string;
|
|
44
|
+
lastActiveAt: string;
|
|
45
|
+
isStale: boolean;
|
|
46
|
+
reviewState: ReviewState;
|
|
47
|
+
latestVerdict: ReviewState | null;
|
|
48
|
+
progressSummary: string;
|
|
49
|
+
tokens: ScanTokens;
|
|
50
|
+
latestAnnotation: ScanAnnotationMetadata | null;
|
|
51
|
+
nextAction: string | null;
|
|
52
|
+
}
|
|
53
|
+
export interface LogEntry {
|
|
54
|
+
ts: string;
|
|
55
|
+
event: string;
|
|
56
|
+
repo?: string;
|
|
57
|
+
pr?: number;
|
|
58
|
+
step_type?: string;
|
|
59
|
+
verdict?: string | null;
|
|
60
|
+
tokens_used?: number;
|
|
61
|
+
applied_count?: number;
|
|
62
|
+
conflicts_resolved?: number;
|
|
63
|
+
reason?: string;
|
|
64
|
+
}
|
|
65
|
+
export interface PRLogSummary {
|
|
66
|
+
reviewVerdict: ReviewState | null;
|
|
67
|
+
recheckVerdict: ReviewState | null;
|
|
68
|
+
latestVerdict: ReviewState | null;
|
|
69
|
+
latestVerdictAt: string | null;
|
|
70
|
+
latestStep: StepType | null;
|
|
71
|
+
latestLogAt: string | null;
|
|
72
|
+
fixAppliedCount: number | null;
|
|
73
|
+
fixCompletedAt: string | null;
|
|
74
|
+
tokens: ScanTokens;
|
|
75
|
+
}
|
|
76
|
+
export declare function filterScanRowsForOutput(rows: ScanRow[], tidy: boolean): ScanRow[];
|
|
77
|
+
export declare function chooseLatestVerdict(annotationVerdict: ReviewState, annotationAt: string, logSummary: PRLogSummary): ReviewState | null;
|
|
78
|
+
export declare function selectNextAction(latestVerdict: ReviewState | null, logSummary: PRLogSummary): string | null;
|
|
79
|
+
export declare function buildProgressSummary(annotation: ScanAnnotationMetadata | null, logSummary: PRLogSummary): string;
|
|
80
|
+
interface ScanAnnotations {
|
|
81
|
+
latestAnnotation: ScanAnnotationMetadata | null;
|
|
82
|
+
latestVerdictAnnotation: ScanAnnotationMetadata | null;
|
|
83
|
+
}
|
|
84
|
+
export declare function findLatestAnnotation(comments: Array<{
|
|
85
|
+
id: number;
|
|
86
|
+
body: string;
|
|
87
|
+
createdAt: string;
|
|
88
|
+
author?: string;
|
|
89
|
+
updatedAt?: string;
|
|
90
|
+
}>): ScanAnnotations;
|
|
91
|
+
export declare function applyLogEntry(summary: PRLogSummary, entry: LogEntry): void;
|
|
92
|
+
export declare function emptyLogSummary(): PRLogSummary;
|
|
93
|
+
export {};
|
|
94
|
+
//# sourceMappingURL=scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { createHash } from 'crypto';
|
|
3
|
+
import { getGithubToken, loadConfig } from '../config/loader.js';
|
|
4
|
+
import { formatDuration, parseDuration } from '../lib/durations.js';
|
|
5
|
+
import { initLogger, logError } from '../lib/logger.js';
|
|
6
|
+
import { UserInputError } from '../lib/pr-picker.js';
|
|
7
|
+
import { scanOpenPRStatuses } from '../lib/pr-status.js';
|
|
8
|
+
import { readScanCache, writeScanCache } from '../lib/scan-cache.js';
|
|
9
|
+
export async function loadScanResult(options) {
|
|
10
|
+
const config = loadConfig();
|
|
11
|
+
initLogger(config.logs);
|
|
12
|
+
const token = getGithubToken();
|
|
13
|
+
const now = new Date();
|
|
14
|
+
const scopeHash = buildScanScopeHash(config);
|
|
15
|
+
if (!options.force) {
|
|
16
|
+
const cached = readScanCache({
|
|
17
|
+
nowMs: now.getTime(),
|
|
18
|
+
staleAfterMs: options.staleAfterMs,
|
|
19
|
+
scopeHash,
|
|
20
|
+
});
|
|
21
|
+
if (cached)
|
|
22
|
+
return { ...cached, cached: true };
|
|
23
|
+
}
|
|
24
|
+
const scan = await scanOpenPRStatuses(config, token, {
|
|
25
|
+
now,
|
|
26
|
+
staleAfterMs: options.staleAfterMs,
|
|
27
|
+
});
|
|
28
|
+
const result = { ...scan, scopeHash };
|
|
29
|
+
writeScanCache(toCachePayload(result));
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
export async function runScan(opts = {}) {
|
|
33
|
+
let staleAfterMs;
|
|
34
|
+
try {
|
|
35
|
+
staleAfterMs = parseDuration(opts.staleAfter ?? '24h');
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
console.error(chalk.red(`✗ ${err instanceof Error ? err.message : String(err)}`));
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
const result = await loadScanResult({ force: opts.force, staleAfterMs });
|
|
43
|
+
if (opts.json) {
|
|
44
|
+
console.log(JSON.stringify(result, null, 2));
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
printScanResult(result, opts.tidy === true);
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
handleScanError('scan', err);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export function printScanResult(result, tidy) {
|
|
54
|
+
const visible = tidy
|
|
55
|
+
? result.prs.filter(pr => pr.freshness === 'stale' && pr.nextAction !== null)
|
|
56
|
+
: result.prs;
|
|
57
|
+
const cacheNote = result.cached ? chalk.dim(' cached') : '';
|
|
58
|
+
console.log(`crosscheck scan${cacheNote}`);
|
|
59
|
+
console.log(chalk.dim(` scanned ${result.scannedAt}`));
|
|
60
|
+
console.log(chalk.dim(` stale after ${formatDuration(result.staleAfterMs)}`));
|
|
61
|
+
console.log(` total ${result.summary.total}`);
|
|
62
|
+
console.log(` stale ${chalk.yellow(result.summary.stale)}`);
|
|
63
|
+
console.log(` actionable ${chalk.cyan(result.summary.actionable)}`);
|
|
64
|
+
console.log();
|
|
65
|
+
if (visible.length === 0) {
|
|
66
|
+
console.log(tidy ? chalk.dim('No stale PRs need attention.') : chalk.dim('No open PRs found in the configured monitor scope.'));
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
for (const pr of visible) {
|
|
70
|
+
console.log(formatPRLine(pr));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function formatPRLine(pr) {
|
|
74
|
+
const freshness = pr.freshness === 'stale' ? chalk.yellow('stale') : chalk.dim('not_stale');
|
|
75
|
+
const next = pr.nextAction ? `next=${pr.nextAction}` : 'terminal';
|
|
76
|
+
const age = formatAge(pr.ageMs);
|
|
77
|
+
return [
|
|
78
|
+
` ${freshness}`,
|
|
79
|
+
chalk.cyan(`#${pr.number}`),
|
|
80
|
+
`${pr.owner}/${pr.repo}`,
|
|
81
|
+
chalk.bold(pr.reviewState),
|
|
82
|
+
chalk.dim(`last=${age}`),
|
|
83
|
+
chalk.dim(next),
|
|
84
|
+
pr.title,
|
|
85
|
+
].join(' ');
|
|
86
|
+
}
|
|
87
|
+
function formatAge(ms) {
|
|
88
|
+
const minuteMs = 60 * 1000;
|
|
89
|
+
const hourMs = 60 * minuteMs;
|
|
90
|
+
const dayMs = 24 * hourMs;
|
|
91
|
+
if (ms >= dayMs)
|
|
92
|
+
return `${Math.floor(ms / dayMs)}d`;
|
|
93
|
+
if (ms >= hourMs)
|
|
94
|
+
return `${Math.floor(ms / hourMs)}h`;
|
|
95
|
+
return `${Math.floor(ms / minuteMs)}m`;
|
|
96
|
+
}
|
|
97
|
+
function toCachePayload(result) {
|
|
98
|
+
return {
|
|
99
|
+
scannedAt: result.scannedAt,
|
|
100
|
+
staleAfterMs: result.staleAfterMs,
|
|
101
|
+
...(result.scopeHash && { scopeHash: result.scopeHash }),
|
|
102
|
+
summary: result.summary,
|
|
103
|
+
prs: result.prs,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
export function handleScanError(command, err) {
|
|
107
|
+
logError({ command }, err);
|
|
108
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
109
|
+
console.error(chalk.red(`✗ ${message}`));
|
|
110
|
+
process.exit(isUserError(err, message) ? 1 : 2);
|
|
111
|
+
}
|
|
112
|
+
function isUserError(err, message) {
|
|
113
|
+
return err instanceof UserInputError
|
|
114
|
+
|| message.startsWith('No GitHub token found')
|
|
115
|
+
|| message.includes('Invalid configuration');
|
|
116
|
+
}
|
|
117
|
+
function buildScanScopeHash(config) {
|
|
118
|
+
const scope = {
|
|
119
|
+
orgs: [...config.orgs].sort(),
|
|
120
|
+
repos: config.repos.map(repo => `${repo.owner}/${repo.name}`).sort(),
|
|
121
|
+
users: [...config.users].sort(),
|
|
122
|
+
allowedAuthors: [...config.routing.allowed_authors].sort(),
|
|
123
|
+
};
|
|
124
|
+
return createHash('sha256').update(JSON.stringify(scope)).digest('hex');
|
|
125
|
+
}
|
|
126
|
+
export function filterScanRowsForOutput(rows, tidy) {
|
|
127
|
+
if (!tidy)
|
|
128
|
+
return rows;
|
|
129
|
+
return rows.filter(row => row.isStale && row.nextAction !== null);
|
|
130
|
+
}
|
|
131
|
+
export function chooseLatestVerdict(annotationVerdict, annotationAt, logSummary) {
|
|
132
|
+
if (!logSummary.latestVerdictAt)
|
|
133
|
+
return annotationVerdict;
|
|
134
|
+
return new Date(annotationAt).getTime() >= new Date(logSummary.latestVerdictAt).getTime()
|
|
135
|
+
? annotationVerdict
|
|
136
|
+
: logSummary.latestVerdict;
|
|
137
|
+
}
|
|
138
|
+
export function selectNextAction(latestVerdict, logSummary) {
|
|
139
|
+
if (!latestVerdict || latestVerdict === 'PR')
|
|
140
|
+
return 'next CR';
|
|
141
|
+
if (latestVerdict === 'APPROVE')
|
|
142
|
+
return 'next merge';
|
|
143
|
+
if (latestVerdict === 'NEEDS_WORK' || latestVerdict === 'BLOCK') {
|
|
144
|
+
if (logSummary.latestStep === 'fix')
|
|
145
|
+
return 'next recheck';
|
|
146
|
+
return 'next fix';
|
|
147
|
+
}
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
export function buildProgressSummary(annotation, logSummary) {
|
|
151
|
+
const parts = ['PR'];
|
|
152
|
+
if (logSummary.reviewVerdict) {
|
|
153
|
+
parts.push(`CR(${logSummary.reviewVerdict})`);
|
|
154
|
+
}
|
|
155
|
+
else if (annotation?.verdict) {
|
|
156
|
+
parts.push(`${annotation.isRecheck ? 'recheck' : 'CR'}(${annotation.verdict})`);
|
|
157
|
+
}
|
|
158
|
+
if (logSummary.fixAppliedCount !== null)
|
|
159
|
+
parts.push(`fix(${logSummary.fixAppliedCount})`);
|
|
160
|
+
const recheckVerdict = logSummary.recheckVerdict;
|
|
161
|
+
if (recheckVerdict)
|
|
162
|
+
parts.push(`recheck(${recheckVerdict})`);
|
|
163
|
+
return parts.join(' -> ');
|
|
164
|
+
}
|
|
165
|
+
export function findLatestAnnotation(comments) {
|
|
166
|
+
let latestAnnotation = null;
|
|
167
|
+
let latestVerdictAnnotation = null;
|
|
168
|
+
const orderedComments = [...comments].sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());
|
|
169
|
+
for (const comment of orderedComments) {
|
|
170
|
+
const matches = [...comment.body.matchAll(/<!-- crosscheck: ([^>]+) -->/g)];
|
|
171
|
+
const match = matches.at(-1);
|
|
172
|
+
if (!match)
|
|
173
|
+
continue;
|
|
174
|
+
const attrs = parseAttrs(match[1]);
|
|
175
|
+
const annotation = {
|
|
176
|
+
commentId: comment.id,
|
|
177
|
+
commentCreatedAt: comment.createdAt,
|
|
178
|
+
raw: match[1],
|
|
179
|
+
origin: attrs.origin,
|
|
180
|
+
reviewer: attrs.reviewer,
|
|
181
|
+
verdict: normalizeReviewState(attrs.verdict) ?? undefined,
|
|
182
|
+
type: attrs.type,
|
|
183
|
+
isRecheck: attrs.type === 'recheck' || comment.body.startsWith('> Recheck of'),
|
|
184
|
+
};
|
|
185
|
+
latestAnnotation = annotation;
|
|
186
|
+
if (annotation.verdict)
|
|
187
|
+
latestVerdictAnnotation = annotation;
|
|
188
|
+
}
|
|
189
|
+
return { latestAnnotation, latestVerdictAnnotation };
|
|
190
|
+
}
|
|
191
|
+
export function applyLogEntry(summary, entry) {
|
|
192
|
+
if (entry.ts)
|
|
193
|
+
summary.latestLogAt = maxTimestamp([summary.latestLogAt, entry.ts]);
|
|
194
|
+
if (entry.event === 'review_complete') {
|
|
195
|
+
const verdict = normalizeReviewState(entry.verdict ?? undefined);
|
|
196
|
+
const stepType = entry.step_type === 'recheck' ? 'recheck' : 'review';
|
|
197
|
+
if (stepType === 'recheck')
|
|
198
|
+
summary.recheckVerdict = verdict;
|
|
199
|
+
else
|
|
200
|
+
summary.reviewVerdict = verdict;
|
|
201
|
+
if (verdict) {
|
|
202
|
+
summary.latestVerdict = verdict;
|
|
203
|
+
summary.latestVerdictAt = entry.ts;
|
|
204
|
+
summary.latestStep = stepType;
|
|
205
|
+
}
|
|
206
|
+
addTokens(summary.tokens, stepType, entry.tokens_used);
|
|
207
|
+
}
|
|
208
|
+
else if (entry.event === 'fix_complete') {
|
|
209
|
+
if (entry.applied_count !== undefined)
|
|
210
|
+
summary.fixAppliedCount = entry.applied_count;
|
|
211
|
+
summary.fixCompletedAt = entry.ts;
|
|
212
|
+
summary.latestStep = 'fix';
|
|
213
|
+
addTokens(summary.tokens, 'fix', entry.tokens_used);
|
|
214
|
+
}
|
|
215
|
+
else if (entry.event === 'conflict_resolve_complete') {
|
|
216
|
+
if (entry.conflicts_resolved !== undefined)
|
|
217
|
+
summary.fixAppliedCount = entry.conflicts_resolved;
|
|
218
|
+
summary.fixCompletedAt = entry.ts;
|
|
219
|
+
summary.latestStep = 'fix';
|
|
220
|
+
addTokens(summary.tokens, 'fix', entry.tokens_used);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
export function emptyLogSummary() {
|
|
224
|
+
return {
|
|
225
|
+
reviewVerdict: null,
|
|
226
|
+
recheckVerdict: null,
|
|
227
|
+
latestVerdict: null,
|
|
228
|
+
latestVerdictAt: null,
|
|
229
|
+
latestStep: null,
|
|
230
|
+
latestLogAt: null,
|
|
231
|
+
fixAppliedCount: null,
|
|
232
|
+
fixCompletedAt: null,
|
|
233
|
+
tokens: { review: 0, fix: 0, recheck: 0, total: 0 },
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
function parseAttrs(raw) {
|
|
237
|
+
const attrs = {};
|
|
238
|
+
for (const part of raw.trim().split(/\s+/)) {
|
|
239
|
+
const eq = part.indexOf('=');
|
|
240
|
+
if (eq <= 0)
|
|
241
|
+
continue;
|
|
242
|
+
attrs[part.slice(0, eq)] = part.slice(eq + 1);
|
|
243
|
+
}
|
|
244
|
+
return attrs;
|
|
245
|
+
}
|
|
246
|
+
function normalizeReviewState(value) {
|
|
247
|
+
if (!value)
|
|
248
|
+
return null;
|
|
249
|
+
const normalized = value.toUpperCase().replace(/\s+/g, '_');
|
|
250
|
+
if (normalized === 'APPROVE')
|
|
251
|
+
return 'APPROVE';
|
|
252
|
+
if (normalized === 'NEEDS_WORK')
|
|
253
|
+
return 'NEEDS_WORK';
|
|
254
|
+
if (normalized === 'BLOCK')
|
|
255
|
+
return 'BLOCK';
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
function maxTimestamp(values) {
|
|
259
|
+
let latest = null;
|
|
260
|
+
for (const value of values) {
|
|
261
|
+
if (!value)
|
|
262
|
+
continue;
|
|
263
|
+
if (Number.isNaN(new Date(value).getTime()))
|
|
264
|
+
continue;
|
|
265
|
+
if (!latest || new Date(value).getTime() > new Date(latest).getTime())
|
|
266
|
+
latest = value;
|
|
267
|
+
}
|
|
268
|
+
return latest;
|
|
269
|
+
}
|
|
270
|
+
function addTokens(tokens, step, value) {
|
|
271
|
+
if (value === undefined)
|
|
272
|
+
return;
|
|
273
|
+
tokens[step] += value;
|
|
274
|
+
tokens.total += value;
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
|