@humanbased/crosscheck 1.2.0 → 1.3.0-beta.100
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 +183 -375
- package/README.zh.md +1 -1
- package/assets/icon-256.png +0 -0
- package/assets/linear-comment.svg +18 -0
- package/assets/linear-onboard.svg +30 -0
- package/assets/linear-status.svg +23 -0
- package/assets/linear-test.svg +34 -0
- package/assets/skills/code-review/.crosscheck-skill.json +9 -0
- package/assets/skills/code-review/LICENSE +21 -0
- package/assets/skills/code-review/SKILL.md +89 -0
- package/assets/skills/code-review/agents/openai.yaml +3 -0
- package/assets/skills/code-review-skill/.crosscheck-skill.json +9 -0
- package/assets/skills/code-review-skill/LICENSE +21 -0
- package/assets/skills/code-review-skill/SKILL.md +231 -0
- package/assets/skills/code-review-skill/assets/pr-review-template.md +137 -0
- package/assets/skills/code-review-skill/assets/review-checklist.md +123 -0
- package/assets/skills/code-review-skill/reference/angular.md +768 -0
- package/assets/skills/code-review-skill/reference/architecture-review-guide.md +472 -0
- package/assets/skills/code-review-skill/reference/c.md +890 -0
- package/assets/skills/code-review-skill/reference/code-quality-universal.md +488 -0
- package/assets/skills/code-review-skill/reference/code-review-best-practices.md +136 -0
- package/assets/skills/code-review-skill/reference/common-bugs-checklist.md +286 -0
- package/assets/skills/code-review-skill/reference/cpp.md +893 -0
- package/assets/skills/code-review-skill/reference/cross-cutting/async-concurrency-patterns.md +515 -0
- package/assets/skills/code-review-skill/reference/cross-cutting/error-handling-principles.md +492 -0
- package/assets/skills/code-review-skill/reference/cross-cutting/n-plus-one-queries.md +309 -0
- package/assets/skills/code-review-skill/reference/cross-cutting/sql-injection-prevention.md +308 -0
- package/assets/skills/code-review-skill/reference/cross-cutting/xss-prevention.md +264 -0
- package/assets/skills/code-review-skill/reference/csharp.md +525 -0
- package/assets/skills/code-review-skill/reference/css-less-sass.md +661 -0
- package/assets/skills/code-review-skill/reference/django.md +985 -0
- package/assets/skills/code-review-skill/reference/fastapi.md +580 -0
- package/assets/skills/code-review-skill/reference/go.md +993 -0
- package/assets/skills/code-review-skill/reference/java.md +409 -0
- package/assets/skills/code-review-skill/reference/java8.md +586 -0
- package/assets/skills/code-review-skill/reference/kotlin.md +1018 -0
- package/assets/skills/code-review-skill/reference/nestjs.md +593 -0
- package/assets/skills/code-review-skill/reference/performance-review-guide.md +816 -0
- package/assets/skills/code-review-skill/reference/php.md +684 -0
- package/assets/skills/code-review-skill/reference/python.md +1073 -0
- package/assets/skills/code-review-skill/reference/qt.md +757 -0
- package/assets/skills/code-review-skill/reference/react.md +871 -0
- package/assets/skills/code-review-skill/reference/ruby.md +964 -0
- package/assets/skills/code-review-skill/reference/rust.md +846 -0
- package/assets/skills/code-review-skill/reference/security-review-guide.md +494 -0
- package/assets/skills/code-review-skill/reference/svelte.md +1064 -0
- package/assets/skills/code-review-skill/reference/swift.md +936 -0
- package/assets/skills/code-review-skill/reference/typescript.md +1016 -0
- package/assets/skills/code-review-skill/reference/vue.md +924 -0
- package/assets/skills/code-review-skill/reference/zig.md +440 -0
- package/assets/skills/code-review-skill/scripts/pr-analyzer.py +435 -0
- package/assets/skills/code-review-skill/scripts/test_pr_analyzer.py +380 -0
- package/assets/skills/codebase-design/.crosscheck-skill.json +9 -0
- package/assets/skills/codebase-design/DEEPENING.md +37 -0
- package/assets/skills/codebase-design/DESIGN-IT-TWICE.md +44 -0
- package/assets/skills/codebase-design/LICENSE +21 -0
- package/assets/skills/codebase-design/SKILL.md +114 -0
- package/assets/skills/codebase-design/agents/openai.yaml +3 -0
- package/assets/skills/diagnosing-bugs/.crosscheck-skill.json +9 -0
- package/assets/skills/diagnosing-bugs/LICENSE +21 -0
- package/assets/skills/diagnosing-bugs/SKILL.md +134 -0
- package/assets/skills/diagnosing-bugs/agents/openai.yaml +3 -0
- package/assets/skills/diagnosing-bugs/scripts/hitl-loop.template.sh +41 -0
- package/crosscheck.config.example.yml +124 -11
- package/dist/__tests__/adoption.test.d.ts +2 -0
- package/dist/__tests__/adoption.test.d.ts.map +1 -0
- package/dist/__tests__/adoption.test.js +175 -0
- package/dist/__tests__/adoption.test.js.map +1 -0
- package/dist/__tests__/auto-fix-branch.test.d.ts +2 -0
- package/dist/__tests__/auto-fix-branch.test.d.ts.map +1 -0
- package/dist/__tests__/auto-fix-branch.test.js +143 -0
- package/dist/__tests__/auto-fix-branch.test.js.map +1 -0
- package/dist/__tests__/board.test.js +13 -0
- package/dist/__tests__/board.test.js.map +1 -1
- package/dist/__tests__/can-write-verdict.test.d.ts +2 -0
- package/dist/__tests__/can-write-verdict.test.d.ts.map +1 -0
- package/dist/__tests__/can-write-verdict.test.js +31 -0
- package/dist/__tests__/can-write-verdict.test.js.map +1 -0
- package/dist/__tests__/codex-env.test.d.ts +2 -0
- package/dist/__tests__/codex-env.test.d.ts.map +1 -0
- package/dist/__tests__/codex-env.test.js +70 -0
- package/dist/__tests__/codex-env.test.js.map +1 -0
- package/dist/__tests__/codex.test.js +100 -25
- package/dist/__tests__/codex.test.js.map +1 -1
- package/dist/__tests__/comment-bodies.test.js +49 -1
- package/dist/__tests__/comment-bodies.test.js.map +1 -1
- package/dist/__tests__/commit-subject.test.d.ts +2 -0
- package/dist/__tests__/commit-subject.test.d.ts.map +1 -0
- package/dist/__tests__/commit-subject.test.js +72 -0
- package/dist/__tests__/commit-subject.test.js.map +1 -0
- package/dist/__tests__/conflict-resolve.test.js +44 -1
- package/dist/__tests__/conflict-resolve.test.js.map +1 -1
- package/dist/__tests__/credential-free-origin.test.d.ts +2 -0
- package/dist/__tests__/credential-free-origin.test.d.ts.map +1 -0
- package/dist/__tests__/credential-free-origin.test.js +59 -0
- package/dist/__tests__/credential-free-origin.test.js.map +1 -0
- package/dist/__tests__/detector.test.js +87 -1
- package/dist/__tests__/detector.test.js.map +1 -1
- package/dist/__tests__/error-classification.test.js +34 -0
- package/dist/__tests__/error-classification.test.js.map +1 -1
- package/dist/__tests__/fix.test.js +69 -0
- package/dist/__tests__/fix.test.js.map +1 -1
- package/dist/__tests__/harness-section.test.d.ts +2 -0
- package/dist/__tests__/harness-section.test.d.ts.map +1 -0
- package/dist/__tests__/harness-section.test.js +46 -0
- package/dist/__tests__/harness-section.test.js.map +1 -0
- package/dist/__tests__/kickass.test.js +31 -0
- package/dist/__tests__/kickass.test.js.map +1 -1
- package/dist/__tests__/linear-branding.test.d.ts +2 -0
- package/dist/__tests__/linear-branding.test.d.ts.map +1 -0
- package/dist/__tests__/linear-branding.test.js +156 -0
- package/dist/__tests__/linear-branding.test.js.map +1 -0
- package/dist/__tests__/linear-client.test.d.ts +2 -0
- package/dist/__tests__/linear-client.test.d.ts.map +1 -0
- package/dist/__tests__/linear-client.test.js +120 -0
- package/dist/__tests__/linear-client.test.js.map +1 -0
- package/dist/__tests__/linear-comment.test.d.ts +2 -0
- package/dist/__tests__/linear-comment.test.d.ts.map +1 -0
- package/dist/__tests__/linear-comment.test.js +151 -0
- package/dist/__tests__/linear-comment.test.js.map +1 -0
- package/dist/__tests__/linear-identity.test.d.ts +2 -0
- package/dist/__tests__/linear-identity.test.d.ts.map +1 -0
- package/dist/__tests__/linear-identity.test.js +253 -0
- package/dist/__tests__/linear-identity.test.js.map +1 -0
- package/dist/__tests__/linear-notify.test.d.ts +2 -0
- package/dist/__tests__/linear-notify.test.d.ts.map +1 -0
- package/dist/__tests__/linear-notify.test.js +144 -0
- package/dist/__tests__/linear-notify.test.js.map +1 -0
- package/dist/__tests__/linear-ref.test.d.ts +2 -0
- package/dist/__tests__/linear-ref.test.d.ts.map +1 -0
- package/dist/__tests__/linear-ref.test.js +261 -0
- package/dist/__tests__/linear-ref.test.js.map +1 -0
- package/dist/__tests__/linear-test-ref.test.d.ts +2 -0
- package/dist/__tests__/linear-test-ref.test.d.ts.map +1 -0
- package/dist/__tests__/linear-test-ref.test.js +81 -0
- package/dist/__tests__/linear-test-ref.test.js.map +1 -0
- package/dist/__tests__/linear-verify.test.d.ts +2 -0
- package/dist/__tests__/linear-verify.test.d.ts.map +1 -0
- package/dist/__tests__/linear-verify.test.js +132 -0
- package/dist/__tests__/linear-verify.test.js.map +1 -0
- package/dist/__tests__/linear-worker.test.d.ts +2 -0
- package/dist/__tests__/linear-worker.test.d.ts.map +1 -0
- package/dist/__tests__/linear-worker.test.js +83 -0
- package/dist/__tests__/linear-worker.test.js.map +1 -0
- package/dist/__tests__/linear-write-possible.test.d.ts +2 -0
- package/dist/__tests__/linear-write-possible.test.d.ts.map +1 -0
- package/dist/__tests__/linear-write-possible.test.js +30 -0
- package/dist/__tests__/linear-write-possible.test.js.map +1 -0
- package/dist/__tests__/loader.test.js +2 -2
- package/dist/__tests__/loader.test.js.map +1 -1
- package/dist/__tests__/onboard-preservation.test.js +59 -4
- package/dist/__tests__/onboard-preservation.test.js.map +1 -1
- package/dist/__tests__/optimize.test.js +2 -0
- package/dist/__tests__/optimize.test.js.map +1 -1
- package/dist/__tests__/pr-status.test.js +213 -3
- package/dist/__tests__/pr-status.test.js.map +1 -1
- package/dist/__tests__/pr-workflow-state.test.js +247 -7
- package/dist/__tests__/pr-workflow-state.test.js.map +1 -1
- package/dist/__tests__/repo-picker.test.js +7 -1
- package/dist/__tests__/repo-picker.test.js.map +1 -1
- package/dist/__tests__/repository-guidance.test.d.ts +2 -0
- package/dist/__tests__/repository-guidance.test.d.ts.map +1 -0
- package/dist/__tests__/repository-guidance.test.js +107 -0
- package/dist/__tests__/repository-guidance.test.js.map +1 -0
- package/dist/__tests__/review-comment-body.test.js +35 -0
- package/dist/__tests__/review-comment-body.test.js.map +1 -1
- package/dist/__tests__/review-models.test.js +19 -3
- package/dist/__tests__/review-models.test.js.map +1 -1
- package/dist/__tests__/review-strategy.test.d.ts +2 -0
- package/dist/__tests__/review-strategy.test.d.ts.map +1 -0
- package/dist/__tests__/review-strategy.test.js +397 -0
- package/dist/__tests__/review-strategy.test.js.map +1 -0
- package/dist/__tests__/reviewed-sha.test.d.ts +2 -0
- package/dist/__tests__/reviewed-sha.test.d.ts.map +1 -0
- package/dist/__tests__/reviewed-sha.test.js +116 -0
- package/dist/__tests__/reviewed-sha.test.js.map +1 -0
- package/dist/__tests__/runner.test.js +206 -2
- package/dist/__tests__/runner.test.js.map +1 -1
- package/dist/__tests__/skill-attribution.test.d.ts +2 -0
- package/dist/__tests__/skill-attribution.test.d.ts.map +1 -0
- package/dist/__tests__/skill-attribution.test.js +53 -0
- package/dist/__tests__/skill-attribution.test.js.map +1 -0
- package/dist/__tests__/skill-broker.test.d.ts +2 -0
- package/dist/__tests__/skill-broker.test.d.ts.map +1 -0
- package/dist/__tests__/skill-broker.test.js +186 -0
- package/dist/__tests__/skill-broker.test.js.map +1 -0
- package/dist/__tests__/skill-catalog.test.d.ts +2 -0
- package/dist/__tests__/skill-catalog.test.d.ts.map +1 -0
- package/dist/__tests__/skill-catalog.test.js +40 -0
- package/dist/__tests__/skill-catalog.test.js.map +1 -0
- package/dist/__tests__/skill-installer.test.d.ts +2 -0
- package/dist/__tests__/skill-installer.test.d.ts.map +1 -0
- package/dist/__tests__/skill-installer.test.js +96 -0
- package/dist/__tests__/skill-installer.test.js.map +1 -0
- package/dist/__tests__/skills-config.test.d.ts +2 -0
- package/dist/__tests__/skills-config.test.d.ts.map +1 -0
- package/dist/__tests__/skills-config.test.js +12 -0
- package/dist/__tests__/skills-config.test.js.map +1 -0
- package/dist/__tests__/superseded-fix-pr.test.d.ts +2 -0
- package/dist/__tests__/superseded-fix-pr.test.d.ts.map +1 -0
- package/dist/__tests__/superseded-fix-pr.test.js +225 -0
- package/dist/__tests__/superseded-fix-pr.test.js.map +1 -0
- package/dist/__tests__/webhook.test.js +60 -0
- package/dist/__tests__/webhook.test.js.map +1 -1
- package/dist/cli.js +37 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/adoption.d.ts +6 -0
- package/dist/commands/adoption.d.ts.map +1 -0
- package/dist/commands/adoption.js +132 -0
- package/dist/commands/adoption.js.map +1 -0
- package/dist/commands/detect-step.d.ts.map +1 -1
- package/dist/commands/detect-step.js +5 -1
- package/dist/commands/detect-step.js.map +1 -1
- package/dist/commands/diagnose.d.ts.map +1 -1
- package/dist/commands/diagnose.js +2 -2
- package/dist/commands/diagnose.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +1 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/issue.js +1 -1
- package/dist/commands/issue.js.map +1 -1
- package/dist/commands/kickass.d.ts +1 -1
- package/dist/commands/kickass.d.ts.map +1 -1
- package/dist/commands/kickass.js +36 -22
- package/dist/commands/kickass.js.map +1 -1
- package/dist/commands/linear-test.d.ts +18 -0
- package/dist/commands/linear-test.d.ts.map +1 -0
- package/dist/commands/linear-test.js +130 -0
- package/dist/commands/linear-test.js.map +1 -0
- package/dist/commands/onboard.d.ts +36 -3
- package/dist/commands/onboard.d.ts.map +1 -1
- package/dist/commands/onboard.js +263 -45
- package/dist/commands/onboard.js.map +1 -1
- package/dist/commands/optimize.d.ts.map +1 -1
- package/dist/commands/optimize.js +1 -0
- package/dist/commands/optimize.js.map +1 -1
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +65 -6
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +85 -11
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/scan.d.ts.map +1 -1
- package/dist/commands/scan.js +6 -0
- package/dist/commands/scan.js.map +1 -1
- package/dist/commands/skill.d.ts +2 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +16 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +53 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +215 -66
- package/dist/commands/watch.js.map +1 -1
- package/dist/config/loader.d.ts +3 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +19 -6
- package/dist/config/loader.js.map +1 -1
- package/dist/config/review-model-tiers.json +3 -3
- package/dist/config/review-strategy.json +204 -0
- package/dist/config/schema.d.ts +269 -15
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +109 -10
- package/dist/config/schema.js.map +1 -1
- package/dist/github/client.d.ts +21 -1
- package/dist/github/client.d.ts.map +1 -1
- package/dist/github/client.js +46 -7
- package/dist/github/client.js.map +1 -1
- package/dist/github/detector.d.ts.map +1 -1
- package/dist/github/detector.js +28 -1
- package/dist/github/detector.js.map +1 -1
- package/dist/github/merge.d.ts +0 -5
- package/dist/github/merge.d.ts.map +1 -1
- package/dist/github/merge.js +0 -9
- package/dist/github/merge.js.map +1 -1
- package/dist/github/reviewed-sha.d.ts +13 -0
- package/dist/github/reviewed-sha.d.ts.map +1 -0
- package/dist/github/reviewed-sha.js +62 -0
- package/dist/github/reviewed-sha.js.map +1 -0
- package/dist/github/superseded-fix-pr.d.ts +19 -0
- package/dist/github/superseded-fix-pr.d.ts.map +1 -0
- package/dist/github/superseded-fix-pr.js +97 -0
- package/dist/github/superseded-fix-pr.js.map +1 -0
- package/dist/github/webhook.d.ts +8 -1
- package/dist/github/webhook.d.ts.map +1 -1
- package/dist/github/webhook.js +8 -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 +6 -5
- package/dist/issues/ticket-ref.js.map +1 -1
- package/dist/lib/adoption.d.ts +64 -0
- package/dist/lib/adoption.d.ts.map +1 -0
- package/dist/lib/adoption.js +165 -0
- package/dist/lib/adoption.js.map +1 -0
- package/dist/lib/annotation.d.ts +7 -0
- package/dist/lib/annotation.d.ts.map +1 -1
- package/dist/lib/annotation.js +11 -8
- package/dist/lib/annotation.js.map +1 -1
- package/dist/lib/auto-fix-branch.d.ts +35 -0
- package/dist/lib/auto-fix-branch.d.ts.map +1 -0
- package/dist/lib/auto-fix-branch.js +88 -0
- package/dist/lib/auto-fix-branch.js.map +1 -0
- package/dist/lib/board.d.ts +3 -0
- package/dist/lib/board.d.ts.map +1 -1
- package/dist/lib/board.js +4 -2
- package/dist/lib/board.js.map +1 -1
- package/dist/lib/clone.d.ts +2 -0
- package/dist/lib/clone.d.ts.map +1 -1
- package/dist/lib/clone.js +69 -10
- package/dist/lib/clone.js.map +1 -1
- package/dist/lib/comment-bodies.d.ts +37 -0
- package/dist/lib/comment-bodies.d.ts.map +1 -1
- package/dist/lib/comment-bodies.js +50 -9
- package/dist/lib/comment-bodies.js.map +1 -1
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +17 -1
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/pr-picker.d.ts +1 -1
- package/dist/lib/pr-picker.d.ts.map +1 -1
- package/dist/lib/pr-picker.js +10 -5
- package/dist/lib/pr-picker.js.map +1 -1
- package/dist/lib/pr-status.d.ts +2 -1
- package/dist/lib/pr-status.d.ts.map +1 -1
- package/dist/lib/pr-status.js +70 -6
- package/dist/lib/pr-status.js.map +1 -1
- package/dist/lib/pr-workflow-state.d.ts +17 -1
- package/dist/lib/pr-workflow-state.d.ts.map +1 -1
- package/dist/lib/pr-workflow-state.js +110 -5
- package/dist/lib/pr-workflow-state.js.map +1 -1
- package/dist/lib/repo-picker.d.ts +3 -0
- package/dist/lib/repo-picker.d.ts.map +1 -1
- package/dist/lib/repo-picker.js +45 -10
- package/dist/lib/repo-picker.js.map +1 -1
- package/dist/lib/repository-guidance.d.ts +2 -0
- package/dist/lib/repository-guidance.d.ts.map +1 -0
- package/dist/lib/repository-guidance.js +55 -0
- package/dist/lib/repository-guidance.js.map +1 -0
- package/dist/lib/review-models.d.ts +15 -2
- package/dist/lib/review-models.d.ts.map +1 -1
- package/dist/lib/review-models.js +26 -6
- package/dist/lib/review-models.js.map +1 -1
- package/dist/lib/review-strategy.d.ts +92 -0
- package/dist/lib/review-strategy.d.ts.map +1 -0
- package/dist/lib/review-strategy.js +282 -0
- package/dist/lib/review-strategy.js.map +1 -0
- package/dist/lib/runner.d.ts +123 -1
- package/dist/lib/runner.d.ts.map +1 -1
- package/dist/lib/runner.js +919 -101
- package/dist/lib/runner.js.map +1 -1
- package/dist/lib/vendor.d.ts +1 -0
- package/dist/lib/vendor.d.ts.map +1 -1
- package/dist/lib/vendor.js +6 -0
- package/dist/lib/vendor.js.map +1 -1
- package/dist/lib/workflow.d.ts +13 -0
- package/dist/lib/workflow.d.ts.map +1 -1
- package/dist/lib/workflow.js +24 -1
- package/dist/lib/workflow.js.map +1 -1
- package/dist/linear/client.d.ts +18 -0
- package/dist/linear/client.d.ts.map +1 -0
- package/dist/linear/client.js +67 -0
- package/dist/linear/client.js.map +1 -0
- package/dist/linear/comment.d.ts +20 -0
- package/dist/linear/comment.d.ts.map +1 -0
- package/dist/linear/comment.js +57 -0
- package/dist/linear/comment.js.map +1 -0
- package/dist/linear/identity.d.ts +59 -0
- package/dist/linear/identity.d.ts.map +1 -0
- package/dist/linear/identity.js +187 -0
- package/dist/linear/identity.js.map +1 -0
- package/dist/linear/notify.d.ts +35 -0
- package/dist/linear/notify.d.ts.map +1 -0
- package/dist/linear/notify.js +76 -0
- package/dist/linear/notify.js.map +1 -0
- package/dist/linear/ref.d.ts +13 -0
- package/dist/linear/ref.d.ts.map +1 -0
- package/dist/linear/ref.js +90 -0
- package/dist/linear/ref.js.map +1 -0
- package/dist/linear/verify.d.ts +26 -0
- package/dist/linear/verify.d.ts.map +1 -0
- package/dist/linear/verify.js +67 -0
- package/dist/linear/verify.js.map +1 -0
- package/dist/reviewers/address.d.ts +1 -1
- package/dist/reviewers/address.d.ts.map +1 -1
- package/dist/reviewers/address.js +1 -1
- package/dist/reviewers/address.js.map +1 -1
- package/dist/reviewers/claude.d.ts +4 -1
- package/dist/reviewers/claude.d.ts.map +1 -1
- package/dist/reviewers/claude.js +39 -7
- package/dist/reviewers/claude.js.map +1 -1
- package/dist/reviewers/codex-env.d.ts +12 -0
- package/dist/reviewers/codex-env.d.ts.map +1 -0
- package/dist/reviewers/codex-env.js +54 -0
- package/dist/reviewers/codex-env.js.map +1 -0
- package/dist/reviewers/codex.d.ts +18 -1
- package/dist/reviewers/codex.d.ts.map +1 -1
- package/dist/reviewers/codex.js +164 -81
- package/dist/reviewers/codex.js.map +1 -1
- package/dist/reviewers/conflict-resolve.d.ts +3 -1
- package/dist/reviewers/conflict-resolve.d.ts.map +1 -1
- package/dist/reviewers/conflict-resolve.js +21 -6
- package/dist/reviewers/conflict-resolve.js.map +1 -1
- package/dist/reviewers/fix.d.ts +5 -2
- package/dist/reviewers/fix.d.ts.map +1 -1
- package/dist/reviewers/fix.js +38 -12
- package/dist/reviewers/fix.js.map +1 -1
- package/dist/skills/attribution.d.ts +4 -0
- package/dist/skills/attribution.d.ts.map +1 -0
- package/dist/skills/attribution.js +14 -0
- package/dist/skills/attribution.js.map +1 -0
- package/dist/skills/broker-server.d.ts +2 -0
- package/dist/skills/broker-server.d.ts.map +1 -0
- package/dist/skills/broker-server.js +17 -0
- package/dist/skills/broker-server.js.map +1 -0
- package/dist/skills/broker.d.ts +43 -0
- package/dist/skills/broker.d.ts.map +1 -0
- package/dist/skills/broker.js +311 -0
- package/dist/skills/broker.js.map +1 -0
- package/dist/skills/catalog.d.ts +28 -0
- package/dist/skills/catalog.d.ts.map +1 -0
- package/dist/skills/catalog.js +104 -0
- package/dist/skills/catalog.js.map +1 -0
- package/dist/skills/installer.d.ts +10 -0
- package/dist/skills/installer.d.ts.map +1 -0
- package/dist/skills/installer.js +138 -0
- package/dist/skills/installer.js.map +1 -0
- package/dist/skills/integrity.d.ts +4 -0
- package/dist/skills/integrity.d.ts.map +1 -0
- package/dist/skills/integrity.js +36 -0
- package/dist/skills/integrity.js.map +1 -0
- package/docs/dynamic-thoroughness.md +738 -0
- package/docs/linear-identity-contract.md +139 -0
- package/docs/linear-identity.md +293 -0
- package/docs/metrics.md +115 -0
- package/docs/trust.md +159 -0
- package/get-started.md +322 -16
- package/package.json +6 -3
package/dist/reviewers/codex.js
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import { execa } from 'execa';
|
|
2
|
-
import {
|
|
2
|
+
import { readFileSync, realpathSync, rmSync } from 'fs';
|
|
3
|
+
import { randomUUID } from 'crypto';
|
|
3
4
|
import { tmpdir } from 'os';
|
|
4
5
|
import { join } from 'path';
|
|
5
6
|
import { DEFAULT_REVIEW_INSTRUCTIONS } from '../lib/workflow.js';
|
|
6
7
|
import { resolveCodexModel } from '../lib/review-models.js';
|
|
7
8
|
import { withTimeoutRetry } from '../lib/with-timeout-retry.js';
|
|
8
9
|
import { tierTimeoutMs } from './tier-timeouts.js';
|
|
10
|
+
import { codexSkillBrokerArgs, codexSkillsReachable, renderSkillBrokerInstructions } from '../skills/broker.js';
|
|
11
|
+
import { buildCodexEnv } from './codex-env.js';
|
|
12
|
+
import { withCredentialFreeOrigin } from '../lib/clone.js';
|
|
13
|
+
import { loadRepositoryReviewGuidance } from '../lib/repository-guidance.js';
|
|
9
14
|
// Codex review command outputs [P0]/[P1]/[P2]/[P3] priority markers but never a VERDICT line.
|
|
10
15
|
// Infer the verdict from the highest severity present and append it so parseVerdict() can
|
|
11
16
|
// extract it. Only called when the output doesn't already contain a VERDICT: token.
|
|
@@ -35,6 +40,60 @@ export function stripRepoDirPaths(text, repoDir) {
|
|
|
35
40
|
}
|
|
36
41
|
return out;
|
|
37
42
|
}
|
|
43
|
+
// vendors.codex.effort matches the codex CLI's model_reasoning_effort values
|
|
44
|
+
// 1:1 (low/medium/high/xhigh/max/ultra), so this is a whitelist rather than a
|
|
45
|
+
// translation — anything outside it falls back to medium instead of reaching
|
|
46
|
+
// the CLI as an arbitrary string.
|
|
47
|
+
const REASONING_EFFORT_MAP = {
|
|
48
|
+
low: 'low',
|
|
49
|
+
medium: 'medium',
|
|
50
|
+
high: 'high',
|
|
51
|
+
xhigh: 'xhigh',
|
|
52
|
+
max: 'max',
|
|
53
|
+
ultra: 'ultra',
|
|
54
|
+
};
|
|
55
|
+
export function codexReasoningEffort(effort) {
|
|
56
|
+
return REASONING_EFFORT_MAP[effort] ?? 'medium';
|
|
57
|
+
}
|
|
58
|
+
// `codex review --base` scoped the diff by itself; `codex exec` does not, so the
|
|
59
|
+
// prompt has to name the range. It gives the exact command rather than the branch
|
|
60
|
+
// name: the clone creates `refs/remotes/origin/<base>` and no local `<base>`
|
|
61
|
+
// branch, so `git diff <base>...HEAD` — the obvious reading of a bare branch name
|
|
62
|
+
// — fails outright on any non-default base and can leave the agent reviewing an
|
|
63
|
+
// empty diff. `codex exec review --base` is not the alternative it appears to be:
|
|
64
|
+
// there `--base` and a custom prompt are mutually exclusive, so it cannot carry
|
|
65
|
+
// the verdict rule or the skill instructions. Block order matches runClaudeReview
|
|
66
|
+
// exactly, so the same PR gets the same brief whichever vendor draws it:
|
|
67
|
+
// skills before the behaviour block (activation must happen before the review
|
|
68
|
+
// starts, and the behaviour block ends on the verdict rule, so anything after it
|
|
69
|
+
// reads as boilerplate past the end of the prompt), repository guidance after it
|
|
70
|
+
// (reference material consulted while reviewing, not a first step).
|
|
71
|
+
export function buildCodexReviewPrompt(input) {
|
|
72
|
+
return [
|
|
73
|
+
`You are reviewing a pull request titled: "${input.prTitle}".`,
|
|
74
|
+
`The branch \`${input.baseBranch}\` is the base. Review only the changes introduced in this PR.`,
|
|
75
|
+
`Read them with \`git diff origin/${input.baseBranch}...HEAD\` — this checkout has the remote-tracking ref \`origin/${input.baseBranch}\`, not a local \`${input.baseBranch}\` branch.`,
|
|
76
|
+
input.issueContext ?? '',
|
|
77
|
+
input.focusLine ?? '',
|
|
78
|
+
input.customPrompt ?? '',
|
|
79
|
+
input.skillInstructions ?? '',
|
|
80
|
+
input.behaviorInstructions,
|
|
81
|
+
input.repositoryGuidance ?? '',
|
|
82
|
+
].filter(Boolean).join('\n\n');
|
|
83
|
+
}
|
|
84
|
+
// `codex exec` prints usage as a "tokens used" heading with the count beneath it;
|
|
85
|
+
// `codex review` used an inline "tokens: N". Both are read so the move between
|
|
86
|
+
// subcommands did not silently drop token telemetry. Anchored to the start of a
|
|
87
|
+
// line so the word "tokens" in review prose cannot be mistaken for a usage
|
|
88
|
+
// report, and takes the last match because a retried run reports more than once.
|
|
89
|
+
export function parseCodexTokensUsed(output) {
|
|
90
|
+
const matches = [...output.matchAll(/^[^\S\n]*tokens(?:\s+used\s*\n|\s*:)[^\S\n]*([\d,]+)/gim)];
|
|
91
|
+
const last = matches.at(-1);
|
|
92
|
+
if (!last)
|
|
93
|
+
return undefined;
|
|
94
|
+
const parsed = parseInt(last[1].replace(/,/g, ''), 10);
|
|
95
|
+
return Number.isNaN(parsed) ? undefined : parsed;
|
|
96
|
+
}
|
|
38
97
|
// Detect transient Codex API errors that should be retried (socket disconnects, rate limits)
|
|
39
98
|
function isRetryableCodexError(message) {
|
|
40
99
|
return /socket.*closed|429|rate limit|connection.*reset|econnreset/i.test(message);
|
|
@@ -63,108 +122,132 @@ export async function runCodexReview(repoDir, baseBranch, prTitle, quality, vend
|
|
|
63
122
|
onRetry,
|
|
64
123
|
// Linked tracker issue rendered as a prompt block (issues/enrich.ts) — anchors
|
|
65
124
|
// the review to the stated goal. Omitted when enrichment is off / unresolved.
|
|
66
|
-
issueContext
|
|
125
|
+
issueContext, skillSession,
|
|
126
|
+
// skills.codex_full_access. Codex reaches the broker only with the sandbox off,
|
|
127
|
+
// so this is what decides whether skills are offered to codex at all.
|
|
128
|
+
codexFullAccess = false) {
|
|
67
129
|
const model = resolveCodexModel(quality, vendor);
|
|
68
|
-
const tmpFile = join(mkdtempSync(join(tmpdir(), 'crosscheck-')), 'review.md');
|
|
69
130
|
const tierTimeout = tierTimeoutMs(quality.tier);
|
|
70
131
|
// timeoutMs: 0 → no cap (crazy/halfcrazy); undefined → tier-based default; positive → user-specified
|
|
71
132
|
const resolvedTimeout = timeoutMs === undefined ? tierTimeout : timeoutMs === 0 ? undefined : timeoutMs;
|
|
72
|
-
//
|
|
73
|
-
//
|
|
133
|
+
// `codex exec`, not `codex review`: the review subcommand starts no MCP
|
|
134
|
+
// servers at all — not the ones passed with -c, not the ones in
|
|
135
|
+
// ~/.codex/config.toml — so the skill broker was unreachable and the prompt's
|
|
136
|
+
// "call list_enabled_skills first" named a tool that did not exist in the
|
|
137
|
+
// session. `exec` takes both a prompt and MCP config, which also retires the
|
|
138
|
+
// temporary Codex profile that only existed because `--base` and [PROMPT] are
|
|
139
|
+
// mutually exclusive in `codex review`.
|
|
74
140
|
const focusNote = quality.focus.length > 0
|
|
75
|
-
? `Focus areas: ${quality.focus.join(', ')}
|
|
141
|
+
? `Focus areas: ${quality.focus.join(', ')}.`
|
|
76
142
|
: '';
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
143
|
+
const prompt = buildCodexReviewPrompt({
|
|
144
|
+
prTitle,
|
|
145
|
+
baseBranch,
|
|
146
|
+
issueContext,
|
|
147
|
+
focusLine: focusNote,
|
|
148
|
+
customPrompt: quality.custom_prompt,
|
|
149
|
+
// Gated, not merely unused: telling codex to call a tool it cannot reach is
|
|
150
|
+
// how this failed before — 244 runs obliged to call `list_enabled_skills`,
|
|
151
|
+
// every call cancelled, 0 activations.
|
|
152
|
+
skillInstructions: codexSkillsReachable(skillSession, codexFullAccess)
|
|
153
|
+
? renderSkillBrokerInstructions(skillSession)
|
|
154
|
+
: undefined,
|
|
155
|
+
behaviorInstructions: stepInstructions ?? DEFAULT_REVIEW_INSTRUCTIONS,
|
|
156
|
+
repositoryGuidance: loadRepositoryReviewGuidance(repoDir, baseBranch),
|
|
157
|
+
});
|
|
158
|
+
// Retry loop for transient Codex API errors (socket disconnects, rate limits)
|
|
159
|
+
let lastErr = undefined;
|
|
160
|
+
for (let attempt = 1; attempt <= MAX_CODEX_RETRIES; attempt++) {
|
|
161
|
+
try {
|
|
162
|
+
const modelArgs = model !== 'default' ? ['-c', `model="${model}"`] : [];
|
|
163
|
+
const skillArgs = codexSkillBrokerArgs(skillSession, codexFullAccess);
|
|
164
|
+
const reasoningEffort = codexReasoningEffort(vendor.effort);
|
|
165
|
+
const effortArgs = ['-c', `model_reasoning_effort="${reasoningEffort}"`];
|
|
166
|
+
// The agent's final message is the review. Reading it from a file rather
|
|
167
|
+
// than stdout keeps session chatter out of the posted comment, and leaves
|
|
168
|
+
// stdout free to carry the usage line quiet mode would suppress.
|
|
169
|
+
const lastMessagePath = join(tmpdir(), `crosscheck-codex-review-${randomUUID()}.md`);
|
|
170
|
+
onLog?.(` running: codex exec --base ${baseBranch}${model !== 'default' ? ` -c model="${model}"` : ''} -c model_reasoning_effort="${reasoningEffort}"`);
|
|
94
171
|
try {
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
|
|
172
|
+
const { result, retried } = await withCredentialFreeOrigin(repoDir, () => withTimeoutRetry(resolvedTimeout, (t) => execa('codex',
|
|
173
|
+
// Prompt on stdin (`-`), not argv: it carries repository guidance and
|
|
174
|
+
// tracker-issue context, which the retired profile file kept out of
|
|
175
|
+
// the process list. runClaudeReview feeds its prompt the same way.
|
|
176
|
+
//
|
|
177
|
+
// --ignore-user-config: `codex exec` reads ~/.codex/config.toml, which
|
|
178
|
+
// `codex review` never did. That would hand a review of untrusted code
|
|
179
|
+
// the operator's own MCP servers and plugins — every connected service
|
|
180
|
+
// reachable from a prompt injection. Crosscheck passes everything it
|
|
181
|
+
// needs with -c, so there is nothing to lose by ignoring the rest.
|
|
182
|
+
// Auth is unaffected: it lives in auth.json, not config.toml.
|
|
183
|
+
['exec', '--ignore-user-config', '-c', 'project_doc_max_bytes=0', ...modelArgs, ...effortArgs, ...skillArgs, '--output-last-message', lastMessagePath, '-'], {
|
|
98
184
|
cwd: repoDir,
|
|
99
185
|
timeout: t,
|
|
100
|
-
|
|
101
|
-
|
|
186
|
+
input: prompt,
|
|
187
|
+
// extendEnv: false or execa merges process.env back in and the
|
|
188
|
+
// allowlist means nothing. Verified: with this, a shell command run
|
|
189
|
+
// by codex finds neither GITHUB_TOKEN nor any other export.
|
|
190
|
+
extendEnv: false,
|
|
191
|
+
env: buildCodexEnv({
|
|
102
192
|
// Make local dev tools (tsc, jest, etc.) findable if node_modules exists
|
|
103
193
|
PATH: `${repoDir}/node_modules/.bin:${process.env.PATH ?? ''}`,
|
|
104
|
-
},
|
|
194
|
+
}),
|
|
105
195
|
}), {
|
|
106
196
|
onRetry: (effectiveMs, delayMs) => (onRetry ?? onLog)?.(` ⏱ codex timed out at ${effectiveMs / 1000}s — waiting ${delayMs / 1000}s and retrying once`),
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
197
|
+
}));
|
|
198
|
+
// Fall back to stdout only if the agent wrote no final message — an
|
|
199
|
+
// aborted run leaves the file empty and stdout is then all there is.
|
|
200
|
+
let lastMessage = '';
|
|
201
|
+
try {
|
|
202
|
+
lastMessage = readFileSync(lastMessagePath, 'utf8').trim();
|
|
203
|
+
}
|
|
204
|
+
catch { /* no final message */ }
|
|
205
|
+
const rawReview = stripRepoDirPaths(lastMessage || result.stdout.trim() || result.stderr.trim(), repoDir);
|
|
206
|
+
const tokensUsed = parseCodexTokensUsed(`${result.stdout ?? ''}\n${result.stderr ?? ''}`);
|
|
207
|
+
// Safety net for a run that ignored the verdict rule. `codex exec` follows
|
|
208
|
+
// it (unlike `codex review`, whose own format emits [P0]-[P3] markers and
|
|
209
|
+
// never a VERDICT line), so this should now be the rare path.
|
|
113
210
|
const review = rawReview.includes('VERDICT:')
|
|
114
211
|
? rawReview
|
|
115
212
|
: `${rawReview}\n\nVERDICT: ${inferVerdictFromCodexOutput(rawReview)}`;
|
|
116
|
-
return { review, tokensUsed, model, retried };
|
|
213
|
+
return { review, tokensUsed, model, effort: reasoningEffort, retried };
|
|
117
214
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
const rawStderr = execa.stderr ?? '';
|
|
121
|
-
const fullMessage = rawStderr || execa.message || '';
|
|
122
|
-
// Check if this is a retryable error
|
|
123
|
-
if (isRetryableCodexError(fullMessage) && attempt < MAX_CODEX_RETRIES) {
|
|
124
|
-
const delay = CODEX_RETRY_DELAY_MS * attempt; // 5s, 10s
|
|
125
|
-
onLog?.(` codex: transient error (${fullMessage.slice(0, 80)}), retrying in ${delay / 1000}s (attempt ${attempt}/${MAX_CODEX_RETRIES})...`);
|
|
126
|
-
await new Promise(resolve => setTimeout(resolve, delay));
|
|
127
|
-
lastErr = err;
|
|
128
|
-
continue;
|
|
129
|
-
}
|
|
130
|
-
// Non-retryable error or final attempt — format and throw
|
|
131
|
-
const effectiveMs = execa.effectiveTimeoutMs ?? resolvedTimeout;
|
|
132
|
-
const retryNote = execa.retryDelayMs !== undefined ? ' (retried once)' : '';
|
|
133
|
-
const summary = execa.timedOut
|
|
134
|
-
? `timed out after ${effectiveMs !== undefined ? effectiveMs / 1000 : '?'}s${retryNote} — PR diff may be too large (tier: ${quality.tier})`
|
|
135
|
-
: (extractErrorSummary(rawStderr) ?? execa.message ?? 'unknown error');
|
|
136
|
-
const thrown = Object.assign(new Error(`codex: ${summary}`), {
|
|
137
|
-
exitCode: execa.exitCode,
|
|
138
|
-
timedOut: execa.timedOut,
|
|
139
|
-
stderr: rawStderr,
|
|
140
|
-
effectiveTimeoutMs: effectiveMs,
|
|
141
|
-
retryDelayMs: execa.retryDelayMs,
|
|
142
|
-
});
|
|
143
|
-
throw thrown;
|
|
215
|
+
finally {
|
|
216
|
+
rmSync(lastMessagePath, { force: true });
|
|
144
217
|
}
|
|
145
218
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
219
|
+
catch (err) {
|
|
220
|
+
const execa = err;
|
|
221
|
+
const rawStderr = execa.stderr ?? '';
|
|
222
|
+
const fullMessage = rawStderr || execa.message || '';
|
|
223
|
+
// Check if this is a retryable error
|
|
224
|
+
if (isRetryableCodexError(fullMessage) && attempt < MAX_CODEX_RETRIES) {
|
|
225
|
+
const delay = CODEX_RETRY_DELAY_MS * attempt; // 5s, 10s
|
|
226
|
+
onLog?.(` codex: transient error (${fullMessage.slice(0, 80)}), retrying in ${delay / 1000}s (attempt ${attempt}/${MAX_CODEX_RETRIES})...`);
|
|
227
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
228
|
+
lastErr = err;
|
|
229
|
+
continue;
|
|
157
230
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
231
|
+
// Non-retryable error or final attempt — format and throw
|
|
232
|
+
const effectiveMs = execa.effectiveTimeoutMs ?? resolvedTimeout;
|
|
233
|
+
const retryNote = execa.retryDelayMs !== undefined ? ' (retried once)' : '';
|
|
234
|
+
const summary = execa.timedOut
|
|
235
|
+
? `timed out after ${effectiveMs !== undefined ? effectiveMs / 1000 : '?'}s${retryNote} — PR diff may be too large (tier: ${quality.tier})`
|
|
236
|
+
: (extractErrorSummary(rawStderr) ?? execa.message ?? 'unknown error');
|
|
237
|
+
const thrown = Object.assign(new Error(`codex: ${summary}`), {
|
|
238
|
+
exitCode: execa.exitCode,
|
|
239
|
+
timedOut: execa.timedOut,
|
|
240
|
+
stderr: rawStderr,
|
|
241
|
+
effectiveTimeoutMs: effectiveMs,
|
|
242
|
+
retryDelayMs: execa.retryDelayMs,
|
|
243
|
+
});
|
|
244
|
+
throw thrown;
|
|
165
245
|
}
|
|
166
|
-
catch { /* ignore */ }
|
|
167
246
|
}
|
|
247
|
+
// Should not reach here, but handle the case where all retries were consumed
|
|
248
|
+
if (lastErr)
|
|
249
|
+
throw lastErr;
|
|
250
|
+
throw new Error('codex: unexpected retry loop exit');
|
|
168
251
|
}
|
|
169
252
|
export async function checkCodexAuth() {
|
|
170
253
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/reviewers/codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAC7B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/reviewers/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
import { type SkillActivationSession } from '../skills/broker.js';
|
|
1
2
|
export declare const PROMPT_TEMPLATE = "This pull request has merge conflicts. Resolve all conflict markers in the files listed below.\n\nPR title: {PR_TITLE}\n\nConflicted files:\n{CONFLICTED_FILES}\n\n{EXTRA_INSTRUCTIONS}\n\nContext: the PR's branch is checked out as HEAD, and the base branch was merged into it. That means the `<<<<<<< HEAD` side is the PR author's intended changes and the `>>>>>>>` side is the base branch. Default to preserving the PR author's intent.\n\nRules for resolving each conflict:\n- Keep ALL meaningful changes from both sides if they are not directly contradictory\n- When both sides modify the same line, prefer the PR author's changes (the `<<<<<<< HEAD` side) over the base branch (the `>>>>>>>` side), unless the PR side clearly breaks existing logic on the base\n- Remove ALL conflict markers: <<<<<<<, =======, >>>>>>>\n\nFor each file, output ONLY the resolved conflict regions using this format:\n\n<edit path=\"relative/path/to/file.ext\">\n<old>\nexact conflict region including all markers (copy verbatim from the file)\n</old>\n<new>\nresolved content with no conflict markers\n</new>\n</edit>\n\nRules for <edit> blocks:\n- <old> must match the file content EXACTLY, including conflict markers and surrounding lines\n- <new> must not contain ANY conflict markers\n- Include 2\u20133 context lines around the conflict region to make the match unambiguous\n- One block per conflict region; multiple blocks per file are fine\n- Output ONLY <edit> blocks. No other text.";
|
|
2
3
|
export declare function findConflictedFiles(tmpDir: string): string[];
|
|
3
4
|
export declare function extractConflictWindows(content: string): string;
|
|
4
|
-
export declare function runConflictResolveStep(tmpDir: string, prTitle: string, instructions: string, model?: string, timeoutMs?: number): Promise<{
|
|
5
|
+
export declare function runConflictResolveStep(tmpDir: string, prTitle: string, instructions: string, model?: string, timeoutMs?: number, skillSession?: SkillActivationSession, configuredEffort?: string): Promise<{
|
|
5
6
|
appliedCount: number;
|
|
6
7
|
resolvedPaths: string[];
|
|
7
8
|
tokensUsed?: number;
|
|
9
|
+
effort: string;
|
|
8
10
|
}>;
|
|
9
11
|
export interface ResolverEdit {
|
|
10
12
|
filePath: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conflict-resolve.d.ts","sourceRoot":"","sources":["../../src/reviewers/conflict-resolve.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"conflict-resolve.d.ts","sourceRoot":"","sources":["../../src/reviewers/conflict-resolve.ts"],"names":[],"mappings":"AAMA,OAAO,EAAwD,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAUvH,eAAO,MAAM,eAAe,u8CAgCgB,CAAA;AAG5C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAO5D;AAQD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAuC9D;AAkBD,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,KAAK,SAAY,EACjB,SAAS,CAAC,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,sBAAsB,EAIrC,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAmFjG;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;CAChB;AAOD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,CAqB5F"}
|
|
@@ -3,6 +3,8 @@ import { readFileSync } from 'fs';
|
|
|
3
3
|
import { join } from 'path';
|
|
4
4
|
import { execa } from 'execa';
|
|
5
5
|
import { applyEdit } from './fix.js';
|
|
6
|
+
import { claudeEffort } from './claude.js';
|
|
7
|
+
import { claudeSkillBrokerArgs, renderSkillBrokerInstructions } from '../skills/broker.js';
|
|
6
8
|
// Exported so tests can verify the prompt's side-preference guidance stays in
|
|
7
9
|
// sync with the merge direction in runner.ts (origin/<base> is merged into HEAD,
|
|
8
10
|
// so HEAD is the PR side and the `>>>>>>>` side is the base branch).
|
|
@@ -114,21 +116,34 @@ function buildConflictedFilesBlock(tmpDir, filePaths) {
|
|
|
114
116
|
}
|
|
115
117
|
}).join('\n\n');
|
|
116
118
|
}
|
|
117
|
-
export async function runConflictResolveStep(tmpDir, prTitle, instructions, model = 'default', timeoutMs
|
|
119
|
+
export async function runConflictResolveStep(tmpDir, prTitle, instructions, model = 'default', timeoutMs, skillSession,
|
|
120
|
+
// Reasoning effort from vendors.claude.effort. Was never passed here, so the
|
|
121
|
+
// resolver ran at the CLI default while review and fix honored the config;
|
|
122
|
+
// the posted card now reports this value, so it has to be the real one.
|
|
123
|
+
configuredEffort) {
|
|
124
|
+
const effort = claudeEffort(configuredEffort);
|
|
118
125
|
const conflictedFiles = findConflictedFiles(tmpDir);
|
|
119
126
|
if (conflictedFiles.length === 0)
|
|
120
|
-
return { appliedCount: 0, resolvedPaths: [] };
|
|
127
|
+
return { appliedCount: 0, resolvedPaths: [], effort };
|
|
121
128
|
const filesBlock = buildConflictedFilesBlock(tmpDir, conflictedFiles);
|
|
122
129
|
const prompt = PROMPT_TEMPLATE
|
|
123
130
|
.replace('{PR_TITLE}', prTitle)
|
|
124
131
|
.replace('{CONFLICTED_FILES}', filesBlock)
|
|
125
|
-
.replace('{EXTRA_INSTRUCTIONS}', instructions ? `Additional instructions: ${instructions}` : '');
|
|
132
|
+
.replace('{EXTRA_INSTRUCTIONS}', [instructions ? `Additional instructions: ${instructions}` : '', skillSession ? renderSkillBrokerInstructions(skillSession) : ''].filter(Boolean).join('\n\n'));
|
|
126
133
|
let output = '';
|
|
127
134
|
let tokensUsed;
|
|
128
135
|
try {
|
|
129
136
|
const modelArgs = model !== 'default' ? ['--model', model] : [];
|
|
130
137
|
const resolvedTimeout = timeoutMs === undefined ? 180_000 : timeoutMs === 0 ? undefined : timeoutMs;
|
|
131
|
-
const { stdout } = await execa('claude', [
|
|
138
|
+
const { stdout } = await execa('claude', [
|
|
139
|
+
'--print', '--output-format', 'json', ...modelArgs, '--effort', effort,
|
|
140
|
+
...claudeSkillBrokerArgs(skillSession),
|
|
141
|
+
...(skillSession ? ['--allowedTools', [
|
|
142
|
+
'mcp__crosscheck__list_enabled_skills',
|
|
143
|
+
'mcp__crosscheck__activate_skill',
|
|
144
|
+
'mcp__crosscheck__read_skill_file',
|
|
145
|
+
].join(',')] : []),
|
|
146
|
+
], {
|
|
132
147
|
input: prompt,
|
|
133
148
|
timeout: resolvedTimeout,
|
|
134
149
|
env: { ...process.env },
|
|
@@ -153,7 +168,7 @@ export async function runConflictResolveStep(tmpDir, prTitle, instructions, mode
|
|
|
153
168
|
throw err;
|
|
154
169
|
}
|
|
155
170
|
if (!output || output === 'NO_CHANGES')
|
|
156
|
-
return { appliedCount: 0, resolvedPaths: [], tokensUsed };
|
|
171
|
+
return { appliedCount: 0, resolvedPaths: [], tokensUsed, effort };
|
|
157
172
|
const fileEdits = new Map();
|
|
158
173
|
const fileCache = new Map();
|
|
159
174
|
for (const { filePath, oldText, newText } of parseResolverEdits(output, conflictedFiles)) {
|
|
@@ -187,7 +202,7 @@ export async function runConflictResolveStep(tmpDir, prTitle, instructions, mode
|
|
|
187
202
|
}
|
|
188
203
|
catch { /* skip unwritable paths */ }
|
|
189
204
|
}
|
|
190
|
-
return { appliedCount, resolvedPaths, tokensUsed };
|
|
205
|
+
return { appliedCount, resolvedPaths, tokensUsed, effort };
|
|
191
206
|
}
|
|
192
207
|
// Parses <edit path="…"><old>…</old><new>…</new></edit> blocks from resolver output.
|
|
193
208
|
// Filters out anything that escapes tmpDir (`..`, absolute paths) or targets a file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conflict-resolve.js","sourceRoot":"","sources":["../../src/reviewers/conflict-resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"conflict-resolve.js","sourceRoot":"","sources":["../../src/reviewers/conflict-resolve.ts"],"names":[],"mappings":"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"}
|
package/dist/reviewers/fix.d.ts
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import type { Config } from '../config/schema.js';
|
|
2
|
+
import { type SkillActivationSession } from '../skills/broker.js';
|
|
2
3
|
export declare function applyEdit(fileContent: string, oldText: string, newText: string): string | null;
|
|
3
|
-
export declare function runFixStep(tmpDir: string, baseRef: string, prTitle: string, reviewComment: string, instructions: string, config: Config, model?: string, timeoutMs?: number): Promise<{
|
|
4
|
+
export declare function runFixStep(tmpDir: string, baseRef: string, prTitle: string, reviewComment: string, instructions: string, config: Config, model?: string, timeoutMs?: number, skillSession?: SkillActivationSession): Promise<{
|
|
4
5
|
appliedCount: number;
|
|
5
6
|
changedFiles: string[];
|
|
6
7
|
tokensUsed?: number;
|
|
8
|
+
effort: string;
|
|
7
9
|
}>;
|
|
8
|
-
export declare function runCodexFixStep(tmpDir: string, baseRef: string, prTitle: string, reviewComment: string, instructions: string, model?: string, timeoutMs?: number): Promise<{
|
|
10
|
+
export declare function runCodexFixStep(tmpDir: string, baseRef: string, prTitle: string, reviewComment: string, instructions: string, model?: string, timeoutMs?: number, skillSession?: SkillActivationSession, configuredEffort?: string, codexFullAccess?: boolean): Promise<{
|
|
9
11
|
appliedCount: number;
|
|
10
12
|
changedFiles: string[];
|
|
11
13
|
tokensUsed?: number;
|
|
14
|
+
effort: string;
|
|
12
15
|
}>;
|
|
13
16
|
//# sourceMappingURL=fix.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fix.d.ts","sourceRoot":"","sources":["../../src/reviewers/fix.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"fix.d.ts","sourceRoot":"","sources":["../../src/reviewers/fix.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAIjD,OAAO,EAAoG,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AA8DnK,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO9F;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,KAAK,SAAY,EACjB,SAAS,CAAC,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,sBAAsB,GACpC,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA+IhG;AA2BD,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,KAAK,SAAY,EACjB,SAAS,CAAC,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,sBAAsB,EAIrC,gBAAgB,CAAC,EAAE,MAAM,EAGzB,eAAe,UAAQ,GACtB,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAkDhG"}
|
package/dist/reviewers/fix.js
CHANGED
|
@@ -3,6 +3,11 @@ import { mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
|
3
3
|
import { dirname, join } from 'path';
|
|
4
4
|
import { execa } from 'execa';
|
|
5
5
|
import { tierTimeoutMs } from './tier-timeouts.js';
|
|
6
|
+
import { claudeEffort } from './claude.js';
|
|
7
|
+
import { codexReasoningEffort } from './codex.js';
|
|
8
|
+
import { claudeSkillBrokerArgs, codexSkillBrokerArgs, codexSkillsReachable, renderSkillBrokerInstructions } from '../skills/broker.js';
|
|
9
|
+
import { buildCodexEnv } from './codex-env.js';
|
|
10
|
+
import { withCredentialFreeOrigin } from '../lib/clone.js';
|
|
6
11
|
// Minimum ratio of new lines to original lines before we reject a full-file write.
|
|
7
12
|
// Guards against Claude silently truncating large files.
|
|
8
13
|
const MIN_SIZE_RATIO = 0.6;
|
|
@@ -63,7 +68,8 @@ export function applyEdit(fileContent, oldText, newText) {
|
|
|
63
68
|
return null;
|
|
64
69
|
return fileContent.slice(0, idx) + newText + fileContent.slice(idx + oldText.length);
|
|
65
70
|
}
|
|
66
|
-
export async function runFixStep(tmpDir, baseRef, prTitle, reviewComment, instructions, config, model = 'default', timeoutMs) {
|
|
71
|
+
export async function runFixStep(tmpDir, baseRef, prTitle, reviewComment, instructions, config, model = 'default', timeoutMs, skillSession) {
|
|
72
|
+
const effort = claudeEffort(config.vendors?.claude?.effort);
|
|
67
73
|
let diff = '';
|
|
68
74
|
try {
|
|
69
75
|
diff = execSync(`git diff origin/${baseRef}...HEAD`, { cwd: tmpDir, encoding: 'utf8' });
|
|
@@ -78,14 +84,21 @@ export async function runFixStep(tmpDir, baseRef, prTitle, reviewComment, instru
|
|
|
78
84
|
.replace('{PR_TITLE}', prTitle)
|
|
79
85
|
.replace('{REVIEW_COMMENT}', reviewComment.slice(0, 8000))
|
|
80
86
|
.replace('{DIFF}', diff.slice(0, 16000))
|
|
81
|
-
.replace('{EXTRA_INSTRUCTIONS}', instructions ? `Additional instructions: ${instructions}` : '');
|
|
87
|
+
.replace('{EXTRA_INSTRUCTIONS}', [instructions ? `Additional instructions: ${instructions}` : '', skillSession ? renderSkillBrokerInstructions(skillSession) : ''].filter(Boolean).join('\n\n'));
|
|
82
88
|
let output = '';
|
|
83
89
|
let tokensUsed;
|
|
84
90
|
try {
|
|
85
91
|
const modelArgs = model !== 'default' ? ['--model', model] : [];
|
|
86
|
-
const effort = config.vendors?.claude?.effort ?? 'medium';
|
|
87
92
|
const resolvedTimeout = timeoutMs === undefined ? tierTimeoutMs(config.quality.tier) : timeoutMs === 0 ? undefined : timeoutMs;
|
|
88
|
-
const { stdout } = await execa('claude', [
|
|
93
|
+
const { stdout } = await execa('claude', [
|
|
94
|
+
'--print', '--output-format', 'json', ...modelArgs, '--effort', effort,
|
|
95
|
+
...claudeSkillBrokerArgs(skillSession),
|
|
96
|
+
...(skillSession ? ['--allowedTools', [
|
|
97
|
+
'mcp__crosscheck__list_enabled_skills',
|
|
98
|
+
'mcp__crosscheck__activate_skill',
|
|
99
|
+
'mcp__crosscheck__read_skill_file',
|
|
100
|
+
].join(',')] : []),
|
|
101
|
+
], {
|
|
89
102
|
input: prompt,
|
|
90
103
|
timeout: resolvedTimeout,
|
|
91
104
|
env: { ...process.env },
|
|
@@ -110,7 +123,7 @@ export async function runFixStep(tmpDir, baseRef, prTitle, reviewComment, instru
|
|
|
110
123
|
throw err;
|
|
111
124
|
}
|
|
112
125
|
if (!output || output === 'NO_CHANGES')
|
|
113
|
-
return { appliedCount: 0, changedFiles: [], tokensUsed };
|
|
126
|
+
return { appliedCount: 0, changedFiles: [], tokensUsed, effort };
|
|
114
127
|
let appliedCount = 0;
|
|
115
128
|
// Primary: apply <edit path="..."><old>...</old><new>...</new></edit> blocks.
|
|
116
129
|
// This format only outputs changed sections — structurally prevents truncation.
|
|
@@ -198,7 +211,7 @@ export async function runFixStep(tmpDir, baseRef, prTitle, reviewComment, instru
|
|
|
198
211
|
catch { /* skip unwritable paths */ }
|
|
199
212
|
}
|
|
200
213
|
}
|
|
201
|
-
return { appliedCount, changedFiles: writtenFiles, tokensUsed };
|
|
214
|
+
return { appliedCount, changedFiles: writtenFiles, tokensUsed, effort };
|
|
202
215
|
}
|
|
203
216
|
// Codex fix: codex is an agentic tool that edits files directly on disk.
|
|
204
217
|
// We pass the fix context as a prompt, run codex in full-auto mode, then
|
|
@@ -224,7 +237,15 @@ Please address the issues raised in the review. Rules:
|
|
|
224
237
|
- Do not refactor unrelated code, rename variables, or add tests unless asked
|
|
225
238
|
- If a comment requires deeper understanding of business logic, skip it
|
|
226
239
|
- If there are no actionable code changes, exit immediately without modifying any files`;
|
|
227
|
-
export async function runCodexFixStep(tmpDir, baseRef, prTitle, reviewComment, instructions, model = 'default', timeoutMs
|
|
240
|
+
export async function runCodexFixStep(tmpDir, baseRef, prTitle, reviewComment, instructions, model = 'default', timeoutMs, skillSession,
|
|
241
|
+
// Reasoning effort from vendors.codex.effort. Was never passed here, so a
|
|
242
|
+
// configured effort applied to the review and then silently dropped for the
|
|
243
|
+
// fix; the posted card now reports this value, so it has to be the real one.
|
|
244
|
+
configuredEffort,
|
|
245
|
+
// skills.codex_full_access — see runCodexReview. The fix step reads the same
|
|
246
|
+
// untrusted review comment and diff, so it is gated identically.
|
|
247
|
+
codexFullAccess = false) {
|
|
248
|
+
const effort = codexReasoningEffort(configuredEffort ?? 'medium');
|
|
228
249
|
let diff = '';
|
|
229
250
|
try {
|
|
230
251
|
diff = execSync(`git diff origin/${baseRef}...HEAD`, { cwd: tmpDir, encoding: 'utf8' });
|
|
@@ -239,15 +260,20 @@ export async function runCodexFixStep(tmpDir, baseRef, prTitle, reviewComment, i
|
|
|
239
260
|
.replace('{PR_TITLE}', prTitle)
|
|
240
261
|
.replace('{REVIEW_COMMENT}', reviewComment.slice(0, 8000))
|
|
241
262
|
.replace('{DIFF}', diff.slice(0, 16000))
|
|
242
|
-
.replace('{EXTRA_INSTRUCTIONS}', instructions ? `Additional instructions: ${instructions}` : '');
|
|
263
|
+
.replace('{EXTRA_INSTRUCTIONS}', [instructions ? `Additional instructions: ${instructions}` : '', codexSkillsReachable(skillSession, codexFullAccess) ? renderSkillBrokerInstructions(skillSession) : ''].filter(Boolean).join('\n\n'));
|
|
243
264
|
const resolvedTimeout = timeoutMs === undefined ? 300_000 : timeoutMs === 0 ? undefined : timeoutMs;
|
|
244
265
|
const modelArgs = model !== 'default' ? ['-c', `model="${model}"`] : [];
|
|
245
266
|
try {
|
|
246
|
-
await execa('codex',
|
|
267
|
+
await withCredentialFreeOrigin(tmpDir, () => execa('codex',
|
|
268
|
+
// --ignore-user-config and the env allowlist for the same reason as the
|
|
269
|
+
// review path: this step reads an untrusted diff, and with
|
|
270
|
+
// skills.codex_full_access it runs unsandboxed.
|
|
271
|
+
['exec', '--ignore-user-config', ...modelArgs, '-c', `model_reasoning_effort="${effort}"`, ...codexSkillBrokerArgs(skillSession, codexFullAccess), prompt], {
|
|
247
272
|
cwd: tmpDir,
|
|
248
273
|
timeout: resolvedTimeout,
|
|
249
|
-
|
|
250
|
-
|
|
274
|
+
extendEnv: false,
|
|
275
|
+
env: buildCodexEnv({ CODEX_QUIET_MODE: '1' }),
|
|
276
|
+
}));
|
|
251
277
|
}
|
|
252
278
|
catch (err) {
|
|
253
279
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -263,6 +289,6 @@ export async function runCodexFixStep(tmpDir, baseRef, prTitle, reviewComment, i
|
|
|
263
289
|
...(changedOutput ? changedOutput.split('\n').filter(Boolean) : []),
|
|
264
290
|
...(untrackedOutput ? untrackedOutput.split('\n').filter(Boolean) : []),
|
|
265
291
|
];
|
|
266
|
-
return { appliedCount: changedFiles.length, changedFiles };
|
|
292
|
+
return { appliedCount: changedFiles.length, changedFiles, effort };
|
|
267
293
|
}
|
|
268
294
|
//# sourceMappingURL=fix.js.map
|