@diff-review-system/drs 4.0.0-rc.4 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.pi/agents/describe/pr-describer.md +14 -0
- package/.pi/agents/review/unified-reviewer.md +33 -7
- package/.pi/agents/task/agents-md-updater.md +3 -1
- package/.pi/agents/task/review-assistant.md +22 -0
- package/.pi/agents/task/review-issue-fixer.md +18 -1
- package/.pi/agents/visual/pr-explainer.md +205 -0
- package/.pi/workflows/github-pr-describe.yaml +10 -7
- package/.pi/workflows/github-pr-fix-review-issues-stacked.yaml +154 -0
- package/.pi/workflows/github-pr-post-comment.yaml +10 -10
- package/.pi/workflows/github-pr-review-post.yaml +18 -8
- package/.pi/workflows/github-pr-review.yaml +354 -7
- package/.pi/workflows/github-pr-show-changes.yaml +8 -8
- package/.pi/workflows/github-pr-update-agents-md-stacked.yaml +103 -0
- package/.pi/workflows/github-pr-visual-explain.yaml +80 -0
- package/.pi/workflows/gitlab-mr-describe.yaml +8 -5
- package/.pi/workflows/gitlab-mr-fix-review-issues-stacked.yaml +150 -0
- package/.pi/workflows/gitlab-mr-post-comment.yaml +8 -8
- package/.pi/workflows/gitlab-mr-review.yaml +354 -5
- package/.pi/workflows/gitlab-mr-show-changes.yaml +6 -6
- package/.pi/workflows/gitlab-mr-update-agents-md-stacked.yaml +100 -0
- package/.pi/workflows/gitlab-mr-visual-explain.yaml +78 -0
- package/.pi/workflows/local-fix-review-issues.yaml +89 -13
- package/.pi/workflows/local-review.yaml +15 -2
- package/.pi/workflows/local-update-agents-md.yaml +1 -1
- package/.pi/workflows/local-visual-explain.yaml +76 -0
- package/.pi/workflows/release-changelog-finalize.yaml +47 -0
- package/.pi/workflows/tag-changelog-update.yaml +4 -4
- package/.pi/workflows/temporal-control-smoke.yaml +63 -0
- package/README.md +130 -27
- package/dist/ci/runner.d.ts.map +1 -1
- package/dist/ci/runner.js +3 -1
- package/dist/ci/runner.js.map +1 -1
- package/dist/cli/index.js +258 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts +6 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +29 -10
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/run-agent.d.ts +4 -7
- package/dist/cli/run-agent.d.ts.map +1 -1
- package/dist/cli/run-agent.js +4 -0
- package/dist/cli/run-agent.js.map +1 -1
- package/dist/cli/workflow-executor-selection.d.ts +3 -0
- package/dist/cli/workflow-executor-selection.d.ts.map +1 -0
- package/dist/cli/workflow-executor-selection.js +15 -0
- package/dist/cli/workflow-executor-selection.js.map +1 -0
- package/dist/cli/workflow.d.ts +76 -26
- package/dist/cli/workflow.d.ts.map +1 -1
- package/dist/cli/workflow.js +1624 -192
- package/dist/cli/workflow.js.map +1 -1
- 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-result.d.ts +8 -0
- package/dist/lib/agent-result.d.ts.map +1 -0
- package/dist/lib/agent-result.js +2 -0
- package/dist/lib/agent-result.js.map +1 -0
- package/dist/lib/comment-formatter.d.ts +8 -0
- package/dist/lib/comment-formatter.d.ts.map +1 -1
- package/dist/lib/comment-formatter.js +12 -4
- package/dist/lib/comment-formatter.js.map +1 -1
- package/dist/lib/comment-poster.d.ts.map +1 -1
- package/dist/lib/comment-poster.js +28 -1
- package/dist/lib/comment-poster.js.map +1 -1
- package/dist/lib/config.d.ts +71 -11
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +163 -28
- 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 +2 -1
- package/dist/lib/context-loader.d.ts.map +1 -1
- package/dist/lib/context-loader.js +70 -1
- 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/diff-lines.d.ts +9 -0
- package/dist/lib/diff-lines.d.ts.map +1 -1
- package/dist/lib/diff-lines.js +17 -9
- package/dist/lib/diff-lines.js.map +1 -1
- 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/output-paths.d.ts +0 -1
- package/dist/lib/output-paths.d.ts.map +1 -1
- package/dist/lib/output-paths.js +0 -1
- package/dist/lib/output-paths.js.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/project-setup.d.ts +10 -0
- package/dist/lib/project-setup.d.ts.map +1 -0
- package/dist/lib/project-setup.js +25 -0
- package/dist/lib/project-setup.js.map +1 -0
- package/dist/lib/review-artifact-store.d.ts +16 -0
- package/dist/lib/review-artifact-store.d.ts.map +1 -0
- package/dist/lib/review-artifact-store.js +84 -0
- package/dist/lib/review-artifact-store.js.map +1 -0
- 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 +172 -0
- package/dist/lib/review-artifact.js.map +1 -0
- package/dist/lib/review-core.d.ts +7 -4
- package/dist/lib/review-core.d.ts.map +1 -1
- package/dist/lib/review-core.js +82 -165
- 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 +20 -13
- package/dist/lib/review-orchestrator.js.map +1 -1
- package/dist/lib/review-parser.d.ts.map +1 -1
- package/dist/lib/review-parser.js +15 -12
- package/dist/lib/review-parser.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/skills.d.ts +16 -0
- package/dist/lib/skills.d.ts.map +1 -0
- package/dist/lib/skills.js +140 -0
- package/dist/lib/skills.js.map +1 -0
- 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/artifact-store.d.ts +71 -0
- package/dist/lib/workflow/artifact-store.d.ts.map +1 -0
- package/dist/lib/workflow/artifact-store.js +121 -0
- package/dist/lib/workflow/artifact-store.js.map +1 -0
- package/dist/lib/workflow/compiled-plan.d.ts +87 -0
- package/dist/lib/workflow/compiled-plan.d.ts.map +1 -0
- package/dist/lib/workflow/compiled-plan.js +62 -0
- package/dist/lib/workflow/compiled-plan.js.map +1 -0
- package/dist/lib/workflow/executor.d.ts +18 -0
- package/dist/lib/workflow/executor.d.ts.map +1 -0
- package/dist/lib/workflow/executor.js +2 -0
- package/dist/lib/workflow/executor.js.map +1 -0
- package/dist/lib/workflow/graph.d.ts +30 -0
- package/dist/lib/workflow/graph.d.ts.map +1 -0
- package/dist/lib/workflow/graph.js +139 -0
- package/dist/lib/workflow/graph.js.map +1 -0
- package/dist/lib/workflow/input.d.ts +4 -0
- package/dist/lib/workflow/input.d.ts.map +1 -0
- package/dist/lib/workflow/input.js +4 -0
- package/dist/lib/workflow/input.js.map +1 -0
- package/dist/lib/workflow/node-executor.d.ts +19 -0
- package/dist/lib/workflow/node-executor.d.ts.map +1 -0
- package/dist/lib/workflow/node-executor.js +2 -0
- package/dist/lib/workflow/node-executor.js.map +1 -0
- package/dist/lib/workflow/planning.d.ts +51 -0
- package/dist/lib/workflow/planning.d.ts.map +1 -0
- package/dist/lib/workflow/planning.js +814 -0
- package/dist/lib/workflow/planning.js.map +1 -0
- package/dist/lib/workflow/types.d.ts +66 -0
- package/dist/lib/workflow/types.d.ts.map +1 -0
- package/dist/lib/workflow/types.js +2 -0
- package/dist/lib/workflow/types.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/lib/write-json-output.d.ts.map +1 -1
- package/dist/lib/write-json-output.js +3 -8
- package/dist/lib/write-json-output.js.map +1 -1
- package/dist/pi/sdk.d.ts.map +1 -1
- package/dist/pi/sdk.js +576 -8
- package/dist/pi/sdk.js.map +1 -1
- package/dist/runtime/agent-loader.js +2 -2
- 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 +2 -0
- package/dist/runtime/client.d.ts.map +1 -1
- package/dist/runtime/client.js +11 -5
- package/dist/runtime/client.js.map +1 -1
- package/dist/temporal/activities.d.ts +26 -0
- package/dist/temporal/activities.d.ts.map +1 -0
- package/dist/temporal/activities.js +219 -0
- package/dist/temporal/activities.js.map +1 -0
- package/dist/temporal/config.d.ts +4 -0
- package/dist/temporal/config.d.ts.map +1 -0
- package/dist/temporal/config.js +36 -0
- package/dist/temporal/config.js.map +1 -0
- package/dist/temporal/executor.d.ts +7 -0
- package/dist/temporal/executor.d.ts.map +1 -0
- package/dist/temporal/executor.js +233 -0
- package/dist/temporal/executor.js.map +1 -0
- package/dist/temporal/retry-policy.d.ts +28 -0
- package/dist/temporal/retry-policy.d.ts.map +1 -0
- package/dist/temporal/retry-policy.js +56 -0
- package/dist/temporal/retry-policy.js.map +1 -0
- package/dist/temporal/types.d.ts +86 -0
- package/dist/temporal/types.d.ts.map +1 -0
- package/dist/temporal/types.js +2 -0
- package/dist/temporal/types.js.map +1 -0
- package/dist/temporal/worker.d.ts +3 -0
- package/dist/temporal/worker.d.ts.map +1 -0
- package/dist/temporal/worker.js +18 -0
- package/dist/temporal/worker.js.map +1 -0
- package/dist/temporal/workflow-id.d.ts +27 -0
- package/dist/temporal/workflow-id.d.ts.map +1 -0
- package/dist/temporal/workflow-id.js +53 -0
- package/dist/temporal/workflow-id.js.map +1 -0
- package/dist/temporal/workflows.d.ts +6 -0
- package/dist/temporal/workflows.d.ts.map +1 -0
- package/dist/temporal/workflows.js +342 -0
- package/dist/temporal/workflows.js.map +1 -0
- package/package.json +26 -15
- package/.pi/workflows/github-pr-describe-post.yaml +0 -24
- package/.pi/workflows/gitlab-mr-describe-post.yaml +0 -22
- package/.pi/workflows/gitlab-mr-review-code-quality.yaml +0 -31
- package/.pi/workflows/gitlab-mr-review-post-code-quality.yaml +0 -40
- package/.pi/workflows/gitlab-mr-review-post.yaml +0 -30
- package/.pi/workflows/local-staged-review.yaml +0 -17
- package/dist/cli/run-agent.test.d.ts +0 -2
- package/dist/cli/run-agent.test.d.ts.map +0 -1
- package/dist/cli/run-agent.test.js +0 -204
- package/dist/cli/run-agent.test.js.map +0 -1
- package/dist/cli/workflow.test.d.ts +0 -2
- package/dist/cli/workflow.test.d.ts.map +0 -1
- package/dist/cli/workflow.test.js +0 -1410
- package/dist/cli/workflow.test.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 -727
- 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 -255
- package/dist/lib/comment-poster.test.js.map +0 -1
- package/dist/lib/config-model-overrides.test.d.ts +0 -2
- package/dist/lib/config-model-overrides.test.d.ts.map +0 -1
- package/dist/lib/config-model-overrides.test.js +0 -218
- 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 -353
- 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 -212
- 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 -135
- 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-lines.test.d.ts +0 -2
- package/dist/lib/diff-lines.test.d.ts.map +0 -1
- package/dist/lib/diff-lines.test.js +0 -13
- package/dist/lib/diff-lines.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 -614
- 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 -552
- 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 -58
- package/dist/lib/unified-review-executor.d.ts.map +0 -1
- package/dist/lib/unified-review-executor.js +0 -201
- 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 -488
- 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 -277
- 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 -772
- 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
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { createIssueFingerprint } from './comment-manager.js';
|
|
2
|
+
function createReviewId(date) {
|
|
3
|
+
const timestamp = date.toISOString().replace(/[-:.TZ]/g, '');
|
|
4
|
+
const random = Math.random().toString(36).slice(2, 8);
|
|
5
|
+
return `rev_${timestamp}_${random}`;
|
|
6
|
+
}
|
|
7
|
+
function getSourceString(source) {
|
|
8
|
+
return source?.name;
|
|
9
|
+
}
|
|
10
|
+
function getSourceProject(source) {
|
|
11
|
+
const projectId = source?.context.projectId;
|
|
12
|
+
return typeof projectId === 'string' ? projectId : undefined;
|
|
13
|
+
}
|
|
14
|
+
function getSourcePullRequest(source) {
|
|
15
|
+
const pullRequest = source?.context.pullRequest;
|
|
16
|
+
if (!pullRequest || typeof pullRequest !== 'object') {
|
|
17
|
+
return {};
|
|
18
|
+
}
|
|
19
|
+
const record = pullRequest;
|
|
20
|
+
return {
|
|
21
|
+
headSha: typeof record.headSha === 'string' ? record.headSha : undefined,
|
|
22
|
+
sourceBranch: typeof record.sourceBranch === 'string' ? record.sourceBranch : undefined,
|
|
23
|
+
targetBranch: typeof record.targetBranch === 'string' ? record.targetBranch : undefined,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function findingId(index) {
|
|
27
|
+
return `F${String(index + 1).padStart(3, '0')}`;
|
|
28
|
+
}
|
|
29
|
+
function nextFindingId(findings) {
|
|
30
|
+
const max = findings.reduce((currentMax, finding) => {
|
|
31
|
+
const match = /^F(\d+)$/.exec(finding.id);
|
|
32
|
+
return match ? Math.max(currentMax, Number.parseInt(match[1] ?? '0', 10)) : currentMax;
|
|
33
|
+
}, 0);
|
|
34
|
+
return findingId(max);
|
|
35
|
+
}
|
|
36
|
+
function selectorMatches(finding, selector) {
|
|
37
|
+
const hasIds = selector.ids !== undefined && selector.ids.length > 0;
|
|
38
|
+
const hasFingerprints = selector.fingerprints !== undefined && selector.fingerprints.length > 0;
|
|
39
|
+
const hasSeverity = selector.severity !== undefined && selector.severity !== '';
|
|
40
|
+
if (!hasIds && !hasFingerprints && !hasSeverity) {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
return ((hasIds && (selector.ids?.includes(finding.id) ?? false)) ||
|
|
44
|
+
(hasFingerprints && (selector.fingerprints?.includes(finding.fingerprint) ?? false)) ||
|
|
45
|
+
(hasSeverity && finding.issue.severity === selector.severity));
|
|
46
|
+
}
|
|
47
|
+
export function createReviewArtifactPayload(review, source, date = new Date()) {
|
|
48
|
+
const now = date.toISOString();
|
|
49
|
+
const pullRequest = getSourcePullRequest(source);
|
|
50
|
+
const findings = review.issues.map((issue, index) => ({
|
|
51
|
+
id: findingId(index),
|
|
52
|
+
fingerprint: createIssueFingerprint(issue),
|
|
53
|
+
issue,
|
|
54
|
+
state: 'open',
|
|
55
|
+
disposition: 'confirmed',
|
|
56
|
+
source: 'agent',
|
|
57
|
+
createdAt: now,
|
|
58
|
+
updatedAt: now,
|
|
59
|
+
}));
|
|
60
|
+
return {
|
|
61
|
+
schemaVersion: 1,
|
|
62
|
+
reviewId: createReviewId(date),
|
|
63
|
+
reviewedAt: now,
|
|
64
|
+
reviewedSha: pullRequest.headSha,
|
|
65
|
+
baseBranch: pullRequest.targetBranch,
|
|
66
|
+
headBranch: pullRequest.sourceBranch,
|
|
67
|
+
summary: review.summary,
|
|
68
|
+
findings,
|
|
69
|
+
usage: review.usage,
|
|
70
|
+
metadata: {
|
|
71
|
+
source: getSourceString(source),
|
|
72
|
+
project: getSourceProject(source),
|
|
73
|
+
branch: pullRequest.sourceBranch || pullRequest.targetBranch
|
|
74
|
+
? {
|
|
75
|
+
source: pullRequest.sourceBranch,
|
|
76
|
+
target: pullRequest.targetBranch,
|
|
77
|
+
}
|
|
78
|
+
: undefined,
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
export function isReviewArtifactPayload(value) {
|
|
83
|
+
if (!value || typeof value !== 'object') {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
const candidate = value;
|
|
87
|
+
return (candidate.schemaVersion === 1 &&
|
|
88
|
+
typeof candidate.reviewId === 'string' &&
|
|
89
|
+
typeof candidate.reviewedAt === 'string' &&
|
|
90
|
+
!!candidate.summary &&
|
|
91
|
+
typeof candidate.summary === 'object' &&
|
|
92
|
+
Array.isArray(candidate.findings));
|
|
93
|
+
}
|
|
94
|
+
export function getReviewArtifactStatus(artifact) {
|
|
95
|
+
const byState = { open: 0, attempted: 0, resolved: 0 };
|
|
96
|
+
const byDisposition = {
|
|
97
|
+
confirmed: 0,
|
|
98
|
+
uncertain: 0,
|
|
99
|
+
pre_existing: 0,
|
|
100
|
+
partial: 0,
|
|
101
|
+
still_open: 0,
|
|
102
|
+
regression: 0,
|
|
103
|
+
resolved: 0,
|
|
104
|
+
};
|
|
105
|
+
for (const finding of artifact.findings) {
|
|
106
|
+
byState[finding.state] += 1;
|
|
107
|
+
byDisposition[finding.disposition] += 1;
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
reviewId: artifact.reviewId,
|
|
111
|
+
reviewedAt: artifact.reviewedAt,
|
|
112
|
+
reviewedSha: artifact.reviewedSha,
|
|
113
|
+
totalFindings: artifact.findings.length,
|
|
114
|
+
byState,
|
|
115
|
+
byDisposition,
|
|
116
|
+
bySeverity: artifact.summary.bySeverity,
|
|
117
|
+
openFindings: byState.open,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
export function addReviewArtifactFinding(artifact, issue, source = 'manual', date = new Date()) {
|
|
121
|
+
const now = date.toISOString();
|
|
122
|
+
const finding = {
|
|
123
|
+
id: nextFindingId(artifact.findings),
|
|
124
|
+
fingerprint: createIssueFingerprint(issue),
|
|
125
|
+
issue,
|
|
126
|
+
state: 'open',
|
|
127
|
+
disposition: 'confirmed',
|
|
128
|
+
source,
|
|
129
|
+
createdAt: now,
|
|
130
|
+
updatedAt: now,
|
|
131
|
+
};
|
|
132
|
+
return {
|
|
133
|
+
...artifact,
|
|
134
|
+
findings: [...artifact.findings, finding],
|
|
135
|
+
summary: {
|
|
136
|
+
...artifact.summary,
|
|
137
|
+
issuesFound: artifact.summary.issuesFound + 1,
|
|
138
|
+
bySeverity: {
|
|
139
|
+
...artifact.summary.bySeverity,
|
|
140
|
+
[issue.severity]: (artifact.summary.bySeverity[issue.severity] ?? 0) + 1,
|
|
141
|
+
},
|
|
142
|
+
byCategory: {
|
|
143
|
+
...artifact.summary.byCategory,
|
|
144
|
+
[issue.category]: (artifact.summary.byCategory[issue.category] ?? 0) + 1,
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
export function updateReviewArtifactFindings(artifact, options, date = new Date()) {
|
|
150
|
+
const now = date.toISOString();
|
|
151
|
+
const updatedIds = [];
|
|
152
|
+
const findings = artifact.findings.map((finding) => {
|
|
153
|
+
if (!selectorMatches(finding, options)) {
|
|
154
|
+
return finding;
|
|
155
|
+
}
|
|
156
|
+
updatedIds.push(finding.id);
|
|
157
|
+
return {
|
|
158
|
+
...finding,
|
|
159
|
+
state: options.state ?? finding.state,
|
|
160
|
+
disposition: options.disposition ?? finding.disposition,
|
|
161
|
+
updatedAt: now,
|
|
162
|
+
};
|
|
163
|
+
});
|
|
164
|
+
return {
|
|
165
|
+
artifact: {
|
|
166
|
+
...artifact,
|
|
167
|
+
findings,
|
|
168
|
+
},
|
|
169
|
+
updatedIds,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=review-artifact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-artifact.js","sourceRoot":"","sources":["../../src/lib/review-artifact.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Core review execution logic shared between local and platform reviews
|
|
3
3
|
*
|
|
4
|
-
* This module contains the common agent execution logic
|
|
5
|
-
* between review-orchestrator.ts (local) and unified-review-executor.ts (platform).
|
|
4
|
+
* This module contains the common agent execution logic used by the review orchestrator.
|
|
6
5
|
*/
|
|
7
6
|
import type { DRSConfig } from './config.js';
|
|
8
7
|
import { calculateSummary, type ReviewIssue } from './comment-formatter.js';
|
|
9
8
|
import type { ChangeSummary } from './change-summary.js';
|
|
10
9
|
import type { RuntimeClient } from '../runtime/client.js';
|
|
10
|
+
import type { ReviewVerificationContext, ReviewVerificationResult } from './review-orchestrator.js';
|
|
11
11
|
import { type AgentUsageSummary, type ReviewUsageSummary } from './review-usage.js';
|
|
12
12
|
/**
|
|
13
13
|
* File with optional diff content
|
|
@@ -34,11 +34,15 @@ export interface AgentReviewResult {
|
|
|
34
34
|
agentResults: AgentResult[];
|
|
35
35
|
/** Token usage and cost details for the review run */
|
|
36
36
|
usage?: ReviewUsageSummary;
|
|
37
|
+
/** Explicit verification verdicts for existing review findings. */
|
|
38
|
+
verification?: ReviewVerificationResult;
|
|
37
39
|
}
|
|
38
40
|
export interface AgentResult {
|
|
39
41
|
agentType: string;
|
|
40
42
|
success: boolean;
|
|
41
43
|
issues: ReviewIssue[];
|
|
44
|
+
error?: string;
|
|
45
|
+
verification?: ReviewVerificationResult;
|
|
42
46
|
usage?: AgentUsageSummary;
|
|
43
47
|
}
|
|
44
48
|
/**
|
|
@@ -48,8 +52,7 @@ export interface AgentResult {
|
|
|
48
52
|
* @param files - List of files with optional diff content
|
|
49
53
|
* @param diffCommand - Fallback git diff command hint (used when diff not provided)
|
|
50
54
|
*/
|
|
51
|
-
export declare function buildBaseInstructions(label: string, files: FileWithDiff[], diffCommand?: string, compressionSummary?: string): string;
|
|
52
|
-
export declare function runUnifiedReviewAgent(runtime: RuntimeClient, config: DRSConfig, baseInstructions: string, reviewLabel: string, filteredFiles: string[], additionalContext?: Record<string, unknown>, workingDir?: string, debug?: boolean): Promise<AgentReviewResult>;
|
|
55
|
+
export declare function buildBaseInstructions(label: string, files: FileWithDiff[], diffCommand?: string, compressionSummary?: string, verificationContext?: ReviewVerificationContext): string;
|
|
53
56
|
export declare function runReviewAgents(runtime: RuntimeClient, config: DRSConfig, baseInstructions: string, reviewLabel: string, filteredFiles: string[], additionalContext?: Record<string, unknown>, workingDir?: string, debug?: boolean): Promise<AgentReviewResult>;
|
|
54
57
|
export declare function runReviewPipeline(runtime: RuntimeClient, config: DRSConfig, baseInstructions: string, reviewLabel: string, filteredFiles: string[], additionalContext?: Record<string, unknown>, workingDir?: string, debug?: boolean): Promise<AgentReviewResult>;
|
|
55
58
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-core.d.ts","sourceRoot":"","sources":["../../src/lib/review-core.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"review-core.d.ts","sourceRoot":"","sources":["../../src/lib/review-core.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/review-core.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Core review execution logic shared between local and platform reviews
|
|
3
3
|
*
|
|
4
|
-
* This module contains the common agent execution logic
|
|
5
|
-
* between review-orchestrator.ts (local) and unified-review-executor.ts (platform).
|
|
4
|
+
* This module contains the common agent execution logic used by the review orchestrator.
|
|
6
5
|
*/
|
|
7
6
|
import chalk from 'chalk';
|
|
8
7
|
import { getModelOverrides, getReviewAgentIds, getUnifiedModelOverride, resolveAgentSkills, } from './config.js';
|
|
@@ -12,7 +11,7 @@ import { parseReviewOutput } from './review-parser.js';
|
|
|
12
11
|
import { calculateSummary } from './comment-formatter.js';
|
|
13
12
|
import { loadAgents } from '../runtime/agent-loader.js';
|
|
14
13
|
import { getLogger } from './logger.js';
|
|
15
|
-
import { aggregateAgentUsage, applyUsageMessage, createAgentUsageSummary, } from './review-usage.js';
|
|
14
|
+
import { aggregateAgentUsage, applySkillCall, applyToolCall, applyUsageMessage, createAgentUsageSummary, } from './review-usage.js';
|
|
16
15
|
import { estimatePromptBudget, formatPromptBudgetEstimate } from './prompt-budget.js';
|
|
17
16
|
/**
|
|
18
17
|
* Build base review instructions for agents
|
|
@@ -21,7 +20,7 @@ import { estimatePromptBudget, formatPromptBudgetEstimate } from './prompt-budge
|
|
|
21
20
|
* @param files - List of files with optional diff content
|
|
22
21
|
* @param diffCommand - Fallback git diff command hint (used when diff not provided)
|
|
23
22
|
*/
|
|
24
|
-
export function buildBaseInstructions(label, files, diffCommand, compressionSummary) {
|
|
23
|
+
export function buildBaseInstructions(label, files, diffCommand, compressionSummary, verificationContext) {
|
|
25
24
|
// Check if we have actual diff content
|
|
26
25
|
const filesWithDiffs = files.filter((f) => f.patch);
|
|
27
26
|
const hasDiffs = filesWithDiffs.length > 0;
|
|
@@ -42,12 +41,8 @@ The following shows exactly what changed in this PR/MR:
|
|
|
42
41
|
${diffContent}
|
|
43
42
|
|
|
44
43
|
${compressionSummary ? `${compressionSummary}\n\n` : ''}Output requirements:
|
|
45
|
-
-
|
|
46
|
-
|
|
47
|
-
- payload: the JSON object
|
|
48
|
-
- After calling the tool, return only the JSON pointer returned by the tool
|
|
49
|
-
(e.g. {"outputType":"review_output","outputPath":".drs/review-output.json"})
|
|
50
|
-
- Do not return raw JSON directly.
|
|
44
|
+
- Return only the raw JSON object.
|
|
45
|
+
- Do not call write_json_output.
|
|
51
46
|
- Do not include markdown, code fences, or extra text.
|
|
52
47
|
- Follow this exact schema:
|
|
53
48
|
{
|
|
@@ -81,18 +76,19 @@ ${compressionSummary ? `${compressionSummary}\n\n` : ''}Output requirements:
|
|
|
81
76
|
"references": ["https://link1", "https://link2"],
|
|
82
77
|
"agent": "security" | "quality" | "style" | "performance" | "documentation" | "unified"
|
|
83
78
|
}
|
|
84
|
-
]
|
|
79
|
+
]${verificationContext ? buildVerificationSchemaSnippet() : ''}
|
|
85
80
|
}
|
|
86
81
|
|
|
87
82
|
**Analysis approach:**
|
|
88
83
|
1. First, use Grep or Read to quickly understand the project's existing patterns relevant to the changed files (e.g., existing validation, error handling, auth patterns, naming conventions).
|
|
89
84
|
2. Then analyze the diff content above against those established patterns.
|
|
85
|
+
3. If the prompt says a diff was omitted or summarized, call git_diff for that file before making file-specific claims.
|
|
90
86
|
|
|
91
87
|
**Review rules:**
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
88
|
+
4. **IMPORTANT: Only report issues on lines that were actually changed or added (lines starting with + in the diff).** Do not report issues on unchanged code.
|
|
89
|
+
5. Only flag deviations or new risks introduced by the changes.
|
|
90
|
+
6. Populate summary counts based on the issues you report (use 0 when none).
|
|
91
|
+
7. Focus on the changes - only report issues for newly added or modified lines (lines with + prefix in the diff).`;
|
|
96
92
|
}
|
|
97
93
|
// No diff content available - instruct agent to read files directly
|
|
98
94
|
return `Review the following changed files from ${label}:
|
|
@@ -100,12 +96,8 @@ ${compressionSummary ? `${compressionSummary}\n\n` : ''}Output requirements:
|
|
|
100
96
|
${fileList}
|
|
101
97
|
|
|
102
98
|
Output requirements:
|
|
103
|
-
-
|
|
104
|
-
|
|
105
|
-
- payload: the JSON object
|
|
106
|
-
- After calling the tool, return only the JSON pointer returned by the tool
|
|
107
|
-
(e.g. {"outputType":"review_output","outputPath":".drs/review-output.json"})
|
|
108
|
-
- Do not return raw JSON directly.
|
|
99
|
+
- Return only the raw JSON object.
|
|
100
|
+
- Do not call write_json_output.
|
|
109
101
|
- Do not include markdown, code fences, or extra text.
|
|
110
102
|
- Follow this exact schema:
|
|
111
103
|
{
|
|
@@ -139,17 +131,30 @@ Output requirements:
|
|
|
139
131
|
"references": ["https://link1", "https://link2"],
|
|
140
132
|
"agent": "security" | "quality" | "style" | "performance" | "documentation" | "unified"
|
|
141
133
|
}
|
|
142
|
-
]
|
|
134
|
+
]${verificationContext ? buildVerificationSchemaSnippet() : ''}
|
|
143
135
|
}
|
|
144
136
|
|
|
145
137
|
**Instructions:**
|
|
146
|
-
1. The diffs for these files were omitted due to size constraints. Use the
|
|
147
|
-
2. Focus your review on newly added or modified code patterns.
|
|
138
|
+
1. The diffs for these files were omitted due to size constraints. Use git_diff to inspect the file diffs, then use Read/Grep for surrounding context as needed.
|
|
139
|
+
2. Focus your review on newly added or modified code patterns from the git_diff output.
|
|
148
140
|
3. **IMPORTANT: Only report issues on lines that were actually changed or added.** Do not report issues on existing code that was not modified.
|
|
149
141
|
4. Analyze the changed code for issues in your specialty area
|
|
150
142
|
5. Populate summary counts based on the issues you report (use 0 when none).
|
|
151
143
|
6. Focus on the changes - only report issues for newly added or modified lines.`;
|
|
152
144
|
}
|
|
145
|
+
function buildVerificationSchemaSnippet() {
|
|
146
|
+
return `,
|
|
147
|
+
"verification": {
|
|
148
|
+
"findings": [
|
|
149
|
+
{
|
|
150
|
+
"id": "F001",
|
|
151
|
+
"disposition": "resolved",
|
|
152
|
+
"rationale": "short explanation",
|
|
153
|
+
"issue": null
|
|
154
|
+
}
|
|
155
|
+
]
|
|
156
|
+
}`;
|
|
157
|
+
}
|
|
153
158
|
/**
|
|
154
159
|
* Get information about configured review agents
|
|
155
160
|
*/
|
|
@@ -255,143 +260,7 @@ function extractSkillNameFromToolOutput(content) {
|
|
|
255
260
|
}
|
|
256
261
|
return undefined;
|
|
257
262
|
}
|
|
258
|
-
|
|
259
|
-
const agentType = 'review/unified-reviewer';
|
|
260
|
-
const agentName = agentType;
|
|
261
|
-
console.log(chalk.bold('🎯 Selected Agents: review/unified-reviewer\n'));
|
|
262
|
-
console.log(chalk.gray('Running unified review...\n'));
|
|
263
|
-
let agentUsage = createAgentUsageSummary(agentType);
|
|
264
|
-
const configuredSkills = getConfiguredSkillsForAgent(config, agentType);
|
|
265
|
-
const reviewModelOverrides = resolveReviewModelOverrides(config);
|
|
266
|
-
const modelId = reviewModelOverrides[agentName];
|
|
267
|
-
let sawSkillToolCall = false;
|
|
268
|
-
const describeSummary = typeof additionalContext.describeSummary === 'string'
|
|
269
|
-
? additionalContext.describeSummary
|
|
270
|
-
: undefined;
|
|
271
|
-
try {
|
|
272
|
-
const reviewPrompt = buildReviewPrompt(agentType, baseInstructions, reviewLabel, filteredFiles, workingDir, config, describeSummary);
|
|
273
|
-
logPromptInputBudget({
|
|
274
|
-
runtime,
|
|
275
|
-
config,
|
|
276
|
-
agentType,
|
|
277
|
-
prompt: reviewPrompt,
|
|
278
|
-
modelId,
|
|
279
|
-
});
|
|
280
|
-
const logger = getLogger();
|
|
281
|
-
if (debug) {
|
|
282
|
-
console.log(chalk.gray('┌── DEBUG: Message sent to review agent'));
|
|
283
|
-
console.log(chalk.gray(`│ Agent: ${agentName}`));
|
|
284
|
-
console.log(chalk.gray('│ Prompt:'));
|
|
285
|
-
console.log(chalk.gray('─'.repeat(60)));
|
|
286
|
-
console.log(reviewPrompt);
|
|
287
|
-
console.log(chalk.gray('─'.repeat(60)));
|
|
288
|
-
console.log(chalk.gray(`└── End message for ${agentName}\n`));
|
|
289
|
-
}
|
|
290
|
-
else {
|
|
291
|
-
logger.agentInput(agentType, reviewPrompt);
|
|
292
|
-
}
|
|
293
|
-
const session = await runtime.createSession({
|
|
294
|
-
agent: agentName,
|
|
295
|
-
message: reviewPrompt,
|
|
296
|
-
});
|
|
297
|
-
const agentIssues = [];
|
|
298
|
-
let fullResponse = '';
|
|
299
|
-
for await (const message of runtime.streamMessages(session.id)) {
|
|
300
|
-
if (message.role === 'tool') {
|
|
301
|
-
// Detect skill loading: legacy 'skill' tool or Pi-native read of SKILL.md
|
|
302
|
-
const skillFromLegacy = message.toolName === 'skill'
|
|
303
|
-
? extractSkillNameFromToolOutput(message.content)
|
|
304
|
-
: undefined;
|
|
305
|
-
const skillFromRead = extractSkillNameFromReadToolOutput(message.toolName, message.content);
|
|
306
|
-
const skillName = skillFromLegacy ?? skillFromRead;
|
|
307
|
-
if (skillName) {
|
|
308
|
-
logger.skillLoaded(skillName, agentType);
|
|
309
|
-
sawSkillToolCall = true;
|
|
310
|
-
}
|
|
311
|
-
else {
|
|
312
|
-
logger.toolOutput(message.toolName ?? 'unknown', agentType, message.content);
|
|
313
|
-
}
|
|
314
|
-
continue;
|
|
315
|
-
}
|
|
316
|
-
if (message.role === 'assistant') {
|
|
317
|
-
agentUsage = applyUsageMessage(agentUsage, message);
|
|
318
|
-
if (!message.content.trim()) {
|
|
319
|
-
continue;
|
|
320
|
-
}
|
|
321
|
-
fullResponse += message.content;
|
|
322
|
-
if (debug) {
|
|
323
|
-
console.log(chalk.gray(`┌── DEBUG: Full response from ${agentName}`));
|
|
324
|
-
console.log(message.content);
|
|
325
|
-
console.log(chalk.gray(`└── End response for ${agentName}\n`));
|
|
326
|
-
}
|
|
327
|
-
else {
|
|
328
|
-
logger.agentMessage(agentType, message.content);
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
if (configuredSkills.length > 0 && !sawSkillToolCall) {
|
|
333
|
-
logger.noSkillCalls(agentType);
|
|
334
|
-
}
|
|
335
|
-
await runtime.closeSession(session.id);
|
|
336
|
-
try {
|
|
337
|
-
const reviewOutput = await parseReviewOutput(workingDir, debug, fullResponse);
|
|
338
|
-
const parsedIssues = parseReviewIssues(JSON.stringify(reviewOutput), agentType);
|
|
339
|
-
if (parsedIssues.length > 0) {
|
|
340
|
-
agentIssues.push(...parsedIssues);
|
|
341
|
-
console.log(chalk.green(`✓ [unified] Found ${parsedIssues.length} issue(s)`));
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
catch (parseError) {
|
|
345
|
-
console.error(chalk.red('Failed to parse unified review output'));
|
|
346
|
-
if (debug) {
|
|
347
|
-
console.log(chalk.dim('Unified agent output:'), fullResponse);
|
|
348
|
-
}
|
|
349
|
-
const reason = parseError instanceof Error ? `: ${parseError.message}` : '';
|
|
350
|
-
throw new Error(`Unified review agent did not return valid JSON output${reason}`);
|
|
351
|
-
}
|
|
352
|
-
const summary = calculateSummary(filteredFiles.length, agentIssues);
|
|
353
|
-
const agentResults = [
|
|
354
|
-
{
|
|
355
|
-
agentType,
|
|
356
|
-
success: true,
|
|
357
|
-
issues: agentIssues,
|
|
358
|
-
usage: {
|
|
359
|
-
...agentUsage,
|
|
360
|
-
success: true,
|
|
361
|
-
},
|
|
362
|
-
},
|
|
363
|
-
];
|
|
364
|
-
return {
|
|
365
|
-
issues: agentIssues,
|
|
366
|
-
summary,
|
|
367
|
-
filesReviewed: filteredFiles.length,
|
|
368
|
-
agentResults,
|
|
369
|
-
usage: summarizeRunUsage(agentResults),
|
|
370
|
-
};
|
|
371
|
-
}
|
|
372
|
-
catch (error) {
|
|
373
|
-
console.error(chalk.red(`✗ review/unified-reviewer agent failed: ${error}`));
|
|
374
|
-
const agentResults = [
|
|
375
|
-
{
|
|
376
|
-
agentType,
|
|
377
|
-
success: false,
|
|
378
|
-
issues: [],
|
|
379
|
-
usage: {
|
|
380
|
-
...agentUsage,
|
|
381
|
-
success: false,
|
|
382
|
-
},
|
|
383
|
-
},
|
|
384
|
-
];
|
|
385
|
-
return {
|
|
386
|
-
issues: [],
|
|
387
|
-
summary: calculateSummary(filteredFiles.length, []),
|
|
388
|
-
filesReviewed: filteredFiles.length,
|
|
389
|
-
agentResults,
|
|
390
|
-
usage: summarizeRunUsage(agentResults),
|
|
391
|
-
};
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
async function executeSingleAgent(runtime, config, baseInstructions, reviewLabel, filteredFiles, workingDir, debug, agentType, reviewModelOverrides, describeSummary) {
|
|
263
|
+
async function executeSingleAgent(runtime, config, baseInstructions, reviewLabel, filteredFiles, workingDir, debug, agentType, reviewModelOverrides, describeSummary, verificationContext) {
|
|
395
264
|
const agentName = agentType;
|
|
396
265
|
console.log(chalk.gray(`Running ${agentType} review...\n`));
|
|
397
266
|
let agentUsage = createAgentUsageSummary(agentType);
|
|
@@ -400,7 +269,7 @@ async function executeSingleAgent(runtime, config, baseInstructions, reviewLabel
|
|
|
400
269
|
let sawSkillToolCall = false;
|
|
401
270
|
try {
|
|
402
271
|
// Build prompt with global and agent-specific context
|
|
403
|
-
const reviewPrompt = buildReviewPrompt(agentType, baseInstructions, reviewLabel, filteredFiles, workingDir, config, describeSummary);
|
|
272
|
+
const reviewPrompt = buildReviewPrompt(agentType, baseInstructions, reviewLabel, filteredFiles, workingDir, config, describeSummary, verificationContext);
|
|
404
273
|
logPromptInputBudget({
|
|
405
274
|
runtime,
|
|
406
275
|
config,
|
|
@@ -430,6 +299,7 @@ async function executeSingleAgent(runtime, config, baseInstructions, reviewLabel
|
|
|
430
299
|
// Collect results from this agent
|
|
431
300
|
for await (const message of runtime.streamMessages(session.id)) {
|
|
432
301
|
if (message.role === 'tool') {
|
|
302
|
+
agentUsage = applyToolCall(agentUsage, message.toolName);
|
|
433
303
|
// Detect skill loading: legacy 'skill' tool or Pi-native read of SKILL.md
|
|
434
304
|
const skillFromLegacy = message.toolName === 'skill'
|
|
435
305
|
? extractSkillNameFromToolOutput(message.content)
|
|
@@ -437,6 +307,7 @@ async function executeSingleAgent(runtime, config, baseInstructions, reviewLabel
|
|
|
437
307
|
const skillFromRead = extractSkillNameFromReadToolOutput(message.toolName, message.content);
|
|
438
308
|
const skillName = skillFromLegacy ?? skillFromRead;
|
|
439
309
|
if (skillName) {
|
|
310
|
+
agentUsage = applySkillCall(agentUsage, skillName);
|
|
440
311
|
logger.skillLoaded(skillName, agentType);
|
|
441
312
|
sawSkillToolCall = true;
|
|
442
313
|
}
|
|
@@ -467,6 +338,7 @@ async function executeSingleAgent(runtime, config, baseInstructions, reviewLabel
|
|
|
467
338
|
await runtime.closeSession(session.id);
|
|
468
339
|
const reviewOutput = await parseReviewOutput(workingDir, debug, fullResponse);
|
|
469
340
|
const parsedIssues = parseReviewIssues(JSON.stringify(reviewOutput), agentType);
|
|
341
|
+
const verification = parseReviewVerification(reviewOutput);
|
|
470
342
|
if (parsedIssues.length > 0) {
|
|
471
343
|
agentIssues.push(...parsedIssues);
|
|
472
344
|
console.log(chalk.green(`✓ [${agentType}] Found ${parsedIssues.length} issue(s)`));
|
|
@@ -475,6 +347,7 @@ async function executeSingleAgent(runtime, config, baseInstructions, reviewLabel
|
|
|
475
347
|
agentType,
|
|
476
348
|
success: true,
|
|
477
349
|
issues: agentIssues,
|
|
350
|
+
verification,
|
|
478
351
|
usage: {
|
|
479
352
|
...agentUsage,
|
|
480
353
|
success: true,
|
|
@@ -482,11 +355,13 @@ async function executeSingleAgent(runtime, config, baseInstructions, reviewLabel
|
|
|
482
355
|
};
|
|
483
356
|
}
|
|
484
357
|
catch (error) {
|
|
485
|
-
|
|
358
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
359
|
+
console.error(chalk.red(`✗ ${agentType} agent failed: ${message}`));
|
|
486
360
|
return {
|
|
487
361
|
agentType,
|
|
488
362
|
success: false,
|
|
489
363
|
issues: [],
|
|
364
|
+
error: message,
|
|
490
365
|
usage: {
|
|
491
366
|
...agentUsage,
|
|
492
367
|
success: false,
|
|
@@ -512,18 +387,24 @@ export async function runReviewAgents(runtime, config, baseInstructions, reviewL
|
|
|
512
387
|
const describeSummary = typeof additionalContext.describeSummary === 'string'
|
|
513
388
|
? additionalContext.describeSummary
|
|
514
389
|
: undefined;
|
|
515
|
-
const
|
|
390
|
+
const verificationContext = isReviewVerificationContext(additionalContext.verificationContext)
|
|
391
|
+
? additionalContext.verificationContext
|
|
392
|
+
: undefined;
|
|
393
|
+
const agentResults = await Promise.all(agentNames.map((agentType) => executeSingleAgent(runtime, config, baseInstructions, reviewLabel, filteredFiles, workingDir, debug, agentType, reviewModelOverrides, describeSummary, verificationContext)));
|
|
516
394
|
// Check agent results
|
|
517
395
|
const successfulAgents = agentResults.filter((r) => r.success);
|
|
518
396
|
const failedAgents = agentResults.filter((r) => !r.success);
|
|
519
397
|
if (successfulAgents.length === 0) {
|
|
398
|
+
const failureDetails = failedAgents
|
|
399
|
+
.map((result) => `${result.agentType}: ${result.error ?? 'unknown error'}`)
|
|
400
|
+
.join('; ');
|
|
520
401
|
console.error(chalk.red('\n✗ All review agents failed!\n'));
|
|
521
402
|
console.error(chalk.yellow('This usually means:\n' +
|
|
522
403
|
' 1. Model configuration is incorrect or missing\n' +
|
|
523
404
|
' 2. API credentials are invalid or missing\n' +
|
|
524
405
|
' 3. Models are not accessible or timed out\n' +
|
|
525
406
|
' 4. Agents cannot find files to review\n'));
|
|
526
|
-
throw new Error('All review agents failed');
|
|
407
|
+
throw new Error(failureDetails ? `All review agents failed: ${failureDetails}` : 'All review agents failed');
|
|
527
408
|
}
|
|
528
409
|
if (failedAgents.length > 0) {
|
|
529
410
|
console.log(chalk.yellow(`\n⚠️ ${failedAgents.length} of ${agentResults.length} agents failed: ${failedAgents.map((r) => r.agentType).join(', ')}\n`));
|
|
@@ -532,17 +413,53 @@ export async function runReviewAgents(runtime, config, baseInstructions, reviewL
|
|
|
532
413
|
const issues = [];
|
|
533
414
|
agentResults.forEach((result) => issues.push(...result.issues));
|
|
534
415
|
const summary = calculateSummary(filteredFiles.length, issues);
|
|
416
|
+
const verificationFindings = agentResults.flatMap((result) => result.verification?.findings ?? []);
|
|
535
417
|
return {
|
|
536
418
|
issues,
|
|
537
419
|
summary,
|
|
538
420
|
filesReviewed: filteredFiles.length,
|
|
539
421
|
agentResults,
|
|
422
|
+
verification: verificationFindings.length > 0 ? { findings: verificationFindings } : undefined,
|
|
540
423
|
usage: summarizeRunUsage(agentResults),
|
|
541
424
|
};
|
|
542
425
|
}
|
|
543
426
|
export async function runReviewPipeline(runtime, config, baseInstructions, reviewLabel, filteredFiles, additionalContext = {}, workingDir = process.cwd(), debug = false) {
|
|
544
427
|
return runReviewAgents(runtime, config, baseInstructions, reviewLabel, filteredFiles, additionalContext, workingDir, debug);
|
|
545
428
|
}
|
|
429
|
+
function isReviewVerificationContext(value) {
|
|
430
|
+
if (!value || typeof value !== 'object') {
|
|
431
|
+
return false;
|
|
432
|
+
}
|
|
433
|
+
const candidate = value;
|
|
434
|
+
return !!candidate.artifact && Array.isArray(candidate.artifact.findings);
|
|
435
|
+
}
|
|
436
|
+
function parseReviewVerification(value) {
|
|
437
|
+
if (!value || typeof value !== 'object') {
|
|
438
|
+
return undefined;
|
|
439
|
+
}
|
|
440
|
+
const verification = value.verification;
|
|
441
|
+
if (!verification || typeof verification !== 'object') {
|
|
442
|
+
return undefined;
|
|
443
|
+
}
|
|
444
|
+
const findings = verification.findings;
|
|
445
|
+
if (!Array.isArray(findings)) {
|
|
446
|
+
return undefined;
|
|
447
|
+
}
|
|
448
|
+
const parsed = findings.filter(isReviewVerificationFinding);
|
|
449
|
+
return parsed.length > 0 ? { findings: parsed } : undefined;
|
|
450
|
+
}
|
|
451
|
+
function isReviewVerificationFinding(value) {
|
|
452
|
+
if (!value || typeof value !== 'object') {
|
|
453
|
+
return false;
|
|
454
|
+
}
|
|
455
|
+
const candidate = value;
|
|
456
|
+
return (typeof candidate.id === 'string' &&
|
|
457
|
+
isReviewVerificationDisposition(candidate.disposition) &&
|
|
458
|
+
(candidate.rationale === undefined || typeof candidate.rationale === 'string'));
|
|
459
|
+
}
|
|
460
|
+
function isReviewVerificationDisposition(value) {
|
|
461
|
+
return value === 'resolved' || value === 'still_open' || value === 'partial';
|
|
462
|
+
}
|
|
546
463
|
/**
|
|
547
464
|
* Display review summary to terminal
|
|
548
465
|
*/
|