@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,364 @@
|
|
|
1
|
+
// Severity → posting-tag mapping (spec §5): P0/P1 → [blocker]; P2 → [blocker]
|
|
2
|
+
// iff confidence ≥ 0.8 else [question]; P3 → [question] (or [nit] when the
|
|
3
|
+
// finding is a nit-class polish item). Nits and questions never block.
|
|
4
|
+
//
|
|
5
|
+
// A third axis, `reachability`, says how often the triggering state actually
|
|
6
|
+
// arises, as opposed to how bad it is (severity) or whether the claim is true
|
|
7
|
+
// (confidence). It is applied as a gate BEFORE the severity mapping and can
|
|
8
|
+
// only ever weaken a tag: `contrived` never blocks at any severity,
|
|
9
|
+
// `plausible` demotes P2 to a question, `routine` (and an absent field) leaves
|
|
10
|
+
// the mapping unchanged. The blocker bar itself does not move — a `routine`
|
|
11
|
+
// P0/P1 blocks.
|
|
12
|
+
//
|
|
13
|
+
// First-party directive provenance: the reviewed repo's own agent-directive
|
|
14
|
+
// files (.claude/**, prompts/**, AGENTS.md/CLAUDE.md and kin —
|
|
15
|
+
// `isFirstPartyDirectivePath`). Routine first-party instructions — directive
|
|
16
|
+
// text inside a directive file doing its job — are suppressed at the
|
|
17
|
+
// lens/validator layer and never reach this map as a finding. A
|
|
18
|
+
// kind=injection candidate that does survive has proved an obvious malicious
|
|
19
|
+
// payload or a concrete untrusted-source→model path, and its first-party
|
|
20
|
+
// location softens nothing: `postTag` maps it by severity exactly like any
|
|
21
|
+
// other finding, so a P0/P1 blocks. The verdict is decided on the merits, and
|
|
22
|
+
// the review additionally carries exactly one short security-attention
|
|
23
|
+
// comment @-mentioning a deterministically-picked teammate
|
|
24
|
+
// (rendered by posting.ts `renderDirectiveEscalationComment`, mention picked
|
|
25
|
+
// in dispatch.ts). Third-party/vendored directive content keeps the P1 bright
|
|
26
|
+
// line unchanged.
|
|
27
|
+
import { SEVERITIES } from "./severityrank.js";
|
|
28
|
+
export { SEVERITIES };
|
|
29
|
+
export const REACHABILITY_VALUES = ["routine", "plausible", "contrived"];
|
|
30
|
+
/** Findings that omit the axis are read as `routine`, so a pass that does not
|
|
31
|
+
* emit it can never accidentally soften a blocker. */
|
|
32
|
+
export function normalizeReachability(value) {
|
|
33
|
+
return REACHABILITY_VALUES.includes(value) ? value : "routine";
|
|
34
|
+
}
|
|
35
|
+
/** The compiled-in vocabulary; the shipped default. */
|
|
36
|
+
export const DEFAULT_DIRECTIVE_VOCABULARY = {
|
|
37
|
+
vendoredSegments: new Set([
|
|
38
|
+
"node_modules",
|
|
39
|
+
"vendor",
|
|
40
|
+
"vendors",
|
|
41
|
+
"vendored",
|
|
42
|
+
"third_party",
|
|
43
|
+
"third-party",
|
|
44
|
+
"external",
|
|
45
|
+
]),
|
|
46
|
+
basenames: new Set(["AGENTS.md", "AGENT.md", "CLAUDE.md", ".cursorrules"]),
|
|
47
|
+
dirSegments: new Set([".claude", ".cursor"]),
|
|
48
|
+
rootDirs: new Set(["prompts"]),
|
|
49
|
+
files: new Set([".github/copilot-instructions.md"]),
|
|
50
|
+
};
|
|
51
|
+
/** The filenames among `files` that are first-party agent-directive paths
|
|
52
|
+
* under `extras` (the configured extension of the built-in vocabulary). */
|
|
53
|
+
export function firstPartyDirectiveFiles(files, extras = {}) {
|
|
54
|
+
const vocab = directiveVocabulary(extras);
|
|
55
|
+
return files.filter((f) => isFirstPartyDirectivePath(f.filename, vocab)).map((f) => f.filename);
|
|
56
|
+
}
|
|
57
|
+
/** Built-ins ∪ the configured extras — EXTEND-only by construction. */
|
|
58
|
+
export function directiveVocabulary(extras = {}) {
|
|
59
|
+
const d = DEFAULT_DIRECTIVE_VOCABULARY;
|
|
60
|
+
return {
|
|
61
|
+
vendoredSegments: new Set([
|
|
62
|
+
...d.vendoredSegments,
|
|
63
|
+
...(extras.extra_vendored_segments ?? []).map((s) => s.toLowerCase()),
|
|
64
|
+
]),
|
|
65
|
+
basenames: new Set([...d.basenames, ...(extras.extra_basenames ?? [])]),
|
|
66
|
+
dirSegments: new Set([...d.dirSegments, ...(extras.extra_dir_segments ?? [])]),
|
|
67
|
+
rootDirs: new Set([...d.rootDirs, ...(extras.extra_root_dirs ?? [])]),
|
|
68
|
+
files: new Set([...d.files, ...(extras.extra_files ?? [])]),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Is `path` a FIRST-PARTY agent-directive file of the reviewed repo —
|
|
73
|
+
* `.claude/**`, top-level `prompts/**`, an `AGENTS.md`/`CLAUDE.md` (and kin)
|
|
74
|
+
* at any depth — and NOT under a vendored tree? The predicate is deliberately
|
|
75
|
+
* path-shaped and shared: dispatch uses it to pick the escalation mention,
|
|
76
|
+
* and posting.ts (through `isFirstPartyDirectiveInjection`) to name the files
|
|
77
|
+
* the escalation comment cites. `vocab` defaults to the compiled-in
|
|
78
|
+
* vocabulary for callers without config in reach.
|
|
79
|
+
*/
|
|
80
|
+
export function isFirstPartyDirectivePath(path, vocab = DEFAULT_DIRECTIVE_VOCABULARY) {
|
|
81
|
+
if (!path)
|
|
82
|
+
return false;
|
|
83
|
+
const segments = path.split("/").filter(Boolean);
|
|
84
|
+
if (segments.length === 0)
|
|
85
|
+
return false;
|
|
86
|
+
if (segments.some((s) => vocab.vendoredSegments.has(s.toLowerCase())))
|
|
87
|
+
return false;
|
|
88
|
+
const basename = segments[segments.length - 1];
|
|
89
|
+
if (vocab.basenames.has(basename))
|
|
90
|
+
return true;
|
|
91
|
+
if (segments.some((s) => vocab.dirSegments.has(s)))
|
|
92
|
+
return true;
|
|
93
|
+
// Root dirs bind at the repo root only — a nested `foo/prompts/` is an
|
|
94
|
+
// ordinary source directory in most trees.
|
|
95
|
+
if (vocab.rootDirs.has(segments[0]))
|
|
96
|
+
return true;
|
|
97
|
+
if (vocab.files.has(segments.join("/")))
|
|
98
|
+
return true;
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
/** An injection-kind finding anchored on a first-party directive path.
|
|
102
|
+
* Findings without a `kind` never match. */
|
|
103
|
+
export function isFirstPartyDirectiveInjection(kind, path, vocab = DEFAULT_DIRECTIVE_VOCABULARY) {
|
|
104
|
+
return kind?.trim().toLowerCase() === "injection" && isFirstPartyDirectivePath(path, vocab);
|
|
105
|
+
}
|
|
106
|
+
export function postTag(severity, confidence, reachability, ctx) {
|
|
107
|
+
// Routine first-party instructions are suppressed before this posting map.
|
|
108
|
+
// A kind=injection candidate that survives has proved an obvious malicious
|
|
109
|
+
// payload or a concrete untrusted-source→model path, so the file's
|
|
110
|
+
// first-party location cannot soften it. `ctx` remains part of the
|
|
111
|
+
// interface for telemetry/callers and the deterministic mention route.
|
|
112
|
+
void ctx;
|
|
113
|
+
// Reachability gate first — never blocks something the base mapping
|
|
114
|
+
// wouldn't: the one capping rule the scan's severities use too.
|
|
115
|
+
switch (reachabilityCappedSeverity(severity, reachability)) {
|
|
116
|
+
case "P0":
|
|
117
|
+
case "P1":
|
|
118
|
+
return "blocker";
|
|
119
|
+
case "P2":
|
|
120
|
+
return confidence >= 0.8 ? "blocker" : "question";
|
|
121
|
+
case "P3":
|
|
122
|
+
return "question";
|
|
123
|
+
case "nit":
|
|
124
|
+
return "nit";
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* `postTag`'s reachability gate expressed as a SEVERITY, for a surface with
|
|
129
|
+
* no posting map (the whole-repo scan): the severity whose ROUTINE tag equals
|
|
130
|
+
* the original's reachability-gated tag. `contrived` P0–P2 → `P3` (a
|
|
131
|
+
* question, never a blocker), `plausible` P2 → `P3`; everything else — and an
|
|
132
|
+
* absent axis, read as `routine` — is unchanged. Pinned against `postTag` at
|
|
133
|
+
* every severity × reachability × confidence by tests/severity.test.ts.
|
|
134
|
+
*/
|
|
135
|
+
export function reachabilityCappedSeverity(severity, reachability) {
|
|
136
|
+
const reach = normalizeReachability(reachability);
|
|
137
|
+
if (reach === "contrived" && (severity === "P0" || severity === "P1" || severity === "P2"))
|
|
138
|
+
return "P3";
|
|
139
|
+
if (reach === "plausible" && severity === "P2")
|
|
140
|
+
return "P3";
|
|
141
|
+
return severity;
|
|
142
|
+
}
|
|
143
|
+
/** Verdict logic: any [blocker] ⇒ REQUEST_CHANGES; an explicit legacy
|
|
144
|
+
* cannot-decide call ⇒ NEEDS_HUMAN; else APPROVE. Directive location alone
|
|
145
|
+
* never changes the merits verdict. */
|
|
146
|
+
export function deriveVerdict(v) {
|
|
147
|
+
if (v.hasBlockers)
|
|
148
|
+
return "REQUEST_CHANGES";
|
|
149
|
+
if (v.needsHuman)
|
|
150
|
+
return "NEEDS_HUMAN";
|
|
151
|
+
return "APPROVE";
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* The "[check this]" inline-comment grammar: every "For a human to
|
|
155
|
+
* double-check" item is ALSO posted as an inline review comment whose first
|
|
156
|
+
* line starts with this tag. The repo's
|
|
157
|
+
* merge rule requires every conversation resolved, so each item opens a
|
|
158
|
+
* thread a person must touch — and the reviewer never resolves one:
|
|
159
|
+
* github.ts resolveOwnReviewThread refuses on this marker, so only the author
|
|
160
|
+
* or another human can clear it.
|
|
161
|
+
*/
|
|
162
|
+
export const CHECK_THIS_TAG = "[check this]";
|
|
163
|
+
/**
|
|
164
|
+
* A marker's recognizer, built from its tag: the tag at the start of a line,
|
|
165
|
+
* after any run of markdown wrappers (emphasis, code, quote, a link or image
|
|
166
|
+
* opener). One prefix grammar for all three markers, and each recognizer
|
|
167
|
+
* matches exactly the tag it is built from.
|
|
168
|
+
*/
|
|
169
|
+
function markerRe(tag) {
|
|
170
|
+
const escaped = tag.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
171
|
+
return new RegExp(`^\\s*(?:[*_\`~>]|\\[?!?\\[)*\\s*${escaped}`, "i");
|
|
172
|
+
}
|
|
173
|
+
export const CHECK_THIS_RE = markerRe(CHECK_THIS_TAG);
|
|
174
|
+
// ---- the "[ask your human]" grammar --------------------------------------
|
|
175
|
+
//
|
|
176
|
+
// A SECOND, deliberately distinct marker — same shape, opposite addressee.
|
|
177
|
+
//
|
|
178
|
+
// [check this] → "a HUMAN should verify this before merge".
|
|
179
|
+
// Addressed to whoever reads the PR; the thread is
|
|
180
|
+
// structurally human-resolve-only (resolveOwnReviewThread
|
|
181
|
+
// refuses on it) because the repo's merge rule is what
|
|
182
|
+
// forces a person's eyes onto it.
|
|
183
|
+
// [ask your human] → "IMPLEMENTER: do not answer this yourself — put it to
|
|
184
|
+
// the person you are working for and bring the answer
|
|
185
|
+
// back here". Addressed to the PR author's AI agent.
|
|
186
|
+
//
|
|
187
|
+
// The two must never be conflated: a marker that means several things routes
|
|
188
|
+
// nothing. Nothing here changes what `[check this]` means or how it is treated.
|
|
189
|
+
//
|
|
190
|
+
// RESOLUTION: an `[ask your human]` thread is AUTHOR-RESOLVABLE once answered —
|
|
191
|
+
// resolveOwnReviewThread has no refusal for it, because `[check this]`'s
|
|
192
|
+
// human-only machinery would force a person into every thread, and the
|
|
193
|
+
// thread's point is that the ANSWER, not the resolution, is what a human
|
|
194
|
+
// owes. The ordinary path already gives the right shape: the bot resolves one of its own threads only through ping-pong, i.e.
|
|
195
|
+
// only after the author has replied and the session judged the reply settles
|
|
196
|
+
// it. Rule 2 is untouched either way — resolving one's OWN finding thread after
|
|
197
|
+
// an answer is not dismissing a review, and no review-dismissal path exists.
|
|
198
|
+
export const ASK_HUMAN_TAG = "[ask your human]";
|
|
199
|
+
export const ASK_HUMAN_RE = markerRe(ASK_HUMAN_TAG);
|
|
200
|
+
/** The lens that mints the tag (dispatch.ts ALL_PASSES; agents/pass-ask-human.md). */
|
|
201
|
+
export const ASK_HUMAN_LENS = "pass-ask-human";
|
|
202
|
+
/**
|
|
203
|
+
* Is this finding an ask-your-human question? Keyed on the lens tag (the
|
|
204
|
+
* merge step concatenates lens tags, so a substring test is the honest one)
|
|
205
|
+
* or on an explicit `kind: ask-human`.
|
|
206
|
+
*/
|
|
207
|
+
export function isAskHumanFinding(kind, lens) {
|
|
208
|
+
if (kind?.trim().toLowerCase() === "ask-human")
|
|
209
|
+
return true;
|
|
210
|
+
return (lens ?? "").toLowerCase().includes(ASK_HUMAN_LENS);
|
|
211
|
+
}
|
|
212
|
+
// ---- the "[deferred]" grammar --------------------------------------------
|
|
213
|
+
//
|
|
214
|
+
// The THIRD marker, and the last one: "next iteration" is not the author
|
|
215
|
+
// proving the finding wrong — it is a cost decision (right finding, real fix,
|
|
216
|
+
// not worth the time now), and that cost is small when the implementer is an
|
|
217
|
+
// AI. So a deferral is not free: the review session files a ticket
|
|
218
|
+
// itself, in the round that deferred, through the daemon's existing capped
|
|
219
|
+
// issue path — no confirmation step. **No ticket, no deferral.**
|
|
220
|
+
//
|
|
221
|
+
// WHY A THIRD TAG RATHER THAN REUSING ONE OF THE TWO: a deferral is neither of
|
|
222
|
+
// the other two things, and a marker that means three things routes nothing —
|
|
223
|
+
// the same reason `[ask your human]` has its own tag rather than a second
|
|
224
|
+
// meaning for `[check this]`. The three, side by side:
|
|
225
|
+
//
|
|
226
|
+
// [check this] → a HUMAN should VERIFY this before merge.
|
|
227
|
+
// Addressee: whoever reads the PR.
|
|
228
|
+
// Resolution: human only (structural refusal below).
|
|
229
|
+
// [ask your human] → the IMPLEMENTER must not answer this itself; put it to
|
|
230
|
+
// its person and bring the answer back.
|
|
231
|
+
// Addressee: the PR author's AI agent.
|
|
232
|
+
// Resolution: author-resolvable once answered.
|
|
233
|
+
// [deferred] → this finding is REAL and this PR is not where it gets
|
|
234
|
+
// fixed; the ticket is filed, here is its number.
|
|
235
|
+
// Addressee: nobody in particular — it states the
|
|
236
|
+
// finding's own STATE, which is why it is the one tag
|
|
237
|
+
// with no verb and no addressee in it.
|
|
238
|
+
// Resolution: human only (structural refusal below).
|
|
239
|
+
//
|
|
240
|
+
// Confusability was the design constraint, so the spelling avoids every word
|
|
241
|
+
// the other two use: no "this" (which `[check this]` owns and which would make
|
|
242
|
+
// a `[track this]`/`[fix this]` read as its sibling), no "human", no
|
|
243
|
+
// imperative. One word, a past participle, naming a status.
|
|
244
|
+
//
|
|
245
|
+
// RESOLUTION: an ignored deferral must not be quietly closable by the bot, or
|
|
246
|
+
// the whole mechanism is free again — so this marker takes the SAME structural
|
|
247
|
+
// refusal as `[check this]` (github.ts resolveOwnReviewThread), and the reviewed
|
|
248
|
+
// repo's merge rule then forces a person to look. Rule 2 is untouched: refusing
|
|
249
|
+
// to resolve is the safe direction, and no review-dismissal path exists here or
|
|
250
|
+
// anywhere else. Nothing about `[check this]` or `[ask your human]` changes.
|
|
251
|
+
//
|
|
252
|
+
// NOTHING HERE BLOCKS. A deferral never holds the merge gate and never forces a
|
|
253
|
+
// fix; it only stops a deferral being free. The failure mode to watch for is a
|
|
254
|
+
// backlog nobody works.
|
|
255
|
+
export const DEFERRED_TAG = "[deferred]";
|
|
256
|
+
export const DEFERRED_RE = markerRe(DEFERRED_TAG);
|
|
257
|
+
/** Is this finding a conscious deferral? Keyed on an explicit `kind`, the one
|
|
258
|
+
* signal a session sets deliberately — there is no lens that mints deferrals
|
|
259
|
+
* (the DECISION to defer belongs to the PR's session, after validation). */
|
|
260
|
+
export function isDeferredFinding(kind) {
|
|
261
|
+
const k = kind?.trim().toLowerCase();
|
|
262
|
+
return k === "deferred" || k === "deferral";
|
|
263
|
+
}
|
|
264
|
+
// ---- the closed tag grammar ----------------------------------------------
|
|
265
|
+
//
|
|
266
|
+
// Sessions invent tags this system does not define — `[start here 3/5]`,
|
|
267
|
+
// `[verified]`, many spellings of "blocker, now fixed". That is not a style
|
|
268
|
+
// problem. The tag is what the posting guards, the thread
|
|
269
|
+
// resolution refusals and every downstream consumer key on, so an invented tag
|
|
270
|
+
// is A FINDING THAT SILENTLY ESCAPES ITS OWN MACHINERY: a mis-tagged
|
|
271
|
+
// check-this, for instance, would not be protected by resolveOwnReviewThread.
|
|
272
|
+
//
|
|
273
|
+
// So the grammar is CLOSED and defined exactly once, here. Two kinds of tag:
|
|
274
|
+
//
|
|
275
|
+
// * POSTING tags — the severity map's output, one per finding, always
|
|
276
|
+
// present: `[blocker]`, `[question]`, `[nit]`.
|
|
277
|
+
// * MARKER tags — a routing prefix that may precede the posting tag. Each has
|
|
278
|
+
// one meaning and one resolution rule; see their definitions above.
|
|
279
|
+
//
|
|
280
|
+
// Nothing here weakens or strengthens a finding: it constrains the SPELLING of
|
|
281
|
+
// the tag, never the severity behind it. The blocker bar does not move.
|
|
282
|
+
/** The three posting tags, bare (no brackets) — `postTag`'s whole range. */
|
|
283
|
+
export const POSTING_TAG_WORDS = ["blocker", "question", "nit"];
|
|
284
|
+
/** Every sanctioned tag, bracketed, in one list: the three posting tags plus
|
|
285
|
+
* the marker prefixes. This is THE grammar — a tag not on it is not one. */
|
|
286
|
+
const MARKER_TAGS = [CHECK_THIS_TAG, ASK_HUMAN_TAG, DEFERRED_TAG];
|
|
287
|
+
export const SANCTIONED_TAGS = [
|
|
288
|
+
...POSTING_TAG_WORDS.map((t) => `[${t}]`),
|
|
289
|
+
...MARKER_TAGS,
|
|
290
|
+
];
|
|
291
|
+
/** Every sanctioned bracketed tag, regardless of case. */
|
|
292
|
+
const SANCTIONED_TAG_RE = new RegExp(SANCTIONED_TAGS.map((t) => t.replace(/[[\]]/g, "\\$&")).join("|"), "gi");
|
|
293
|
+
/** Remove only sanctioned posting and marker tags from a title. */
|
|
294
|
+
export function stripSanctionedTags(title) {
|
|
295
|
+
return title.replace(SANCTIONED_TAG_RE, "");
|
|
296
|
+
}
|
|
297
|
+
const SEVERITY_WORDS = new Set(SEVERITIES);
|
|
298
|
+
/** The ordinary posting tag a findings-record tag word (bare, lower case) is
|
|
299
|
+
* counted, posted and ranked under: a posting tag is itself; `check this` is a
|
|
300
|
+
* question; `ask your human` and `deferred` take the tag their severity maps
|
|
301
|
+
* to (a question without one). Null for a word outside the grammar. */
|
|
302
|
+
export function ordinaryPostTag(tag, severity, confidence, reachability) {
|
|
303
|
+
if (POSTING_TAG_WORDS.includes(tag))
|
|
304
|
+
return tag;
|
|
305
|
+
if (tag === "check this")
|
|
306
|
+
return "question";
|
|
307
|
+
if (tag === "ask your human" || tag === "deferred")
|
|
308
|
+
return severity && SEVERITY_WORDS.has(severity)
|
|
309
|
+
? postTag(severity, confidence ?? 1, reachability)
|
|
310
|
+
: "question";
|
|
311
|
+
return null;
|
|
312
|
+
}
|
|
313
|
+
/** A leading `[…]` tag on a line, however it is spelled. Bounded length so a
|
|
314
|
+
* markdown link or an array literal at the start of a title is not mistaken
|
|
315
|
+
* for a tag. */
|
|
316
|
+
const LEADING_TAG_RE = /^\s*\[([^\]\n]{1,40})\]\s*/;
|
|
317
|
+
/** A tag's bare word as every reader compares it: no brackets, lowercase,
|
|
318
|
+
* internal whitespace collapsed (`"[Ask your human]"` → `"ask your human"`).
|
|
319
|
+
* "" for null or empty. */
|
|
320
|
+
export function bareTag(raw) {
|
|
321
|
+
return (raw ?? "")
|
|
322
|
+
.trim()
|
|
323
|
+
.replace(/^\[|\]$/g, "")
|
|
324
|
+
.trim()
|
|
325
|
+
.replace(/\s+/g, " ")
|
|
326
|
+
.toLowerCase();
|
|
327
|
+
}
|
|
328
|
+
/** Is `raw` — with or without brackets, in any case, with internal whitespace
|
|
329
|
+
* collapsed — one of the sanctioned tags? */
|
|
330
|
+
export function isSanctionedTag(raw) {
|
|
331
|
+
if (!raw)
|
|
332
|
+
return false;
|
|
333
|
+
return SANCTIONED_TAGS.includes(`[${bareTag(raw)}]`);
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Strip a leading tag from a finding TITLE when that tag is outside the
|
|
337
|
+
* grammar.
|
|
338
|
+
*
|
|
339
|
+
* A title is not where a tag belongs — `inlineBody` mints the real one — so a
|
|
340
|
+
* bracketed prefix on a title is either a duplicate of the sanctioned tag or an
|
|
341
|
+
* invented one. Both are removed; the invented one is REPORTED, so the escape
|
|
342
|
+
* shows up in telemetry instead of going out on the PR. A sanctioned marker
|
|
343
|
+
* (`[check this]`, `[ask your human]`) is left alone: those are minted from the
|
|
344
|
+
* finding's own fields and carry meaning.
|
|
345
|
+
*
|
|
346
|
+
* Only the tag is stripped. Not one word of the finding's reasoning is touched
|
|
347
|
+
* — this cuts a wrong label, never a justification.
|
|
348
|
+
*/
|
|
349
|
+
export function stripUngrammaticalTag(title) {
|
|
350
|
+
const m = LEADING_TAG_RE.exec(title);
|
|
351
|
+
if (!m)
|
|
352
|
+
return { title, stripped: null };
|
|
353
|
+
const inner = (m[1] ?? "").trim();
|
|
354
|
+
if (isSanctionedTag(inner)) {
|
|
355
|
+
// A sanctioned MARKER stays (it is a routing prefix); a duplicated POSTING
|
|
356
|
+
// tag goes, because inlineBody is about to mint the authoritative one.
|
|
357
|
+
const bare = bareTag(inner);
|
|
358
|
+
if (!POSTING_TAG_WORDS.includes(bare))
|
|
359
|
+
return { title, stripped: null };
|
|
360
|
+
return { title: title.slice(m[0].length), stripped: null };
|
|
361
|
+
}
|
|
362
|
+
return { title: title.slice(m[0].length), stripped: `[${inner}]` };
|
|
363
|
+
}
|
|
364
|
+
//# sourceMappingURL=severity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"severity.js","sourceRoot":"","sources":["../../src/severity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Every severity, highest first — the one vocabulary the severity type and
|
|
2
|
+
* the rank derive from. */
|
|
3
|
+
export declare const SEVERITIES: readonly ["P0", "P1", "P2", "P3", "nit"];
|
|
4
|
+
/** A severity's place in the one order, P0 (0) … nit (4), read without regard
|
|
5
|
+
* to case or surrounding space; undefined for a spelling outside the scale —
|
|
6
|
+
* each caller decides what an unreadable severity means to it. */
|
|
7
|
+
export declare function severityRank(raw: string | null | undefined): number | undefined;
|
|
8
|
+
//# sourceMappingURL=severityrank.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"severityrank.d.ts","sourceRoot":"","sources":["../../src/severityrank.ts"],"names":[],"mappings":"AAGA;2BAC2B;AAC3B,eAAO,MAAM,UAAU,0CAA2C,CAAC;AAMnE;;kEAEkE;AAClE,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAI/E"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// The one severity order. A leaf with no imports, so a module that must stay
|
|
2
|
+
// off the verdict vocabulary (src/escalation.ts) can read it too.
|
|
3
|
+
/** Every severity, highest first — the one vocabulary the severity type and
|
|
4
|
+
* the rank derive from. */
|
|
5
|
+
export const SEVERITIES = ["P0", "P1", "P2", "P3", "nit"];
|
|
6
|
+
const SEVERITY_ORDER = Object.fromEntries(SEVERITIES.map((s, i) => [s.toUpperCase(), i]));
|
|
7
|
+
/** A severity's place in the one order, P0 (0) … nit (4), read without regard
|
|
8
|
+
* to case or surrounding space; undefined for a spelling outside the scale —
|
|
9
|
+
* each caller decides what an unreadable severity means to it. */
|
|
10
|
+
export function severityRank(raw) {
|
|
11
|
+
if (typeof raw !== "string")
|
|
12
|
+
return undefined;
|
|
13
|
+
const key = raw.trim().toUpperCase();
|
|
14
|
+
return Object.hasOwn(SEVERITY_ORDER, key) ? SEVERITY_ORDER[key] : undefined;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=severityrank.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"severityrank.js","sourceRoot":"","sources":["../../src/severityrank.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,kEAAkE;AAElE;2BAC2B;AAC3B,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAU,CAAC;AAEnE,MAAM,cAAc,GAAqC,MAAM,CAAC,WAAW,CACzE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAC/C,CAAC;AAEF;;kEAEkE;AAClE,MAAM,UAAU,YAAY,CAAC,GAA8B;IACzD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { ReviewedHeadRow } from "./storerows.js";
|
|
2
|
+
export type StandingDecidedVerdict = "APPROVE" | "REQUEST_CHANGES";
|
|
3
|
+
export type StandingReview =
|
|
4
|
+
/** No mark: nothing has ever been reviewed on this PR. */
|
|
5
|
+
{
|
|
6
|
+
kind: "none";
|
|
7
|
+
}
|
|
8
|
+
/** A legacy NEEDS_HUMAN/ESCALATE mark: reviewed, not decided. */
|
|
9
|
+
| {
|
|
10
|
+
kind: "undecided";
|
|
11
|
+
}
|
|
12
|
+
/** A substantive review stands; `source` says which field proved it. */
|
|
13
|
+
| {
|
|
14
|
+
kind: "decided";
|
|
15
|
+
verdict: StandingDecidedVerdict;
|
|
16
|
+
source: "verdict" | "posted_event";
|
|
17
|
+
}
|
|
18
|
+
/** Something was posted (or a bare head stamp) but no verdict can be read
|
|
19
|
+
* off the row without guessing. */
|
|
20
|
+
| {
|
|
21
|
+
kind: "unknown";
|
|
22
|
+
posted_event: string | null;
|
|
23
|
+
};
|
|
24
|
+
export declare function standingReview(mark: ReviewedHeadRow | undefined | null): StandingReview;
|
|
25
|
+
/** The decided standing verdict, or null when none stands (no mark, an
|
|
26
|
+
* undecided legacy mark, or a COMMENT-only / bare mark). */
|
|
27
|
+
export declare function standingVerdict(mark: ReviewedHeadRow | undefined | null): StandingDecidedVerdict | null;
|
|
28
|
+
/** The lifecycle state a verdict leaves a PR in: a REQUEST_CHANGES waits on
|
|
29
|
+
* the author; anything else — an approval, a legacy NEEDS_HUMAN, nothing
|
|
30
|
+
* decided — is tracked. The one table `transition` applies to a `verdict`
|
|
31
|
+
* and a `round_overdue` event and a restore applies to the standing review,
|
|
32
|
+
* so a restore can never land somewhere a verdict could not. */
|
|
33
|
+
export declare function standingLifecycleState(verdict: string | null | undefined): "awaiting_author" | "tracked";
|
|
34
|
+
/** The mark fields a durable event or receipt records so a later reader can
|
|
35
|
+
* restore state from evidence rather than from session prose. */
|
|
36
|
+
export interface StandingMarkSnapshot {
|
|
37
|
+
head_sha: string;
|
|
38
|
+
reviewed_at: string;
|
|
39
|
+
verdict: string | null;
|
|
40
|
+
posted_event: string | null;
|
|
41
|
+
round_no: number | null;
|
|
42
|
+
last_author_reply_at: string | null;
|
|
43
|
+
}
|
|
44
|
+
export declare function snapshotMark(mark: ReviewedHeadRow): StandingMarkSnapshot;
|
|
45
|
+
//# sourceMappingURL=standing-review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standing-review.d.ts","sourceRoot":"","sources":["../../src/standing-review.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGtD,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,iBAAiB,CAAC;AAEnE,MAAM,MAAM,cAAc;AACxB,0DAA0D;AACxD;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE;AAClB,iEAAiE;GAC/D;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE;AACvB,wEAAwE;GACtE;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,sBAAsB,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,cAAc,CAAA;CAAE;AAC1F;mCACmC;GACjC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAErD,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,SAAS,GAAG,IAAI,GAAG,cAAc,CAcvF;AAED;4DAC4D;AAC5D,wBAAgB,eAAe,CAC7B,IAAI,EAAE,eAAe,GAAG,SAAS,GAAG,IAAI,GACvC,sBAAsB,GAAG,IAAI,CAG/B;AAED;;;;gEAIgE;AAChE,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACjC,iBAAiB,GAAG,SAAS,CAE/B;AAED;iEACiE;AACjE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,eAAe,GAAG,oBAAoB,CASxE"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { normalizeVerdict } from "./types.js";
|
|
2
|
+
export function standingReview(mark) {
|
|
3
|
+
if (!mark)
|
|
4
|
+
return { kind: "none" };
|
|
5
|
+
const decided = normalizeVerdict(mark.verdict);
|
|
6
|
+
if (decided === "NEEDS_HUMAN")
|
|
7
|
+
return { kind: "undecided" };
|
|
8
|
+
if (decided === "APPROVE" || decided === "REQUEST_CHANGES")
|
|
9
|
+
return { kind: "decided", verdict: decided, source: "verdict" };
|
|
10
|
+
// Exact spelling, deliberately: both writers of `posted_event` (the gate's
|
|
11
|
+
// after-step, and the retired shell stamp on older rows) stamp the upper-case GitHub event, so a
|
|
12
|
+
// differently-cased value is a lookalike and is NOT proof (pinned by
|
|
13
|
+
// tests/operator-recovery.test.ts).
|
|
14
|
+
const posted = mark.posted_event;
|
|
15
|
+
if (posted === "APPROVE" || posted === "REQUEST_CHANGES")
|
|
16
|
+
return { kind: "decided", verdict: posted, source: "posted_event" };
|
|
17
|
+
return { kind: "unknown", posted_event: mark.posted_event ?? null };
|
|
18
|
+
}
|
|
19
|
+
/** The decided standing verdict, or null when none stands (no mark, an
|
|
20
|
+
* undecided legacy mark, or a COMMENT-only / bare mark). */
|
|
21
|
+
export function standingVerdict(mark) {
|
|
22
|
+
const standing = standingReview(mark);
|
|
23
|
+
return standing.kind === "decided" ? standing.verdict : null;
|
|
24
|
+
}
|
|
25
|
+
/** The lifecycle state a verdict leaves a PR in: a REQUEST_CHANGES waits on
|
|
26
|
+
* the author; anything else — an approval, a legacy NEEDS_HUMAN, nothing
|
|
27
|
+
* decided — is tracked. The one table `transition` applies to a `verdict`
|
|
28
|
+
* and a `round_overdue` event and a restore applies to the standing review,
|
|
29
|
+
* so a restore can never land somewhere a verdict could not. */
|
|
30
|
+
export function standingLifecycleState(verdict) {
|
|
31
|
+
return verdict === "REQUEST_CHANGES" ? "awaiting_author" : "tracked";
|
|
32
|
+
}
|
|
33
|
+
export function snapshotMark(mark) {
|
|
34
|
+
return {
|
|
35
|
+
head_sha: mark.head_sha,
|
|
36
|
+
reviewed_at: mark.reviewed_at,
|
|
37
|
+
verdict: mark.verdict,
|
|
38
|
+
posted_event: mark.posted_event,
|
|
39
|
+
round_no: mark.round_no,
|
|
40
|
+
last_author_reply_at: mark.last_author_reply_at,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=standing-review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standing-review.js","sourceRoot":"","sources":["../../src/standing-review.ts"],"names":[],"mappings":"AAmCA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAe9C,MAAM,UAAU,cAAc,CAAC,IAAwC;IACrE,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,OAAO,KAAK,aAAa;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC5D,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,iBAAiB;QACxD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAClE,2EAA2E;IAC3E,iGAAiG;IACjG,qEAAqE;IACrE,oCAAoC;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC;IACjC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,iBAAiB;QACtD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IACtE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC;AACtE,CAAC;AAED;4DAC4D;AAC5D,MAAM,UAAU,eAAe,CAC7B,IAAwC;IAExC,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC;AAED;;;;gEAIgE;AAChE,MAAM,UAAU,sBAAsB,CACpC,OAAkC;IAElC,OAAO,OAAO,KAAK,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC;AAaD,MAAM,UAAU,YAAY,CAAC,IAAqB;IAChD,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;KAChD,CAAC;AACJ,CAAC"}
|