feat(review): give LOOPOVER_REVIEW_PLANNER a per-repo config override#6321
Conversation
|
Superagent didn't find any vulnerabilities or security issues in this PR. |
|
Warning ⏸️ LoopOver review result - manual review recommendedReview updated: 2026-07-16 06:04:33 UTC
Review summary Nits — 4 non-blocking
Concerns raised — review before merging
📋 Copy for AI agents — paste into your coding agentDecision drivers
Context & advisory signals — never blocks the verdict
Review context
Contributor next steps
Signal definitions
🧪 Chat with LoopOverAsk LoopOver a question about this PR directly in a comment — grounded only in the same cached, public-safe facts shown above, never a new claim.
Full command reference: https://loopover.ai/docs/loopover-commands 🧪 Experimental — new and may change. Visual preview
Click any thumbnail to open the full-size screenshot. Before = production · After = this PR's preview deploy. 🟩 Safe / merged · 🟦 Advisory · 🟨 Held for review · 🟥 Blocked / closed 💰 Earn for open-source contributions like this. Gittensor lets GitHub contributors earn for the work they already do — register to start earning →. Checked by LoopOver, a quiet PR intelligence layer for OSS maintainers.
|
ce88bd7 to
d4a4a94
Compare
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #6321 +/- ##
==========================================
- Coverage 95.60% 95.60% -0.01%
==========================================
Files 599 600 +1
Lines 47221 47245 +24
Branches 15024 15035 +11
==========================================
+ Hits 45147 45167 +20
- Misses 1290 1291 +1
- Partials 784 787 +3
Flags with carried forward coverage won't be shown. Click here to find out more.
|
Adds settings.plannerMode (inherit | off | enabled) to .loopover.yml, mirroring duplicateWinnerMode/openPrFileCollisionMode's shape, so a repo can turn the @Loopover plan issue command on or off independent of the fleet-wide LOOPOVER_REVIEW_PLANNER default. Wires the new resolveDuplicateWinnerEnabled-style resolver (settings/planner-mode.ts) into maybeProcessPlanCommand, reordering the cheap synchronous checks ahead of the manifest load so an unrelated or PR-thread comment never pays for it, and keeps the manifest-load-failure path fail-safe to the fleet default. Tested end to end through the webhook path, including the inherit branch, the manifest-load-failure fallback, and the no-repository edge case.
d4a4a94 to
73eb87d
Compare
Bundle ReportChanges will increase total bundle size by 81.43kB (1.11%) ⬆️. This is within the configured threshold ✅ Detailed changes
Affected Assets, Files, and Routes:view changes for bundle: loopover-uiAssets Changed:
|
Each of the 6 backend test shards (validate-tests matrix in ci.yml) uploads its own lcov.info to Codecov directly (flags: shard-N) -- additive by design, but with no after_n_builds setting Codecov re-evaluates and re-posts codecov/patch after EVERY individual upload instead of waiting for all six. That produced a wildly wrong intermediate verdict (patch coverage as low as ~20%) after only 1-2 shards had landed on PR JSONbored#6321, before self-correcting once the rest arrived -- require_ci_to_pass only checks the upstream GH Actions run's own conclusion, not upload completeness. Sets codecov.notify.after_n_builds: 6 so Codecov withholds any status until all six coverage uploads for a commit are in. Validated the resulting config against Codecov's public validator (codecov.io/validate).


Summary
settings.plannerMode(inherit | off | enabled) per-repo override for the@loopover planissue command, mirroringduplicateWinnerMode/openPrFileCollisionMode's existing inherit/off/enabled shape exactly (src/settings/duplicate-winner-mode.ts,src/settings/open-pr-file-collision-mode.ts).src/settings/planner-mode.tscarriesresolvePlannerEnabled(globalDefault, mode); the existingisPlannerEnabled(env-var global default) stays insrc/review/planner.tsunchanged.packages/loopover-engine/src/focus-manifest.ts(FocusManifestSettings+parseSettingsOverride),packages/loopover-engine/src/types/manifest-deps-types.tsandsrc/types.ts(RepositorySettings.plannerMode),src/openapi/schemas.ts(RepositorySettingsSchema), and both.loopover.yml.example/config/examples/loopover.full.yml(kept in sync, matching the header's "body synced with this file" convention). Regeneratedapps/loopover-ui/public/openapi.jsonvianpm run ui:openapi.maybeProcessPlanCommand(src/queue/processors.ts): the cheap synchronous checks (isPlanCommand, the PR-vs-issue check) still run first with zero added I/O, then the per-repo override is resolved vialoadRepoFocusManifest(the same loader other manifest-driven features use), wrapped in the same.catch(() => null)fail-safe convention, before falling through to the existing classifier. Byte-identical when nothing overridesplannerModeand the env var is unset.Scope
type(scope): short summaryConventional Commit format.CONTRIBUTING.mdand does not reintroduce GitHub Pages, VitePress,site/, orCNAME.LOOPOVER_*feature-toggle env vars to config-as-code one at a time; this PR migratesLOOPOVER_REVIEW_PLANNERas one sub-item — the epic stays open for the rest).Validation
git diff --checknpm run actionlintnpm run typechecknpm run test:coveragelocally (896 test files / 17k+ tests passed; new/changed lines and branches insrc/settings/planner-mode.ts,src/review/planner.ts, and the touched region ofsrc/queue/processors.tsare 100% line + branch covered per the local lcov report)npm run test:workersnpm run build:mcpnpm run test:mcp-packnpm run ui:openapi:checknpm run ui:lintnpm run ui:typechecknpm run ui:buildnpm audit --audit-level=moderatetest/unit/planner-mode.test.ts(resolver, both directions of inherit/off/enabled) plus new end-to-end webhook tests intest/unit/queue-3.test.tscovering a per-repoenabledoverride turning the command ON with the fleet default off, a per-repooffoverride turning it OFF with the fleet default on, explicitinheritin both directions, a manifest-load-failure fail-safe (mocked rejection degrading to the fleet default, never throwing), and the no-repository-on-payload edge case (falls back to the fleet-only default without attempting a manifest load).Also ran the full
npm run test:cigate locally end to end (green) andnpm audit --audit-level=moderate(0 vulnerabilities).Safety
UI Evidencesection. (N/A — this PR has no visible UI change;apps/loopover-ui/public/openapi.jsonis a regenerated schema artifact, not a UI change.).loopover.yml.example/config/examples/loopover.full.ymlupdated;CHANGELOG.mduntouched.)Notes
duplicateWinnerMode/openPrFileCollisionMode,plannerModeis config-as-code only (no DB column).