@quickchatai/pi-quickreview 0.0.0-stage → 1.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/LICENSE +23 -0
- package/README.md +75 -2
- package/assets/agents/pass-abstraction.md +64 -0
- package/assets/agents/pass-ask-human.md +134 -0
- package/assets/agents/pass-backcompat.md +67 -0
- package/assets/agents/pass-baseline.md +61 -0
- package/assets/agents/pass-behaviour-delta.md +64 -0
- package/assets/agents/pass-bounds.md +36 -0
- package/assets/agents/pass-claims.md +31 -0
- package/assets/agents/pass-concurrency.md +168 -0
- package/assets/agents/pass-consistency.md +57 -0
- package/assets/agents/pass-contracts.md +30 -0
- package/assets/agents/pass-data-safety.md +54 -0
- package/assets/agents/pass-deferred.md +35 -0
- package/assets/agents/pass-delivery.md +37 -0
- package/assets/agents/pass-duplication.md +60 -0
- package/assets/agents/pass-intent.md +63 -0
- package/assets/agents/pass-lint-conformance.md +46 -0
- package/assets/agents/pass-maintainability.md +67 -0
- package/assets/agents/pass-placement.md +68 -0
- package/assets/agents/pass-prod-risk.md +24 -0
- package/assets/agents/pass-rollout.md +32 -0
- package/assets/agents/pass-roundtrip.md +46 -0
- package/assets/agents/pass-security.md +31 -0
- package/assets/agents/pass-simplicity.md +68 -0
- package/assets/agents/pass-statelessness.md +27 -0
- package/assets/agents/pass-style.md +37 -0
- package/assets/agents/pass-sweep.md +57 -0
- package/assets/agents/pass-tests.md +58 -0
- package/assets/agents/pass-ui.md +23 -0
- package/assets/agents/pass-validate.md +50 -0
- package/assets/agents/pass-widened.md +46 -0
- package/assets/agents/scan/pass-scan.md +86 -0
- package/assets/config.example.toml +1067 -0
- package/assets/deploy/reviewer/AGENTS.override.md +12 -0
- package/assets/profiles/default/README.md +21 -0
- package/assets/profiles/default/addenda/.gitkeep +0 -0
- package/assets/profiles/default/profile.toml +17 -0
- package/assets/profiles/example-django/README.md +21 -0
- package/assets/profiles/example-django/addenda/10-migration-discipline.md +13 -0
- package/assets/profiles/example-django/addenda/20-new-column-nullability.md +12 -0
- package/assets/profiles/example-django/addenda/30-test-doctrine.md +12 -0
- package/assets/profiles/example-django/addenda/40-orm-usage.md +19 -0
- package/assets/profiles/example-django/addenda/50-declared-shape.md +10 -0
- package/assets/profiles/example-django/addenda/60-config-placement.md +14 -0
- package/assets/profiles/example-django/heuristics.toml +24 -0
- package/assets/profiles/example-django/profile.toml +9 -0
- package/assets/profiles/fast/README.md +24 -0
- package/assets/profiles/fast/profile.toml +59 -0
- package/assets/profiles/minimal/README.md +17 -0
- package/assets/profiles/minimal/addenda/.gitkeep +0 -0
- package/assets/profiles/minimal/profile.toml +8 -0
- package/assets/profiles/snappy/README.md +24 -0
- package/assets/profiles/snappy/addenda/10-race-as-question.md +6 -0
- package/assets/profiles/snappy/profile.toml +46 -0
- package/assets/prompts/companion-day-open.md +46 -0
- package/assets/prompts/companion-first-run.md +104 -0
- package/assets/prompts/companion.md +821 -0
- package/assets/prompts/conversation-system.md +117 -0
- package/assets/prompts/eod-sweep.md +120 -0
- package/assets/prompts/onboarding.md +74 -0
- package/assets/prompts/pass-common.md +52 -0
- package/assets/prompts/pass-quality-common.md +22 -0
- package/assets/prompts/round-first.md +874 -0
- package/assets/prompts/round-follow-up.md +991 -0
- package/assets/prompts/round-re-review.md +889 -0
- package/assets/prompts/round-recheck.md +196 -0
- package/assets/prompts/round-staleness.md +856 -0
- package/assets/schemas/review-result.v1.json +391 -0
- package/assets/schemas/scan-result.v1.json +421 -0
- package/assets/schemas/version.v1.json +57 -0
- package/assets/seed-manifest.json +19 -0
- package/assets/seeds/agents/pass-baseline.md +61 -0
- package/assets/seeds/agents/pass-contracts.md +30 -0
- package/assets/seeds/agents/pass-data-safety.md +54 -0
- package/assets/seeds/agents/pass-delivery.md +37 -0
- package/assets/seeds/agents/pass-prod-risk.md +24 -0
- package/assets/seeds/agents/pass-security.md +31 -0
- package/assets/seeds/agents/pass-statelessness.md +27 -0
- package/assets/seeds/agents/pass-ui.md +23 -0
- package/assets/seeds/agents/pass-validate.md +50 -0
- package/assets/seeds/prompts/conversation-system.md +117 -0
- package/assets/seeds/prompts/eod-sweep.md +120 -0
- package/assets/seeds/prompts/pass-common.md +52 -0
- package/dist/extensions/bash-guard.d.ts +467 -0
- package/dist/extensions/bash-guard.d.ts.map +1 -0
- package/dist/extensions/bash-guard.js +3058 -0
- package/dist/extensions/bash-guard.js.map +1 -0
- package/dist/extensions/finding-clusters.d.ts +33 -0
- package/dist/extensions/finding-clusters.d.ts.map +1 -0
- package/dist/extensions/finding-clusters.js +218 -0
- package/dist/extensions/finding-clusters.js.map +1 -0
- package/dist/extensions/ledger-pin.d.ts +76 -0
- package/dist/extensions/ledger-pin.d.ts.map +1 -0
- package/dist/extensions/ledger-pin.js +331 -0
- package/dist/extensions/ledger-pin.js.map +1 -0
- package/dist/extensions/lens.d.ts +43 -0
- package/dist/extensions/lens.d.ts.map +1 -0
- package/dist/extensions/lens.js +150 -0
- package/dist/extensions/lens.js.map +1 -0
- package/dist/extensions/pi-tool.d.ts +22 -0
- package/dist/extensions/pi-tool.d.ts.map +1 -0
- package/dist/extensions/pi-tool.js +20 -0
- package/dist/extensions/pi-tool.js.map +1 -0
- package/dist/extensions/quickreview.d.ts +21 -0
- package/dist/extensions/quickreview.d.ts.map +1 -0
- package/dist/extensions/quickreview.js +132 -0
- package/dist/extensions/quickreview.js.map +1 -0
- package/dist/src/anchors.d.ts +54 -0
- package/dist/src/anchors.d.ts.map +1 -0
- package/dist/src/anchors.js +127 -0
- package/dist/src/anchors.js.map +1 -0
- package/dist/src/assetroot.d.ts +16 -0
- package/dist/src/assetroot.d.ts.map +1 -0
- package/dist/src/assetroot.js +77 -0
- package/dist/src/assetroot.js.map +1 -0
- package/dist/src/authwatch.d.ts +61 -0
- package/dist/src/authwatch.d.ts.map +1 -0
- package/dist/src/authwatch.js +210 -0
- package/dist/src/authwatch.js.map +1 -0
- package/dist/src/budget.d.ts +15 -0
- package/dist/src/budget.d.ts.map +1 -0
- package/dist/src/budget.js +32 -0
- package/dist/src/budget.js.map +1 -0
- package/dist/src/casebudget.d.ts +3 -0
- package/dist/src/casebudget.d.ts.map +1 -0
- package/dist/src/casebudget.js +3 -0
- package/dist/src/casebudget.js.map +1 -0
- package/dist/src/cigate.d.ts +116 -0
- package/dist/src/cigate.d.ts.map +1 -0
- package/dist/src/cigate.js +176 -0
- package/dist/src/cigate.js.map +1 -0
- package/dist/src/codespan.d.ts +46 -0
- package/dist/src/codespan.d.ts.map +1 -0
- package/dist/src/codespan.js +75 -0
- package/dist/src/codespan.js.map +1 -0
- package/dist/src/contextpack.d.ts +56 -0
- package/dist/src/contextpack.d.ts.map +1 -0
- package/dist/src/contextpack.js +195 -0
- package/dist/src/contextpack.js.map +1 -0
- package/dist/src/contract.d.ts +8 -0
- package/dist/src/contract.d.ts.map +1 -0
- package/dist/src/contract.js +21 -0
- package/dist/src/contract.js.map +1 -0
- package/dist/src/coverage.d.ts +32 -0
- package/dist/src/coverage.d.ts.map +1 -0
- package/dist/src/coverage.js +85 -0
- package/dist/src/coverage.js.map +1 -0
- package/dist/src/datafence.d.ts +19 -0
- package/dist/src/datafence.d.ts.map +1 -0
- package/dist/src/datafence.js +60 -0
- package/dist/src/datafence.js.map +1 -0
- package/dist/src/dedup.d.ts +65 -0
- package/dist/src/dedup.d.ts.map +1 -0
- package/dist/src/dedup.js +459 -0
- package/dist/src/dedup.js.map +1 -0
- package/dist/src/depsources.d.ts +304 -0
- package/dist/src/depsources.d.ts.map +1 -0
- package/dist/src/depsources.js +3367 -0
- package/dist/src/depsources.js.map +1 -0
- package/dist/src/diffinput.d.ts +10 -0
- package/dist/src/diffinput.d.ts.map +1 -0
- package/dist/src/diffinput.js +172 -0
- package/dist/src/diffinput.js.map +1 -0
- package/dist/src/doubtwords.d.ts +10 -0
- package/dist/src/doubtwords.d.ts.map +1 -0
- package/dist/src/doubtwords.js +13 -0
- package/dist/src/doubtwords.js.map +1 -0
- package/dist/src/ecosystem.d.ts +148 -0
- package/dist/src/ecosystem.d.ts.map +1 -0
- package/dist/src/ecosystem.js +338 -0
- package/dist/src/ecosystem.js.map +1 -0
- package/dist/src/engine/agentdir.d.ts +5 -0
- package/dist/src/engine/agentdir.d.ts.map +1 -0
- package/dist/src/engine/agentdir.js +21 -0
- package/dist/src/engine/agentdir.js.map +1 -0
- package/dist/src/engine/auth.d.ts +214 -0
- package/dist/src/engine/auth.d.ts.map +1 -0
- package/dist/src/engine/auth.js +374 -0
- package/dist/src/engine/auth.js.map +1 -0
- package/dist/src/engine/budget.d.ts +60 -0
- package/dist/src/engine/budget.d.ts.map +1 -0
- package/dist/src/engine/budget.js +113 -0
- package/dist/src/engine/budget.js.map +1 -0
- package/dist/src/engine/capfd.d.ts +6 -0
- package/dist/src/engine/capfd.d.ts.map +1 -0
- package/dist/src/engine/capfd.js +21 -0
- package/dist/src/engine/capfd.js.map +1 -0
- package/dist/src/engine/caseout.d.ts +66 -0
- package/dist/src/engine/caseout.d.ts.map +1 -0
- package/dist/src/engine/caseout.js +107 -0
- package/dist/src/engine/caseout.js.map +1 -0
- package/dist/src/engine/context.d.ts +57 -0
- package/dist/src/engine/context.d.ts.map +1 -0
- package/dist/src/engine/context.js +212 -0
- package/dist/src/engine/context.js.map +1 -0
- package/dist/src/engine/envmap.d.ts +13 -0
- package/dist/src/engine/envmap.d.ts.map +1 -0
- package/dist/src/engine/envmap.js +372 -0
- package/dist/src/engine/envmap.js.map +1 -0
- package/dist/src/engine/extfiles.d.ts +7 -0
- package/dist/src/engine/extfiles.d.ts.map +1 -0
- package/dist/src/engine/extfiles.js +23 -0
- package/dist/src/engine/extfiles.js.map +1 -0
- package/dist/src/engine/keyroute.d.ts +21 -0
- package/dist/src/engine/keyroute.d.ts.map +1 -0
- package/dist/src/engine/keyroute.js +58 -0
- package/dist/src/engine/keyroute.js.map +1 -0
- package/dist/src/engine/lens/cache-group.d.ts +20 -0
- package/dist/src/engine/lens/cache-group.d.ts.map +1 -0
- package/dist/src/engine/lens/cache-group.js +31 -0
- package/dist/src/engine/lens/cache-group.js.map +1 -0
- package/dist/src/engine/lens/cache-run.d.ts +65 -0
- package/dist/src/engine/lens/cache-run.d.ts.map +1 -0
- package/dist/src/engine/lens/cache-run.js +159 -0
- package/dist/src/engine/lens/cache-run.js.map +1 -0
- package/dist/src/engine/lens/deadline.d.ts +54 -0
- package/dist/src/engine/lens/deadline.d.ts.map +1 -0
- package/dist/src/engine/lens/deadline.js +111 -0
- package/dist/src/engine/lens/deadline.js.map +1 -0
- package/dist/src/engine/lens/engine-tools.d.ts +13 -0
- package/dist/src/engine/lens/engine-tools.d.ts.map +1 -0
- package/dist/src/engine/lens/engine-tools.js +37 -0
- package/dist/src/engine/lens/engine-tools.js.map +1 -0
- package/dist/src/engine/lens/env.d.ts +23 -0
- package/dist/src/engine/lens/env.d.ts.map +1 -0
- package/dist/src/engine/lens/env.js +42 -0
- package/dist/src/engine/lens/env.js.map +1 -0
- package/dist/src/engine/lens/launch-plan.d.ts +63 -0
- package/dist/src/engine/lens/launch-plan.d.ts.map +1 -0
- package/dist/src/engine/lens/launch-plan.js +203 -0
- package/dist/src/engine/lens/launch-plan.js.map +1 -0
- package/dist/src/engine/lens/leaf-cache.d.ts +22 -0
- package/dist/src/engine/lens/leaf-cache.d.ts.map +1 -0
- package/dist/src/engine/lens/leaf-cache.js +115 -0
- package/dist/src/engine/lens/leaf-cache.js.map +1 -0
- package/dist/src/engine/lens/permits.d.ts +14 -0
- package/dist/src/engine/lens/permits.d.ts.map +1 -0
- package/dist/src/engine/lens/permits.js +18 -0
- package/dist/src/engine/lens/permits.js.map +1 -0
- package/dist/src/engine/lens/registry.d.ts +55 -0
- package/dist/src/engine/lens/registry.d.ts.map +1 -0
- package/dist/src/engine/lens/registry.js +140 -0
- package/dist/src/engine/lens/registry.js.map +1 -0
- package/dist/src/engine/lens/round-lens.d.ts +16 -0
- package/dist/src/engine/lens/round-lens.d.ts.map +1 -0
- package/dist/src/engine/lens/round-lens.js +46 -0
- package/dist/src/engine/lens/round-lens.js.map +1 -0
- package/dist/src/engine/lens/runlens.d.ts +103 -0
- package/dist/src/engine/lens/runlens.d.ts.map +1 -0
- package/dist/src/engine/lens/runlens.js +538 -0
- package/dist/src/engine/lens/runlens.js.map +1 -0
- package/dist/src/engine/lens/section.d.ts +19 -0
- package/dist/src/engine/lens/section.d.ts.map +1 -0
- package/dist/src/engine/lens/section.js +40 -0
- package/dist/src/engine/lens/section.js.map +1 -0
- package/dist/src/engine/lens/semaphore.d.ts +13 -0
- package/dist/src/engine/lens/semaphore.d.ts.map +1 -0
- package/dist/src/engine/lens/semaphore.js +44 -0
- package/dist/src/engine/lens/semaphore.js.map +1 -0
- package/dist/src/engine/lens/tool.d.ts +34 -0
- package/dist/src/engine/lens/tool.d.ts.map +1 -0
- package/dist/src/engine/lens/tool.js +345 -0
- package/dist/src/engine/lens/tool.js.map +1 -0
- package/dist/src/engine/lens/wave.d.ts +63 -0
- package/dist/src/engine/lens/wave.d.ts.map +1 -0
- package/dist/src/engine/lens/wave.js +95 -0
- package/dist/src/engine/lens/wave.js.map +1 -0
- package/dist/src/engine/livesessions.d.ts +21 -0
- package/dist/src/engine/livesessions.d.ts.map +1 -0
- package/dist/src/engine/livesessions.js +57 -0
- package/dist/src/engine/livesessions.js.map +1 -0
- package/dist/src/engine/livewire.d.ts +18 -0
- package/dist/src/engine/livewire.d.ts.map +1 -0
- package/dist/src/engine/livewire.js +31 -0
- package/dist/src/engine/livewire.js.map +1 -0
- package/dist/src/engine/openable.d.ts +37 -0
- package/dist/src/engine/openable.d.ts.map +1 -0
- package/dist/src/engine/openable.js +120 -0
- package/dist/src/engine/openable.js.map +1 -0
- package/dist/src/engine/pisdk.d.ts +226 -0
- package/dist/src/engine/pisdk.d.ts.map +1 -0
- package/dist/src/engine/pisdk.js +552 -0
- package/dist/src/engine/pisdk.js.map +1 -0
- package/dist/src/engine/port.d.ts +144 -0
- package/dist/src/engine/port.d.ts.map +1 -0
- package/dist/src/engine/port.js +16 -0
- package/dist/src/engine/port.js.map +1 -0
- package/dist/src/engine/prompts.d.ts +159 -0
- package/dist/src/engine/prompts.d.ts.map +1 -0
- package/dist/src/engine/prompts.js +339 -0
- package/dist/src/engine/prompts.js.map +1 -0
- package/dist/src/engine/render.d.ts +10 -0
- package/dist/src/engine/render.d.ts.map +1 -0
- package/dist/src/engine/render.js +23 -0
- package/dist/src/engine/render.js.map +1 -0
- package/dist/src/engine/reviewruntime.d.ts +13 -0
- package/dist/src/engine/reviewruntime.d.ts.map +1 -0
- package/dist/src/engine/reviewruntime.js +35 -0
- package/dist/src/engine/reviewruntime.js.map +1 -0
- package/dist/src/engine/reviewsdk.d.ts +75 -0
- package/dist/src/engine/reviewsdk.d.ts.map +1 -0
- package/dist/src/engine/reviewsdk.js +180 -0
- package/dist/src/engine/reviewsdk.js.map +1 -0
- package/dist/src/engine/round.d.ts +166 -0
- package/dist/src/engine/round.d.ts.map +1 -0
- package/dist/src/engine/round.js +543 -0
- package/dist/src/engine/round.js.map +1 -0
- package/dist/src/engine/roundagents.d.ts +17 -0
- package/dist/src/engine/roundagents.d.ts.map +1 -0
- package/dist/src/engine/roundagents.js +49 -0
- package/dist/src/engine/roundagents.js.map +1 -0
- package/dist/src/engine/roundevents.d.ts +110 -0
- package/dist/src/engine/roundevents.d.ts.map +1 -0
- package/dist/src/engine/roundevents.js +276 -0
- package/dist/src/engine/roundevents.js.map +1 -0
- package/dist/src/engine/roundsdk.d.ts +33 -0
- package/dist/src/engine/roundsdk.d.ts.map +1 -0
- package/dist/src/engine/roundsdk.js +76 -0
- package/dist/src/engine/roundsdk.js.map +1 -0
- package/dist/src/engine/sdkruntime.d.ts +23 -0
- package/dist/src/engine/sdkruntime.d.ts.map +1 -0
- package/dist/src/engine/sdkruntime.js +340 -0
- package/dist/src/engine/sdkruntime.js.map +1 -0
- package/dist/src/engine/select.d.ts +16 -0
- package/dist/src/engine/select.d.ts.map +1 -0
- package/dist/src/engine/select.js +32 -0
- package/dist/src/engine/select.js.map +1 -0
- package/dist/src/engine/sessionwrap.d.ts +4 -0
- package/dist/src/engine/sessionwrap.d.ts.map +1 -0
- package/dist/src/engine/sessionwrap.js +31 -0
- package/dist/src/engine/sessionwrap.js.map +1 -0
- package/dist/src/engine/toolfence.d.ts +90 -0
- package/dist/src/engine/toolfence.d.ts.map +1 -0
- package/dist/src/engine/toolfence.js +378 -0
- package/dist/src/engine/toolfence.js.map +1 -0
- package/dist/src/engine/tooluid.d.ts +128 -0
- package/dist/src/engine/tooluid.d.ts.map +1 -0
- package/dist/src/engine/tooluid.js +401 -0
- package/dist/src/engine/tooluid.js.map +1 -0
- package/dist/src/envstrip.d.ts +10 -0
- package/dist/src/envstrip.d.ts.map +1 -0
- package/dist/src/envstrip.js +15 -0
- package/dist/src/envstrip.js.map +1 -0
- package/dist/src/escalationprompt.d.ts +22 -0
- package/dist/src/escalationprompt.d.ts.map +1 -0
- package/dist/src/escalationprompt.js +54 -0
- package/dist/src/escalationprompt.js.map +1 -0
- package/dist/src/execfn.d.ts +29 -0
- package/dist/src/execfn.d.ts.map +1 -0
- package/dist/src/execfn.js +55 -0
- package/dist/src/execfn.js.map +1 -0
- package/dist/src/finding-chain.d.ts +40 -0
- package/dist/src/finding-chain.d.ts.map +1 -0
- package/dist/src/finding-chain.js +76 -0
- package/dist/src/finding-chain.js.map +1 -0
- package/dist/src/finding-row.d.ts +24 -0
- package/dist/src/finding-row.d.ts.map +1 -0
- package/dist/src/finding-row.js +26 -0
- package/dist/src/finding-row.js.map +1 -0
- package/dist/src/findingkey.d.ts +99 -0
- package/dist/src/findingkey.d.ts.map +1 -0
- package/dist/src/findingkey.js +210 -0
- package/dist/src/findingkey.js.map +1 -0
- package/dist/src/findingsrecord.d.ts +175 -0
- package/dist/src/findingsrecord.d.ts.map +1 -0
- package/dist/src/findingsrecord.js +410 -0
- package/dist/src/findingsrecord.js.map +1 -0
- package/dist/src/followup-mode.d.ts +4 -0
- package/dist/src/followup-mode.d.ts.map +1 -0
- package/dist/src/followup-mode.js +6 -0
- package/dist/src/followup-mode.js.map +1 -0
- package/dist/src/gate.d.ts +199 -0
- package/dist/src/gate.d.ts.map +1 -0
- package/dist/src/gate.js +315 -0
- package/dist/src/gate.js.map +1 -0
- package/dist/src/ghcred.d.ts +58 -0
- package/dist/src/ghcred.d.ts.map +1 -0
- package/dist/src/ghcred.js +139 -0
- package/dist/src/ghcred.js.map +1 -0
- package/dist/src/githubAuth.d.ts +32 -0
- package/dist/src/githubAuth.d.ts.map +1 -0
- package/dist/src/githubAuth.js +116 -0
- package/dist/src/githubAuth.js.map +1 -0
- package/dist/src/githubcore.d.ts +20 -0
- package/dist/src/githubcore.d.ts.map +1 -0
- package/dist/src/githubcore.js +20 -0
- package/dist/src/githubcore.js.map +1 -0
- package/dist/src/glob.d.ts +11 -0
- package/dist/src/glob.d.ts.map +1 -0
- package/dist/src/glob.js +69 -0
- package/dist/src/glob.js.map +1 -0
- package/dist/src/guards.d.ts +93 -0
- package/dist/src/guards.d.ts.map +1 -0
- package/dist/src/guards.js +306 -0
- package/dist/src/guards.js.map +1 -0
- package/dist/src/heartbeat.d.ts +29 -0
- package/dist/src/heartbeat.d.ts.map +1 -0
- package/dist/src/heartbeat.js +87 -0
- package/dist/src/heartbeat.js.map +1 -0
- package/dist/src/heuristics.d.ts +247 -0
- package/dist/src/heuristics.d.ts.map +1 -0
- package/dist/src/heuristics.js +927 -0
- package/dist/src/heuristics.js.map +1 -0
- package/dist/src/homes.d.ts +181 -0
- package/dist/src/homes.d.ts.map +1 -0
- package/dist/src/homes.js +242 -0
- package/dist/src/homes.js.map +1 -0
- package/dist/src/hunkheader.d.ts +11 -0
- package/dist/src/hunkheader.d.ts.map +1 -0
- package/dist/src/hunkheader.js +18 -0
- package/dist/src/hunkheader.js.map +1 -0
- package/dist/src/include.d.ts +435 -0
- package/dist/src/include.d.ts.map +1 -0
- package/dist/src/include.js +1692 -0
- package/dist/src/include.js.map +1 -0
- package/dist/src/launchvocab.d.ts +36 -0
- package/dist/src/launchvocab.d.ts.map +1 -0
- package/dist/src/launchvocab.js +59 -0
- package/dist/src/launchvocab.js.map +1 -0
- package/dist/src/ledgercarry.d.ts +24 -0
- package/dist/src/ledgercarry.d.ts.map +1 -0
- package/dist/src/ledgercarry.js +109 -0
- package/dist/src/ledgercarry.js.map +1 -0
- package/dist/src/lensids.d.ts +7 -0
- package/dist/src/lensids.d.ts.map +1 -0
- package/dist/src/lensids.js +53 -0
- package/dist/src/lensids.js.map +1 -0
- package/dist/src/lensplanning.d.ts +8 -0
- package/dist/src/lensplanning.d.ts.map +1 -0
- package/dist/src/lensplanning.js +126 -0
- package/dist/src/lensplanning.js.map +1 -0
- package/dist/src/lensresult.d.ts +94 -0
- package/dist/src/lensresult.d.ts.map +1 -0
- package/dist/src/lensresult.js +162 -0
- package/dist/src/lensresult.js.map +1 -0
- package/dist/src/lenstuning.d.ts +97 -0
- package/dist/src/lenstuning.d.ts.map +1 -0
- package/dist/src/lenstuning.js +326 -0
- package/dist/src/lenstuning.js.map +1 -0
- package/dist/src/lintconfig.d.ts +31 -0
- package/dist/src/lintconfig.d.ts.map +1 -0
- package/dist/src/lintconfig.js +543 -0
- package/dist/src/lintconfig.js.map +1 -0
- package/dist/src/live/events.d.ts +188 -0
- package/dist/src/live/events.d.ts.map +1 -0
- package/dist/src/live/events.js +136 -0
- package/dist/src/live/events.js.map +1 -0
- package/dist/src/live/writer.d.ts +54 -0
- package/dist/src/live/writer.d.ts.map +1 -0
- package/dist/src/live/writer.js +516 -0
- package/dist/src/live/writer.js.map +1 -0
- package/dist/src/localreview.d.ts +128 -0
- package/dist/src/localreview.d.ts.map +1 -0
- package/dist/src/localreview.js +426 -0
- package/dist/src/localreview.js.map +1 -0
- package/dist/src/loosenedtests.d.ts +13 -0
- package/dist/src/loosenedtests.d.ts.map +1 -0
- package/dist/src/loosenedtests.js +188 -0
- package/dist/src/loosenedtests.js.map +1 -0
- package/dist/src/memoryport.d.ts +264 -0
- package/dist/src/memoryport.d.ts.map +1 -0
- package/dist/src/memoryport.js +445 -0
- package/dist/src/memoryport.js.map +1 -0
- package/dist/src/migrations.d.ts +106 -0
- package/dist/src/migrations.d.ts.map +1 -0
- package/dist/src/migrations.js +373 -0
- package/dist/src/migrations.js.map +1 -0
- package/dist/src/oneshot.d.ts +12 -0
- package/dist/src/oneshot.d.ts.map +1 -0
- package/dist/src/oneshot.js +8 -0
- package/dist/src/oneshot.js.map +1 -0
- package/dist/src/packing.d.ts +11 -0
- package/dist/src/packing.d.ts.map +1 -0
- package/dist/src/packing.js +31 -0
- package/dist/src/packing.js.map +1 -0
- package/dist/src/passes.d.ts +16 -0
- package/dist/src/passes.d.ts.map +1 -0
- package/dist/src/passes.js +104 -0
- package/dist/src/passes.js.map +1 -0
- package/dist/src/passtasks.d.ts +68 -0
- package/dist/src/passtasks.d.ts.map +1 -0
- package/dist/src/passtasks.js +360 -0
- package/dist/src/passtasks.js.map +1 -0
- package/dist/src/pathinside.d.ts +5 -0
- package/dist/src/pathinside.d.ts.map +1 -0
- package/dist/src/pathinside.js +9 -0
- package/dist/src/pathinside.js.map +1 -0
- package/dist/src/pibuiltins.d.ts +36 -0
- package/dist/src/pibuiltins.d.ts.map +1 -0
- package/dist/src/pibuiltins.js +83 -0
- package/dist/src/pibuiltins.js.map +1 -0
- package/dist/src/plankey.d.ts +4 -0
- package/dist/src/plankey.d.ts.map +1 -0
- package/dist/src/plankey.js +10 -0
- package/dist/src/plankey.js.map +1 -0
- package/dist/src/planner.d.ts +375 -0
- package/dist/src/planner.d.ts.map +1 -0
- package/dist/src/planner.js +722 -0
- package/dist/src/planner.js.map +1 -0
- package/dist/src/plugin/args.d.ts +19 -0
- package/dist/src/plugin/args.d.ts.map +1 -0
- package/dist/src/plugin/args.js +107 -0
- package/dist/src/plugin/args.js.map +1 -0
- package/dist/src/plugin/index.d.ts +3 -0
- package/dist/src/plugin/index.d.ts.map +1 -0
- package/dist/src/plugin/index.js +14 -0
- package/dist/src/plugin/index.js.map +1 -0
- package/dist/src/plugin/login.d.ts +39 -0
- package/dist/src/plugin/login.d.ts.map +1 -0
- package/dist/src/plugin/login.js +73 -0
- package/dist/src/plugin/login.js.map +1 -0
- package/dist/src/plugin/review.d.ts +27 -0
- package/dist/src/plugin/review.d.ts.map +1 -0
- package/dist/src/plugin/review.js +298 -0
- package/dist/src/plugin/review.js.map +1 -0
- package/dist/src/plugin/runner.d.ts +6 -0
- package/dist/src/plugin/runner.d.ts.map +1 -0
- package/dist/src/plugin/runner.js +65 -0
- package/dist/src/plugin/runner.js.map +1 -0
- package/dist/src/plugin/scan.d.ts +79 -0
- package/dist/src/plugin/scan.d.ts.map +1 -0
- package/dist/src/plugin/scan.js +348 -0
- package/dist/src/plugin/scan.js.map +1 -0
- package/dist/src/plugin/session.d.ts +56 -0
- package/dist/src/plugin/session.d.ts.map +1 -0
- package/dist/src/plugin/session.js +2 -0
- package/dist/src/plugin/session.js.map +1 -0
- package/dist/src/plugin/setup.d.ts +19 -0
- package/dist/src/plugin/setup.d.ts.map +1 -0
- package/dist/src/plugin/setup.js +142 -0
- package/dist/src/plugin/setup.js.map +1 -0
- package/dist/src/plugin/versiongate.d.ts +26 -0
- package/dist/src/plugin/versiongate.d.ts.map +1 -0
- package/dist/src/plugin/versiongate.js +83 -0
- package/dist/src/plugin/versiongate.js.map +1 -0
- package/dist/src/postingkey.d.ts +8 -0
- package/dist/src/postingkey.d.ts.map +1 -0
- package/dist/src/postingkey.js +25 -0
- package/dist/src/postingkey.js.map +1 -0
- package/dist/src/postingpolicy.d.ts +108 -0
- package/dist/src/postingpolicy.d.ts.map +1 -0
- package/dist/src/postingpolicy.js +341 -0
- package/dist/src/postingpolicy.js.map +1 -0
- package/dist/src/pr-identity.d.ts +3 -0
- package/dist/src/pr-identity.d.ts.map +1 -0
- package/dist/src/pr-identity.js +9 -0
- package/dist/src/pr-identity.js.map +1 -0
- package/dist/src/prdelta.d.ts +181 -0
- package/dist/src/prdelta.d.ts.map +1 -0
- package/dist/src/prdelta.js +501 -0
- package/dist/src/prdelta.js.map +1 -0
- package/dist/src/pricing.d.ts +94 -0
- package/dist/src/pricing.d.ts.map +1 -0
- package/dist/src/pricing.js +209 -0
- package/dist/src/pricing.js.map +1 -0
- package/dist/src/priorfindings.d.ts +167 -0
- package/dist/src/priorfindings.d.ts.map +1 -0
- package/dist/src/priorfindings.js +445 -0
- package/dist/src/priorfindings.js.map +1 -0
- package/dist/src/priortasks.d.ts +31 -0
- package/dist/src/priortasks.d.ts.map +1 -0
- package/dist/src/priortasks.js +119 -0
- package/dist/src/priortasks.js.map +1 -0
- package/dist/src/profilelookup.d.ts +59 -0
- package/dist/src/profilelookup.d.ts.map +1 -0
- package/dist/src/profilelookup.js +98 -0
- package/dist/src/profilelookup.js.map +1 -0
- package/dist/src/profileoverrides.d.ts +91 -0
- package/dist/src/profileoverrides.d.ts.map +1 -0
- package/dist/src/profileoverrides.js +313 -0
- package/dist/src/profileoverrides.js.map +1 -0
- package/dist/src/profiles.d.ts +144 -0
- package/dist/src/profiles.d.ts.map +1 -0
- package/dist/src/profiles.js +604 -0
- package/dist/src/profiles.js.map +1 -0
- package/dist/src/promptdoc.d.ts +3 -0
- package/dist/src/promptdoc.d.ts.map +1 -0
- package/dist/src/promptdoc.js +18 -0
- package/dist/src/promptdoc.js.map +1 -0
- package/dist/src/prtarget.d.ts +70 -0
- package/dist/src/prtarget.d.ts.map +1 -0
- package/dist/src/prtarget.js +181 -0
- package/dist/src/prtarget.js.map +1 -0
- package/dist/src/recheckorder.d.ts +32 -0
- package/dist/src/recheckorder.d.ts.map +1 -0
- package/dist/src/recheckorder.js +5 -0
- package/dist/src/recheckorder.js.map +1 -0
- package/dist/src/reviewapi.d.ts +207 -0
- package/dist/src/reviewapi.d.ts.map +1 -0
- package/dist/src/reviewapi.js +939 -0
- package/dist/src/reviewapi.js.map +1 -0
- package/dist/src/reviewbotfindings.d.ts +33 -0
- package/dist/src/reviewbotfindings.d.ts.map +1 -0
- package/dist/src/reviewbotfindings.js +80 -0
- package/dist/src/reviewbotfindings.js.map +1 -0
- package/dist/src/reviewconfig.d.ts +741 -0
- package/dist/src/reviewconfig.d.ts.map +1 -0
- package/dist/src/reviewconfig.js +797 -0
- package/dist/src/reviewconfig.js.map +1 -0
- package/dist/src/reviewdelta.d.ts +51 -0
- package/dist/src/reviewdelta.d.ts.map +1 -0
- package/dist/src/reviewdelta.js +119 -0
- package/dist/src/reviewdelta.js.map +1 -0
- package/dist/src/reviewdest.d.ts +86 -0
- package/dist/src/reviewdest.d.ts.map +1 -0
- package/dist/src/reviewdest.js +142 -0
- package/dist/src/reviewdest.js.map +1 -0
- package/dist/src/reviewerstub.d.ts +12 -0
- package/dist/src/reviewerstub.d.ts.map +1 -0
- package/dist/src/reviewerstub.js +28 -0
- package/dist/src/reviewerstub.js.map +1 -0
- package/dist/src/reviewhost.d.ts +58 -0
- package/dist/src/reviewhost.d.ts.map +1 -0
- package/dist/src/reviewhost.js +135 -0
- package/dist/src/reviewhost.js.map +1 -0
- package/dist/src/reviewpost.d.ts +79 -0
- package/dist/src/reviewpost.d.ts.map +1 -0
- package/dist/src/reviewpost.js +233 -0
- package/dist/src/reviewpost.js.map +1 -0
- package/dist/src/reviewrender.d.ts +154 -0
- package/dist/src/reviewrender.d.ts.map +1 -0
- package/dist/src/reviewrender.js +480 -0
- package/dist/src/reviewrender.js.map +1 -0
- package/dist/src/reviewstate.d.ts +62 -0
- package/dist/src/reviewstate.d.ts.map +1 -0
- package/dist/src/reviewstate.js +167 -0
- package/dist/src/reviewstate.js.map +1 -0
- package/dist/src/reviewstore.d.ts +17 -0
- package/dist/src/reviewstore.d.ts.map +1 -0
- package/dist/src/reviewstore.js +105 -0
- package/dist/src/reviewstore.js.map +1 -0
- package/dist/src/round-progress.d.ts +120 -0
- package/dist/src/round-progress.d.ts.map +1 -0
- package/dist/src/round-progress.js +172 -0
- package/dist/src/round-progress.js.map +1 -0
- package/dist/src/round-stage-deadlines.d.ts +12 -0
- package/dist/src/round-stage-deadlines.d.ts.map +1 -0
- package/dist/src/round-stage-deadlines.js +10 -0
- package/dist/src/round-stage-deadlines.js.map +1 -0
- package/dist/src/session-command.d.ts +19 -0
- package/dist/src/session-command.d.ts.map +1 -0
- package/dist/src/session-command.js +20 -0
- package/dist/src/session-command.js.map +1 -0
- package/dist/src/settledread.d.ts +61 -0
- package/dist/src/settledread.d.ts.map +1 -0
- package/dist/src/settledread.js +135 -0
- package/dist/src/settledread.js.map +1 -0
- package/dist/src/severity.d.ts +167 -0
- package/dist/src/severity.d.ts.map +1 -0
- package/dist/src/severity.js +364 -0
- package/dist/src/severity.js.map +1 -0
- package/dist/src/severityrank.d.ts +8 -0
- package/dist/src/severityrank.d.ts.map +1 -0
- package/dist/src/severityrank.js +16 -0
- package/dist/src/severityrank.js.map +1 -0
- package/dist/src/standing-review.d.ts +45 -0
- package/dist/src/standing-review.d.ts.map +1 -0
- package/dist/src/standing-review.js +43 -0
- package/dist/src/standing-review.js.map +1 -0
- package/dist/src/storerows.d.ts +225 -0
- package/dist/src/storerows.d.ts.map +1 -0
- package/dist/src/storerows.js +7 -0
- package/dist/src/storerows.js.map +1 -0
- package/dist/src/styleguide.d.ts +25 -0
- package/dist/src/styleguide.d.ts.map +1 -0
- package/dist/src/styleguide.js +272 -0
- package/dist/src/styleguide.js.map +1 -0
- package/dist/src/sweepstatus.d.ts +42 -0
- package/dist/src/sweepstatus.d.ts.map +1 -0
- package/dist/src/sweepstatus.js +97 -0
- package/dist/src/sweepstatus.js.map +1 -0
- package/dist/src/templates.d.ts +243 -0
- package/dist/src/templates.d.ts.map +1 -0
- package/dist/src/templates.js +847 -0
- package/dist/src/templates.js.map +1 -0
- package/dist/src/types.d.ts +639 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +90 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/unifieddiff.d.ts +22 -0
- package/dist/src/unifieddiff.d.ts.map +1 -0
- package/dist/src/unifieddiff.js +176 -0
- package/dist/src/unifieddiff.js.map +1 -0
- package/dist/src/yieldloop.d.ts +2 -0
- package/dist/src/yieldloop.d.ts.map +1 -0
- package/dist/src/yieldloop.js +14 -0
- package/dist/src/yieldloop.js.map +1 -0
- package/package.json +60 -4
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import type { PrFileEntry } from "./githubcore.js";
|
|
2
|
+
/** The current branch against its base, as the round order takes a target. */
|
|
3
|
+
export interface BranchTarget {
|
|
4
|
+
/** `owner/name` from the origin remote, else `local/<directory>`. */
|
|
5
|
+
repo: string;
|
|
6
|
+
branch: string;
|
|
7
|
+
base: string;
|
|
8
|
+
headSha: string;
|
|
9
|
+
baseSha: string;
|
|
10
|
+
mergeBase: string;
|
|
11
|
+
files: PrFileEntry[];
|
|
12
|
+
/** Added plus deleted lines over the diff. */
|
|
13
|
+
lines: number;
|
|
14
|
+
/** Set when the target is the uncommitted working tree: the tree object of
|
|
15
|
+
* HEAD plus every uncommitted edit (the person's index is never touched),
|
|
16
|
+
* and the binary patch from HEAD to it. The tree's objects live only in a
|
|
17
|
+
* scratch store that is gone once the target is resolved, so the patch is
|
|
18
|
+
* what later builds the review tree. */
|
|
19
|
+
uncommitted?: {
|
|
20
|
+
treeSha: string;
|
|
21
|
+
patch: string;
|
|
22
|
+
};
|
|
23
|
+
/** Set when the target is a unified diff handed in (`--diff`): there is no
|
|
24
|
+
* branch and no head, so `headSha` is a hash of the diff's text. */
|
|
25
|
+
diff?: {
|
|
26
|
+
patch: string;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export type BranchResolution = {
|
|
30
|
+
ok: true;
|
|
31
|
+
target: BranchTarget;
|
|
32
|
+
} | {
|
|
33
|
+
ok: false;
|
|
34
|
+
error: string;
|
|
35
|
+
};
|
|
36
|
+
/** `owner/name` from the origin remote, or null when there is none. */
|
|
37
|
+
export declare function originRepo(cwd: string): string | null;
|
|
38
|
+
export declare function resolveBranch(cwd: string, asked?: string): BranchResolution;
|
|
39
|
+
/** The uncommitted working tree against HEAD: staged, unstaged and new
|
|
40
|
+
* (untracked, not ignored) files, read without touching the person's index or
|
|
41
|
+
* files. The snapshot is a tree built in a throwaway index, and its objects
|
|
42
|
+
* are written to a throwaway object store that borrows the repo's as an
|
|
43
|
+
* alternate, so nothing is written into the reviewed repository and a
|
|
44
|
+
* read-only checkout works. The snapshot's scratch store goes under
|
|
45
|
+
* `scratchParent` (default: the OS temp dir) and is gone when this returns. */
|
|
46
|
+
export declare function resolveUncommitted(cwd: string, o?: {
|
|
47
|
+
scratchParent?: string;
|
|
48
|
+
}): BranchResolution;
|
|
49
|
+
/** A unified diff handed in, as a target. The repository around `cwd` is not
|
|
50
|
+
* needed: when there is one it is only named (the repo, for the report), never
|
|
51
|
+
* written to. */
|
|
52
|
+
export declare function resolveDiff(cwd: string, text: string): BranchResolution;
|
|
53
|
+
/** The review's tree for a diff target: a plain directory, never a git
|
|
54
|
+
* worktree, so a read-only checkout is enough and nothing is written to its
|
|
55
|
+
* git dir. With a repository around `cwd` the tree starts as a copy of HEAD
|
|
56
|
+
* (`git archive`, a read) and the diff is applied on top when it applies;
|
|
57
|
+
* otherwise, or when it does not, the tree is the HEAD copy (or empty) and
|
|
58
|
+
* the review reads the changes from the diff itself. Returns a warning when
|
|
59
|
+
* the diff did not apply. The HEAD archive is staged beside `dir`. */
|
|
60
|
+
export declare function addDiffTree(cwd: string, dir: string, t: BranchTarget): string | null;
|
|
61
|
+
/** The review's tree for an uncommitted target: HEAD, then the edits on top. */
|
|
62
|
+
export declare function addUncommittedTree(cwd: string, dir: string, t: BranchTarget, o?: {
|
|
63
|
+
signal?: AbortSignal;
|
|
64
|
+
}): Promise<void>;
|
|
65
|
+
/** A throwaway detached checkout of `sha`, for the review to read. A shared
|
|
66
|
+
* clone, not a worktree: its objects come from the repository by alternates, so
|
|
67
|
+
* nothing is written into the reviewed repo's .git (the wrapper and the Action
|
|
68
|
+
* mount it read-only), and the tree is still a git checkout the lenses can ask. */
|
|
69
|
+
export declare function addReviewTree(cwd: string, dir: string, sha: string, o?: {
|
|
70
|
+
signal?: AbortSignal;
|
|
71
|
+
}): Promise<void>;
|
|
72
|
+
export declare function removeReviewTree(_cwd: string, dir: string): void;
|
|
73
|
+
/** What a repo has decided about local reviews, kept in its git dir (never
|
|
74
|
+
* tracked, never shared): the price under which a review starts without
|
|
75
|
+
* asking, and the price model's three rates. */
|
|
76
|
+
export interface ReviewSettings {
|
|
77
|
+
auto_limit_usd: number;
|
|
78
|
+
/** Dollars a review costs before any lens runs. */
|
|
79
|
+
usd_base: number;
|
|
80
|
+
/** Dollars one planned lens costs, whatever the diff. */
|
|
81
|
+
usd_per_lens: number;
|
|
82
|
+
/** Dollars the diff adds per thousand changed lines, once, not per lens. */
|
|
83
|
+
usd_per_kline: number;
|
|
84
|
+
}
|
|
85
|
+
/** The rates are a least-squares fit to what 295 recorded default-preset
|
|
86
|
+
* reviews cost (the final1 bench runs, gpt-6.1-sol list prices: $2 / M
|
|
87
|
+
* uncached input, $0.10 / M cached input, $10 / M output): the median PR is
|
|
88
|
+
* off by about a fifth, the sum by 1%, and no recorded review cost more than
|
|
89
|
+
* twice its estimate. The table is tests/fixtures/review-cost/recorded.json.
|
|
90
|
+
* A different model moves them; the repo's settings override them. */
|
|
91
|
+
export declare const DEFAULT_REVIEW_SETTINGS: ReviewSettings;
|
|
92
|
+
/** A review stops hard at this many times its estimate. The estimate is the
|
|
93
|
+
* expected cost, so stopping at it would cut about half the reviews short. */
|
|
94
|
+
export declare const HARD_STOP_FACTOR = 2;
|
|
95
|
+
export declare const SETTINGS_GIT_PATH = "qcr-review.json";
|
|
96
|
+
export declare function settingsPath(cwd: string): string | null;
|
|
97
|
+
/** The repo's settings over the defaults. A key that is not a positive number
|
|
98
|
+
* is ignored, so a typo never turns the limit off. */
|
|
99
|
+
export declare function loadReviewSettings(cwd: string): ReviewSettings;
|
|
100
|
+
/** The estimated cost of reviewing `lines` changed lines with `lenses` lenses:
|
|
101
|
+
* a base, a fixed cost per lens and one term for the diff. Rounded UP to the
|
|
102
|
+
* cent shown. */
|
|
103
|
+
export declare function priceReview(lenses: number, lines: number, s: ReviewSettings): number;
|
|
104
|
+
/** The most a review may spend before it is stopped, from its estimate. */
|
|
105
|
+
export declare function hardStopFor(estimateUsd: number): number;
|
|
106
|
+
/** What a start must quote: change the branch, the plan or the price and the
|
|
107
|
+
* key moves. */
|
|
108
|
+
export declare function reviewKey(parts: {
|
|
109
|
+
headSha: string;
|
|
110
|
+
baseSha: string;
|
|
111
|
+
lenses: readonly string[];
|
|
112
|
+
lines: number;
|
|
113
|
+
cap_usd: number;
|
|
114
|
+
/** A delta review: the head it reviews from. */
|
|
115
|
+
since?: string;
|
|
116
|
+
}): string;
|
|
117
|
+
export interface TerminalFinding {
|
|
118
|
+
path: string | null;
|
|
119
|
+
line: number | null;
|
|
120
|
+
severity: string;
|
|
121
|
+
title: string;
|
|
122
|
+
lens: string | null;
|
|
123
|
+
}
|
|
124
|
+
/** The findings a reader sees, grouped by severity, worst first (P0 … nit;
|
|
125
|
+
* a spelling outside the scale after them, as "other"). */
|
|
126
|
+
export declare function groupFindings(record: unknown): Record<string, TerminalFinding[]>;
|
|
127
|
+
export declare function renderGrouped(groups: Record<string, TerminalFinding[]>): string[];
|
|
128
|
+
//# sourceMappingURL=localreview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localreview.d.ts","sourceRoot":"","sources":["../../src/localreview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
// The pieces of a local review (`qcr review`) that are not the CLI: what the
|
|
2
|
+
// current branch is against its base (read with git, no network), what the
|
|
3
|
+
// review will cost, and how its findings read in a terminal. The engine is
|
|
4
|
+
// the shared one-shot runner (packages/pi-plugin/src/oneshot.ts); the plan key is the scan's
|
|
5
|
+
// (src/setup/scan.ts planKey) so a start must quote the price it was shown.
|
|
6
|
+
import { execFileSync } from "node:child_process";
|
|
7
|
+
import { createHash } from "node:crypto";
|
|
8
|
+
import { copyFileSync, existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, statSync, utimesSync, } from "node:fs";
|
|
9
|
+
import { tmpdir } from "node:os";
|
|
10
|
+
import { basename, dirname, join, resolve } from "node:path";
|
|
11
|
+
import { normalizeDisposition, recordNumber, recordString } from "./findingkey.js";
|
|
12
|
+
import { severityRank } from "./severityrank.js";
|
|
13
|
+
import { planKey } from "./plankey.js";
|
|
14
|
+
import { parseUnifiedDiff } from "./diffinput.js";
|
|
15
|
+
import { nodeExec, runOrThrow } from "./execfn.js";
|
|
16
|
+
/** A git command's stdout, trimmed; throws with git's own words. */
|
|
17
|
+
function git(cwd, args, opts = {}) {
|
|
18
|
+
const out = execFileSync("git", [...args], {
|
|
19
|
+
cwd,
|
|
20
|
+
encoding: "utf8",
|
|
21
|
+
...(opts.env ? { env: { ...process.env, ...opts.env } } : {}),
|
|
22
|
+
...(opts.input !== undefined ? { input: opts.input } : {}),
|
|
23
|
+
stdio: [opts.input !== undefined ? "pipe" : "ignore", "pipe", "pipe"],
|
|
24
|
+
maxBuffer: 256 * 1024 * 1024,
|
|
25
|
+
});
|
|
26
|
+
return opts.raw ? out : out.trim();
|
|
27
|
+
}
|
|
28
|
+
/** How long one git step of building a review tree may take. */
|
|
29
|
+
const TREE_GIT_TIMEOUT_MS = 10 * 60_000;
|
|
30
|
+
/** A git command run as a child the event loop waits on (a clone or checkout
|
|
31
|
+
* of a large repo takes a while, and the caller's stop must be heard while it
|
|
32
|
+
* runs); throws with git's own words, or the signal's AbortError. */
|
|
33
|
+
async function gitAsync(cwd, args, opts = {}) {
|
|
34
|
+
const res = await runOrThrow(nodeExec, "git", [...args], {
|
|
35
|
+
cwd,
|
|
36
|
+
timeoutMs: TREE_GIT_TIMEOUT_MS,
|
|
37
|
+
...(opts.input !== undefined ? { input: opts.input } : {}),
|
|
38
|
+
...(opts.signal ? { signal: opts.signal } : {}),
|
|
39
|
+
});
|
|
40
|
+
return res.stdout.trim();
|
|
41
|
+
}
|
|
42
|
+
function tryGit(cwd, args) {
|
|
43
|
+
try {
|
|
44
|
+
return git(cwd, args);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const STATUS = { A: "added", D: "removed", M: "modified" };
|
|
51
|
+
/** The base to review against: `--base`, else origin's default branch, else
|
|
52
|
+
* `main`, else `master`. */
|
|
53
|
+
function baseOf(cwd, asked) {
|
|
54
|
+
const exists = (ref) => tryGit(cwd, ["rev-parse", "--verify", "--quiet", `${ref}^{commit}`]) !== null;
|
|
55
|
+
if (asked !== undefined)
|
|
56
|
+
return exists(asked) ? asked : null;
|
|
57
|
+
const origin = tryGit(cwd, ["symbolic-ref", "--quiet", "--short", "refs/remotes/origin/HEAD"]);
|
|
58
|
+
if (origin && exists(origin))
|
|
59
|
+
return origin;
|
|
60
|
+
for (const c of ["main", "master"])
|
|
61
|
+
if (exists(c))
|
|
62
|
+
return c;
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
/** The files and changed-line count between two trees (or commits). */
|
|
66
|
+
function diffFiles(cwd, from, to, env) {
|
|
67
|
+
// -z: NUL-terminated records with the paths verbatim, never C-quoted.
|
|
68
|
+
const numstat = git(cwd, ["diff", "--no-renames", "-z", "--numstat", from, to], {
|
|
69
|
+
env,
|
|
70
|
+
raw: true,
|
|
71
|
+
});
|
|
72
|
+
const names = new Map();
|
|
73
|
+
const nameFields = git(cwd, ["diff", "--no-renames", "-z", "--name-status", from, to], {
|
|
74
|
+
env,
|
|
75
|
+
raw: true,
|
|
76
|
+
}).split("\0");
|
|
77
|
+
for (let i = 0; i + 1 < nameFields.length; i += 2)
|
|
78
|
+
names.set(nameFields[i + 1], STATUS[nameFields[i][0]] ?? "modified");
|
|
79
|
+
const files = [];
|
|
80
|
+
let lines = 0;
|
|
81
|
+
for (const l of numstat.split("\0").filter(Boolean)) {
|
|
82
|
+
const [a, d, ...p] = l.split("\t");
|
|
83
|
+
const path = p.join("\t");
|
|
84
|
+
const binary = a === "-";
|
|
85
|
+
const additions = binary ? 0 : Number(a);
|
|
86
|
+
const deletions = binary ? 0 : Number(d);
|
|
87
|
+
lines += additions + deletions;
|
|
88
|
+
const patch = binary
|
|
89
|
+
? undefined
|
|
90
|
+
: git(cwd, ["diff", "--no-renames", from, to, "--", path], { env });
|
|
91
|
+
files.push({
|
|
92
|
+
filename: path,
|
|
93
|
+
additions,
|
|
94
|
+
deletions,
|
|
95
|
+
status: names.get(path) ?? "modified",
|
|
96
|
+
...(patch ? { patch } : {}),
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
return { files, lines };
|
|
100
|
+
}
|
|
101
|
+
/** `owner/name` from the origin remote, or null when there is none. */
|
|
102
|
+
export function originRepo(cwd) {
|
|
103
|
+
const origin = tryGit(cwd, ["remote", "get-url", "origin"]);
|
|
104
|
+
const m = origin?.match(/[:/]([^/:]+\/[^/]+?)(?:\.git)?\/?$/);
|
|
105
|
+
return m ? m[1] : null;
|
|
106
|
+
}
|
|
107
|
+
/** `owner/name` from the origin remote, else `local/<directory>`. */
|
|
108
|
+
function repoName(cwd) {
|
|
109
|
+
const top = tryGit(cwd, ["rev-parse", "--show-toplevel"]) ?? cwd;
|
|
110
|
+
return originRepo(cwd) ?? `local/${basename(resolve(top))}`;
|
|
111
|
+
}
|
|
112
|
+
/** The repository check both resolvers start with: `cwd` is a work tree and
|
|
113
|
+
* HEAD names a commit. */
|
|
114
|
+
function admitRepo(cwd) {
|
|
115
|
+
if (tryGit(cwd, ["rev-parse", "--is-inside-work-tree"]) !== "true")
|
|
116
|
+
return { ok: false, error: `${cwd} is not a git repository` };
|
|
117
|
+
const headSha = tryGit(cwd, ["rev-parse", "--verify", "--quiet", "HEAD^{commit}"]);
|
|
118
|
+
if (headSha === null)
|
|
119
|
+
return { ok: false, error: "the repository has no commits yet" };
|
|
120
|
+
return { ok: true, headSha };
|
|
121
|
+
}
|
|
122
|
+
export function resolveBranch(cwd, asked) {
|
|
123
|
+
const head = admitRepo(cwd);
|
|
124
|
+
if (!head.ok)
|
|
125
|
+
return head;
|
|
126
|
+
const headSha = head.headSha;
|
|
127
|
+
const base = baseOf(cwd, asked);
|
|
128
|
+
if (base === null)
|
|
129
|
+
return {
|
|
130
|
+
ok: false,
|
|
131
|
+
error: asked !== undefined
|
|
132
|
+
? `base ${asked} is not a commit in this repository`
|
|
133
|
+
: "no base to review against: no origin default branch, main or master — pass --base REF",
|
|
134
|
+
};
|
|
135
|
+
const baseSha = git(cwd, ["rev-parse", `${base}^{commit}`]);
|
|
136
|
+
const mergeBase = tryGit(cwd, ["merge-base", base, "HEAD"]);
|
|
137
|
+
if (mergeBase === null)
|
|
138
|
+
return {
|
|
139
|
+
ok: false,
|
|
140
|
+
error: `HEAD and ${base} share no history, so there is no branch to review`,
|
|
141
|
+
};
|
|
142
|
+
const branch = tryGit(cwd, ["rev-parse", "--abbrev-ref", "HEAD"]) ?? "HEAD";
|
|
143
|
+
const { files, lines } = diffFiles(cwd, mergeBase, headSha);
|
|
144
|
+
if (files.length === 0)
|
|
145
|
+
return { ok: false, error: `nothing to review: ${branch} has no changes against ${base}` };
|
|
146
|
+
return {
|
|
147
|
+
ok: true,
|
|
148
|
+
target: {
|
|
149
|
+
repo: repoName(cwd),
|
|
150
|
+
branch,
|
|
151
|
+
base,
|
|
152
|
+
headSha,
|
|
153
|
+
baseSha,
|
|
154
|
+
mergeBase,
|
|
155
|
+
files,
|
|
156
|
+
lines,
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/** The uncommitted working tree against HEAD: staged, unstaged and new
|
|
161
|
+
* (untracked, not ignored) files, read without touching the person's index or
|
|
162
|
+
* files. The snapshot is a tree built in a throwaway index, and its objects
|
|
163
|
+
* are written to a throwaway object store that borrows the repo's as an
|
|
164
|
+
* alternate, so nothing is written into the reviewed repository and a
|
|
165
|
+
* read-only checkout works. The snapshot's scratch store goes under
|
|
166
|
+
* `scratchParent` (default: the OS temp dir) and is gone when this returns. */
|
|
167
|
+
export function resolveUncommitted(cwd, o = {}) {
|
|
168
|
+
const head = admitRepo(cwd);
|
|
169
|
+
if (!head.ok)
|
|
170
|
+
return head;
|
|
171
|
+
const headSha = head.headSha;
|
|
172
|
+
if (o.scratchParent !== undefined)
|
|
173
|
+
mkdirSync(o.scratchParent, { recursive: true });
|
|
174
|
+
const scratch = mkdtempSync(join(o.scratchParent ?? tmpdir(), "qcr-snap-"));
|
|
175
|
+
let treeSha;
|
|
176
|
+
let files;
|
|
177
|
+
let lines;
|
|
178
|
+
let patch;
|
|
179
|
+
try {
|
|
180
|
+
const objects = join(scratch, "objects");
|
|
181
|
+
mkdirSync(objects);
|
|
182
|
+
const commonDir = resolve(cwd, git(cwd, ["rev-parse", "--git-common-dir"]));
|
|
183
|
+
const env = {
|
|
184
|
+
GIT_INDEX_FILE: join(scratch, "index"),
|
|
185
|
+
GIT_OBJECT_DIRECTORY: objects,
|
|
186
|
+
GIT_ALTERNATE_OBJECT_DIRECTORIES: join(commonDir, "objects"),
|
|
187
|
+
};
|
|
188
|
+
const top = git(cwd, ["rev-parse", "--show-toplevel"]);
|
|
189
|
+
// Start from the person's own index (copied, never touched): its cached
|
|
190
|
+
// stat data keeps `add -A` from re-hashing every unchanged file, and git
|
|
191
|
+
// refreshes the mtime of each object it writes again, even one that sits
|
|
192
|
+
// in the alternate store. An index that is absent or unreadable falls back
|
|
193
|
+
// to HEAD's tree.
|
|
194
|
+
const index = resolve(cwd, git(cwd, ["rev-parse", "--git-path", "index"]));
|
|
195
|
+
try {
|
|
196
|
+
copyFileSync(index, env.GIT_INDEX_FILE);
|
|
197
|
+
// git re-hashes a file whose stat matches its entry only while the index
|
|
198
|
+
// file is no newer than that entry (the racy check): the copy keeps the
|
|
199
|
+
// original's mtime, a microsecond earlier, or a same-size edit made in
|
|
200
|
+
// the tick of the last index write would be read as unchanged
|
|
201
|
+
const t = (Math.floor(statSync(index).mtimeMs * 1000) - 1) / 1e6;
|
|
202
|
+
utimesSync(env.GIT_INDEX_FILE, t, t);
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
git(top, ["read-tree", headSha], { env });
|
|
206
|
+
}
|
|
207
|
+
git(top, ["add", "-A"], { env });
|
|
208
|
+
treeSha = git(top, ["write-tree"], { env });
|
|
209
|
+
({ files, lines } = diffFiles(cwd, headSha, treeSha, env));
|
|
210
|
+
patch =
|
|
211
|
+
files.length === 0
|
|
212
|
+
? ""
|
|
213
|
+
: git(cwd, ["diff", "--binary", "--no-renames", headSha, treeSha], { env, raw: true });
|
|
214
|
+
}
|
|
215
|
+
finally {
|
|
216
|
+
rmSync(scratch, { recursive: true, force: true });
|
|
217
|
+
}
|
|
218
|
+
if (files.length === 0)
|
|
219
|
+
return { ok: false, error: "nothing to review: the working tree has no uncommitted changes" };
|
|
220
|
+
const branch = tryGit(cwd, ["rev-parse", "--abbrev-ref", "HEAD"]) ?? "HEAD";
|
|
221
|
+
return {
|
|
222
|
+
ok: true,
|
|
223
|
+
target: {
|
|
224
|
+
repo: repoName(cwd),
|
|
225
|
+
branch,
|
|
226
|
+
base: "HEAD",
|
|
227
|
+
headSha,
|
|
228
|
+
baseSha: headSha,
|
|
229
|
+
mergeBase: headSha,
|
|
230
|
+
files,
|
|
231
|
+
lines,
|
|
232
|
+
uncommitted: { treeSha, patch },
|
|
233
|
+
},
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
/** A unified diff handed in, as a target. The repository around `cwd` is not
|
|
237
|
+
* needed: when there is one it is only named (the repo, for the report), never
|
|
238
|
+
* written to. */
|
|
239
|
+
export function resolveDiff(cwd, text) {
|
|
240
|
+
const { files, lines } = parseUnifiedDiff(text);
|
|
241
|
+
if (files.length === 0)
|
|
242
|
+
return { ok: false, error: "nothing to review: no file changes were found in the diff" };
|
|
243
|
+
const id = createHash("sha1").update(text).digest("hex");
|
|
244
|
+
const inRepo = tryGit(cwd, ["rev-parse", "--is-inside-work-tree"]) === "true";
|
|
245
|
+
return {
|
|
246
|
+
ok: true,
|
|
247
|
+
target: {
|
|
248
|
+
repo: inRepo ? repoName(cwd) : "local/diff",
|
|
249
|
+
branch: "diff",
|
|
250
|
+
base: "diff",
|
|
251
|
+
headSha: id,
|
|
252
|
+
baseSha: id,
|
|
253
|
+
mergeBase: id,
|
|
254
|
+
files,
|
|
255
|
+
lines,
|
|
256
|
+
diff: { patch: text },
|
|
257
|
+
},
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
/** The review's tree for a diff target: a plain directory, never a git
|
|
261
|
+
* worktree, so a read-only checkout is enough and nothing is written to its
|
|
262
|
+
* git dir. With a repository around `cwd` the tree starts as a copy of HEAD
|
|
263
|
+
* (`git archive`, a read) and the diff is applied on top when it applies;
|
|
264
|
+
* otherwise, or when it does not, the tree is the HEAD copy (or empty) and
|
|
265
|
+
* the review reads the changes from the diff itself. Returns a warning when
|
|
266
|
+
* the diff did not apply. The HEAD archive is staged beside `dir`. */
|
|
267
|
+
export function addDiffTree(cwd, dir, t) {
|
|
268
|
+
mkdirSync(dir, { recursive: true });
|
|
269
|
+
const top = tryGit(cwd, ["rev-parse", "--show-toplevel"]);
|
|
270
|
+
const head = top === null ? null : tryGit(top, ["rev-parse", "--verify", "--quiet", "HEAD^{commit}"]);
|
|
271
|
+
if (top === null || head === null)
|
|
272
|
+
return null;
|
|
273
|
+
const scratch = mkdtempSync(join(dirname(resolve(dir)), ".qcr-diff-"));
|
|
274
|
+
try {
|
|
275
|
+
const tarball = join(scratch, "head.tar");
|
|
276
|
+
git(top, ["archive", "--format=tar", "-o", tarball, head]);
|
|
277
|
+
execFileSync("tar", ["-xf", tarball, "-C", dir], { stdio: "ignore" });
|
|
278
|
+
if (!t.diff)
|
|
279
|
+
return null;
|
|
280
|
+
try {
|
|
281
|
+
// the ceiling keeps git from finding a repository above the scratch tree
|
|
282
|
+
git(dir, ["apply", "--whitespace=nowarn"], {
|
|
283
|
+
input: t.diff.patch,
|
|
284
|
+
env: { GIT_CEILING_DIRECTORIES: dirname(resolve(dir)) },
|
|
285
|
+
});
|
|
286
|
+
return null;
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
return "the diff does not apply to this repository's HEAD, so the repository is context only and the review reads the changes from the diff";
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
finally {
|
|
293
|
+
rmSync(scratch, { recursive: true, force: true });
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/** The review's tree for an uncommitted target: HEAD, then the edits on top. */
|
|
297
|
+
export async function addUncommittedTree(cwd, dir, t, o = {}) {
|
|
298
|
+
await addReviewTree(cwd, dir, t.headSha, o);
|
|
299
|
+
if (!t.uncommitted)
|
|
300
|
+
return;
|
|
301
|
+
const { patch } = t.uncommitted;
|
|
302
|
+
if (patch)
|
|
303
|
+
await gitAsync(dir, ["apply", "--whitespace=nowarn"], {
|
|
304
|
+
input: patch,
|
|
305
|
+
...(o.signal ? { signal: o.signal } : {}),
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
/** A throwaway detached checkout of `sha`, for the review to read. A shared
|
|
309
|
+
* clone, not a worktree: its objects come from the repository by alternates, so
|
|
310
|
+
* nothing is written into the reviewed repo's .git (the wrapper and the Action
|
|
311
|
+
* mount it read-only), and the tree is still a git checkout the lenses can ask. */
|
|
312
|
+
export async function addReviewTree(cwd, dir, sha, o = {}) {
|
|
313
|
+
const common = git(cwd, ["rev-parse", "--path-format=absolute", "--git-common-dir"]);
|
|
314
|
+
const signal = o.signal ? { signal: o.signal } : {};
|
|
315
|
+
await gitAsync(cwd, ["clone", "--quiet", "--shared", "--no-checkout", common, dir], signal);
|
|
316
|
+
await gitAsync(dir, ["checkout", "--quiet", "--detach", sha], signal);
|
|
317
|
+
}
|
|
318
|
+
export function removeReviewTree(_cwd, dir) {
|
|
319
|
+
rmSync(dir, { recursive: true, force: true });
|
|
320
|
+
}
|
|
321
|
+
/** The rates are a least-squares fit to what 295 recorded default-preset
|
|
322
|
+
* reviews cost (the final1 bench runs, gpt-6.1-sol list prices: $2 / M
|
|
323
|
+
* uncached input, $0.10 / M cached input, $10 / M output): the median PR is
|
|
324
|
+
* off by about a fifth, the sum by 1%, and no recorded review cost more than
|
|
325
|
+
* twice its estimate. The table is tests/fixtures/review-cost/recorded.json.
|
|
326
|
+
* A different model moves them; the repo's settings override them. */
|
|
327
|
+
export const DEFAULT_REVIEW_SETTINGS = {
|
|
328
|
+
auto_limit_usd: 2,
|
|
329
|
+
usd_base: 0.1,
|
|
330
|
+
usd_per_lens: 0.125,
|
|
331
|
+
usd_per_kline: 1.85,
|
|
332
|
+
};
|
|
333
|
+
/** A review stops hard at this many times its estimate. The estimate is the
|
|
334
|
+
* expected cost, so stopping at it would cut about half the reviews short. */
|
|
335
|
+
export const HARD_STOP_FACTOR = 2;
|
|
336
|
+
export const SETTINGS_GIT_PATH = "qcr-review.json";
|
|
337
|
+
export function settingsPath(cwd) {
|
|
338
|
+
const p = tryGit(cwd, ["rev-parse", "--git-path", SETTINGS_GIT_PATH]);
|
|
339
|
+
return p === null ? null : resolve(cwd, p);
|
|
340
|
+
}
|
|
341
|
+
/** The repo's settings over the defaults. A key that is not a positive number
|
|
342
|
+
* is ignored, so a typo never turns the limit off. */
|
|
343
|
+
export function loadReviewSettings(cwd) {
|
|
344
|
+
const out = { ...DEFAULT_REVIEW_SETTINGS };
|
|
345
|
+
const path = settingsPath(cwd);
|
|
346
|
+
if (path === null || !existsSync(path))
|
|
347
|
+
return out;
|
|
348
|
+
try {
|
|
349
|
+
const raw = JSON.parse(readFileSync(path, "utf8"));
|
|
350
|
+
for (const k of Object.keys(out)) {
|
|
351
|
+
const v = raw[k];
|
|
352
|
+
if (typeof v === "number" && Number.isFinite(v) && v > 0)
|
|
353
|
+
out[k] = v;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
catch {
|
|
357
|
+
// unreadable settings are the defaults
|
|
358
|
+
}
|
|
359
|
+
return out;
|
|
360
|
+
}
|
|
361
|
+
/** The estimated cost of reviewing `lines` changed lines with `lenses` lenses:
|
|
362
|
+
* a base, a fixed cost per lens and one term for the diff. Rounded UP to the
|
|
363
|
+
* cent shown. */
|
|
364
|
+
export function priceReview(lenses, lines, s) {
|
|
365
|
+
const usd = s.usd_base + s.usd_per_lens * lenses + (s.usd_per_kline * lines) / 1000;
|
|
366
|
+
return Math.max(0.01, Math.ceil(usd * 100 - 1e-9) / 100);
|
|
367
|
+
}
|
|
368
|
+
/** The most a review may spend before it is stopped, from its estimate. */
|
|
369
|
+
export function hardStopFor(estimateUsd) {
|
|
370
|
+
return Math.ceil(estimateUsd * HARD_STOP_FACTOR * 100 - 1e-9) / 100;
|
|
371
|
+
}
|
|
372
|
+
/** What a start must quote: change the branch, the plan or the price and the
|
|
373
|
+
* key moves. */
|
|
374
|
+
export function reviewKey(parts) {
|
|
375
|
+
return planKey({ ...parts, cap: Math.round(parts.cap_usd * 100) });
|
|
376
|
+
}
|
|
377
|
+
/** Dispositions that never reach a reader: the review's own kills. */
|
|
378
|
+
const HIDDEN = new Set(["killed", "withheld", "merged", "folded", "conceded"]);
|
|
379
|
+
/** The findings a reader sees, grouped by severity, worst first (P0 … nit;
|
|
380
|
+
* a spelling outside the scale after them, as "other"). */
|
|
381
|
+
export function groupFindings(record) {
|
|
382
|
+
const entries = record !== null &&
|
|
383
|
+
typeof record === "object" &&
|
|
384
|
+
Array.isArray(record.findings)
|
|
385
|
+
? record.findings
|
|
386
|
+
: record !== null &&
|
|
387
|
+
typeof record === "object" &&
|
|
388
|
+
Array.isArray(record.candidates)
|
|
389
|
+
? record.candidates
|
|
390
|
+
: [];
|
|
391
|
+
const rows = [];
|
|
392
|
+
for (const e of entries) {
|
|
393
|
+
if (e === null || typeof e !== "object")
|
|
394
|
+
continue;
|
|
395
|
+
if (HIDDEN.has(normalizeDisposition(e["disposition"])))
|
|
396
|
+
continue;
|
|
397
|
+
const sev = typeof e["severity"] === "string" ? e["severity"].trim() : "";
|
|
398
|
+
const rank = severityRank(sev);
|
|
399
|
+
const str = recordString;
|
|
400
|
+
rows.push({
|
|
401
|
+
rank: rank ?? 99,
|
|
402
|
+
path: str(e["path"]),
|
|
403
|
+
line: recordNumber(e["line"]),
|
|
404
|
+
severity: rank === undefined ? "other" : sev.toUpperCase() === "NIT" ? "nit" : sev.toUpperCase(),
|
|
405
|
+
title: str(e["title"]) ?? str(e["reason"]) ?? "(untitled finding)",
|
|
406
|
+
lens: str(e["lens"]) ?? str(e["name"]),
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
rows.sort((a, b) => a.rank - b.rank);
|
|
410
|
+
const out = {};
|
|
411
|
+
for (const { rank: _r, ...f } of rows)
|
|
412
|
+
(out[f.severity] ??= []).push(f);
|
|
413
|
+
return out;
|
|
414
|
+
}
|
|
415
|
+
export function renderGrouped(groups) {
|
|
416
|
+
const lines = [];
|
|
417
|
+
for (const [sev, list] of Object.entries(groups)) {
|
|
418
|
+
lines.push(`${sev} (${list.length})`);
|
|
419
|
+
for (const f of list) {
|
|
420
|
+
const where = f.path ? `${f.path}${f.line !== null ? `:${f.line}` : ""}` : "(no location)";
|
|
421
|
+
lines.push(` ${where} ${f.title}`);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
return lines;
|
|
425
|
+
}
|
|
426
|
+
//# sourceMappingURL=localreview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localreview.js","sourceRoot":"","sources":["../../src/localreview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type PrFile } from "./heuristics.js";
|
|
2
|
+
export type LoosenedKind = "exact-to-bound" | "exact-to-contains" | "tolerance-widened" | "count-lowered" | "bound-relaxed" | "timeout-lengthened" | "assert-removed" | "assert-commented" | "skip-added";
|
|
3
|
+
export interface LoosenedHit {
|
|
4
|
+
file: string;
|
|
5
|
+
/** Head line of the weakened assertion (the removed line's base line for a removal). */
|
|
6
|
+
line: number;
|
|
7
|
+
kind: LoosenedKind;
|
|
8
|
+
}
|
|
9
|
+
/** Every weakened assertion in the PR's test files, in diff order. */
|
|
10
|
+
export declare function detectLoosenedAssertions(files: readonly PrFile[]): LoosenedHit[];
|
|
11
|
+
/** The plan reason that hands the hits to pass-tests (at most `max` sites named). */
|
|
12
|
+
export declare function loosenedReason(hits: readonly LoosenedHit[], max?: number): string;
|
|
13
|
+
//# sourceMappingURL=loosenedtests.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loosenedtests.d.ts","sourceRoot":"","sources":["../../src/loosenedtests.ts"],"names":[],"mappings":"AASA,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE1D,MAAM,MAAM,YAAY,GACpB,gBAAgB,GAChB,mBAAmB,GACnB,mBAAmB,GACnB,eAAe,GACf,eAAe,GACf,oBAAoB,GACpB,gBAAgB,GAChB,kBAAkB,GAClB,YAAY,CAAC;AAEjB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,wFAAwF;IACxF,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,CAAC;CACpB;AAqFD,sEAAsE;AACtE,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,WAAW,EAAE,CA2FhF;AAcD,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,EAAE,GAAG,SAAK,GAAG,MAAM,CAO7E"}
|