fix(doctor): include allow-only official plugin ids in release repair set#77193
fix(doctor): include allow-only official plugin ids in release repair set#77193hclsys wants to merge 2 commits into
Conversation
|
Codex review: needs changes before merge. Summary Reproducibility: yes. Source inspection shows current main’s release collector does not iterate Next step before merge Security Review detailsBest possible solution: Resolve the current merge conflict, keep the official-catalog gate and regression tests intact, then land the doctor repair with the changelog entry on current main. Do we have a high-confidence way to reproduce the issue? Yes. Source inspection shows current main’s release collector does not iterate Is this the best way to solve the issue? Yes, functionally. Gating allow-only repair installs through the official external plugin catalog is the narrow maintainable fix; the remaining issue is mechanical conflict resolution and revalidation before merge. Acceptance criteria:
What I checked:
Likely related people:
Remaining risk / open question:
Codex review notes: model gpt-5.5, reasoning high; reviewed against ef0dbcf49d85. |
This comment was marked as low quality.
This comment was marked as low quality.
… set plugins.allow entries that are not in plugins.entries (allow-only) were never passed to repairMissingPluginInstallsForIds during the one-time release repair step. Stale-config cleanup then removed them from plugins.allow, silently breaking cron jobs that depend on those plugins. Fix: collectAllowOnlyOfficialPluginIds reads plugins.allow, filters to ids that resolve to an official external catalog entry and have no material plugins.entries coverage, and adds them to the eligible repair set. Unofficial arbitrary allow-list ids are intentionally excluded to avoid installing arbitrary packages during doctor --fix. Fixes openclaw#77155.
Summary
Fixes #77155 —
doctor --fixsilently removes plugins that appear inplugins.allowbut not inplugins.entries(allow-only).Root Cause
collectReleaseConfiguredPluginIdscollected plugin ids fromplugins.entries(material entries), slots, channels, providers, and runtimes — but not fromplugins.allow. Allow-only entries (e.g.lobsterinplugins.allowwith noplugins.entries.lobster) were never passed torepairMissingPluginInstallsForIds, so they weren't installed during the one-time 2026.5.2 release repair. Stale-config cleanup then removed them fromplugins.allowbecause they weren't in the installed plugin registry — silently breaking cron jobs that depend on those plugins.Fix
Added
collectAllowOnlyOfficialPluginIdswhich readsplugins.allow, filters out ids already covered by a materialplugins.entriesentry, and gates each remaining id againstgetOfficialExternalPluginCatalogEntry. Only official external catalog entries are included — arbitrary allow-list ids for unofficial/workspace plugins are intentionally excluded to avoid installing unknown packages duringdoctor --fix.Changes
src/commands/doctor/shared/release-configured-plugin-installs.ts: addedcollectAllowOnlyOfficialPluginIds+ call incollectReleaseConfiguredPluginIdssrc/commands/doctor/shared/release-configured-plugin-installs.test.ts: 2 new regression testsCHANGELOG.md: entry under FixesTest plan
pnpm exec vitest run src/commands/doctor/shared/release-configured-plugin-installs.test.ts— 12/12 passpnpm exec oxlint src/commands/doctor/shared/release-configured-plugin-installs.ts src/commands/doctor/shared/release-configured-plugin-installs.test.ts— 0 warnings, 0 errorslobster) → included in repair set🤖 Generated with Claude Code