@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,40 @@
|
|
|
1
|
+
import type { RoundFindingRow } from "./storerows.js";
|
|
2
|
+
/** A finding continuation address; the key may itself contain colons. */
|
|
3
|
+
export declare function carriedToRef(roundNo: number, findingKey: string): string;
|
|
4
|
+
export interface CarriedFinding {
|
|
5
|
+
round_no: number;
|
|
6
|
+
finding_key: string;
|
|
7
|
+
carried_to: string | null;
|
|
8
|
+
}
|
|
9
|
+
/** Follow known links once, ending at a missing target or a cycle. */
|
|
10
|
+
export declare function walkFindingChain<T extends CarriedFinding>(rows: readonly T[], root: T): T[];
|
|
11
|
+
/** Every unpointed root and its last known continuation. */
|
|
12
|
+
export declare function findingChains<T extends CarriedFinding>(rows: readonly T[]): Array<{
|
|
13
|
+
root: T;
|
|
14
|
+
end: T;
|
|
15
|
+
}>;
|
|
16
|
+
/** Was this row posted on the PR? `posted` with a tag — a downgraded, killed,
|
|
17
|
+
* doubted or withheld entry never reached the author as itself. */
|
|
18
|
+
export declare function isPostedRow(r: RoundFindingRow): boolean;
|
|
19
|
+
/** How far a later round's entry may sit from a finding's line and still be
|
|
20
|
+
* that finding (lines move as the branch moves). */
|
|
21
|
+
export declare const CONTINUATION_LINES = 10;
|
|
22
|
+
/**
|
|
23
|
+
* Which entry of the round `e` names in `raised_in_round` is `e` again? Only
|
|
24
|
+
* an entry on the same path, sharing a lens, within `CONTINUATION_LINES`:
|
|
25
|
+
* the one carrying `e`'s key when it is such an entry, else the single
|
|
26
|
+
* nearest such entry (a file-level line counts as the farthest near one). A
|
|
27
|
+
* tie is nobody's: two findings a few lines apart in one file and one lens
|
|
28
|
+
* must not both inherit one entry's fate. Returns the owner's key, or null.
|
|
29
|
+
*
|
|
30
|
+
* An equal key ALONE is no match: sessions number their keys per round (f1,
|
|
31
|
+
* f2, …), so a later round's `f1` is usually a different finding; a key-only
|
|
32
|
+
* match would carry one finding's fate onto another far away in the file.
|
|
33
|
+
*/
|
|
34
|
+
export declare function predecessorOf(round: readonly RoundFindingRow[], e: RoundFindingRow): string | null;
|
|
35
|
+
/** Could `b` be `a` again? The same path, a shared lens, within
|
|
36
|
+
* `CONTINUATION_LINES` (an entry without a line is near). The one eligibility
|
|
37
|
+
* rule of predecessor ownership and of the weak next-round match; who wins
|
|
38
|
+
* among the eligible is each caller's own rule. */
|
|
39
|
+
export declare function sameSite(a: RoundFindingRow, b: RoundFindingRow): boolean;
|
|
40
|
+
//# sourceMappingURL=finding-chain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-chain.d.ts","sourceRoot":"","sources":["../../src/finding-chain.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,cAAc,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAa3F;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,CAAC,SAAS,cAAc,EACpD,IAAI,EAAE,SAAS,CAAC,EAAE,GACjB,KAAK,CAAC;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,GAAG,EAAE,CAAC,CAAA;CAAE,CAAC,CAK5B;AAED;mEACmE;AACnE,wBAAgB,WAAW,CAAC,CAAC,EAAE,eAAe,GAAG,OAAO,CAEvD;AAED;oDACoD;AACpD,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAMrC;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,eAAe,EAAE,EACjC,CAAC,EAAE,eAAe,GACjB,MAAM,GAAG,IAAI,CAUf;AAED;;;mDAGmD;AACnD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,eAAe,GAAG,OAAO,CAMxE"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { storedLensIds } from "./lensids.js";
|
|
2
|
+
/** A finding continuation address; the key may itself contain colons. */
|
|
3
|
+
export function carriedToRef(roundNo, findingKey) {
|
|
4
|
+
return `${roundNo}:${findingKey}`;
|
|
5
|
+
}
|
|
6
|
+
/** Follow known links once, ending at a missing target or a cycle. */
|
|
7
|
+
export function walkFindingChain(rows, root) {
|
|
8
|
+
const byKey = new Map(rows.map((row) => [carriedToRef(row.round_no, row.finding_key), row]));
|
|
9
|
+
const seen = new Set();
|
|
10
|
+
const chain = [];
|
|
11
|
+
let row = root;
|
|
12
|
+
while (row) {
|
|
13
|
+
const key = carriedToRef(row.round_no, row.finding_key);
|
|
14
|
+
if (seen.has(key))
|
|
15
|
+
break;
|
|
16
|
+
seen.add(key);
|
|
17
|
+
chain.push(row);
|
|
18
|
+
row = row.carried_to ? byKey.get(row.carried_to) : undefined;
|
|
19
|
+
}
|
|
20
|
+
return chain;
|
|
21
|
+
}
|
|
22
|
+
/** Every unpointed root and its last known continuation. */
|
|
23
|
+
export function findingChains(rows) {
|
|
24
|
+
const pointed = new Set(rows.map((row) => row.carried_to).filter((ref) => !!ref));
|
|
25
|
+
return rows
|
|
26
|
+
.filter((row) => !pointed.has(carriedToRef(row.round_no, row.finding_key)))
|
|
27
|
+
.map((root) => ({ root, end: walkFindingChain(rows, root).at(-1) }));
|
|
28
|
+
}
|
|
29
|
+
/** Was this row posted on the PR? `posted` with a tag — a downgraded, killed,
|
|
30
|
+
* doubted or withheld entry never reached the author as itself. */
|
|
31
|
+
export function isPostedRow(r) {
|
|
32
|
+
return r.disposition === "posted" && r.posted_as !== null && r.posted_as.trim() !== "";
|
|
33
|
+
}
|
|
34
|
+
/** How far a later round's entry may sit from a finding's line and still be
|
|
35
|
+
* that finding (lines move as the branch moves). */
|
|
36
|
+
export const CONTINUATION_LINES = 10;
|
|
37
|
+
function lensIdsOf(row) {
|
|
38
|
+
return storedLensIds(row.lens_ids) ?? [];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Which entry of the round `e` names in `raised_in_round` is `e` again? Only
|
|
42
|
+
* an entry on the same path, sharing a lens, within `CONTINUATION_LINES`:
|
|
43
|
+
* the one carrying `e`'s key when it is such an entry, else the single
|
|
44
|
+
* nearest such entry (a file-level line counts as the farthest near one). A
|
|
45
|
+
* tie is nobody's: two findings a few lines apart in one file and one lens
|
|
46
|
+
* must not both inherit one entry's fate. Returns the owner's key, or null.
|
|
47
|
+
*
|
|
48
|
+
* An equal key ALONE is no match: sessions number their keys per round (f1,
|
|
49
|
+
* f2, …), so a later round's `f1` is usually a different finding; a key-only
|
|
50
|
+
* match would carry one finding's fate onto another far away in the file.
|
|
51
|
+
*/
|
|
52
|
+
export function predecessorOf(round, e) {
|
|
53
|
+
const dist = (s) => s.line === null || e.line === null ? CONTINUATION_LINES : Math.abs(s.line - e.line);
|
|
54
|
+
const candidates = round.filter((s) => sameSite(s, e));
|
|
55
|
+
const keyed = candidates.find((s) => s.finding_key === e.finding_key);
|
|
56
|
+
if (keyed)
|
|
57
|
+
return keyed.finding_key;
|
|
58
|
+
if (candidates.length === 0)
|
|
59
|
+
return null;
|
|
60
|
+
const best = Math.min(...candidates.map(dist));
|
|
61
|
+
const nearest = candidates.filter((s) => dist(s) === best);
|
|
62
|
+
return nearest.length === 1 ? nearest[0].finding_key : null;
|
|
63
|
+
}
|
|
64
|
+
/** Could `b` be `a` again? The same path, a shared lens, within
|
|
65
|
+
* `CONTINUATION_LINES` (an entry without a line is near). The one eligibility
|
|
66
|
+
* rule of predecessor ownership and of the weak next-round match; who wins
|
|
67
|
+
* among the eligible is each caller's own rule. */
|
|
68
|
+
export function sameSite(a, b) {
|
|
69
|
+
if (!a.path || a.path !== b.path)
|
|
70
|
+
return false;
|
|
71
|
+
if (a.line !== null && b.line !== null && Math.abs(a.line - b.line) > CONTINUATION_LINES)
|
|
72
|
+
return false;
|
|
73
|
+
const ids = lensIdsOf(a);
|
|
74
|
+
return lensIdsOf(b).some((id) => ids.includes(id));
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=finding-chain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-chain.js","sourceRoot":"","sources":["../../src/finding-chain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { RoundFindingInput } from "./storerows.js";
|
|
2
|
+
/** Semantic finding fields shared by file fallback and durable ingestion. */
|
|
3
|
+
export declare function findingRowFields(f: RoundFindingInput): {
|
|
4
|
+
finding_key: string;
|
|
5
|
+
path: string | null;
|
|
6
|
+
line: number | null;
|
|
7
|
+
lens: string;
|
|
8
|
+
tier: string | null;
|
|
9
|
+
severity: string | null;
|
|
10
|
+
confidence: number | null;
|
|
11
|
+
reachability: string | null;
|
|
12
|
+
kind: string | null;
|
|
13
|
+
disposition: string;
|
|
14
|
+
axis: string | null;
|
|
15
|
+
word: string | null;
|
|
16
|
+
reason: string | null;
|
|
17
|
+
evidence: string | null;
|
|
18
|
+
posted_as: string | null;
|
|
19
|
+
raised_in_round: number | null;
|
|
20
|
+
thread_id: number | null;
|
|
21
|
+
title: string | null;
|
|
22
|
+
lens_ids: string;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=finding-row.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-row.d.ts","sourceRoot":"","sources":["../../src/finding-row.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,iBAAiB;;;;;;;;;;;;;;;;;;;;EAsBpD"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { canonicalLensIds } from "./lensids.js";
|
|
2
|
+
/** Semantic finding fields shared by file fallback and durable ingestion. */
|
|
3
|
+
export function findingRowFields(f) {
|
|
4
|
+
return {
|
|
5
|
+
finding_key: f.key,
|
|
6
|
+
path: f.path ?? null,
|
|
7
|
+
line: f.line ?? null,
|
|
8
|
+
lens: f.lens ?? "",
|
|
9
|
+
tier: f.tier ?? null,
|
|
10
|
+
severity: f.severity ?? null,
|
|
11
|
+
confidence: f.confidence ?? null,
|
|
12
|
+
reachability: f.reachability ?? null,
|
|
13
|
+
kind: f.kind ?? null,
|
|
14
|
+
disposition: f.disposition ?? "unknown",
|
|
15
|
+
axis: f.axis ?? null,
|
|
16
|
+
word: f.word ?? null,
|
|
17
|
+
reason: f.reason ?? null,
|
|
18
|
+
evidence: f.evidence ?? null,
|
|
19
|
+
posted_as: f.posted_as ?? null,
|
|
20
|
+
raised_in_round: f.raised_in_round ?? null,
|
|
21
|
+
thread_id: f.thread_id ?? null,
|
|
22
|
+
title: f.title ?? null,
|
|
23
|
+
lens_ids: JSON.stringify(canonicalLensIds(f.lens ?? "")),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=finding-row.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-row.js","sourceRoot":"","sources":["../../src/finding-row.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD,6EAA6E;AAC7E,MAAM,UAAU,gBAAgB,CAAC,CAAoB;IACnD,OAAO;QACL,WAAW,EAAE,CAAC,CAAC,GAAG;QAClB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI;QACpB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI;QACpB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;QAClB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI;QACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI;QAC5B,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,IAAI;QAChC,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,IAAI;QACpC,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI;QACpB,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,SAAS;QACvC,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI;QACpB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI;QACpB,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI;QACxB,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI;QAC5B,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI;QAC9B,eAAe,EAAE,CAAC,CAAC,eAAe,IAAI,IAAI;QAC1C,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI;QAC9B,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI;QACtB,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;KACzD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/** A record field as a non-empty trimmed string, else null. */
|
|
2
|
+
export declare function recordString(val: unknown): string | null;
|
|
3
|
+
/** The record's entry array: `findings` first, else the legacy `candidates`
|
|
4
|
+
* spelling, else null. The ONE precedence the parser and the renderer share. */
|
|
5
|
+
export declare function recordEntries(rec: Record<string, unknown>): unknown[] | null;
|
|
6
|
+
/** A record field as a number — a finite number, or a decimal string a
|
|
7
|
+
* session wrote (`"0.7"`, `"12"`) — else null. The ONE coercion: the parser
|
|
8
|
+
* stores what the renderer posts, so a value both read must read alike. */
|
|
9
|
+
export declare function recordNumber(val: unknown): number | null;
|
|
10
|
+
/** The diff side a record entry's anchor counts on: `LEFT` in any case, else
|
|
11
|
+
* `RIGHT` (the default). The renderer posts on it and the post-check compares
|
|
12
|
+
* by it, so both read one side. */
|
|
13
|
+
export declare function recordSide(val: unknown): "LEFT" | "RIGHT";
|
|
14
|
+
/**
|
|
15
|
+
* What happened to a candidate finding. Closed set — the record is only
|
|
16
|
+
* countable if the disposition is.
|
|
17
|
+
*
|
|
18
|
+
* - `posted` — it survived validation and went out on the PR (the RAISE side,
|
|
19
|
+
* the half adjudication actually needs).
|
|
20
|
+
* - `killed` — the validator vetoed it.
|
|
21
|
+
* - `downgraded` — the validator moved it (severity, confidence or
|
|
22
|
+
* reachability). A `downgrade` survivor still goes out: recorded with its
|
|
23
|
+
* `posted_as` it reads as posted (`entryDisposition`); without one it
|
|
24
|
+
* is never posted, and the renderer reports it.
|
|
25
|
+
* - `doubted` — the validator could not stand behind the CLAIM (`DOUBT_WORDS`:
|
|
26
|
+
* refuted, unverifiable, bad anchor). A validity veto is a mark, not a
|
|
27
|
+
* deletion — kept here as "may not be valid", never posted on the PR,
|
|
28
|
+
* shown in the TUI for the operator to judge.
|
|
29
|
+
* - `merged` / `folded` — merge-stage attrition: the same defect
|
|
30
|
+
* collapsed into another finding, or a different defect carried as a
|
|
31
|
+
* paragraph under one. Attrition here counts like a kill; it must never
|
|
32
|
+
* vanish silently.
|
|
33
|
+
* - `withheld` — the session itself dropped it before the validator saw it,
|
|
34
|
+
* or the profile's `[posting]` policy kept a survivor off the PR (a word
|
|
35
|
+
* from `WITHHOLD_WORDS`: `over-budget`, `nits-off`, …) — kept, never posted.
|
|
36
|
+
* - `conceded` — REFUTED AND CONCEDED: previously posted, the author refuted
|
|
37
|
+
* it and the reviewer accepted the refutation. This is the state that lets a
|
|
38
|
+
* later round tell "escalating an open finding" (legitimate — blocking late
|
|
39
|
+
* beats never) from "resurrecting a settled one" (not legitimate). Nothing
|
|
40
|
+
* else in the system records it.
|
|
41
|
+
*/
|
|
42
|
+
declare const DISPOSITION_VALUES: readonly ["posted", "killed", "doubted", "downgraded", "merged", "folded", "withheld", "conceded"];
|
|
43
|
+
export type FindingDisposition = (typeof DISPOSITION_VALUES)[number] | "unknown";
|
|
44
|
+
/** A disposition as the closed set, under every spelling the aliases fold. */
|
|
45
|
+
export declare function normalizeDisposition(raw: unknown): FindingDisposition;
|
|
46
|
+
/**
|
|
47
|
+
* The disposition a record ENTRY acts on. A validator `downgrade` keeps the
|
|
48
|
+
* finding at the severity it names (packages/pi-plugin/src/templates.ts
|
|
49
|
+
* renderValidatorOutputNote), so a `downgraded` entry that went out under a
|
|
50
|
+
* tag (`posted_as`) is a posted survivor: the downgrade's `word` and `axis`
|
|
51
|
+
* stay on the entry, and it counts, renders and dedups as `posted`. Without a
|
|
52
|
+
* `posted_as` it stays `downgraded`, never posted. Every reader that asks
|
|
53
|
+
* "was this entry posted?" of a raw entry asks it here.
|
|
54
|
+
*/
|
|
55
|
+
export declare function entryDisposition(entry: Record<string, unknown>): FindingDisposition;
|
|
56
|
+
/**
|
|
57
|
+
* The per-round key of the record entry at `index` of its `findings` array:
|
|
58
|
+
* the session's own handle (`id`, else `key`), and when it wrote neither, the
|
|
59
|
+
* stable fallback `<lens>@<path>:<line>#<index>`. This IS the parser's rule
|
|
60
|
+
* (`parseFindingsRecord` calls it), so a key computed here from the same
|
|
61
|
+
* record always names the same row.
|
|
62
|
+
*/
|
|
63
|
+
export declare function findingRecordKey(entry: Record<string, unknown>, index: number): string;
|
|
64
|
+
/**
|
|
65
|
+
* The hidden marker the live render route appends to an inline comment:
|
|
66
|
+
* `<!-- qcr:f=<round_no>:<finding key> -->`. GitHub renders an HTML comment
|
|
67
|
+
* as nothing, so the reader never sees it. The key is percent-encoded down to
|
|
68
|
+
* `[A-Za-z0-9%._~]`, so no session-written key can close the comment early
|
|
69
|
+
* (`-->`), break the line, or collide with the separator. Never throws: the
|
|
70
|
+
* render route has no catch around it.
|
|
71
|
+
*/
|
|
72
|
+
export declare function findingMarker(roundNo: number, key: string): string;
|
|
73
|
+
/** Matches a marker anywhere in a comment body. */
|
|
74
|
+
export declare const FINDING_MARKER_RE: RegExp;
|
|
75
|
+
/**
|
|
76
|
+
* The marker a comment body carries, if any. A malformed one is no marker.
|
|
77
|
+
*
|
|
78
|
+
* The LAST marker in the body is the real one: the render route appends it
|
|
79
|
+
* after the finding's text (`reviewrender.ts`), and that text is the
|
|
80
|
+
* reviewer's, which may quote PR content — a marker-shaped string a PR
|
|
81
|
+
* carries (or this repo's own tests, in a self-review) and the finding
|
|
82
|
+
* quotes comes BEFORE it. Taking the first match would link the comment to
|
|
83
|
+
* whatever finding the quoted text names.
|
|
84
|
+
*/
|
|
85
|
+
export declare function parseFindingMarker(body: string | null | undefined): {
|
|
86
|
+
round_no: number;
|
|
87
|
+
key: string;
|
|
88
|
+
} | null;
|
|
89
|
+
/** A body with every marker removed — what the comment reads as without it. */
|
|
90
|
+
export declare function stripFindingMarkers(body: string): string;
|
|
91
|
+
/** A recheck head as the recheck's own key: its first 12 characters,
|
|
92
|
+
* lowercased — so a full sha and its prefix are one head. */
|
|
93
|
+
export declare function recheckHead12(head: string): string;
|
|
94
|
+
/** The `finding_key` prefix of a recheck's own findings at `head`
|
|
95
|
+
* (`recheck:<head12>:`): the recheck writes its rows under it and the learner
|
|
96
|
+
* reads them back by it. */
|
|
97
|
+
export declare function recheckKeyPrefix(head: string): string;
|
|
98
|
+
export {};
|
|
99
|
+
//# sourceMappingURL=findingkey.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findingkey.d.ts","sourceRoot":"","sources":["../../src/findingkey.ts"],"names":[],"mappings":"AAWA,+DAA+D;AAC/D,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIxD;AAED;gFACgF;AAChF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,EAAE,GAAG,IAAI,CAG5E;AAED;;2EAE2E;AAC3E,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAOxD;AAKD;;mCAEmC;AACnC,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAEzD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,QAAA,MAAM,kBAAkB,oGASd,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;AA2BjF,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,kBAAkB,CAKrE;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,kBAAkB,CAKnF;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKtF;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAElE;AAgBD,mDAAmD;AACnD,eAAO,MAAM,iBAAiB,QAAgD,CAAC;AAI/E;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAW1C;AAKD,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;6DAC6D;AAC7D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;4BAE4B;AAC5B,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
// A posted finding's identity, shared by the two ends that must agree on it
|
|
2
|
+
// for outcome capture: the findings-record PARSER, which turns the
|
|
3
|
+
// session's record into `round_findings` rows keyed by `(pr, round_no,
|
|
4
|
+
// finding_key)`, and the live RENDER route, which stamps that key into every
|
|
5
|
+
// inline comment it renders so the comment can be linked back to its row.
|
|
6
|
+
// Beside it, the readings of a record entry every consumer must share: its
|
|
7
|
+
// numbers and strings, its disposition (is it `posted`?) and its diff side.
|
|
8
|
+
//
|
|
9
|
+
// A leaf on purpose — no imports. `packages/pi-plugin/src/reviewrender.ts` is also the bench's
|
|
10
|
+
// render step, and the bench must not pull the daemon's modules in with it.
|
|
11
|
+
/** A record field as a non-empty trimmed string, else null. */
|
|
12
|
+
export function recordString(val) {
|
|
13
|
+
if (typeof val !== "string")
|
|
14
|
+
return null;
|
|
15
|
+
const t = val.trim();
|
|
16
|
+
return t.length > 0 ? t : null;
|
|
17
|
+
}
|
|
18
|
+
/** The record's entry array: `findings` first, else the legacy `candidates`
|
|
19
|
+
* spelling, else null. The ONE precedence the parser and the renderer share. */
|
|
20
|
+
export function recordEntries(rec) {
|
|
21
|
+
if (Array.isArray(rec.findings))
|
|
22
|
+
return rec.findings;
|
|
23
|
+
return Array.isArray(rec.candidates) ? rec.candidates : null;
|
|
24
|
+
}
|
|
25
|
+
/** A record field as a number — a finite number, or a decimal string a
|
|
26
|
+
* session wrote (`"0.7"`, `"12"`) — else null. The ONE coercion: the parser
|
|
27
|
+
* stores what the renderer posts, so a value both read must read alike. */
|
|
28
|
+
export function recordNumber(val) {
|
|
29
|
+
if (typeof val === "number" && Number.isFinite(val))
|
|
30
|
+
return val;
|
|
31
|
+
if (typeof val === "string" && /^-?\d+(\.\d+)?$/.test(val.trim())) {
|
|
32
|
+
const number = Number(val.trim());
|
|
33
|
+
return Number.isFinite(number) ? number : null;
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
const str = recordString;
|
|
38
|
+
const num = recordNumber;
|
|
39
|
+
/** The diff side a record entry's anchor counts on: `LEFT` in any case, else
|
|
40
|
+
* `RIGHT` (the default). The renderer posts on it and the post-check compares
|
|
41
|
+
* by it, so both read one side. */
|
|
42
|
+
export function recordSide(val) {
|
|
43
|
+
return recordString(val)?.toUpperCase() === "LEFT" ? "LEFT" : "RIGHT";
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* What happened to a candidate finding. Closed set — the record is only
|
|
47
|
+
* countable if the disposition is.
|
|
48
|
+
*
|
|
49
|
+
* - `posted` — it survived validation and went out on the PR (the RAISE side,
|
|
50
|
+
* the half adjudication actually needs).
|
|
51
|
+
* - `killed` — the validator vetoed it.
|
|
52
|
+
* - `downgraded` — the validator moved it (severity, confidence or
|
|
53
|
+
* reachability). A `downgrade` survivor still goes out: recorded with its
|
|
54
|
+
* `posted_as` it reads as posted (`entryDisposition`); without one it
|
|
55
|
+
* is never posted, and the renderer reports it.
|
|
56
|
+
* - `doubted` — the validator could not stand behind the CLAIM (`DOUBT_WORDS`:
|
|
57
|
+
* refuted, unverifiable, bad anchor). A validity veto is a mark, not a
|
|
58
|
+
* deletion — kept here as "may not be valid", never posted on the PR,
|
|
59
|
+
* shown in the TUI for the operator to judge.
|
|
60
|
+
* - `merged` / `folded` — merge-stage attrition: the same defect
|
|
61
|
+
* collapsed into another finding, or a different defect carried as a
|
|
62
|
+
* paragraph under one. Attrition here counts like a kill; it must never
|
|
63
|
+
* vanish silently.
|
|
64
|
+
* - `withheld` — the session itself dropped it before the validator saw it,
|
|
65
|
+
* or the profile's `[posting]` policy kept a survivor off the PR (a word
|
|
66
|
+
* from `WITHHOLD_WORDS`: `over-budget`, `nits-off`, …) — kept, never posted.
|
|
67
|
+
* - `conceded` — REFUTED AND CONCEDED: previously posted, the author refuted
|
|
68
|
+
* it and the reviewer accepted the refutation. This is the state that lets a
|
|
69
|
+
* later round tell "escalating an open finding" (legitimate — blocking late
|
|
70
|
+
* beats never) from "resurrecting a settled one" (not legitimate). Nothing
|
|
71
|
+
* else in the system records it.
|
|
72
|
+
*/
|
|
73
|
+
const DISPOSITION_VALUES = [
|
|
74
|
+
"posted",
|
|
75
|
+
"killed",
|
|
76
|
+
"doubted",
|
|
77
|
+
"downgraded",
|
|
78
|
+
"merged",
|
|
79
|
+
"folded",
|
|
80
|
+
"withheld",
|
|
81
|
+
"conceded",
|
|
82
|
+
];
|
|
83
|
+
const DISPOSITIONS = new Set(DISPOSITION_VALUES);
|
|
84
|
+
/** Spellings a session plausibly writes, folded onto the closed set. Tolerant
|
|
85
|
+
* input, exactly like the verdict file's digit-string coercion — never a
|
|
86
|
+
* rejection reason. */
|
|
87
|
+
const DISPOSITION_ALIASES = {
|
|
88
|
+
post: "posted",
|
|
89
|
+
survive: "posted",
|
|
90
|
+
survived: "posted",
|
|
91
|
+
kill: "killed",
|
|
92
|
+
vetoed: "killed",
|
|
93
|
+
doubt: "doubted",
|
|
94
|
+
"may-not-be-valid": "doubted",
|
|
95
|
+
downgrade: "downgraded",
|
|
96
|
+
demoted: "downgraded",
|
|
97
|
+
capped: "downgraded",
|
|
98
|
+
merge: "merged",
|
|
99
|
+
fold: "folded",
|
|
100
|
+
withhold: "withheld",
|
|
101
|
+
dropped: "withheld",
|
|
102
|
+
concede: "conceded",
|
|
103
|
+
"refuted-and-conceded": "conceded",
|
|
104
|
+
refuted_and_conceded: "conceded",
|
|
105
|
+
};
|
|
106
|
+
/** A disposition as the closed set, under every spelling the aliases fold. */
|
|
107
|
+
export function normalizeDisposition(raw) {
|
|
108
|
+
if (typeof raw !== "string")
|
|
109
|
+
return "unknown";
|
|
110
|
+
const v = raw.trim().toLowerCase().replace(/\s+/g, "-");
|
|
111
|
+
if (DISPOSITIONS.has(v))
|
|
112
|
+
return v;
|
|
113
|
+
return DISPOSITION_ALIASES[v] ?? "unknown";
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* The disposition a record ENTRY acts on. A validator `downgrade` keeps the
|
|
117
|
+
* finding at the severity it names (packages/pi-plugin/src/templates.ts
|
|
118
|
+
* renderValidatorOutputNote), so a `downgraded` entry that went out under a
|
|
119
|
+
* tag (`posted_as`) is a posted survivor: the downgrade's `word` and `axis`
|
|
120
|
+
* stay on the entry, and it counts, renders and dedups as `posted`. Without a
|
|
121
|
+
* `posted_as` it stays `downgraded`, never posted. Every reader that asks
|
|
122
|
+
* "was this entry posted?" of a raw entry asks it here.
|
|
123
|
+
*/
|
|
124
|
+
export function entryDisposition(entry) {
|
|
125
|
+
const d = normalizeDisposition(entry.disposition);
|
|
126
|
+
if (d !== "downgraded")
|
|
127
|
+
return d;
|
|
128
|
+
const tag = entry.posted_as;
|
|
129
|
+
return typeof tag === "string" && tag.trim() !== "" ? "posted" : d;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* The per-round key of the record entry at `index` of its `findings` array:
|
|
133
|
+
* the session's own handle (`id`, else `key`), and when it wrote neither, the
|
|
134
|
+
* stable fallback `<lens>@<path>:<line>#<index>`. This IS the parser's rule
|
|
135
|
+
* (`parseFindingsRecord` calls it), so a key computed here from the same
|
|
136
|
+
* record always names the same row.
|
|
137
|
+
*/
|
|
138
|
+
export function findingRecordKey(entry, index) {
|
|
139
|
+
const lens = str(entry.lens) ?? str(entry.name) ?? "";
|
|
140
|
+
const path = str(entry.path);
|
|
141
|
+
const line = num(entry.line);
|
|
142
|
+
return str(entry.id) ?? str(entry.key) ?? `${lens || "?"}@${path ?? "?"}:${line ?? "?"}#${index}`;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* The hidden marker the live render route appends to an inline comment:
|
|
146
|
+
* `<!-- qcr:f=<round_no>:<finding key> -->`. GitHub renders an HTML comment
|
|
147
|
+
* as nothing, so the reader never sees it. The key is percent-encoded down to
|
|
148
|
+
* `[A-Za-z0-9%._~]`, so no session-written key can close the comment early
|
|
149
|
+
* (`-->`), break the line, or collide with the separator. Never throws: the
|
|
150
|
+
* render route has no catch around it.
|
|
151
|
+
*/
|
|
152
|
+
export function findingMarker(roundNo, key) {
|
|
153
|
+
return `<!-- qcr:f=${Math.trunc(roundNo)}:${encodeMarkerKey(key)} -->`;
|
|
154
|
+
}
|
|
155
|
+
/** A lone UTF-16 surrogate — what `encodeURIComponent` throws `URIError` on. */
|
|
156
|
+
const LONE_SURROGATE = /[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g;
|
|
157
|
+
function encodeMarkerKey(key) {
|
|
158
|
+
// A session-written key (a JSON `"\ud800"` escape parses) may hold a lone
|
|
159
|
+
// surrogate. It becomes U+FFFD first — what `String.prototype.toWellFormed`
|
|
160
|
+
// does, and what the key reads back as from the state database, whose UTF-8
|
|
161
|
+
// storage makes the same replacement — so the marker still names its row.
|
|
162
|
+
return encodeURIComponent(key.replace(LONE_SURROGATE, "�")).replace(/[!'()*-]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase().padStart(2, "0")}`);
|
|
163
|
+
}
|
|
164
|
+
/** Matches a marker anywhere in a comment body. */
|
|
165
|
+
export const FINDING_MARKER_RE = /<!--\s*qcr:f=(\d+):([A-Za-z0-9%._~]+)\s*-->/;
|
|
166
|
+
const FINDING_MARKER_ALL_RE = new RegExp(FINDING_MARKER_RE.source, "g");
|
|
167
|
+
/**
|
|
168
|
+
* The marker a comment body carries, if any. A malformed one is no marker.
|
|
169
|
+
*
|
|
170
|
+
* The LAST marker in the body is the real one: the render route appends it
|
|
171
|
+
* after the finding's text (`reviewrender.ts`), and that text is the
|
|
172
|
+
* reviewer's, which may quote PR content — a marker-shaped string a PR
|
|
173
|
+
* carries (or this repo's own tests, in a self-review) and the finding
|
|
174
|
+
* quotes comes BEFORE it. Taking the first match would link the comment to
|
|
175
|
+
* whatever finding the quoted text names.
|
|
176
|
+
*/
|
|
177
|
+
export function parseFindingMarker(body) {
|
|
178
|
+
if (typeof body !== "string")
|
|
179
|
+
return null;
|
|
180
|
+
let m = null;
|
|
181
|
+
for (const hit of body.matchAll(FINDING_MARKER_ALL_RE))
|
|
182
|
+
m = hit;
|
|
183
|
+
if (!m)
|
|
184
|
+
return null;
|
|
185
|
+
try {
|
|
186
|
+
const key = decodeURIComponent(m[2]);
|
|
187
|
+
return key ? { round_no: Number(m[1]), key } : null;
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/** Every marker in a body, with the newlines the render route put before it. */
|
|
194
|
+
const FINDING_MARKER_STRIP_RE = new RegExp(`\\n*${FINDING_MARKER_RE.source}`, "g");
|
|
195
|
+
/** A body with every marker removed — what the comment reads as without it. */
|
|
196
|
+
export function stripFindingMarkers(body) {
|
|
197
|
+
return body.replace(FINDING_MARKER_STRIP_RE, "");
|
|
198
|
+
}
|
|
199
|
+
/** A recheck head as the recheck's own key: its first 12 characters,
|
|
200
|
+
* lowercased — so a full sha and its prefix are one head. */
|
|
201
|
+
export function recheckHead12(head) {
|
|
202
|
+
return head.slice(0, 12).toLowerCase();
|
|
203
|
+
}
|
|
204
|
+
/** The `finding_key` prefix of a recheck's own findings at `head`
|
|
205
|
+
* (`recheck:<head12>:`): the recheck writes its rows under it and the learner
|
|
206
|
+
* reads them back by it. */
|
|
207
|
+
export function recheckKeyPrefix(head) {
|
|
208
|
+
return `recheck:${recheckHead12(head)}:`;
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=findingkey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findingkey.js","sourceRoot":"","sources":["../../src/findingkey.ts"],"names":[],"mappings":"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"}
|