@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,135 @@
|
|
|
1
|
+
// One review run's isolation from everything of the caller's: what a host
|
|
2
|
+
// gives pi so that nothing of the operator's own pi home, the asset tree or
|
|
3
|
+
// the reviewed repo reaches the review session or its lens children. The
|
|
4
|
+
// review API's `prepareHost` port (packages/pi-plugin/src/reviewapi.ts) is this, with the host's
|
|
5
|
+
// own words for a refused login (`qcr review`'s: src/hostroute.ts).
|
|
6
|
+
//
|
|
7
|
+
// A run gets
|
|
8
|
+
// - a private agent dir (`<run>/agent`, replacing ~/.pi/agent): a
|
|
9
|
+
// refresh-disabled copy of the operator's login (packages/pi-plugin/src/engine/auth.ts), a
|
|
10
|
+
// settings.json in the bench's style without an `extensions` entry (the SDK
|
|
11
|
+
// host discovers none; every lens session gets bash-guard as a factory,
|
|
12
|
+
// packages/pi-plugin/src/engine/lens/runlens.ts) that carries the project settings the clone
|
|
13
|
+
// used to inherit from `<root>/.pi/settings.json`, and
|
|
14
|
+
// the lens agents built into `<agent>/agents` (the user scope). It holds no
|
|
15
|
+
// context file, no extension and no skill;
|
|
16
|
+
// - a cwd of its own: the run's `out` dir, outside every checkout, holding a
|
|
17
|
+
// copy of the reviewer stub as AGENTS.override.md. pi loads the first
|
|
18
|
+
// context file of the cwd and of every ancestor, so the stub is the only
|
|
19
|
+
// one, and the full AGENTS.md the asset tree carries is never shadowed by a
|
|
20
|
+
// file written there.
|
|
21
|
+
//
|
|
22
|
+
// The stub is written nowhere else: never into the asset tree, never into
|
|
23
|
+
// the reviewed repo (the reviewer-stub ruling; asserted by
|
|
24
|
+
// tests/context-files.test.ts and tests/host-isolation.test.ts).
|
|
25
|
+
import { chmodSync, copyFileSync, existsSync, mkdirSync, realpathSync, rmSync, writeFileSync, } from "node:fs";
|
|
26
|
+
import { dirname, join, relative, resolve } from "node:path";
|
|
27
|
+
import { isInside } from "./pathinside.js";
|
|
28
|
+
import { buildBenchAgents } from "./engine/roundagents.js";
|
|
29
|
+
import { benchSettings } from "./pibuiltins.js";
|
|
30
|
+
import { copyPiAuth, ENGINE_AUTH_WORDS } from "./engine/auth.js";
|
|
31
|
+
import { HOST_CONTEXT_STUB, reviewerStubSource } from "./reviewerstub.js";
|
|
32
|
+
/** pi's candidates in one directory, in the order it tries them. */
|
|
33
|
+
const CONTEXT_CANDIDATES = [
|
|
34
|
+
"AGENTS.override.md",
|
|
35
|
+
"AGENTS.md",
|
|
36
|
+
"AGENTS.MD",
|
|
37
|
+
"CLAUDE.md",
|
|
38
|
+
"CLAUDE.MD",
|
|
39
|
+
];
|
|
40
|
+
/** pi's idle timeout for a model stream: the production project setting
|
|
41
|
+
* (`.pi/settings.json`), which the host route's cwd no longer carries.
|
|
42
|
+
* tests/host-isolation.test.ts pins it to that file. */
|
|
43
|
+
export const HOST_HTTP_IDLE_TIMEOUT_MS = 120_000;
|
|
44
|
+
/** The private agent dir's settings.json: what the SDK host reads from it (the
|
|
45
|
+
* durable retry, the idle timeout) and the trust default. No `extensions`
|
|
46
|
+
* entry: the SDK host discovers none (packages/pi-plugin/src/engine/pisdk.ts), so neither the
|
|
47
|
+
* guard nor pi's built-ins (packages/pi-plugin/src/pibuiltins.ts) are loaded from settings. Every
|
|
48
|
+
* lens session gets the guard as a factory (packages/pi-plugin/src/engine/lens/runlens.ts). */
|
|
49
|
+
export function hostSettings(root) {
|
|
50
|
+
const { extensions: _discovered, ...base } = JSON.parse(benchSettings(root).settings);
|
|
51
|
+
return JSON.stringify({ ...base, httpIdleTimeoutMs: HOST_HTTP_IDLE_TIMEOUT_MS }, null, 2) + "\n";
|
|
52
|
+
}
|
|
53
|
+
/** The path with symlinks resolved as far as it exists. */
|
|
54
|
+
const real = (p) => {
|
|
55
|
+
const abs = resolve(p);
|
|
56
|
+
try {
|
|
57
|
+
return realpathSync(abs);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
const parent = dirname(abs);
|
|
61
|
+
return parent === abs ? abs : join(real(parent), relative(parent, abs));
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
/** Every ancestor of `dir` that carries a context file. */
|
|
65
|
+
export function ancestorContextFiles(dir) {
|
|
66
|
+
const hits = [];
|
|
67
|
+
let d = resolve(dir);
|
|
68
|
+
for (;;) {
|
|
69
|
+
const parent = dirname(d);
|
|
70
|
+
if (parent === d)
|
|
71
|
+
break;
|
|
72
|
+
d = parent;
|
|
73
|
+
const file = CONTEXT_CANDIDATES.find((n) => existsSync(join(d, n)));
|
|
74
|
+
if (file)
|
|
75
|
+
hits.push(join(d, file));
|
|
76
|
+
}
|
|
77
|
+
return hits;
|
|
78
|
+
}
|
|
79
|
+
/** The working tree `dir` stands in: its nearest ancestor with a `.git`. */
|
|
80
|
+
function checkoutOf(dir) {
|
|
81
|
+
let d = real(dir);
|
|
82
|
+
for (;;) {
|
|
83
|
+
if (existsSync(join(d, ".git")))
|
|
84
|
+
return d;
|
|
85
|
+
const parent = dirname(d);
|
|
86
|
+
if (parent === d)
|
|
87
|
+
return real(dir);
|
|
88
|
+
d = parent;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Prepare one run's private agent dir and cwd. Throws `AuthExpiring`
|
|
93
|
+
* (packages/pi-plugin/src/engine/auth.ts) when the operator's login would expire inside `needMs`,
|
|
94
|
+
* and a plain Error when the cwd would sit inside a checkout. `srcAgentDir` is
|
|
95
|
+
* only read.
|
|
96
|
+
*/
|
|
97
|
+
export function prepareReviewHost(o) {
|
|
98
|
+
const cwd = resolve(o.cwd);
|
|
99
|
+
for (const c of [o.root, ...o.checkouts])
|
|
100
|
+
if (isInside(real(cwd), checkoutOf(c)))
|
|
101
|
+
throw new Error(`the run directory ${cwd} is inside the checkout ${c}`);
|
|
102
|
+
rmSync(o.agentDir, { recursive: true, force: true });
|
|
103
|
+
mkdirSync(o.agentDir, { recursive: true, mode: 0o700 });
|
|
104
|
+
const auth = join(o.srcAgentDir, "auth.json");
|
|
105
|
+
if (existsSync(auth)) {
|
|
106
|
+
copyPiAuth({
|
|
107
|
+
srcDir: o.srcAgentDir,
|
|
108
|
+
dstDir: o.agentDir,
|
|
109
|
+
needMs: o.needMs,
|
|
110
|
+
...(o.now ? { now: o.now } : {}),
|
|
111
|
+
words: o.authWords ?? ENGINE_AUTH_WORDS,
|
|
112
|
+
...(o.authProviders ? { providers: o.authProviders } : {}),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
// No login: an API key in the environment is the route (as the bench's).
|
|
117
|
+
writeFileSync(join(o.agentDir, "auth.json"), "{}\n", { mode: 0o600 });
|
|
118
|
+
chmodSync(join(o.agentDir, "auth.json"), 0o600);
|
|
119
|
+
}
|
|
120
|
+
// Custom providers the operator configured stay usable; nothing else of the
|
|
121
|
+
// operator's pi home (extensions, skills, prompts, settings) is carried.
|
|
122
|
+
const models = join(o.srcAgentDir, "models.json");
|
|
123
|
+
if (existsSync(models)) {
|
|
124
|
+
copyFileSync(models, join(o.agentDir, "models.json"));
|
|
125
|
+
chmodSync(join(o.agentDir, "models.json"), 0o600);
|
|
126
|
+
}
|
|
127
|
+
writeFileSync(join(o.agentDir, "settings.json"), hostSettings(o.root));
|
|
128
|
+
// The lens agents, for the user scope (QCR_SUBAGENT_SCOPE=user): the lens
|
|
129
|
+
// tool reads them from the agent dir's `agents`.
|
|
130
|
+
buildBenchAgents(o.root, o.cfg, join(o.agentDir, "agents"), o.profile);
|
|
131
|
+
mkdirSync(cwd, { recursive: true });
|
|
132
|
+
copyFileSync(reviewerStubSource(o.root), join(cwd, HOST_CONTEXT_STUB));
|
|
133
|
+
return { agentDir: o.agentDir, cwd, strayContext: ancestorContextFiles(cwd) };
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=reviewhost.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewhost.js","sourceRoot":"","sources":["../../src/reviewhost.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { MutationGate } from "./gate.js";
|
|
2
|
+
import { type PostedRenderConfig, type RenderedComment } from "./reviewrender.js";
|
|
3
|
+
/** The line every posted comment (and the review body) shows to a reader. */
|
|
4
|
+
export declare const QCR_VISIBLE_MARKER = "_Posted by qcr (local review)._";
|
|
5
|
+
/** The same line when a profile replaced a shipped agent or prompt for the
|
|
6
|
+
* run (packages/pi-plugin/src/profileoverrides.ts): the reader sees the review is not stock. */
|
|
7
|
+
export declare const QCR_CUSTOMISED_MARKER = "_Posted by qcr (local review, customised profile)._";
|
|
8
|
+
/** The only review event this route ever sends. */
|
|
9
|
+
export declare const POST_EVENT: "COMMENT";
|
|
10
|
+
export interface PostReview {
|
|
11
|
+
event: typeof POST_EVENT;
|
|
12
|
+
body: string;
|
|
13
|
+
comments: RenderedComment[];
|
|
14
|
+
/** Posted findings the body carries instead of an inline comment. */
|
|
15
|
+
bodyFindings?: number;
|
|
16
|
+
}
|
|
17
|
+
/** The review to post from a findings record: rendered by the production
|
|
18
|
+
* renderer, hidden markers on, every comment marked as qcr's. The verdict in
|
|
19
|
+
* the record never reaches the event. */
|
|
20
|
+
export declare function assemblePostReview(record: unknown, o: {
|
|
21
|
+
cfg: PostedRenderConfig;
|
|
22
|
+
roundNo: number;
|
|
23
|
+
lenses: readonly string[];
|
|
24
|
+
verdict?: string | null;
|
|
25
|
+
summary?: string | null;
|
|
26
|
+
/** A profile replaced a shipped file for this run: say so in the marker. */
|
|
27
|
+
customised?: boolean;
|
|
28
|
+
}): PostReview;
|
|
29
|
+
export interface PostRequest {
|
|
30
|
+
repo: string;
|
|
31
|
+
number: number;
|
|
32
|
+
headSha: string;
|
|
33
|
+
/** Reads the PR's existing comments; the write goes through `gate`. */
|
|
34
|
+
token: string;
|
|
35
|
+
review: PostReview;
|
|
36
|
+
/** The gate the review is posted through (see `localPostGate`). */
|
|
37
|
+
gate: MutationGate;
|
|
38
|
+
fetchFn?: typeof fetch;
|
|
39
|
+
apiBase?: string;
|
|
40
|
+
}
|
|
41
|
+
export type PostResult = {
|
|
42
|
+
ok: true;
|
|
43
|
+
posted: number;
|
|
44
|
+
skipped: number;
|
|
45
|
+
url: string | null;
|
|
46
|
+
recorded?: undefined;
|
|
47
|
+
} | {
|
|
48
|
+
ok: true;
|
|
49
|
+
posted: 0;
|
|
50
|
+
skipped: number;
|
|
51
|
+
url: null;
|
|
52
|
+
recorded: string;
|
|
53
|
+
wouldPost: number;
|
|
54
|
+
} | {
|
|
55
|
+
ok: false;
|
|
56
|
+
error: string;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* The gate for a local or Action review: the install's `dry_run`, its
|
|
60
|
+
* `state/dryrun/` directory, and a REST executor that sends an admitted
|
|
61
|
+
* intent as `token`. The executor is reachable only through `gate.execute`,
|
|
62
|
+
* so nothing here writes around dry-run.
|
|
63
|
+
*/
|
|
64
|
+
export declare function localPostGate(o: {
|
|
65
|
+
dryRun: boolean;
|
|
66
|
+
dryrunDir: string;
|
|
67
|
+
token: string;
|
|
68
|
+
fetchFn?: typeof fetch;
|
|
69
|
+
apiBase?: string;
|
|
70
|
+
/** Hears the gate's loud line. Absent: the gate says nothing. */
|
|
71
|
+
log?: (msg: string, extra?: unknown) => void;
|
|
72
|
+
}): MutationGate;
|
|
73
|
+
export declare function postReviewToPr(req: PostRequest): Promise<PostResult>;
|
|
74
|
+
/** The repo's configured posting identity (`post_as` in `.git/qcr-review.json`):
|
|
75
|
+
* which credential source to post as. Null: the credential the PR was read
|
|
76
|
+
* with. Any other value is returned as written; an unrecognised one is
|
|
77
|
+
* rejected at posting time, so a typo never changes who posts. */
|
|
78
|
+
export declare function loadPostIdentity(cwd: string): string | null;
|
|
79
|
+
//# sourceMappingURL=reviewpost.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewpost.d.ts","sourceRoot":"","sources":["../../src/reviewpost.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,YAAY,EAA8C,MAAM,WAAW,CAAC;AAGrF,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACrB,MAAM,mBAAmB,CAAC;AAE3B,6EAA6E;AAC7E,eAAO,MAAM,kBAAkB,oCAAoC,CAAC;AAEpE;gGACgG;AAChG,eAAO,MAAM,qBAAqB,wDAAwD,CAAC;AAE3F,mDAAmD;AACnD,eAAO,MAAM,UAAU,EAAG,SAAkB,CAAC;AAE7C,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,OAAO,UAAU,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AASD;;yCAEyC;AACzC,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,EACf,CAAC,EAAE;IACD,GAAG,EAAE,kBAAkB,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GACA,UAAU,CAgBZ;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;IACnB,mEAAmE;IACnE,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,UAAU,GAClB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,GAEvF;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACxF;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAYjC;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CAC9C,GAAG,YAAY,CAoBf;AA6DD,wBAAsB,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA+E1E;AAED;;;kEAGkE;AAClE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS3D"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
// `qcr review` posting to a PR: one review whose event is always COMMENT.
|
|
2
|
+
//
|
|
3
|
+
// The body and inline comments come from the production renderer
|
|
4
|
+
// (`renderPostedReview`, with the hidden `qcr:f=` finding markers the live
|
|
5
|
+
// route adds), and every comment also carries a visible line saying it came
|
|
6
|
+
// from qcr. A re-post is deduplicated against the comments already on the PR.
|
|
7
|
+
//
|
|
8
|
+
// This is the LOCAL route's write, made as the person with the credential
|
|
9
|
+
// they already have (the App-only credential rule carve-out). The write is a MutationIntent
|
|
10
|
+
// through the one MutationGate, with the install's `dry_run`: in dry-run the
|
|
11
|
+
// review is recorded under state/dryrun/ and nothing is sent (AGENTS.md
|
|
12
|
+
// invariant 6). The reads stay direct, as every read does. The daemon never imports this
|
|
13
|
+
// module; its writes go through its own gate.
|
|
14
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
15
|
+
import { MutationGate } from "./gate.js";
|
|
16
|
+
import { settingsPath } from "./localreview.js";
|
|
17
|
+
import { FINDING_MARKER_RE, parseFindingMarker, stripFindingMarkers } from "./findingkey.js";
|
|
18
|
+
import { postedRenderOptions, renderPostedReview, } from "./reviewrender.js";
|
|
19
|
+
/** The line every posted comment (and the review body) shows to a reader. */
|
|
20
|
+
export const QCR_VISIBLE_MARKER = "_Posted by qcr (local review)._";
|
|
21
|
+
/** The same line when a profile replaced a shipped agent or prompt for the
|
|
22
|
+
* run (packages/pi-plugin/src/profileoverrides.ts): the reader sees the review is not stock. */
|
|
23
|
+
export const QCR_CUSTOMISED_MARKER = "_Posted by qcr (local review, customised profile)._";
|
|
24
|
+
/** The only review event this route ever sends. */
|
|
25
|
+
export const POST_EVENT = "COMMENT";
|
|
26
|
+
/** Add the visible marker above the hidden finding marker (or at the end). */
|
|
27
|
+
function mark(body, visible) {
|
|
28
|
+
const hidden = body.match(new RegExp(`\\n*(${FINDING_MARKER_RE.source})\\s*$`));
|
|
29
|
+
if (!hidden)
|
|
30
|
+
return `${body.trimEnd()}\n\n${visible}`;
|
|
31
|
+
return `${body.slice(0, hidden.index).trimEnd()}\n\n${visible}\n\n${hidden[1]}`;
|
|
32
|
+
}
|
|
33
|
+
/** The review to post from a findings record: rendered by the production
|
|
34
|
+
* renderer, hidden markers on, every comment marked as qcr's. The verdict in
|
|
35
|
+
* the record never reaches the event. */
|
|
36
|
+
export function assemblePostReview(record, o) {
|
|
37
|
+
const { rendered } = renderPostedReview(record, {
|
|
38
|
+
...postedRenderOptions(o.cfg, {
|
|
39
|
+
verdict: o.verdict ?? null,
|
|
40
|
+
summary: o.summary ?? null,
|
|
41
|
+
lensesApplied: o.lenses.length ? o.lenses.join(", ") : null,
|
|
42
|
+
}),
|
|
43
|
+
findingMarkers: { roundNo: o.roundNo },
|
|
44
|
+
});
|
|
45
|
+
const visible = o.customised ? QCR_CUSTOMISED_MARKER : QCR_VISIBLE_MARKER;
|
|
46
|
+
return {
|
|
47
|
+
event: POST_EVENT,
|
|
48
|
+
body: mark(rendered.body, visible),
|
|
49
|
+
comments: rendered.comments.map((c) => ({ ...c, body: mark(c.body, visible) })),
|
|
50
|
+
bodyFindings: rendered.in_body,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/** GitHub answered the gated write with a non-2xx. */
|
|
54
|
+
class GitHubRefusal extends Error {
|
|
55
|
+
status;
|
|
56
|
+
detail;
|
|
57
|
+
constructor(status, detail) {
|
|
58
|
+
super(`GitHub answered ${status}`);
|
|
59
|
+
this.status = status;
|
|
60
|
+
this.detail = detail;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* The gate for a local or Action review: the install's `dry_run`, its
|
|
65
|
+
* `state/dryrun/` directory, and a REST executor that sends an admitted
|
|
66
|
+
* intent as `token`. The executor is reachable only through `gate.execute`,
|
|
67
|
+
* so nothing here writes around dry-run.
|
|
68
|
+
*/
|
|
69
|
+
export function localPostGate(o) {
|
|
70
|
+
const fetchFn = o.fetchFn ?? fetch;
|
|
71
|
+
const api = o.apiBase ?? "https://api.github.com";
|
|
72
|
+
const executor = async (intent) => {
|
|
73
|
+
const res = await fetchFn(`${api}${intent.path}`, {
|
|
74
|
+
method: intent.method,
|
|
75
|
+
headers: { ...githubHeaders(o.token), "content-type": "application/json" },
|
|
76
|
+
signal: AbortSignal.timeout(60_000),
|
|
77
|
+
body: JSON.stringify(intent.body),
|
|
78
|
+
});
|
|
79
|
+
if (!res.ok) {
|
|
80
|
+
const text = (await res.text().catch(() => "")).replaceAll(o.token, "***").slice(0, 200);
|
|
81
|
+
throw new GitHubRefusal(res.status, text);
|
|
82
|
+
}
|
|
83
|
+
return res.json().catch(() => ({}));
|
|
84
|
+
};
|
|
85
|
+
const gate = new MutationGate(o.dryRun, o.dryrunDir, executor);
|
|
86
|
+
// The gate's loud line (app-self-config executions), where the host says.
|
|
87
|
+
if (o.log)
|
|
88
|
+
gate.setLog(o.log);
|
|
89
|
+
return gate;
|
|
90
|
+
}
|
|
91
|
+
const githubHeaders = (token) => ({
|
|
92
|
+
authorization: `Bearer ${token}`,
|
|
93
|
+
accept: "application/vnd.github+json",
|
|
94
|
+
"x-github-api-version": "2022-11-28",
|
|
95
|
+
});
|
|
96
|
+
/** What identifies a comment's finding for a re-post: the text without our
|
|
97
|
+
* markers, whitespace collapsed. */
|
|
98
|
+
const textOf = (body) => stripFindingMarkers(body)
|
|
99
|
+
.replace(QCR_VISIBLE_MARKER, "")
|
|
100
|
+
.replace(QCR_CUSTOMISED_MARKER, "")
|
|
101
|
+
.replace(/\s+/g, " ")
|
|
102
|
+
.trim();
|
|
103
|
+
const sameFinding = (c, e) => {
|
|
104
|
+
if (e.path !== c.path || typeof e.body !== "string")
|
|
105
|
+
return false;
|
|
106
|
+
const mc = parseFindingMarker(c.body);
|
|
107
|
+
const me = parseFindingMarker(e.body);
|
|
108
|
+
const eLine = e.line ?? e.original_line ?? null;
|
|
109
|
+
// A finding key is only unique within its round.
|
|
110
|
+
if (mc && me && mc.round_no === me.round_no && mc.key === me.key && eLine === c.line)
|
|
111
|
+
return true;
|
|
112
|
+
return textOf(c.body) === textOf(e.body);
|
|
113
|
+
};
|
|
114
|
+
/** Whether a review with this body is already on the PR. Best-effort: a read
|
|
115
|
+
* that fails answers no. */
|
|
116
|
+
async function bodyAlreadyPosted(fetchFn, api, headers, req) {
|
|
117
|
+
const mine = textOf(req.review.body);
|
|
118
|
+
try {
|
|
119
|
+
for (let page = 1; page <= 20; page++) {
|
|
120
|
+
const res = await fetchFn(`${api}/repos/${req.repo}/pulls/${req.number}/reviews?per_page=100&page=${page}`, { headers, signal: AbortSignal.timeout(60_000) });
|
|
121
|
+
if (!res.ok)
|
|
122
|
+
return false;
|
|
123
|
+
const list = (await res.json());
|
|
124
|
+
if (!Array.isArray(list))
|
|
125
|
+
return false;
|
|
126
|
+
if (list.some((r) => typeof r.body === "string" && textOf(r.body) === mine))
|
|
127
|
+
return true;
|
|
128
|
+
if (list.length < 100)
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
export async function postReviewToPr(req) {
|
|
138
|
+
// The guard the whole route hangs on: a payload that is not a plain comment
|
|
139
|
+
// review is refused here, whatever built it.
|
|
140
|
+
if (req.review.event !== POST_EVENT)
|
|
141
|
+
return {
|
|
142
|
+
ok: false,
|
|
143
|
+
error: `refusing to post a ${String(req.review.event)} review: comment only`,
|
|
144
|
+
};
|
|
145
|
+
const fetchFn = req.fetchFn ?? fetch;
|
|
146
|
+
const api = req.apiBase ?? "https://api.github.com";
|
|
147
|
+
const headers = githubHeaders(req.token);
|
|
148
|
+
const where = `${req.repo}#${req.number}`;
|
|
149
|
+
const existing = [];
|
|
150
|
+
try {
|
|
151
|
+
for (let page = 1; page <= 20; page++) {
|
|
152
|
+
const res = await fetchFn(`${api}/repos/${req.repo}/pulls/${req.number}/comments?per_page=100&page=${page}`, { headers, signal: AbortSignal.timeout(60_000) });
|
|
153
|
+
if (!res.ok)
|
|
154
|
+
return {
|
|
155
|
+
ok: false,
|
|
156
|
+
error: `GitHub answered ${res.status} reading the comments on ${where}`,
|
|
157
|
+
};
|
|
158
|
+
const list = (await res.json());
|
|
159
|
+
existing.push(...list);
|
|
160
|
+
if (list.length < 100)
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
return {
|
|
166
|
+
ok: false,
|
|
167
|
+
error: `could not read the comments on ${where}: ${String(err).slice(0, 200)}`,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
const fresh = req.review.comments.filter((c) => !existing.some((e) => sameFinding(c, e)));
|
|
171
|
+
const skipped = req.review.comments.length - fresh.length;
|
|
172
|
+
// Everything was already there: a second review would only repeat the body,
|
|
173
|
+
// unless the body carries findings of its own.
|
|
174
|
+
if (fresh.length === 0 && req.review.comments.length > 0 && !req.review.bodyFindings)
|
|
175
|
+
return { ok: true, posted: 0, skipped, url: null };
|
|
176
|
+
// Nothing inline to post: the same body already on the PR is the same review.
|
|
177
|
+
if (fresh.length === 0 && (await bodyAlreadyPosted(fetchFn, api, headers, req)))
|
|
178
|
+
return { ok: true, posted: 0, skipped, url: null };
|
|
179
|
+
const intent = {
|
|
180
|
+
kind: "create_review",
|
|
181
|
+
method: "POST",
|
|
182
|
+
path: `/repos/${req.repo}/pulls/${req.number}/reviews`,
|
|
183
|
+
body: {
|
|
184
|
+
commit_id: req.headSha,
|
|
185
|
+
event: POST_EVENT,
|
|
186
|
+
body: req.review.body,
|
|
187
|
+
comments: fresh,
|
|
188
|
+
},
|
|
189
|
+
note: `qcr review: ${fresh.length} comment${fresh.length === 1 ? "" : "s"} on ${where}`,
|
|
190
|
+
pr: req.number,
|
|
191
|
+
};
|
|
192
|
+
try {
|
|
193
|
+
const out = await req.gate.execute(intent);
|
|
194
|
+
if (out.dryRunFile !== undefined)
|
|
195
|
+
return {
|
|
196
|
+
ok: true,
|
|
197
|
+
posted: 0,
|
|
198
|
+
skipped,
|
|
199
|
+
url: null,
|
|
200
|
+
recorded: out.dryRunFile,
|
|
201
|
+
wouldPost: fresh.length,
|
|
202
|
+
};
|
|
203
|
+
if (!out.executed)
|
|
204
|
+
return { ok: false, error: `the gate did not post the review on ${where} (${out.blocked})` };
|
|
205
|
+
const url = out.response?.html_url;
|
|
206
|
+
return { ok: true, posted: fresh.length, skipped, url: url ?? null };
|
|
207
|
+
}
|
|
208
|
+
catch (err) {
|
|
209
|
+
if (err instanceof GitHubRefusal)
|
|
210
|
+
return {
|
|
211
|
+
ok: false,
|
|
212
|
+
error: `GitHub refused the review on ${where} (${err.status}) ${err.detail}`.trim(),
|
|
213
|
+
};
|
|
214
|
+
return { ok: false, error: `could not post to ${where}: ${String(err).slice(0, 200)}` };
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/** The repo's configured posting identity (`post_as` in `.git/qcr-review.json`):
|
|
218
|
+
* which credential source to post as. Null: the credential the PR was read
|
|
219
|
+
* with. Any other value is returned as written; an unrecognised one is
|
|
220
|
+
* rejected at posting time, so a typo never changes who posts. */
|
|
221
|
+
export function loadPostIdentity(cwd) {
|
|
222
|
+
const path = settingsPath(cwd);
|
|
223
|
+
if (path === null || !existsSync(path))
|
|
224
|
+
return null;
|
|
225
|
+
try {
|
|
226
|
+
const v = JSON.parse(readFileSync(path, "utf8"))["post_as"];
|
|
227
|
+
return typeof v === "string" && v !== "" ? v : null;
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=reviewpost.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewpost.js","sourceRoot":"","sources":["../../src/reviewpost.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { type PostCheckMerge } from "./dedup.js";
|
|
2
|
+
import { type PolicyClass, type PostingPolicy, type WithholdWord } from "./postingpolicy.js";
|
|
3
|
+
/** The standard review footer, naming the configured bot identity
|
|
4
|
+
* (`[github] bot_login`; "" degrades to the role). posting.ts takes its
|
|
5
|
+
* `reviewFooter` from here: posting.ts is the recorded unwired module of
|
|
6
|
+
* tests/fences-reachability.test.ts, so the live route owns the text. */
|
|
7
|
+
export declare function renderedFooter(botLogin?: string): string;
|
|
8
|
+
/** GitHub caps a single review at 50 inline comments. */
|
|
9
|
+
export declare const INLINE_COMMENT_CAP = 50;
|
|
10
|
+
export interface RenderedComment {
|
|
11
|
+
path: string;
|
|
12
|
+
line: number;
|
|
13
|
+
side: "RIGHT" | "LEFT";
|
|
14
|
+
start_line?: number;
|
|
15
|
+
body: string;
|
|
16
|
+
}
|
|
17
|
+
export interface RenderedReview {
|
|
18
|
+
/** The review body (review.md). */
|
|
19
|
+
body: string;
|
|
20
|
+
/** The inline comments (comments.json), in the posting script's shape. */
|
|
21
|
+
comments: RenderedComment[];
|
|
22
|
+
/** Posted entries rendered into the body instead of inline. */
|
|
23
|
+
in_body: number;
|
|
24
|
+
/** What the record lacked; rendering went ahead with a fallback. */
|
|
25
|
+
problems: string[];
|
|
26
|
+
}
|
|
27
|
+
export declare function entriesById(entries: readonly unknown[]): Map<string, Record<string, unknown>>;
|
|
28
|
+
/** Follow the complete identity chain, including withheld or missing leads.
|
|
29
|
+
* Cycles share their smallest member id so traversal order cannot split them. */
|
|
30
|
+
export declare function rootCauseId(id: string, sameAs: string | null, byId: ReadonlyMap<string, Record<string, unknown>>): string;
|
|
31
|
+
/** Posting identity across all entries, including withheld leads. Both
|
|
32
|
+
* handwritten and rendered outputs enforce repeat-site policy with this key. */
|
|
33
|
+
export declare function recordPostingKeys(entries: readonly unknown[]): ReadonlyMap<Record<string, unknown>, string>;
|
|
34
|
+
/** A findings-record entry's ordinary tag (`severityTagOf`), whichever route
|
|
35
|
+
* renders it — null when its `posted_as` is outside the grammar. */
|
|
36
|
+
export declare function postedSeverityTag(raw: Record<string, unknown>): "blocker" | "question" | "nit" | null;
|
|
37
|
+
/** Render the review body and the inline comments from a findings record
|
|
38
|
+
* (the session's JSON, parsed). Pure; never throws on a malformed record. */
|
|
39
|
+
export declare function renderReviewFromRecord(record: unknown, opts?: {
|
|
40
|
+
botLogin?: string;
|
|
41
|
+
/** Fallbacks for a record that lacks them (the bench's outcome.json
|
|
42
|
+
* carries the verdict and summary). The record's own values win. */
|
|
43
|
+
verdict?: string | null;
|
|
44
|
+
summary?: string | null;
|
|
45
|
+
lensesApplied?: string | null;
|
|
46
|
+
/** The profile's `[posting] body`: `verdict` renders the verdict line,
|
|
47
|
+
* one sentence and a bullet per finding with no inline anchor. */
|
|
48
|
+
bodyMode?: "full" | "verdict";
|
|
49
|
+
/** Append the hidden `<!-- qcr:f=<round>:<key> -->` marker to
|
|
50
|
+
* every inline comment, so the posted comment links back to its finding.
|
|
51
|
+
* The live route only (src/reviewrendercli.ts): the bench never passes it,
|
|
52
|
+
* so its outputs carry no markers. */
|
|
53
|
+
findingMarkers?: {
|
|
54
|
+
roundNo: number;
|
|
55
|
+
};
|
|
56
|
+
}): RenderedReview;
|
|
57
|
+
/** What a render route needs from the install's config — the ONE place both
|
|
58
|
+
* routes (scripts/render-review.sh → src/reviewrendercli.ts, and the bench
|
|
59
|
+
* runner) turn a config into render options, so they cannot drift. */
|
|
60
|
+
export interface PostedRenderConfig {
|
|
61
|
+
review: {
|
|
62
|
+
dedup_merge?: boolean;
|
|
63
|
+
};
|
|
64
|
+
github?: {
|
|
65
|
+
bot_login?: string;
|
|
66
|
+
};
|
|
67
|
+
/** The profile's `[posting]` policy, overlaid on the config the same way
|
|
68
|
+
* on both routes (wire.ts / the bench: `applyProfilePosting`). */
|
|
69
|
+
posting?: PostingPolicy;
|
|
70
|
+
}
|
|
71
|
+
export interface PostedRenderOptions {
|
|
72
|
+
botLogin?: string;
|
|
73
|
+
verdict?: string | null;
|
|
74
|
+
summary?: string | null;
|
|
75
|
+
lensesApplied?: string | null;
|
|
76
|
+
/** `[review] dedup_merge`: run the post-check (packages/pi-plugin/src/dedup.ts) first. */
|
|
77
|
+
dedupMerge?: boolean;
|
|
78
|
+
/** The profile's `[posting]` policy; absent or all-default ⇒ no cut. */
|
|
79
|
+
policy?: PostingPolicy;
|
|
80
|
+
/** The live route's hidden finding markers (see `renderReviewFromRecord`).
|
|
81
|
+
* Never set by `postedRenderOptions`, so a caller that does not ask — the
|
|
82
|
+
* bench — renders without them. */
|
|
83
|
+
findingMarkers?: {
|
|
84
|
+
roundNo: number;
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export declare function postedRenderOptions(cfg: PostedRenderConfig, fallbacks?: Pick<PostedRenderOptions, "verdict" | "summary" | "lensesApplied">): PostedRenderOptions;
|
|
88
|
+
/** A record entry as the posting policy classes it — the class it RENDERS
|
|
89
|
+
* as (`readPosted`): `[check this]` is a check item; `[ask your human]` and
|
|
90
|
+
* `[deferred]` take their severity's tag, so a blocker under a routing marker
|
|
91
|
+
* keeps a blocker's protection; a tag outside the grammar renders, and so
|
|
92
|
+
* counts, as a question. `tagField` names the field holding the tag
|
|
93
|
+
* (`withheld_as` once an entry is withheld). */
|
|
94
|
+
export declare function postedClassOf(entry: Record<string, unknown>, tagField?: "posted_as" | "withheld_as"): PolicyClass;
|
|
95
|
+
/** Why a withheld entry is in the record and not on the PR. */
|
|
96
|
+
export declare const withheldReason: (word: WithholdWord) => string;
|
|
97
|
+
/** A posted record entry made `withheld` by the posting policy, in place —
|
|
98
|
+
* its tag kept as `withheld_as`, the word and the reason recorded — as every
|
|
99
|
+
* route records it. */
|
|
100
|
+
export declare function markWithheld(entry: Record<string, unknown>, word: WithholdWord): void;
|
|
101
|
+
export interface PolicyWithheld {
|
|
102
|
+
id: string;
|
|
103
|
+
word: WithholdWord;
|
|
104
|
+
path: string | null;
|
|
105
|
+
line: number | null;
|
|
106
|
+
cls: PolicyClass;
|
|
107
|
+
severity: string | null;
|
|
108
|
+
title: string;
|
|
109
|
+
/** Would it have posted inline (it carried an anchor and no `inline: false`)? */
|
|
110
|
+
inline: boolean;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* The profile's `[posting]` cut over a findings record (packages/pi-plugin/src/postingpolicy.ts
|
|
114
|
+
* `selectPosted`), applied by BOTH render routes — so the live shell route
|
|
115
|
+
* enforces it too, not only the bench (src/bench/benchposting.ts, which the
|
|
116
|
+
* bench still uses when it does not render). Items are the record's posted
|
|
117
|
+
* entries in record order; a follower row (`same_as`) carries its lead's key,
|
|
118
|
+
* so `repeat_sites = false` withholds it. No changed-line ranking: neither
|
|
119
|
+
* route's render step holds the diff, so the two rank identically. Every cut
|
|
120
|
+
* entry becomes `withheld` with its word — nothing is deleted.
|
|
121
|
+
*/
|
|
122
|
+
export declare function applyPostingPolicyToRecord(record: unknown, policy: PostingPolicy | undefined): {
|
|
123
|
+
record: unknown;
|
|
124
|
+
withheld: PolicyWithheld[];
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* The render step both routes run (docs/duplicate-merge.md: the bench
|
|
128
|
+
* matches a live round): the post-check over the record when
|
|
129
|
+
* `dedupMerge` is on, then `renderReviewFromRecord`. Returns the record to
|
|
130
|
+
* write back (the same object when the post-check merged nothing, or when it
|
|
131
|
+
* is off) beside what to post.
|
|
132
|
+
*/
|
|
133
|
+
export declare function renderPostedReview(record: unknown, opts?: PostedRenderOptions): {
|
|
134
|
+
rendered: RenderedReview;
|
|
135
|
+
record: unknown;
|
|
136
|
+
merges: PostCheckMerge[];
|
|
137
|
+
withheld: PolicyWithheld[];
|
|
138
|
+
};
|
|
139
|
+
/** The posting fields a rendered round's findings record carries, as the
|
|
140
|
+
* round templates (`{{render_note}}`) and the bench appendix both state them. */
|
|
141
|
+
export declare const RENDER_RECORD_FIELDS: string;
|
|
142
|
+
/** The round prompt's `{{render_note}}` — "" unless the order says this
|
|
143
|
+
* install renders its posted review (`[review] render_outputs`), so a round
|
|
144
|
+
* order without the flag renders the template unchanged. Under the flag the
|
|
145
|
+
* record already carries the verdict's `verdict`, `head_sha` and `summary`, so
|
|
146
|
+
* the note also hands the verdict file to `scripts/commit-verdict.sh
|
|
147
|
+
* --from-record` — the session neither retypes it nor reads the clock, which
|
|
148
|
+
* would otherwise lengthen the round's serial tail. */
|
|
149
|
+
export declare function renderRenderNote(order: {
|
|
150
|
+
render_outputs?: boolean;
|
|
151
|
+
pr: number;
|
|
152
|
+
round_no: number;
|
|
153
|
+
}): string;
|
|
154
|
+
//# sourceMappingURL=reviewrender.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewrender.d.ts","sourceRoot":"","sources":["../../src/reviewrender.ts"],"names":[],"mappings":"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"}
|