@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,373 @@
|
|
|
1
|
+
// Django migration-number collision pre-check. Pure functions: the
|
|
2
|
+
// caller supplies the PR's changed files and the migration paths that exist on
|
|
3
|
+
// the base branch at the round's `base_sha`; this module decides whether the PR
|
|
4
|
+
// occupies a number the base already took, and writes the remedy.
|
|
5
|
+
//
|
|
6
|
+
// Why it lives daemon-side rather than in a lens: a leaf-node collision with
|
|
7
|
+
// the base branch is deterministic, machine-checkable without an LLM, has
|
|
8
|
+
// exactly one remedy (renumber + repoint `dependencies`) and carries no design
|
|
9
|
+
// content. Raised as a blocker it would consume the merge gate and cost the
|
|
10
|
+
// author a full re-review round for a mechanical rename. Nothing
|
|
11
|
+
// else in the pipeline catches it (GitHub reports MERGEABLE because the
|
|
12
|
+
// filenames differ, and CI is green), so the check does not get quieter here:
|
|
13
|
+
// it runs every round, deterministically, and is delivered as a COMMENT.
|
|
14
|
+
//
|
|
15
|
+
// This is not a trivial-delta classifier (src/recheck.ts owns that) —
|
|
16
|
+
// detection and comment text only.
|
|
17
|
+
import { codePath, flatControls } from "./codespan.js";
|
|
18
|
+
const MIGRATION_PATH = /^(?:(.*)\/)?migrations\/(\d{2,})_([^/]+)\.py$/;
|
|
19
|
+
/** Parse `…/<app>/migrations/NNNN_name.py`; undefined for anything else
|
|
20
|
+
* (including `__init__.py`, which carries no number). */
|
|
21
|
+
export function parseMigrationPath(path) {
|
|
22
|
+
const m = MIGRATION_PATH.exec(path);
|
|
23
|
+
if (!m)
|
|
24
|
+
return undefined;
|
|
25
|
+
const app = m[1] ?? "";
|
|
26
|
+
const digits = m[2];
|
|
27
|
+
return {
|
|
28
|
+
path,
|
|
29
|
+
app,
|
|
30
|
+
app_label: app.split("/").filter(Boolean).pop() ?? "",
|
|
31
|
+
number: Number(digits),
|
|
32
|
+
digits,
|
|
33
|
+
name: m[3],
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function migrationName(ref) {
|
|
37
|
+
return `${ref.digits}_${ref.name}`;
|
|
38
|
+
}
|
|
39
|
+
export function dependencyTuple(label, name) {
|
|
40
|
+
return `(${label ? JSON.stringify(label) : "<existing app label>"}, ${JSON.stringify(name)})`;
|
|
41
|
+
}
|
|
42
|
+
/** Re-number a ref onto `n`, keeping the on-disk zero-padding width. */
|
|
43
|
+
function renamedTo(ref, n) {
|
|
44
|
+
const digits = String(n).padStart(ref.digits.length, "0");
|
|
45
|
+
const name = `${digits}_${ref.name}`;
|
|
46
|
+
return { name, path: `${ref.app ? `${ref.app}/` : ""}migrations/${name}.py` };
|
|
47
|
+
}
|
|
48
|
+
function escapeRe(s) {
|
|
49
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
50
|
+
}
|
|
51
|
+
/** Whitespace inside a tuple, where a line break in a unified diff carries
|
|
52
|
+
* the next line's `+` prefix. */
|
|
53
|
+
const DIFF_GAP = "(?:[^\\S\\n]|\\n\\+?)*";
|
|
54
|
+
/** The patch as the file reads after the change: its removed lines dropped,
|
|
55
|
+
* so a dependency the PR deletes is never read as one it still holds. */
|
|
56
|
+
function postChange(patch) {
|
|
57
|
+
return patch
|
|
58
|
+
.split("\n")
|
|
59
|
+
.filter((l) => !l.startsWith("-"))
|
|
60
|
+
.join("\n");
|
|
61
|
+
}
|
|
62
|
+
/** Does this file's diff name `(app_label, name)` as a `dependencies` tuple?
|
|
63
|
+
* A cross-app reference must carry the label — a bare `"0001_initial"` in
|
|
64
|
+
* another app is that app's own migration. The tuple may be split across
|
|
65
|
+
* added diff lines and carry a trailing comma. */
|
|
66
|
+
function referencesAppMigration(patch, appLabel, name) {
|
|
67
|
+
if (!patch || !name || !appLabel)
|
|
68
|
+
return false;
|
|
69
|
+
const g = DIFF_GAP;
|
|
70
|
+
return new RegExp(`\\(${g}["']${escapeRe(appLabel)}["']${g},${g}["']${escapeRe(name)}["']${g}(?:,${g})?\\)`).test(postChange(patch));
|
|
71
|
+
}
|
|
72
|
+
/** Same-app follow-up match. A same-app dependency is an `(app_label, name)`
|
|
73
|
+
* tuple, but the label is inferred from the directory and Django's label can
|
|
74
|
+
* differ, and a tuple split across diff lines carries a `+` between its halves
|
|
75
|
+
* — so a bare quoted `name` still counts (the check must never get quieter
|
|
76
|
+
* than a name-only match), except an occurrence that is the second
|
|
77
|
+
* half of a tuple naming another app this PR or the base branch holds: that
|
|
78
|
+
* one is that app's identically named migration. */
|
|
79
|
+
function ownDependencyLabel(patch, ownLabel, name, knownLabels) {
|
|
80
|
+
if (!patch || !name)
|
|
81
|
+
return null;
|
|
82
|
+
if (referencesAppMigration(patch, ownLabel, name))
|
|
83
|
+
return ownLabel;
|
|
84
|
+
const post = postChange(patch);
|
|
85
|
+
const re = new RegExp(`["']${escapeRe(name)}["']`, "g");
|
|
86
|
+
// The tuple's first half, which may sit on an earlier added line.
|
|
87
|
+
const tupleHead = new RegExp(`\\(${DIFF_GAP}["']([^"'\\n]*)["']${DIFF_GAP},${DIFF_GAP}$`);
|
|
88
|
+
for (let m = re.exec(post); m !== null; m = re.exec(post)) {
|
|
89
|
+
const head = tupleHead.exec(post.slice(Math.max(0, m.index - 200), m.index));
|
|
90
|
+
if (head && head[1] !== ownLabel && knownLabels.has(head[1]))
|
|
91
|
+
continue;
|
|
92
|
+
return head?.[1] ?? ownLabel;
|
|
93
|
+
}
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Migration numbers this PR claims that the base branch already occupies.
|
|
98
|
+
*
|
|
99
|
+
* A collision is "same app, same number, different file" — a PR file that
|
|
100
|
+
* merely edits a migration already on the base (same path) is not one. Deleted
|
|
101
|
+
* PR files are ignored. Collisions are returned in path order per app, and the
|
|
102
|
+
* assigned target numbers form a chain: the first renumbered migration in an
|
|
103
|
+
* app depends on the base branch's leaf, each later one on its predecessor.
|
|
104
|
+
*/
|
|
105
|
+
export function detectMigrationCollisions(input) {
|
|
106
|
+
const baseByApp = new Map();
|
|
107
|
+
// Every base migration path. Django names a migration by app + full name, so
|
|
108
|
+
// a merged graph can legitimately hold 0042_a and 0042_b; a PR editing
|
|
109
|
+
// either one edits an existing file and collides with nothing.
|
|
110
|
+
const basePaths = new Set();
|
|
111
|
+
for (const path of input.baseFiles) {
|
|
112
|
+
const ref = parseMigrationPath(path);
|
|
113
|
+
if (!ref)
|
|
114
|
+
continue;
|
|
115
|
+
basePaths.add(ref.path);
|
|
116
|
+
const byNumber = baseByApp.get(ref.app) ?? new Map();
|
|
117
|
+
// Two base migrations on one number (branched history + a merge
|
|
118
|
+
// migration): the higher path is the occupant a new file is told about.
|
|
119
|
+
const prev = byNumber.get(ref.number);
|
|
120
|
+
if (!prev || prev.path < ref.path)
|
|
121
|
+
byNumber.set(ref.number, ref);
|
|
122
|
+
baseByApp.set(ref.app, byNumber);
|
|
123
|
+
}
|
|
124
|
+
const prByApp = new Map();
|
|
125
|
+
for (const f of input.files) {
|
|
126
|
+
if (f.status === "removed")
|
|
127
|
+
continue;
|
|
128
|
+
const ref = parseMigrationPath(f.filename);
|
|
129
|
+
if (!ref)
|
|
130
|
+
continue;
|
|
131
|
+
prByApp.set(ref.app, [
|
|
132
|
+
...(prByApp.get(ref.app) ?? []),
|
|
133
|
+
{ ref, ...(f.patch !== undefined ? { patch: f.patch } : {}) },
|
|
134
|
+
]);
|
|
135
|
+
}
|
|
136
|
+
// The one deterministic order both passes walk: apps by name, each app's
|
|
137
|
+
// migrations by number then path (the remedy's order, and its fingerprint's).
|
|
138
|
+
const orderedByApp = [...prByApp]
|
|
139
|
+
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
|
|
140
|
+
.map(([app, entries]) => [
|
|
141
|
+
app,
|
|
142
|
+
[...entries].sort((a, b) => a.ref.number - b.ref.number || (a.ref.path < b.ref.path ? -1 : 1)),
|
|
143
|
+
]);
|
|
144
|
+
// Every app label either side holds — what tells a same-app bare-name match
|
|
145
|
+
// apart from another app's identically named migration.
|
|
146
|
+
const knownLabels = new Set();
|
|
147
|
+
for (const path of basePaths)
|
|
148
|
+
knownLabels.add(parseMigrationPath(path).app_label);
|
|
149
|
+
for (const entries of prByApp.values())
|
|
150
|
+
for (const { ref } of entries)
|
|
151
|
+
knownLabels.add(ref.app_label);
|
|
152
|
+
knownLabels.delete("");
|
|
153
|
+
// Infer custom labels only from tuples naming migrations this app owns.
|
|
154
|
+
// Multiple incompatible labels remain unresolved rather than choosing one.
|
|
155
|
+
const labelsByApp = new Map();
|
|
156
|
+
for (const [app, ordered] of orderedByApp) {
|
|
157
|
+
const ownNames = new Set([
|
|
158
|
+
...[...(baseByApp.get(app)?.values() ?? [])].map(migrationName),
|
|
159
|
+
...ordered.map(({ ref }) => migrationName(ref)),
|
|
160
|
+
]);
|
|
161
|
+
const labels = new Set();
|
|
162
|
+
for (const { ref, patch } of ordered)
|
|
163
|
+
for (const name of ownNames) {
|
|
164
|
+
const label = ownDependencyLabel(patch, ref.app_label, name, knownLabels);
|
|
165
|
+
if (label !== null && label !== ref.app_label)
|
|
166
|
+
labels.add(label);
|
|
167
|
+
}
|
|
168
|
+
labelsByApp.set(app, labels.size === 1 ? [...labels][0] : ordered[0].ref.app_label);
|
|
169
|
+
}
|
|
170
|
+
const out = [];
|
|
171
|
+
// Every rename the remedy prescribes, per app, for the cross-app follow-up
|
|
172
|
+
// pass below.
|
|
173
|
+
const renamedByApp = new Map();
|
|
174
|
+
for (const [app, ordered] of orderedByApp) {
|
|
175
|
+
const base = baseByApp.get(app) ?? new Map();
|
|
176
|
+
const colliding = ordered.filter(({ ref: r }) => {
|
|
177
|
+
const occupant = base.get(r.number);
|
|
178
|
+
return occupant !== undefined && !basePaths.has(r.path);
|
|
179
|
+
});
|
|
180
|
+
if (colliding.length === 0)
|
|
181
|
+
continue;
|
|
182
|
+
// Free numbers start above everything either side already uses, so the
|
|
183
|
+
// remedy never collides with a sibling migration in the same PR.
|
|
184
|
+
const used = [...base.keys(), ...ordered.map(({ ref: r }) => r.number)];
|
|
185
|
+
let next = Math.max(...used) + 1;
|
|
186
|
+
// The chain root is the base branch's leaf — the highest number the base
|
|
187
|
+
// holds for this app, which is what the renumbered migration must depend on.
|
|
188
|
+
const baseLeaf = [...base.values()].sort((a, b) => a.number - b.number).pop();
|
|
189
|
+
let dependencyName = baseLeaf ? migrationName(baseLeaf) : "";
|
|
190
|
+
const renamed = new Map();
|
|
191
|
+
const collidingPaths = new Set(colliding.map(({ ref }) => ref.path));
|
|
192
|
+
// Include every follow-up before allocating numbers, then process parents
|
|
193
|
+
// before dependants. Numbers usually follow dependency order, but Django
|
|
194
|
+
// permits a lower-numbered migration to depend on a later-numbered one.
|
|
195
|
+
const affected = new Set(colliding.map(({ ref }) => migrationName(ref)));
|
|
196
|
+
let grew = true;
|
|
197
|
+
while (grew) {
|
|
198
|
+
grew = false;
|
|
199
|
+
for (const { ref, patch } of ordered) {
|
|
200
|
+
const name = migrationName(ref);
|
|
201
|
+
if (affected.has(name))
|
|
202
|
+
continue;
|
|
203
|
+
if ([...affected].some((old) => ownDependencyLabel(patch, ref.app_label, old, knownLabels) !== null)) {
|
|
204
|
+
affected.add(name);
|
|
205
|
+
grew = true;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const remaining = ordered.filter(({ ref }) => affected.has(migrationName(ref)));
|
|
210
|
+
const remedyOrder = [];
|
|
211
|
+
while (remaining.length > 0) {
|
|
212
|
+
const index = remaining.findIndex(({ ref, patch }) => remaining.every(({ ref: other }) => other.path === ref.path ||
|
|
213
|
+
ownDependencyLabel(patch, ref.app_label, migrationName(other), knownLabels) === null));
|
|
214
|
+
// An already-cyclic input has no dependency order; keep its stable path
|
|
215
|
+
// order rather than letting advice generation hang.
|
|
216
|
+
remedyOrder.push(remaining.splice(index < 0 ? 0 : index, 1)[0]);
|
|
217
|
+
}
|
|
218
|
+
for (const { ref, patch } of remedyOrder) {
|
|
219
|
+
const stales = [...renamed.keys()].flatMap((old) => {
|
|
220
|
+
const label = ownDependencyLabel(patch, ref.app_label, old, knownLabels);
|
|
221
|
+
return label === null ? [] : [{ old, label, dep: renamed.get(old) }];
|
|
222
|
+
});
|
|
223
|
+
const collides = collidingPaths.has(ref.path);
|
|
224
|
+
if (!collides && stales.length === 0)
|
|
225
|
+
continue;
|
|
226
|
+
const mustRenumber = collides || stales.some(({ dep }) => ref.number <= dep.number);
|
|
227
|
+
const targetNumber = mustRenumber ? next++ : ref.number;
|
|
228
|
+
const target = mustRenumber
|
|
229
|
+
? renamedTo(ref, targetNumber)
|
|
230
|
+
: { name: migrationName(ref), path: ref.path };
|
|
231
|
+
if (collides) {
|
|
232
|
+
const label = stales[0]?.label ?? labelsByApp.get(app) ?? ref.app_label;
|
|
233
|
+
out.push({
|
|
234
|
+
app,
|
|
235
|
+
app_label: ref.app_label,
|
|
236
|
+
pr_path: ref.path,
|
|
237
|
+
number: ref.number,
|
|
238
|
+
base_path: base.get(ref.number).path,
|
|
239
|
+
target_number: targetNumber,
|
|
240
|
+
target_path: target.path,
|
|
241
|
+
dependency_name: dependencyName,
|
|
242
|
+
dependency: dependencyTuple(label, dependencyName),
|
|
243
|
+
...(label !== ref.app_label ? { dependency_app_label: label } : {}),
|
|
244
|
+
kind: "base-collision",
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
// A colliding file still owns every original dependency edge. Adding
|
|
248
|
+
// the collision chain edge must not replace its branch dependencies.
|
|
249
|
+
stales.forEach(({ old, label, dep }, i) => {
|
|
250
|
+
out.push({
|
|
251
|
+
app,
|
|
252
|
+
app_label: ref.app_label,
|
|
253
|
+
pr_path: ref.path,
|
|
254
|
+
number: ref.number,
|
|
255
|
+
base_path: "",
|
|
256
|
+
target_number: targetNumber,
|
|
257
|
+
target_path: target.path,
|
|
258
|
+
dependency_name: dep.name,
|
|
259
|
+
dependency: dependencyTuple(label, dep.name),
|
|
260
|
+
dependency_app_label: label,
|
|
261
|
+
kind: "renamed-dependency",
|
|
262
|
+
stale_dependency: old,
|
|
263
|
+
renumber: !collides && mustRenumber && i === 0,
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
if (mustRenumber)
|
|
267
|
+
renamed.set(migrationName(ref), { name: target.name, number: targetNumber });
|
|
268
|
+
if (collides)
|
|
269
|
+
dependencyName = target.name;
|
|
270
|
+
}
|
|
271
|
+
renamedByApp.set(app, {
|
|
272
|
+
app_label: labelsByApp.get(app) ?? colliding[0].ref.app_label,
|
|
273
|
+
renamed,
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
// Cross-app follow-ups: a PR migration in another app whose `dependencies`
|
|
277
|
+
// name a migration the remedy renames. Numbers are per app, so it never
|
|
278
|
+
// renumbers — only its dependency tuple moves.
|
|
279
|
+
if (renamedByApp.size > 0) {
|
|
280
|
+
for (const [app, ordered] of orderedByApp) {
|
|
281
|
+
// Every PR file, including one the same-app pass already remedied: its
|
|
282
|
+
// own-app entry moving says nothing about a stale tuple naming another
|
|
283
|
+
// app. One entry per stale tuple, across every renamed app.
|
|
284
|
+
for (const { ref, patch } of ordered) {
|
|
285
|
+
for (const [otherApp, { app_label, renamed }] of renamedByApp) {
|
|
286
|
+
if (otherApp === app)
|
|
287
|
+
continue;
|
|
288
|
+
for (const [stale, dep] of renamed) {
|
|
289
|
+
if (!referencesAppMigration(patch, app_label, stale))
|
|
290
|
+
continue;
|
|
291
|
+
out.push({
|
|
292
|
+
app,
|
|
293
|
+
app_label: ref.app_label,
|
|
294
|
+
pr_path: ref.path,
|
|
295
|
+
number: ref.number,
|
|
296
|
+
base_path: "",
|
|
297
|
+
target_number: ref.number,
|
|
298
|
+
target_path: ref.path,
|
|
299
|
+
dependency_name: dep.name,
|
|
300
|
+
dependency: dependencyTuple(app_label, dep.name),
|
|
301
|
+
kind: "renamed-dependency",
|
|
302
|
+
stale_dependency: stale,
|
|
303
|
+
renumber: false,
|
|
304
|
+
dependency_app_label: app_label,
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
return out;
|
|
312
|
+
}
|
|
313
|
+
/** The renamed-dependency edit both renderers quote: the stale dependency
|
|
314
|
+
* tuple replaced by the renumbered one. */
|
|
315
|
+
export function renamedDependencyReplacement(c) {
|
|
316
|
+
const stale = c.stale_dependency ?? "";
|
|
317
|
+
return `replace ${codePath(dependencyTuple(c.dependency_app_label ?? c.app_label, stale))} with ${codePath(c.dependency)}`;
|
|
318
|
+
}
|
|
319
|
+
/** A serialization edge is additive: a partial diff cannot enumerate all
|
|
320
|
+
* original parents, and no original edge may be discarded by the remedy. */
|
|
321
|
+
export function collisionDependencyAdvice(c) {
|
|
322
|
+
const unknown = c.dependency_app_label || c.app_label
|
|
323
|
+
? ""
|
|
324
|
+
: " (use its existing app label; the root path does not establish it)";
|
|
325
|
+
return `in its \`dependencies\`, also include ${codePath(c.dependency)} for the collision chain${unknown} — keep every existing entry, applying the renamed-dependency replacements below where listed`;
|
|
326
|
+
}
|
|
327
|
+
/** Stable identity of a detection result — used to post the comment once per
|
|
328
|
+
* (head sha, collision set) rather than on every round at the same head. */
|
|
329
|
+
export function collisionFingerprint(headSha, collisions) {
|
|
330
|
+
return [headSha, ...collisions.map((c) => `${c.pr_path}→${c.target_path}@${c.dependency}`)].join("|");
|
|
331
|
+
}
|
|
332
|
+
/** The collision comment's heading line; `cliops` recognises the comment by it. */
|
|
333
|
+
export const MIGRATION_COMMENT_HEADING = "### Migration numbering — renumber needed (mechanics, not a blocker)";
|
|
334
|
+
/** The collision comment's closing sentence opener; `cliops` recognises the comment by it. */
|
|
335
|
+
export const MIGRATION_COMMENT_CLOSING = "This is posted as a comment on purpose:";
|
|
336
|
+
/**
|
|
337
|
+
* The comment body. It states the exact target number and the exact
|
|
338
|
+
* `dependencies` value, and says in plain words that this is mechanics — no
|
|
339
|
+
* blocker, no verdict consumed, no re-review round owed. Filename-derived
|
|
340
|
+
* fields are the PR author's and render through `codePath` (see
|
|
341
|
+
* `renderMigrationCollisionsNote`).
|
|
342
|
+
*/
|
|
343
|
+
export function renderMigrationCollisionComment(input) {
|
|
344
|
+
const branch = input.base_ref || "the base branch";
|
|
345
|
+
const at = input.base_sha ? ` (\`${input.base_sha.slice(0, 12)}\`)` : "";
|
|
346
|
+
const subject = input.collisions.length === 1
|
|
347
|
+
? "the migration number this PR claims"
|
|
348
|
+
: "migration numbers this PR claims";
|
|
349
|
+
const lines = [
|
|
350
|
+
MIGRATION_COMMENT_HEADING,
|
|
351
|
+
"",
|
|
352
|
+
`\`${branch}\`${at} already occupies ${subject}. GitHub still reports the PR mergeable ` +
|
|
353
|
+
"(the filenames differ) and CI is green, so nothing else catches this — but the " +
|
|
354
|
+
"migration graph would break on merge.",
|
|
355
|
+
"",
|
|
356
|
+
];
|
|
357
|
+
for (const c of input.collisions) {
|
|
358
|
+
const targetNumber = String(c.target_number).padStart(4, "0");
|
|
359
|
+
if (c.kind === "renamed-dependency") {
|
|
360
|
+
const stale = c.stale_dependency ?? "";
|
|
361
|
+
lines.push(`- ${codePath(c.pr_path)} — its \`dependencies\` reference ${codePath(`"${stale}"`)}, which the renumber above moves to ${codePath(c.dependency_name)}.`, ` - in its \`dependencies\`, ${renamedDependencyReplacement(c)} — keep every other entry`);
|
|
362
|
+
if (c.renumber)
|
|
363
|
+
lines.push(` - and rename it to ${codePath(c.target_path)} (number **${targetNumber}**) — its current number would sit below its renumbered dependency`);
|
|
364
|
+
continue;
|
|
365
|
+
}
|
|
366
|
+
lines.push(`- ${codePath(c.pr_path)} collides with ${codePath(c.base_path)} on ${flatControls(branch)}.`, ` - rename it to ${codePath(c.target_path)} (number **${targetNumber}**)`, ` - ${collisionDependencyAdvice(c)}`);
|
|
367
|
+
}
|
|
368
|
+
lines.push("", `${MIGRATION_COMMENT_CLOSING} the fix is mechanical, it consumes no ` +
|
|
369
|
+
"review verdict and it does not block the merge gate. Nothing else in this " +
|
|
370
|
+
"round's review depends on it.");
|
|
371
|
+
return lines.join("\n");
|
|
372
|
+
}
|
|
373
|
+
//# sourceMappingURL=migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/migrations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Runtime } from "./engine/port.js";
|
|
2
|
+
import { type RoundResult, type RoundSpec } from "./engine/round.js";
|
|
3
|
+
export { jsonProblem, missingOutputs, PI_RUN_FILES, readJson, unparseableOutputs, } from "./engine/round.js";
|
|
4
|
+
export type { PiRun } from "./engine/port.js";
|
|
5
|
+
export interface OneShotInput extends RoundSpec {
|
|
6
|
+
/** Hosts the pi session: the SDK runtime of the route. */
|
|
7
|
+
runtime: Runtime;
|
|
8
|
+
}
|
|
9
|
+
export type OneShotResult = RoundResult;
|
|
10
|
+
/** Run the review: `runRound` on `runtime`. */
|
|
11
|
+
export declare function runOneShot(i: OneShotInput): Promise<OneShotResult>;
|
|
12
|
+
//# sourceMappingURL=oneshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oneshot.d.ts","sourceRoot":"","sources":["../../src/oneshot.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAY,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE/E,OAAO,EACL,WAAW,EACX,cAAc,EACd,YAAY,EACZ,QAAQ,EACR,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,WAAW,YAAa,SAAQ,SAAS;IAC7C,0DAA0D;IAC1D,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC;AAExC,+CAA+C;AAC/C,wBAAgB,UAAU,CAAC,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAGlE"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { runRound } from "./engine/round.js";
|
|
2
|
+
export { jsonProblem, missingOutputs, PI_RUN_FILES, readJson, unparseableOutputs, } from "./engine/round.js";
|
|
3
|
+
/** Run the review: `runRound` on `runtime`. */
|
|
4
|
+
export function runOneShot(i) {
|
|
5
|
+
const { runtime, ...spec } = i;
|
|
6
|
+
return runRound(spec, runtime);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=oneshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oneshot.js","sourceRoot":"","sources":["../../src/oneshot.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAoC,MAAM,mBAAmB,CAAC;AAE/E,OAAO,EACL,WAAW,EACX,cAAc,EACd,YAAY,EACZ,QAAQ,EACR,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAU3B,+CAA+C;AAC/C,MAAM,UAAU,UAAU,CAAC,CAAe;IACxC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;IAC/B,OAAO,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Greedy file groups in input order. An oversized file keeps its own group;
|
|
2
|
+
* files beyond the group cap are returned in left, never discarded. */
|
|
3
|
+
export declare function packByBudget<T>(files: readonly T[], limits: {
|
|
4
|
+
maxGroups: number;
|
|
5
|
+
maxLines: number;
|
|
6
|
+
maxFiles?: number;
|
|
7
|
+
}, pathOf: (file: T) => string, sizeOf: (file: T) => number): {
|
|
8
|
+
groups: string[][];
|
|
9
|
+
left: string[];
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=packing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packing.d.ts","sourceRoot":"","sources":["../../src/packing.ts"],"names":[],"mappings":"AAAA;uEACuE;AACvE,wBAAgB,YAAY,CAAC,CAAC,EAC5B,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,EAClE,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,EAC3B,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAC1B;IAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CA2BxC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** Greedy file groups in input order. An oversized file keeps its own group;
|
|
2
|
+
* files beyond the group cap are returned in left, never discarded. */
|
|
3
|
+
export function packByBudget(files, limits, pathOf, sizeOf) {
|
|
4
|
+
const groups = [];
|
|
5
|
+
const left = [];
|
|
6
|
+
let current = [];
|
|
7
|
+
let lines = 0;
|
|
8
|
+
for (const file of files) {
|
|
9
|
+
const size = sizeOf(file);
|
|
10
|
+
if (current.length > 0 &&
|
|
11
|
+
(current.length >= (limits.maxFiles ?? Infinity) || lines + size > limits.maxLines)) {
|
|
12
|
+
groups.push(current);
|
|
13
|
+
current = [];
|
|
14
|
+
lines = 0;
|
|
15
|
+
}
|
|
16
|
+
if (groups.length >= limits.maxGroups) {
|
|
17
|
+
left.push(pathOf(file));
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
current.push(pathOf(file));
|
|
21
|
+
lines += size;
|
|
22
|
+
}
|
|
23
|
+
if (current.length > 0) {
|
|
24
|
+
if (groups.length < limits.maxGroups)
|
|
25
|
+
groups.push(current);
|
|
26
|
+
else
|
|
27
|
+
left.push(...current);
|
|
28
|
+
}
|
|
29
|
+
return { groups, left };
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=packing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packing.js","sourceRoot":"","sources":["../../src/packing.ts"],"names":[],"mappings":"AAAA;uEACuE;AACvE,MAAM,UAAU,YAAY,CAC1B,KAAmB,EACnB,MAAkE,EAClE,MAA2B,EAC3B,MAA2B;IAE3B,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,OAAO,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,IACE,OAAO,CAAC,MAAM,GAAG,CAAC;YAClB,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,EACnF,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,GAAG,CAAC,CAAC;QACZ,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YACxB,SAAS;QACX,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3B,KAAK,IAAI,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;;YACtD,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Every pass the system knows: the lenses selectLenses can emit plus the
|
|
2
|
+
* always-appended validator. addable_lenses derives from this set (∪ the
|
|
3
|
+
* configured risk passes, which today are a subset of it). */
|
|
4
|
+
export declare const ALL_PASSES: readonly string[];
|
|
5
|
+
/** Lenses the whole-repo scan never runs: each needs a diff, a PR body or a
|
|
6
|
+
* mid-round session to mean anything — plus the validator, which is not a
|
|
7
|
+
* lens. Everything else in `ALL_PASSES` is a deep lens a scan may run. */
|
|
8
|
+
export declare const DIFF_ONLY_LENSES: readonly string[];
|
|
9
|
+
/** The deep lenses a scan may run: stage 1 may name them in a suggestion,
|
|
10
|
+
* stage 2 may run them on a row. */
|
|
11
|
+
export declare const SCAN_DEEP_LENSES: readonly string[];
|
|
12
|
+
/** The deep scan's floor lenses by default (`[scan] deep_lenses`): the ones
|
|
13
|
+
* that compare code with its siblings and follow a delivery through its
|
|
14
|
+
* exits — what a first look over one unit never reaches. */
|
|
15
|
+
export declare const SCAN_DEEP_FLOOR_LENSES: readonly string[];
|
|
16
|
+
//# sourceMappingURL=passes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passes.d.ts","sourceRoot":"","sources":["../../src/passes.ts"],"names":[],"mappings":"AAMA;;8DAE8D;AAC9D,eAAO,MAAM,UAAU,EAAE,SAAS,MAAM,EAqEvC,CAAC;AAEF;;0EAE0E;AAC1E,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAS7C,CAAC;AAEF;oCACoC;AACpC,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAE7C,CAAC;AAEF;;4DAE4D;AAC5D,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAKnD,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// The pass vocabulary — every pass the system knows, in plan order, and which
|
|
2
|
+
// of them a whole-repo scan may run. Its own module (no imports) so config
|
|
3
|
+
// parsing can validate pass-name knobs (`[review] skip_lenses`,
|
|
4
|
+
// `[models.pass_tiers]`, `[scan] deep_lenses`) against it without an import
|
|
5
|
+
// cycle through dispatch.ts, which re-exports it.
|
|
6
|
+
/** Every pass the system knows: the lenses selectLenses can emit plus the
|
|
7
|
+
* always-appended validator. addable_lenses derives from this set (∪ the
|
|
8
|
+
* configured risk passes, which today are a subset of it). */
|
|
9
|
+
export const ALL_PASSES = [
|
|
10
|
+
"pass-baseline",
|
|
11
|
+
"pass-ui",
|
|
12
|
+
"pass-contracts",
|
|
13
|
+
"pass-data-safety",
|
|
14
|
+
"pass-security",
|
|
15
|
+
"pass-statelessness",
|
|
16
|
+
"pass-prod-risk",
|
|
17
|
+
"pass-delivery",
|
|
18
|
+
"pass-intent",
|
|
19
|
+
"pass-placement",
|
|
20
|
+
"pass-simplicity",
|
|
21
|
+
"pass-backcompat",
|
|
22
|
+
// No PATH predicate, deliberately. `selectLenses` never emits
|
|
23
|
+
// pass-concurrency — a read-modify-write race has no filename (the corpus
|
|
24
|
+
// findings span unrelated modules), so no path predicate finds the set. It
|
|
25
|
+
// reaches a round through the add protocol, when the session names the
|
|
26
|
+
// read-then-write it suspects — or as a content-triggered sub-lens, when the diff touches synchronisation or the
|
|
27
|
+
// PR text says race/lock/thread-safe (heuristics.ts SUBLENS_TRIGGERS; it
|
|
28
|
+
// sits here, ahead of the other sub-lenses, in registry order).
|
|
29
|
+
"pass-concurrency",
|
|
30
|
+
// Addable-only for the same reason and one more. No path predicate
|
|
31
|
+
// finds "code whose intent is written down nowhere", and the deciding fact —
|
|
32
|
+
// whether the answer is in the repo at all — is only visible after the diff
|
|
33
|
+
// has been read, which is exactly when the session runs the add protocol.
|
|
34
|
+
// (pass-intent's substance bar is the precedent for what daemon-side
|
|
35
|
+
// selection must be: cheap AND honest. The one body-shaped signal here — "the
|
|
36
|
+
// PR text never says why" — is true of most PRs, so planning on it would
|
|
37
|
+
// dispatch the lens nearly always: the pure-spend case that bar exists to
|
|
38
|
+
// prevent, on a lens whose failure mode is volume.)
|
|
39
|
+
"pass-ask-human",
|
|
40
|
+
// Content-triggered sub-lenses (heuristics.ts SUBLENS_TRIGGERS — this list
|
|
41
|
+
// is held equal to SUBLENS_PASSES by tests/review-levers.test.ts): planned
|
|
42
|
+
// when their trigger fires, addable otherwise — the max-effort benchmark
|
|
43
|
+
// runs added a lens on 6 of 10 PRs, and the added lens found defects no
|
|
44
|
+
// planned one did.
|
|
45
|
+
"pass-widened",
|
|
46
|
+
"pass-roundtrip",
|
|
47
|
+
"pass-deferred",
|
|
48
|
+
"pass-bounds",
|
|
49
|
+
"pass-claims",
|
|
50
|
+
"pass-rollout",
|
|
51
|
+
// Base versus head on every modifying change —
|
|
52
|
+
// planned as one row per group of modifying files when `[review]
|
|
53
|
+
// behaviour_delta` is on; addable otherwise.
|
|
54
|
+
"pass-behaviour-delta",
|
|
55
|
+
// The per-file sweep: planned as one row per file group when `[review]
|
|
56
|
+
// sweep` is on; otherwise addable, so a session can sweep a file it
|
|
57
|
+
// suspects.
|
|
58
|
+
"pass-sweep",
|
|
59
|
+
// The tests lens — planned on every PR that changes code when
|
|
60
|
+
// `[review] tests_lens` is on; addable otherwise.
|
|
61
|
+
"pass-tests",
|
|
62
|
+
// The code-quality lenses — planned when `[review] quality_lenses` is on and
|
|
63
|
+
// the change adds enough code; addable otherwise.
|
|
64
|
+
"pass-maintainability",
|
|
65
|
+
"pass-duplication",
|
|
66
|
+
"pass-abstraction",
|
|
67
|
+
"pass-consistency",
|
|
68
|
+
// The style lens — planned only when the repo has a written style guide
|
|
69
|
+
// (packages/pi-plugin/src/styleguide.ts) or the profile points it at one; addable
|
|
70
|
+
// otherwise, but it judges only against a guide, so without one it answers
|
|
71
|
+
// NONE.
|
|
72
|
+
"pass-style",
|
|
73
|
+
// Lint and format conformance — planned only
|
|
74
|
+
// when a CI job runs a linter whose rules cover a changed file
|
|
75
|
+
// (packages/pi-plugin/src/lintconfig.ts); addable otherwise.
|
|
76
|
+
"pass-lint-conformance",
|
|
77
|
+
"pass-validate",
|
|
78
|
+
];
|
|
79
|
+
/** Lenses the whole-repo scan never runs: each needs a diff, a PR body or a
|
|
80
|
+
* mid-round session to mean anything — plus the validator, which is not a
|
|
81
|
+
* lens. Everything else in `ALL_PASSES` is a deep lens a scan may run. */
|
|
82
|
+
export const DIFF_ONLY_LENSES = [
|
|
83
|
+
"pass-intent",
|
|
84
|
+
"pass-claims",
|
|
85
|
+
"pass-backcompat",
|
|
86
|
+
"pass-rollout",
|
|
87
|
+
"pass-widened",
|
|
88
|
+
"pass-sweep",
|
|
89
|
+
"pass-ask-human",
|
|
90
|
+
"pass-validate",
|
|
91
|
+
];
|
|
92
|
+
/** The deep lenses a scan may run: stage 1 may name them in a suggestion,
|
|
93
|
+
* stage 2 may run them on a row. */
|
|
94
|
+
export const SCAN_DEEP_LENSES = ALL_PASSES.filter((p) => !DIFF_ONLY_LENSES.includes(p));
|
|
95
|
+
/** The deep scan's floor lenses by default (`[scan] deep_lenses`): the ones
|
|
96
|
+
* that compare code with its siblings and follow a delivery through its
|
|
97
|
+
* exits — what a first look over one unit never reaches. */
|
|
98
|
+
export const SCAN_DEEP_FLOOR_LENSES = [
|
|
99
|
+
"pass-consistency",
|
|
100
|
+
"pass-delivery",
|
|
101
|
+
"pass-duplication",
|
|
102
|
+
"pass-maintainability",
|
|
103
|
+
];
|
|
104
|
+
//# sourceMappingURL=passes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passes.js","sourceRoot":"","sources":["../../src/passes.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,2EAA2E;AAC3E,gEAAgE;AAChE,4EAA4E;AAC5E,kDAAkD;AAElD;;8DAE8D;AAC9D,MAAM,CAAC,MAAM,UAAU,GAAsB;IAC3C,eAAe;IACf,SAAS;IACT,gBAAgB;IAChB,kBAAkB;IAClB,eAAe;IACf,oBAAoB;IACpB,gBAAgB;IAChB,eAAe;IACf,aAAa;IACb,gBAAgB;IAChB,iBAAiB;IACjB,iBAAiB;IACjB,8DAA8D;IAC9D,0EAA0E;IAC1E,2EAA2E;IAC3E,uEAAuE;IACvE,iHAAiH;IACjH,yEAAyE;IACzE,gEAAgE;IAChE,kBAAkB;IAClB,mEAAmE;IACnE,6EAA6E;IAC7E,4EAA4E;IAC5E,0EAA0E;IAC1E,qEAAqE;IACrE,8EAA8E;IAC9E,yEAAyE;IACzE,0EAA0E;IAC1E,oDAAoD;IACpD,gBAAgB;IAChB,2EAA2E;IAC3E,2EAA2E;IAC3E,yEAAyE;IACzE,wEAAwE;IACxE,mBAAmB;IACnB,cAAc;IACd,gBAAgB;IAChB,eAAe;IACf,aAAa;IACb,aAAa;IACb,cAAc;IACd,+CAA+C;IAC/C,iEAAiE;IACjE,6CAA6C;IAC7C,sBAAsB;IACtB,uEAAuE;IACvE,oEAAoE;IACpE,YAAY;IACZ,YAAY;IACZ,8DAA8D;IAC9D,kDAAkD;IAClD,YAAY;IACZ,6EAA6E;IAC7E,kDAAkD;IAClD,sBAAsB;IACtB,kBAAkB;IAClB,kBAAkB;IAClB,kBAAkB;IAClB,wEAAwE;IACxE,kFAAkF;IAClF,2EAA2E;IAC3E,QAAQ;IACR,YAAY;IACZ,6CAA6C;IAC7C,+DAA+D;IAC/D,6DAA6D;IAC7D,uBAAuB;IACvB,eAAe;CAChB,CAAC;AAEF;;0EAE0E;AAC1E,MAAM,CAAC,MAAM,gBAAgB,GAAsB;IACjD,aAAa;IACb,aAAa;IACb,iBAAiB;IACjB,cAAc;IACd,cAAc;IACd,YAAY;IACZ,gBAAgB;IAChB,eAAe;CAChB,CAAC;AAEF;oCACoC;AACpC,MAAM,CAAC,MAAM,gBAAgB,GAAsB,UAAU,CAAC,MAAM,CAClE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CACrC,CAAC;AAEF;;4DAE4D;AAC5D,MAAM,CAAC,MAAM,sBAAsB,GAAsB;IACvD,kBAAkB;IAClB,eAAe;IACf,kBAAkB;IAClB,sBAAsB;CACvB,CAAC"}
|