@diff-review-system/drs 3.3.1 → 4.0.1
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/.pi/agents/describe/pr-describer.md +14 -0
- package/.pi/agents/review/unified-reviewer.md +31 -1
- package/.pi/agents/task/agents-md-updater.md +26 -0
- package/.pi/agents/task/changelog-updater.md +29 -0
- package/.pi/agents/task/review-issue-fixer.md +42 -0
- package/.pi/agents/visual/pr-explainer.md +205 -0
- package/.pi/workflows/github-pr-describe.yaml +26 -0
- package/.pi/workflows/github-pr-fix-review-issues-stacked.yaml +148 -0
- package/.pi/workflows/github-pr-post-comment.yaml +19 -0
- package/.pi/workflows/github-pr-review-post.yaml +43 -0
- package/.pi/workflows/github-pr-review.yaml +364 -0
- package/.pi/workflows/github-pr-show-changes.yaml +25 -0
- package/.pi/workflows/github-pr-update-agents-md-stacked.yaml +103 -0
- package/.pi/workflows/github-pr-visual-explain.yaml +35 -0
- package/.pi/workflows/gitlab-mr-describe.yaml +24 -0
- package/.pi/workflows/gitlab-mr-fix-review-issues-stacked.yaml +144 -0
- package/.pi/workflows/gitlab-mr-post-comment.yaml +17 -0
- package/.pi/workflows/gitlab-mr-review.yaml +364 -0
- package/.pi/workflows/gitlab-mr-show-changes.yaml +23 -0
- package/.pi/workflows/gitlab-mr-update-agents-md-stacked.yaml +100 -0
- package/.pi/workflows/gitlab-mr-visual-explain.yaml +33 -0
- package/.pi/workflows/local-changelog-update.yaml +23 -0
- package/.pi/workflows/local-fix-review-issues.yaml +111 -0
- package/.pi/workflows/local-review.yaml +24 -0
- package/.pi/workflows/local-update-agents-md.yaml +24 -0
- package/.pi/workflows/local-visual-explain.yaml +31 -0
- package/.pi/workflows/release-changelog-finalize.yaml +47 -0
- package/.pi/workflows/tag-changelog-update.yaml +26 -0
- package/README.md +281 -104
- package/dist/ci/runner.d.ts.map +1 -1
- package/dist/ci/runner.js +9 -8
- package/dist/ci/runner.js.map +1 -1
- package/dist/cli/index.js +95 -325
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +25 -23
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/run-agent.d.ts +26 -0
- package/dist/cli/run-agent.d.ts.map +1 -0
- package/dist/cli/run-agent.js +143 -0
- package/dist/cli/run-agent.js.map +1 -0
- package/dist/cli/workflow.d.ts +105 -0
- package/dist/cli/workflow.d.ts.map +1 -0
- package/dist/cli/workflow.js +3309 -0
- package/dist/cli/workflow.js.map +1 -0
- package/dist/github/client.d.ts +12 -0
- package/dist/github/client.d.ts.map +1 -1
- package/dist/github/client.js +27 -0
- package/dist/github/client.js.map +1 -1
- package/dist/github/platform-adapter.d.ts +6 -1
- package/dist/github/platform-adapter.d.ts.map +1 -1
- package/dist/github/platform-adapter.js +84 -8
- package/dist/github/platform-adapter.js.map +1 -1
- package/dist/gitlab/client.d.ts +11 -0
- package/dist/gitlab/client.d.ts.map +1 -1
- package/dist/gitlab/client.js +11 -0
- package/dist/gitlab/client.js.map +1 -1
- package/dist/gitlab/platform-adapter.d.ts +3 -1
- package/dist/gitlab/platform-adapter.d.ts.map +1 -1
- package/dist/gitlab/platform-adapter.js +32 -1
- package/dist/gitlab/platform-adapter.js.map +1 -1
- package/dist/lib/agent-id.d.ts +9 -0
- package/dist/lib/agent-id.d.ts.map +1 -0
- package/dist/lib/agent-id.js +32 -0
- package/dist/lib/agent-id.js.map +1 -0
- package/dist/lib/comment-formatter.d.ts +15 -1
- package/dist/lib/comment-formatter.d.ts.map +1 -1
- package/dist/lib/comment-formatter.js +53 -4
- package/dist/lib/comment-formatter.js.map +1 -1
- package/dist/lib/comment-manager.d.ts +4 -0
- package/dist/lib/comment-manager.d.ts.map +1 -1
- package/dist/lib/comment-manager.js +7 -1
- package/dist/lib/comment-manager.js.map +1 -1
- package/dist/lib/comment-poster.d.ts +2 -2
- package/dist/lib/comment-poster.d.ts.map +1 -1
- package/dist/lib/comment-poster.js +31 -4
- package/dist/lib/comment-poster.js.map +1 -1
- package/dist/lib/config.d.ts +160 -44
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +475 -101
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/context-compression.d.ts +10 -0
- package/dist/lib/context-compression.d.ts.map +1 -1
- package/dist/lib/context-compression.js +101 -13
- package/dist/lib/context-compression.js.map +1 -1
- package/dist/lib/context-loader.d.ts +5 -4
- package/dist/lib/context-loader.d.ts.map +1 -1
- package/dist/lib/context-loader.js +79 -7
- package/dist/lib/context-loader.js.map +1 -1
- package/dist/lib/describe-core.d.ts.map +1 -1
- package/dist/lib/describe-core.js +3 -2
- package/dist/lib/describe-core.js.map +1 -1
- package/dist/lib/description-executor.js +1 -1
- package/dist/lib/description-executor.js.map +1 -1
- package/dist/lib/diff-lines.d.ts +18 -0
- package/dist/lib/diff-lines.d.ts.map +1 -0
- package/dist/lib/diff-lines.js +40 -0
- package/dist/lib/diff-lines.js.map +1 -0
- package/dist/lib/exit.js +4 -4
- package/dist/lib/exit.js.map +1 -1
- package/dist/lib/html-artifact.d.ts +14 -0
- package/dist/lib/html-artifact.d.ts.map +1 -0
- package/dist/lib/html-artifact.js +59 -0
- package/dist/lib/html-artifact.js.map +1 -0
- package/dist/lib/issue-parser.js +3 -3
- package/dist/lib/issue-parser.js.map +1 -1
- package/dist/lib/json-output-schema.d.ts +70 -0
- package/dist/lib/json-output-schema.d.ts.map +1 -1
- package/dist/lib/json-output-schema.js +40 -0
- package/dist/lib/json-output-schema.js.map +1 -1
- package/dist/lib/logger.d.ts +1 -1
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/platform-client.d.ts +26 -0
- package/dist/lib/platform-client.d.ts.map +1 -1
- package/dist/lib/review-artifact.d.ts +69 -0
- package/dist/lib/review-artifact.d.ts.map +1 -0
- package/dist/lib/review-artifact.js +171 -0
- package/dist/lib/review-artifact.js.map +1 -0
- package/dist/lib/review-core.d.ts +6 -4
- package/dist/lib/review-core.d.ts.map +1 -1
- package/dist/lib/review-core.js +88 -173
- package/dist/lib/review-core.js.map +1 -1
- package/dist/lib/review-orchestrator.d.ts +23 -0
- package/dist/lib/review-orchestrator.d.ts.map +1 -1
- package/dist/lib/review-orchestrator.js +31 -21
- package/dist/lib/review-orchestrator.js.map +1 -1
- package/dist/lib/review-usage.d.ts +4 -0
- package/dist/lib/review-usage.d.ts.map +1 -1
- package/dist/lib/review-usage.js +25 -0
- package/dist/lib/review-usage.js.map +1 -1
- package/dist/lib/trace-collector.d.ts +105 -0
- package/dist/lib/trace-collector.d.ts.map +1 -0
- package/dist/lib/trace-collector.js +255 -0
- package/dist/lib/trace-collector.js.map +1 -0
- package/dist/lib/trace-html.d.ts +3 -0
- package/dist/lib/trace-html.d.ts.map +1 -0
- package/dist/lib/trace-html.js +349 -0
- package/dist/lib/trace-html.js.map +1 -0
- package/dist/lib/workflow-artifacts.d.ts +54 -0
- package/dist/lib/workflow-artifacts.d.ts.map +1 -0
- package/dist/lib/workflow-artifacts.js +150 -0
- package/dist/lib/workflow-artifacts.js.map +1 -0
- package/dist/pi/sdk.d.ts.map +1 -1
- package/dist/pi/sdk.js +605 -16
- package/dist/pi/sdk.js.map +1 -1
- package/dist/runtime/agent-loader.d.ts +10 -6
- package/dist/runtime/agent-loader.d.ts.map +1 -1
- package/dist/runtime/agent-loader.js +55 -29
- package/dist/runtime/agent-loader.js.map +1 -1
- package/dist/runtime/built-in-paths.d.ts +1 -0
- package/dist/runtime/built-in-paths.d.ts.map +1 -1
- package/dist/runtime/built-in-paths.js +7 -0
- package/dist/runtime/built-in-paths.js.map +1 -1
- package/dist/runtime/client.d.ts +14 -0
- package/dist/runtime/client.d.ts.map +1 -1
- package/dist/runtime/client.js +87 -56
- package/dist/runtime/client.js.map +1 -1
- package/dist/runtime/path-config.d.ts +2 -2
- package/dist/runtime/path-config.d.ts.map +1 -1
- package/dist/runtime/path-config.js +8 -8
- package/dist/runtime/path-config.js.map +1 -1
- package/package.json +22 -16
- package/.pi/agents/review/documentation.md +0 -56
- package/.pi/agents/review/performance.md +0 -53
- package/.pi/agents/review/quality.md +0 -59
- package/.pi/agents/review/security.md +0 -53
- package/.pi/agents/review/style.md +0 -132
- package/dist/cli/describe-mr.d.ts +0 -11
- package/dist/cli/describe-mr.d.ts.map +0 -1
- package/dist/cli/describe-mr.js +0 -134
- package/dist/cli/describe-mr.js.map +0 -1
- package/dist/cli/describe-pr.d.ts +0 -12
- package/dist/cli/describe-pr.d.ts.map +0 -1
- package/dist/cli/describe-pr.js +0 -135
- package/dist/cli/describe-pr.js.map +0 -1
- package/dist/cli/post-comments.d.ts +0 -20
- package/dist/cli/post-comments.d.ts.map +0 -1
- package/dist/cli/post-comments.js +0 -225
- package/dist/cli/post-comments.js.map +0 -1
- package/dist/cli/review-local.d.ts +0 -13
- package/dist/cli/review-local.d.ts.map +0 -1
- package/dist/cli/review-local.integration.test.d.ts +0 -2
- package/dist/cli/review-local.integration.test.d.ts.map +0 -1
- package/dist/cli/review-local.integration.test.js +0 -343
- package/dist/cli/review-local.integration.test.js.map +0 -1
- package/dist/cli/review-local.js +0 -90
- package/dist/cli/review-local.js.map +0 -1
- package/dist/cli/review-local.live.e2e.test.d.ts +0 -2
- package/dist/cli/review-local.live.e2e.test.d.ts.map +0 -1
- package/dist/cli/review-local.live.e2e.test.js +0 -153
- package/dist/cli/review-local.live.e2e.test.js.map +0 -1
- package/dist/cli/review-local.test.d.ts +0 -2
- package/dist/cli/review-local.test.d.ts.map +0 -1
- package/dist/cli/review-local.test.js +0 -164
- package/dist/cli/review-local.test.js.map +0 -1
- package/dist/cli/review-mr.d.ts +0 -22
- package/dist/cli/review-mr.d.ts.map +0 -1
- package/dist/cli/review-mr.js +0 -181
- package/dist/cli/review-mr.js.map +0 -1
- package/dist/cli/review-mr.test.d.ts +0 -2
- package/dist/cli/review-mr.test.d.ts.map +0 -1
- package/dist/cli/review-mr.test.js +0 -142
- package/dist/cli/review-mr.test.js.map +0 -1
- package/dist/cli/review-pr.d.ts +0 -22
- package/dist/cli/review-pr.d.ts.map +0 -1
- package/dist/cli/review-pr.js +0 -181
- package/dist/cli/review-pr.js.map +0 -1
- package/dist/cli/review-pr.test.d.ts +0 -2
- package/dist/cli/review-pr.test.d.ts.map +0 -1
- package/dist/cli/review-pr.test.js +0 -137
- package/dist/cli/review-pr.test.js.map +0 -1
- package/dist/cli/review-url.d.ts +0 -35
- package/dist/cli/review-url.d.ts.map +0 -1
- package/dist/cli/review-url.js +0 -110
- package/dist/cli/review-url.js.map +0 -1
- package/dist/cli/review-url.test.d.ts +0 -2
- package/dist/cli/review-url.test.d.ts.map +0 -1
- package/dist/cli/review-url.test.js +0 -132
- package/dist/cli/review-url.test.js.map +0 -1
- package/dist/cli/show-changes.d.ts +0 -15
- package/dist/cli/show-changes.d.ts.map +0 -1
- package/dist/cli/show-changes.js +0 -184
- package/dist/cli/show-changes.js.map +0 -1
- package/dist/github/client.test.d.ts +0 -2
- package/dist/github/client.test.d.ts.map +0 -1
- package/dist/github/client.test.js +0 -206
- package/dist/github/client.test.js.map +0 -1
- package/dist/github/platform-adapter.test.d.ts +0 -2
- package/dist/github/platform-adapter.test.d.ts.map +0 -1
- package/dist/github/platform-adapter.test.js +0 -40
- package/dist/github/platform-adapter.test.js.map +0 -1
- package/dist/gitlab/diff-parser.test.d.ts +0 -2
- package/dist/gitlab/diff-parser.test.d.ts.map +0 -1
- package/dist/gitlab/diff-parser.test.js +0 -315
- package/dist/gitlab/diff-parser.test.js.map +0 -1
- package/dist/gitlab/platform-adapter.test.d.ts +0 -2
- package/dist/gitlab/platform-adapter.test.d.ts.map +0 -1
- package/dist/gitlab/platform-adapter.test.js +0 -21
- package/dist/gitlab/platform-adapter.test.js.map +0 -1
- package/dist/index.test.d.ts +0 -2
- package/dist/index.test.d.ts.map +0 -1
- package/dist/index.test.js +0 -7
- package/dist/index.test.js.map +0 -1
- package/dist/lib/code-quality-report.test.d.ts +0 -2
- package/dist/lib/code-quality-report.test.d.ts.map +0 -1
- package/dist/lib/code-quality-report.test.js +0 -327
- package/dist/lib/code-quality-report.test.js.map +0 -1
- package/dist/lib/comment-formatter.test.d.ts +0 -2
- package/dist/lib/comment-formatter.test.d.ts.map +0 -1
- package/dist/lib/comment-formatter.test.js +0 -694
- package/dist/lib/comment-formatter.test.js.map +0 -1
- package/dist/lib/comment-manager.test.d.ts +0 -2
- package/dist/lib/comment-manager.test.d.ts.map +0 -1
- package/dist/lib/comment-manager.test.js +0 -680
- package/dist/lib/comment-manager.test.js.map +0 -1
- package/dist/lib/comment-poster.test.d.ts +0 -5
- package/dist/lib/comment-poster.test.d.ts.map +0 -1
- package/dist/lib/comment-poster.test.js +0 -245
- package/dist/lib/comment-poster.test.js.map +0 -1
- package/dist/lib/config-model-overrides.test.d.ts +0 -12
- package/dist/lib/config-model-overrides.test.d.ts.map +0 -1
- package/dist/lib/config-model-overrides.test.js +0 -254
- package/dist/lib/config-model-overrides.test.js.map +0 -1
- package/dist/lib/config.test.d.ts +0 -2
- package/dist/lib/config.test.d.ts.map +0 -1
- package/dist/lib/config.test.js +0 -73
- package/dist/lib/config.test.js.map +0 -1
- package/dist/lib/context-compression.test.d.ts +0 -2
- package/dist/lib/context-compression.test.d.ts.map +0 -1
- package/dist/lib/context-compression.test.js +0 -337
- package/dist/lib/context-compression.test.js.map +0 -1
- package/dist/lib/context-loader.test.d.ts +0 -2
- package/dist/lib/context-loader.test.d.ts.map +0 -1
- package/dist/lib/context-loader.test.js +0 -207
- package/dist/lib/context-loader.test.js.map +0 -1
- package/dist/lib/cursor-fix-link.test.d.ts +0 -2
- package/dist/lib/cursor-fix-link.test.d.ts.map +0 -1
- package/dist/lib/cursor-fix-link.test.js +0 -70
- package/dist/lib/cursor-fix-link.test.js.map +0 -1
- package/dist/lib/describe-core.test.d.ts +0 -2
- package/dist/lib/describe-core.test.d.ts.map +0 -1
- package/dist/lib/describe-core.test.js +0 -208
- package/dist/lib/describe-core.test.js.map +0 -1
- package/dist/lib/describe-output-path.test.d.ts +0 -2
- package/dist/lib/describe-output-path.test.d.ts.map +0 -1
- package/dist/lib/describe-output-path.test.js +0 -51
- package/dist/lib/describe-output-path.test.js.map +0 -1
- package/dist/lib/describe-parser.test.d.ts +0 -2
- package/dist/lib/describe-parser.test.d.ts.map +0 -1
- package/dist/lib/describe-parser.test.js +0 -282
- package/dist/lib/describe-parser.test.js.map +0 -1
- package/dist/lib/description-executor.test.d.ts +0 -2
- package/dist/lib/description-executor.test.d.ts.map +0 -1
- package/dist/lib/description-executor.test.js +0 -128
- package/dist/lib/description-executor.test.js.map +0 -1
- package/dist/lib/description-formatter.test.d.ts +0 -2
- package/dist/lib/description-formatter.test.d.ts.map +0 -1
- package/dist/lib/description-formatter.test.js +0 -57
- package/dist/lib/description-formatter.test.js.map +0 -1
- package/dist/lib/diff-parser.test.d.ts +0 -2
- package/dist/lib/diff-parser.test.d.ts.map +0 -1
- package/dist/lib/diff-parser.test.js +0 -335
- package/dist/lib/diff-parser.test.js.map +0 -1
- package/dist/lib/error-comment-poster.test.d.ts +0 -2
- package/dist/lib/error-comment-poster.test.d.ts.map +0 -1
- package/dist/lib/error-comment-poster.test.js +0 -128
- package/dist/lib/error-comment-poster.test.js.map +0 -1
- package/dist/lib/exit.test.d.ts +0 -2
- package/dist/lib/exit.test.d.ts.map +0 -1
- package/dist/lib/exit.test.js +0 -120
- package/dist/lib/exit.test.js.map +0 -1
- package/dist/lib/issue-parser.test.d.ts +0 -2
- package/dist/lib/issue-parser.test.d.ts.map +0 -1
- package/dist/lib/issue-parser.test.js +0 -281
- package/dist/lib/issue-parser.test.js.map +0 -1
- package/dist/lib/json-output-schema.test.d.ts +0 -2
- package/dist/lib/json-output-schema.test.d.ts.map +0 -1
- package/dist/lib/json-output-schema.test.js +0 -92
- package/dist/lib/json-output-schema.test.js.map +0 -1
- package/dist/lib/json-output.test.d.ts +0 -2
- package/dist/lib/json-output.test.d.ts.map +0 -1
- package/dist/lib/json-output.test.js +0 -141
- package/dist/lib/json-output.test.js.map +0 -1
- package/dist/lib/logger.test.d.ts +0 -2
- package/dist/lib/logger.test.d.ts.map +0 -1
- package/dist/lib/logger.test.js +0 -324
- package/dist/lib/logger.test.js.map +0 -1
- package/dist/lib/position-validator.test.d.ts +0 -2
- package/dist/lib/position-validator.test.d.ts.map +0 -1
- package/dist/lib/position-validator.test.js +0 -128
- package/dist/lib/position-validator.test.js.map +0 -1
- package/dist/lib/prompt-budget.test.d.ts +0 -2
- package/dist/lib/prompt-budget.test.d.ts.map +0 -1
- package/dist/lib/prompt-budget.test.js +0 -55
- package/dist/lib/prompt-budget.test.js.map +0 -1
- package/dist/lib/repository-validator.test.d.ts +0 -5
- package/dist/lib/repository-validator.test.d.ts.map +0 -1
- package/dist/lib/repository-validator.test.js +0 -341
- package/dist/lib/repository-validator.test.js.map +0 -1
- package/dist/lib/review-core.test.d.ts +0 -2
- package/dist/lib/review-core.test.d.ts.map +0 -1
- package/dist/lib/review-core.test.js +0 -600
- package/dist/lib/review-core.test.js.map +0 -1
- package/dist/lib/review-orchestrator.test.d.ts +0 -2
- package/dist/lib/review-orchestrator.test.d.ts.map +0 -1
- package/dist/lib/review-orchestrator.test.js +0 -531
- package/dist/lib/review-orchestrator.test.js.map +0 -1
- package/dist/lib/review-output-path.test.d.ts +0 -2
- package/dist/lib/review-output-path.test.d.ts.map +0 -1
- package/dist/lib/review-output-path.test.js +0 -83
- package/dist/lib/review-output-path.test.js.map +0 -1
- package/dist/lib/review-parser.test.d.ts +0 -2
- package/dist/lib/review-parser.test.d.ts.map +0 -1
- package/dist/lib/review-parser.test.js +0 -130
- package/dist/lib/review-parser.test.js.map +0 -1
- package/dist/lib/review-usage.test.d.ts +0 -2
- package/dist/lib/review-usage.test.d.ts.map +0 -1
- package/dist/lib/review-usage.test.js +0 -83
- package/dist/lib/review-usage.test.js.map +0 -1
- package/dist/lib/unified-review-executor.d.ts +0 -60
- package/dist/lib/unified-review-executor.d.ts.map +0 -1
- package/dist/lib/unified-review-executor.js +0 -207
- package/dist/lib/unified-review-executor.js.map +0 -1
- package/dist/lib/unified-review-executor.test.d.ts +0 -5
- package/dist/lib/unified-review-executor.test.d.ts.map +0 -1
- package/dist/lib/unified-review-executor.test.js +0 -472
- package/dist/lib/unified-review-executor.test.js.map +0 -1
- package/dist/lib/write-json-output.test.d.ts +0 -2
- package/dist/lib/write-json-output.test.d.ts.map +0 -1
- package/dist/lib/write-json-output.test.js +0 -259
- package/dist/lib/write-json-output.test.js.map +0 -1
- package/dist/pi/sdk.test.d.ts +0 -2
- package/dist/pi/sdk.test.d.ts.map +0 -1
- package/dist/pi/sdk.test.js +0 -449
- package/dist/pi/sdk.test.js.map +0 -1
- package/dist/runtime/agent-loader.test.d.ts +0 -2
- package/dist/runtime/agent-loader.test.d.ts.map +0 -1
- package/dist/runtime/agent-loader.test.js +0 -280
- package/dist/runtime/agent-loader.test.js.map +0 -1
- package/dist/runtime/client.test.d.ts +0 -2
- package/dist/runtime/client.test.d.ts.map +0 -1
- package/dist/runtime/client.test.js +0 -523
- package/dist/runtime/client.test.js.map +0 -1
- package/dist/runtime/path-config.test.d.ts +0 -2
- package/dist/runtime/path-config.test.d.ts.map +0 -1
- package/dist/runtime/path-config.test.js +0 -112
- package/dist/runtime/path-config.test.js.map +0 -1
package/dist/cli/review-mr.js
DELETED
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
import { resolveCursorFixLinkOptions } from '../lib/cursor-fix-link.js';
|
|
2
|
-
import { createGitLabClient } from '../gitlab/client.js';
|
|
3
|
-
import { GitLabPlatformAdapter } from '../gitlab/platform-adapter.js';
|
|
4
|
-
import { executeUnifiedReview } from '../lib/unified-review-executor.js';
|
|
5
|
-
/**
|
|
6
|
-
* Parse a GitLab diff to extract valid line numbers for review comments.
|
|
7
|
-
* GitLab only allows comments on lines that are in the diff (added or context).
|
|
8
|
-
*/
|
|
9
|
-
function parseValidLinesFromDiff(diff) {
|
|
10
|
-
const validLines = new Set();
|
|
11
|
-
const lines = diff.split('\n');
|
|
12
|
-
let currentLine = 0;
|
|
13
|
-
for (const line of lines) {
|
|
14
|
-
// Parse hunk header: @@ -old_start,old_count +new_start,new_count @@
|
|
15
|
-
const hunkMatch = line.match(/^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/);
|
|
16
|
-
if (hunkMatch) {
|
|
17
|
-
currentLine = parseInt(hunkMatch[1], 10);
|
|
18
|
-
continue;
|
|
19
|
-
}
|
|
20
|
-
// Skip empty lines or lines without proper diff prefix
|
|
21
|
-
if (!line || line.length === 0)
|
|
22
|
-
continue;
|
|
23
|
-
const prefix = line[0];
|
|
24
|
-
if (prefix === '+') {
|
|
25
|
-
// Added line - can comment on this
|
|
26
|
-
validLines.add(currentLine);
|
|
27
|
-
currentLine++;
|
|
28
|
-
}
|
|
29
|
-
else if (prefix === ' ') {
|
|
30
|
-
// Context line - can comment on this
|
|
31
|
-
validLines.add(currentLine);
|
|
32
|
-
currentLine++;
|
|
33
|
-
}
|
|
34
|
-
else if (prefix === '-') {
|
|
35
|
-
// Removed line - cannot comment on "new" version, skip
|
|
36
|
-
continue;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return validLines;
|
|
40
|
-
}
|
|
41
|
-
function parseStatusCodeFromMessage(message) {
|
|
42
|
-
const match = message.match(/\b(401|403|404|429)\b/);
|
|
43
|
-
return match ? parseInt(match[1], 10) : undefined;
|
|
44
|
-
}
|
|
45
|
-
function extractStatusCode(error) {
|
|
46
|
-
if (!error || typeof error !== 'object') {
|
|
47
|
-
return undefined;
|
|
48
|
-
}
|
|
49
|
-
const candidate = error;
|
|
50
|
-
if (typeof candidate.statusCode === 'number') {
|
|
51
|
-
return candidate.statusCode;
|
|
52
|
-
}
|
|
53
|
-
if (typeof candidate.status === 'number') {
|
|
54
|
-
return candidate.status;
|
|
55
|
-
}
|
|
56
|
-
if (candidate.response && typeof candidate.response === 'object') {
|
|
57
|
-
if (typeof candidate.response.statusCode === 'number') {
|
|
58
|
-
return candidate.response.statusCode;
|
|
59
|
-
}
|
|
60
|
-
if (typeof candidate.response.status === 'number') {
|
|
61
|
-
return candidate.response.status;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
if (candidate.cause && candidate.cause !== error) {
|
|
65
|
-
return extractStatusCode(candidate.cause);
|
|
66
|
-
}
|
|
67
|
-
return undefined;
|
|
68
|
-
}
|
|
69
|
-
function mapGitLabContextError(error, options) {
|
|
70
|
-
const rawMessage = error instanceof Error ? error.message : String(error);
|
|
71
|
-
const normalized = rawMessage.toLowerCase();
|
|
72
|
-
const statusCode = extractStatusCode(error) ?? parseStatusCodeFromMessage(rawMessage);
|
|
73
|
-
const gitlabUrl = process.env.GITLAB_URL ?? 'https://gitlab.com';
|
|
74
|
-
if (normalized.includes('gitlab_token environment variable is required')) {
|
|
75
|
-
return new Error('GitLab authentication is required. Set GITLAB_TOKEN with an API token that can access the target merge request.');
|
|
76
|
-
}
|
|
77
|
-
if (statusCode === 401 || normalized.includes('unauthorized')) {
|
|
78
|
-
return new Error(`GitLab authentication failed for ${options.projectId}!${options.mrIid}. Verify GITLAB_TOKEN for ${gitlabUrl} and ensure it has API access.`);
|
|
79
|
-
}
|
|
80
|
-
if (statusCode === 403 || normalized.includes('forbidden')) {
|
|
81
|
-
return new Error(`GitLab authorization failed for ${options.projectId}!${options.mrIid}. Ensure the token has permission to read the project and merge request.`);
|
|
82
|
-
}
|
|
83
|
-
if (statusCode === 404 || normalized.includes('not found')) {
|
|
84
|
-
return new Error(`GitLab merge request not found: ${options.projectId}!${options.mrIid}. Verify --project/--mr values and that the token can access the project.`);
|
|
85
|
-
}
|
|
86
|
-
if (statusCode === 429 || normalized.includes('rate limit')) {
|
|
87
|
-
return new Error(`GitLab API rate limit reached while loading ${options.projectId}!${options.mrIid}. Retry after cooldown or use a token with higher limits.`);
|
|
88
|
-
}
|
|
89
|
-
const connectivityError = normalized.includes('fetch failed') ||
|
|
90
|
-
normalized.includes('econnrefused') ||
|
|
91
|
-
normalized.includes('enotfound') ||
|
|
92
|
-
normalized.includes('etimedout');
|
|
93
|
-
if (connectivityError) {
|
|
94
|
-
return new Error(`Unable to reach GitLab at ${gitlabUrl} while loading ${options.projectId}!${options.mrIid}. Check GITLAB_URL and network connectivity.`);
|
|
95
|
-
}
|
|
96
|
-
return new Error(`Failed to load GitLab merge request context for ${options.projectId}!${options.mrIid}: ${rawMessage}`);
|
|
97
|
-
}
|
|
98
|
-
async function loadMergeRequestContext(platformClient, options) {
|
|
99
|
-
try {
|
|
100
|
-
const pullRequest = await platformClient.getPullRequest(options.projectId, options.mrIid);
|
|
101
|
-
const changedFiles = await platformClient.getChangedFiles(options.projectId, options.mrIid);
|
|
102
|
-
return {
|
|
103
|
-
pullRequest,
|
|
104
|
-
changedFiles,
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
catch (error) {
|
|
108
|
-
throw mapGitLabContextError(error, options);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Review a GitLab merge request.
|
|
113
|
-
*/
|
|
114
|
-
export async function reviewMR(config, options) {
|
|
115
|
-
let platformClient;
|
|
116
|
-
try {
|
|
117
|
-
const gitlabClient = createGitLabClient();
|
|
118
|
-
platformClient = new GitLabPlatformAdapter(gitlabClient);
|
|
119
|
-
}
|
|
120
|
-
catch (error) {
|
|
121
|
-
throw mapGitLabContextError(error, options);
|
|
122
|
-
}
|
|
123
|
-
const workingDir = process.cwd();
|
|
124
|
-
const { pullRequest, changedFiles } = await loadMergeRequestContext(platformClient, options);
|
|
125
|
-
const cursorFixLinks = resolveCursorFixLinkOptions(config, options.projectId, workingDir, options.fixInCursor, options.skipFixInCursor);
|
|
126
|
-
// Build a map of file -> valid line numbers (lines that are in the diff)
|
|
127
|
-
const validLinesMap = new Map();
|
|
128
|
-
for (const file of changedFiles) {
|
|
129
|
-
if (file.patch && file.status !== 'removed') {
|
|
130
|
-
const validLines = parseValidLinesFromDiff(file.patch);
|
|
131
|
-
validLinesMap.set(file.filename, validLines);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
const platformData = pullRequest.platformData;
|
|
135
|
-
const diffRefs = platformData?.diff_refs;
|
|
136
|
-
// Create line validator - only allow comments on lines that are in the diff
|
|
137
|
-
const lineValidator = {
|
|
138
|
-
isValidLine(file, line) {
|
|
139
|
-
if (!diffRefs?.base_sha || !diffRefs.head_sha || !diffRefs.start_sha) {
|
|
140
|
-
return false;
|
|
141
|
-
}
|
|
142
|
-
const validLines = validLinesMap.get(file);
|
|
143
|
-
return validLines !== undefined && validLines.has(line);
|
|
144
|
-
},
|
|
145
|
-
};
|
|
146
|
-
// Create inline position builder
|
|
147
|
-
const createInlinePosition = (issue, platformDataInput) => {
|
|
148
|
-
const data = platformDataInput;
|
|
149
|
-
const refs = data.diff_refs;
|
|
150
|
-
return {
|
|
151
|
-
path: issue.file,
|
|
152
|
-
line: issue.line,
|
|
153
|
-
baseSha: refs?.base_sha,
|
|
154
|
-
headSha: refs?.head_sha,
|
|
155
|
-
startSha: refs?.start_sha,
|
|
156
|
-
};
|
|
157
|
-
};
|
|
158
|
-
// Execute unified review
|
|
159
|
-
await executeUnifiedReview(config, {
|
|
160
|
-
platformClient,
|
|
161
|
-
projectId: options.projectId,
|
|
162
|
-
prNumber: options.mrIid,
|
|
163
|
-
pullRequest,
|
|
164
|
-
changedFiles,
|
|
165
|
-
postComments: options.postComments,
|
|
166
|
-
postErrorComment: options.postErrorComment,
|
|
167
|
-
codeQualityReport: options.codeQualityReport,
|
|
168
|
-
outputPath: options.outputPath,
|
|
169
|
-
jsonOutput: options.jsonOutput,
|
|
170
|
-
baseBranch: options.baseBranch,
|
|
171
|
-
lineValidator,
|
|
172
|
-
createInlinePosition,
|
|
173
|
-
cursorFixLinks,
|
|
174
|
-
workingDir,
|
|
175
|
-
describe: options.describe,
|
|
176
|
-
postDescription: options.postDescription,
|
|
177
|
-
debug: options.debug,
|
|
178
|
-
thinkingLevel: options.thinkingLevel,
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
//# sourceMappingURL=review-mr.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"review-mr.js","sourceRoot":"","sources":["../../src/cli/review-mr.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"review-mr.test.d.ts","sourceRoot":"","sources":["../../src/cli/review-mr.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import { reviewMR } from './review-mr.js';
|
|
3
|
-
const { mockGitLabClient, createGitLabClient, executeUnifiedReview } = vi.hoisted(() => ({
|
|
4
|
-
mockGitLabClient: {
|
|
5
|
-
getMergeRequest: vi.fn(),
|
|
6
|
-
getMRChanges: vi.fn(),
|
|
7
|
-
},
|
|
8
|
-
createGitLabClient: vi.fn(),
|
|
9
|
-
executeUnifiedReview: vi.fn(),
|
|
10
|
-
}));
|
|
11
|
-
vi.mock('../gitlab/client.js', () => ({
|
|
12
|
-
createGitLabClient,
|
|
13
|
-
}));
|
|
14
|
-
vi.mock('../lib/unified-review-executor.js', () => ({
|
|
15
|
-
executeUnifiedReview,
|
|
16
|
-
}));
|
|
17
|
-
const baseConfig = {
|
|
18
|
-
pi: {},
|
|
19
|
-
gitlab: { url: 'https://gitlab.com', token: 'token' },
|
|
20
|
-
github: { token: 'token' },
|
|
21
|
-
review: {
|
|
22
|
-
agents: ['security', 'quality'],
|
|
23
|
-
ignorePatterns: [],
|
|
24
|
-
},
|
|
25
|
-
};
|
|
26
|
-
const baseOptions = {
|
|
27
|
-
projectId: 'group/repo',
|
|
28
|
-
mrIid: 42,
|
|
29
|
-
postComments: true,
|
|
30
|
-
postErrorComment: true,
|
|
31
|
-
describe: false,
|
|
32
|
-
postDescription: false,
|
|
33
|
-
};
|
|
34
|
-
describe('review-mr', () => {
|
|
35
|
-
beforeEach(() => {
|
|
36
|
-
vi.clearAllMocks();
|
|
37
|
-
createGitLabClient.mockReturnValue(mockGitLabClient);
|
|
38
|
-
executeUnifiedReview.mockResolvedValue(undefined);
|
|
39
|
-
mockGitLabClient.getMergeRequest.mockResolvedValue({
|
|
40
|
-
iid: 42,
|
|
41
|
-
title: 'Test MR',
|
|
42
|
-
source_branch: 'feature/pi-migration',
|
|
43
|
-
target_branch: 'main',
|
|
44
|
-
author: { name: 'test-user' },
|
|
45
|
-
diff_refs: {
|
|
46
|
-
base_sha: 'base-sha',
|
|
47
|
-
head_sha: 'head-sha',
|
|
48
|
-
start_sha: 'start-sha',
|
|
49
|
-
},
|
|
50
|
-
});
|
|
51
|
-
mockGitLabClient.getMRChanges.mockResolvedValue([
|
|
52
|
-
{
|
|
53
|
-
oldPath: 'src/app.ts',
|
|
54
|
-
newPath: 'src/app.ts',
|
|
55
|
-
newFile: false,
|
|
56
|
-
renamedFile: false,
|
|
57
|
-
deletedFile: false,
|
|
58
|
-
diff: '@@ -8,2 +8,3 @@\n context line\n+new line\n-removed line',
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
oldPath: 'src/old.ts',
|
|
62
|
-
newPath: 'src/old.ts',
|
|
63
|
-
newFile: false,
|
|
64
|
-
renamedFile: false,
|
|
65
|
-
deletedFile: true,
|
|
66
|
-
diff: '@@ -1 +0,0 @@\n-old line',
|
|
67
|
-
},
|
|
68
|
-
]);
|
|
69
|
-
});
|
|
70
|
-
it('loads MR context once and forwards diff-aware validators to unified review', async () => {
|
|
71
|
-
await reviewMR(baseConfig, baseOptions);
|
|
72
|
-
expect(createGitLabClient).toHaveBeenCalledTimes(1);
|
|
73
|
-
expect(mockGitLabClient.getMergeRequest).toHaveBeenCalledWith('group/repo', 42);
|
|
74
|
-
expect(mockGitLabClient.getMRChanges).toHaveBeenCalledWith('group/repo', 42);
|
|
75
|
-
const unifiedOptions = vi.mocked(executeUnifiedReview).mock.calls[0][1];
|
|
76
|
-
expect(unifiedOptions.pullRequest).toEqual(expect.objectContaining({
|
|
77
|
-
number: 42,
|
|
78
|
-
title: 'Test MR',
|
|
79
|
-
}));
|
|
80
|
-
expect(unifiedOptions.changedFiles).toEqual(expect.arrayContaining([
|
|
81
|
-
expect.objectContaining({ filename: 'src/app.ts', status: 'modified' }),
|
|
82
|
-
expect.objectContaining({ filename: 'src/old.ts', status: 'removed' }),
|
|
83
|
-
]));
|
|
84
|
-
expect(unifiedOptions.lineValidator?.isValidLine('src/app.ts', 8)).toBe(true);
|
|
85
|
-
expect(unifiedOptions.lineValidator?.isValidLine('src/app.ts', 9)).toBe(true);
|
|
86
|
-
expect(unifiedOptions.lineValidator?.isValidLine('src/app.ts', 10)).toBe(false);
|
|
87
|
-
expect(unifiedOptions.lineValidator?.isValidLine('src/old.ts', 1)).toBe(false);
|
|
88
|
-
const inlinePosition = unifiedOptions.createInlinePosition?.({
|
|
89
|
-
category: 'QUALITY',
|
|
90
|
-
severity: 'HIGH',
|
|
91
|
-
title: 'Example issue',
|
|
92
|
-
file: 'src/app.ts',
|
|
93
|
-
line: 9,
|
|
94
|
-
problem: 'Problem',
|
|
95
|
-
solution: 'Solution',
|
|
96
|
-
agent: 'quality',
|
|
97
|
-
}, {
|
|
98
|
-
diff_refs: {
|
|
99
|
-
base_sha: 'base-sha',
|
|
100
|
-
head_sha: 'head-sha',
|
|
101
|
-
start_sha: 'start-sha',
|
|
102
|
-
},
|
|
103
|
-
});
|
|
104
|
-
expect(inlinePosition).toEqual({
|
|
105
|
-
path: 'src/app.ts',
|
|
106
|
-
line: 9,
|
|
107
|
-
baseSha: 'base-sha',
|
|
108
|
-
headSha: 'head-sha',
|
|
109
|
-
startSha: 'start-sha',
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
it('rejects with actionable guidance when GITLAB_TOKEN is missing', async () => {
|
|
113
|
-
createGitLabClient.mockImplementationOnce(() => {
|
|
114
|
-
throw new Error('GITLAB_TOKEN environment variable is required');
|
|
115
|
-
});
|
|
116
|
-
await expect(reviewMR(baseConfig, baseOptions)).rejects.toThrow('Set GITLAB_TOKEN');
|
|
117
|
-
expect(executeUnifiedReview).not.toHaveBeenCalled();
|
|
118
|
-
});
|
|
119
|
-
it('maps GitLab authentication failures to actionable errors', async () => {
|
|
120
|
-
mockGitLabClient.getMergeRequest.mockRejectedValueOnce(new Error('401 Unauthorized'));
|
|
121
|
-
await expect(reviewMR(baseConfig, baseOptions)).rejects.toThrow('GitLab authentication failed for group/repo!42');
|
|
122
|
-
expect(executeUnifiedReview).not.toHaveBeenCalled();
|
|
123
|
-
});
|
|
124
|
-
it('maps GitLab not found failures with project/mr remediation', async () => {
|
|
125
|
-
mockGitLabClient.getMergeRequest.mockRejectedValueOnce(new Error('404 Not Found'));
|
|
126
|
-
await expect(reviewMR(baseConfig, baseOptions)).rejects.toThrow('GitLab merge request not found: group/repo!42');
|
|
127
|
-
expect(executeUnifiedReview).not.toHaveBeenCalled();
|
|
128
|
-
});
|
|
129
|
-
it('disables line validation when diff refs are unavailable', async () => {
|
|
130
|
-
mockGitLabClient.getMergeRequest.mockResolvedValueOnce({
|
|
131
|
-
iid: 42,
|
|
132
|
-
title: 'Missing refs',
|
|
133
|
-
source_branch: 'feature/pi-migration',
|
|
134
|
-
target_branch: 'main',
|
|
135
|
-
author: { name: 'test-user' },
|
|
136
|
-
});
|
|
137
|
-
await reviewMR(baseConfig, baseOptions);
|
|
138
|
-
const unifiedOptions = vi.mocked(executeUnifiedReview).mock.calls[0][1];
|
|
139
|
-
expect(unifiedOptions.lineValidator?.isValidLine('src/app.ts', 8)).toBe(false);
|
|
140
|
-
});
|
|
141
|
-
});
|
|
142
|
-
//# sourceMappingURL=review-mr.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"review-mr.test.js","sourceRoot":"","sources":["../../src/cli/review-mr.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/review-pr.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { DRSConfig } from '../lib/config.js';
|
|
2
|
-
export interface ReviewPROptions {
|
|
3
|
-
owner: string;
|
|
4
|
-
repo: string;
|
|
5
|
-
prNumber: number;
|
|
6
|
-
postComments: boolean;
|
|
7
|
-
postErrorComment: boolean;
|
|
8
|
-
fixInCursor?: boolean;
|
|
9
|
-
skipFixInCursor?: boolean;
|
|
10
|
-
describe: boolean;
|
|
11
|
-
postDescription: boolean;
|
|
12
|
-
outputPath?: string;
|
|
13
|
-
jsonOutput?: boolean;
|
|
14
|
-
baseBranch?: string;
|
|
15
|
-
debug?: boolean;
|
|
16
|
-
thinkingLevel?: string;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Review a GitHub pull request.
|
|
20
|
-
*/
|
|
21
|
-
export declare function reviewPR(config: DRSConfig, options: ReviewPROptions): Promise<void>;
|
|
22
|
-
//# sourceMappingURL=review-pr.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"review-pr.d.ts","sourceRoot":"","sources":["../../src/cli/review-pr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAalD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA8KD;;GAEG;AACH,wBAAsB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAuEzF"}
|
package/dist/cli/review-pr.js
DELETED
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
import { resolveCursorFixLinkOptions } from '../lib/cursor-fix-link.js';
|
|
2
|
-
import { createGitHubClient } from '../github/client.js';
|
|
3
|
-
import { GitHubPlatformAdapter } from '../github/platform-adapter.js';
|
|
4
|
-
import { executeUnifiedReview } from '../lib/unified-review-executor.js';
|
|
5
|
-
/**
|
|
6
|
-
* Parse a GitHub diff patch to extract valid line numbers for review comments.
|
|
7
|
-
* GitHub only allows comments on lines that are in the diff (added, removed, or context).
|
|
8
|
-
*/
|
|
9
|
-
function parseValidLinesFromPatch(patch) {
|
|
10
|
-
const validLines = new Set();
|
|
11
|
-
const lines = patch.split('\n');
|
|
12
|
-
let currentLine = 0;
|
|
13
|
-
for (const line of lines) {
|
|
14
|
-
// Parse hunk header: @@ -old_start,old_count +new_start,new_count @@
|
|
15
|
-
const hunkMatch = line.match(/^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/);
|
|
16
|
-
if (hunkMatch) {
|
|
17
|
-
currentLine = parseInt(hunkMatch[1], 10);
|
|
18
|
-
continue;
|
|
19
|
-
}
|
|
20
|
-
// Skip empty lines or lines without proper diff prefix
|
|
21
|
-
if (!line || line.length === 0)
|
|
22
|
-
continue;
|
|
23
|
-
const prefix = line[0];
|
|
24
|
-
if (prefix === '+') {
|
|
25
|
-
// Added line - can comment on this
|
|
26
|
-
validLines.add(currentLine);
|
|
27
|
-
currentLine++;
|
|
28
|
-
}
|
|
29
|
-
else if (prefix === ' ') {
|
|
30
|
-
// Context line - can comment on this
|
|
31
|
-
validLines.add(currentLine);
|
|
32
|
-
currentLine++;
|
|
33
|
-
}
|
|
34
|
-
else if (prefix === '-') {
|
|
35
|
-
// Removed line - cannot comment on "new" version, skip
|
|
36
|
-
continue;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return validLines;
|
|
40
|
-
}
|
|
41
|
-
function parseStatusCodeFromMessage(message) {
|
|
42
|
-
const match = message.match(/\b(401|403|404|422|429)\b/);
|
|
43
|
-
return match ? parseInt(match[1], 10) : undefined;
|
|
44
|
-
}
|
|
45
|
-
function extractStatusCode(error) {
|
|
46
|
-
if (!error || typeof error !== 'object') {
|
|
47
|
-
return undefined;
|
|
48
|
-
}
|
|
49
|
-
const candidate = error;
|
|
50
|
-
if (typeof candidate.statusCode === 'number') {
|
|
51
|
-
return candidate.statusCode;
|
|
52
|
-
}
|
|
53
|
-
if (typeof candidate.status === 'number') {
|
|
54
|
-
return candidate.status;
|
|
55
|
-
}
|
|
56
|
-
if (candidate.response && typeof candidate.response === 'object') {
|
|
57
|
-
if (typeof candidate.response.statusCode === 'number') {
|
|
58
|
-
return candidate.response.statusCode;
|
|
59
|
-
}
|
|
60
|
-
if (typeof candidate.response.status === 'number') {
|
|
61
|
-
return candidate.response.status;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
if (candidate.cause && candidate.cause !== error) {
|
|
65
|
-
return extractStatusCode(candidate.cause);
|
|
66
|
-
}
|
|
67
|
-
return undefined;
|
|
68
|
-
}
|
|
69
|
-
function mapGitHubContextError(error, options) {
|
|
70
|
-
const rawMessage = error instanceof Error ? error.message : String(error);
|
|
71
|
-
const normalized = rawMessage.toLowerCase();
|
|
72
|
-
const statusCode = extractStatusCode(error) ?? parseStatusCodeFromMessage(rawMessage);
|
|
73
|
-
const pullRequestRef = `${options.owner}/${options.repo}#${options.prNumber}`;
|
|
74
|
-
if (normalized.includes('github_token environment variable is required')) {
|
|
75
|
-
return new Error('GitHub authentication is required. Set GITHUB_TOKEN with a token that can access the target pull request.');
|
|
76
|
-
}
|
|
77
|
-
if (statusCode === 401 ||
|
|
78
|
-
normalized.includes('unauthorized') ||
|
|
79
|
-
normalized.includes('bad credentials')) {
|
|
80
|
-
return new Error(`GitHub authentication failed for ${pullRequestRef}. Verify GITHUB_TOKEN and ensure it has permission to read the repository.`);
|
|
81
|
-
}
|
|
82
|
-
if (statusCode === 429 || normalized.includes('rate limit')) {
|
|
83
|
-
return new Error(`GitHub API rate limit reached while loading ${pullRequestRef}. Retry after cooldown or use a token with higher API limits.`);
|
|
84
|
-
}
|
|
85
|
-
if (statusCode === 403 || normalized.includes('forbidden')) {
|
|
86
|
-
return new Error(`GitHub authorization failed for ${pullRequestRef}. Ensure the token can access the repository and pull request.`);
|
|
87
|
-
}
|
|
88
|
-
if (statusCode === 404 || normalized.includes('not found')) {
|
|
89
|
-
return new Error(`GitHub pull request not found: ${pullRequestRef}. Verify --owner/--repo/--pr values and token access.`);
|
|
90
|
-
}
|
|
91
|
-
if (statusCode === 422 ||
|
|
92
|
-
normalized.includes('unprocessable entity') ||
|
|
93
|
-
normalized.includes('validation failed')) {
|
|
94
|
-
return new Error(`GitHub rejected pull request lookup for ${pullRequestRef}. Confirm the PR number and repository details are valid.`);
|
|
95
|
-
}
|
|
96
|
-
const connectivityError = normalized.includes('fetch failed') ||
|
|
97
|
-
normalized.includes('econnrefused') ||
|
|
98
|
-
normalized.includes('enotfound') ||
|
|
99
|
-
normalized.includes('etimedout') ||
|
|
100
|
-
normalized.includes('econnreset');
|
|
101
|
-
if (connectivityError) {
|
|
102
|
-
return new Error(`Unable to reach GitHub API while loading ${pullRequestRef}. Check network connectivity and retry.`);
|
|
103
|
-
}
|
|
104
|
-
return new Error(`Failed to load GitHub pull request context for ${pullRequestRef}: ${rawMessage}`);
|
|
105
|
-
}
|
|
106
|
-
async function loadPullRequestContext(platformClient, options) {
|
|
107
|
-
const projectId = `${options.owner}/${options.repo}`;
|
|
108
|
-
try {
|
|
109
|
-
const pullRequest = await platformClient.getPullRequest(projectId, options.prNumber);
|
|
110
|
-
const changedFiles = await platformClient.getChangedFiles(projectId, options.prNumber);
|
|
111
|
-
return {
|
|
112
|
-
pullRequest,
|
|
113
|
-
changedFiles,
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
catch (error) {
|
|
117
|
-
throw mapGitHubContextError(error, options);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Review a GitHub pull request.
|
|
122
|
-
*/
|
|
123
|
-
export async function reviewPR(config, options) {
|
|
124
|
-
let platformClient;
|
|
125
|
-
try {
|
|
126
|
-
const githubClient = createGitHubClient();
|
|
127
|
-
platformClient = new GitHubPlatformAdapter(githubClient);
|
|
128
|
-
}
|
|
129
|
-
catch (error) {
|
|
130
|
-
throw mapGitHubContextError(error, options);
|
|
131
|
-
}
|
|
132
|
-
const projectId = `${options.owner}/${options.repo}`;
|
|
133
|
-
const workingDir = process.cwd();
|
|
134
|
-
const { pullRequest, changedFiles } = await loadPullRequestContext(platformClient, options);
|
|
135
|
-
const cursorFixLinks = resolveCursorFixLinkOptions(config, projectId, workingDir, options.fixInCursor, options.skipFixInCursor);
|
|
136
|
-
// Build a map of file -> valid line numbers (lines that are in the diff)
|
|
137
|
-
const validLinesMap = new Map();
|
|
138
|
-
for (const file of changedFiles) {
|
|
139
|
-
if (file.patch && file.status !== 'removed') {
|
|
140
|
-
const validLines = parseValidLinesFromPatch(file.patch);
|
|
141
|
-
validLinesMap.set(file.filename, validLines);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
// Create line validator
|
|
145
|
-
const lineValidator = {
|
|
146
|
-
isValidLine(file, line) {
|
|
147
|
-
const validLines = validLinesMap.get(file);
|
|
148
|
-
return validLines !== undefined && validLines.has(line);
|
|
149
|
-
},
|
|
150
|
-
};
|
|
151
|
-
// Create inline position builder
|
|
152
|
-
const createInlinePosition = (issue, _platformData) => {
|
|
153
|
-
return {
|
|
154
|
-
path: issue.file,
|
|
155
|
-
line: issue.line,
|
|
156
|
-
commitSha: pullRequest.headSha,
|
|
157
|
-
};
|
|
158
|
-
};
|
|
159
|
-
// Execute unified review
|
|
160
|
-
await executeUnifiedReview(config, {
|
|
161
|
-
platformClient,
|
|
162
|
-
projectId,
|
|
163
|
-
prNumber: options.prNumber,
|
|
164
|
-
pullRequest,
|
|
165
|
-
changedFiles,
|
|
166
|
-
postComments: options.postComments,
|
|
167
|
-
postErrorComment: options.postErrorComment,
|
|
168
|
-
outputPath: options.outputPath,
|
|
169
|
-
jsonOutput: options.jsonOutput,
|
|
170
|
-
baseBranch: options.baseBranch,
|
|
171
|
-
lineValidator,
|
|
172
|
-
createInlinePosition,
|
|
173
|
-
cursorFixLinks,
|
|
174
|
-
workingDir,
|
|
175
|
-
describe: options.describe,
|
|
176
|
-
postDescription: options.postDescription,
|
|
177
|
-
debug: options.debug,
|
|
178
|
-
thinkingLevel: options.thinkingLevel,
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
//# sourceMappingURL=review-pr.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"review-pr.js","sourceRoot":"","sources":["../../src/cli/review-pr.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"review-pr.test.d.ts","sourceRoot":"","sources":["../../src/cli/review-pr.test.ts"],"names":[],"mappings":""}
|