doberman plugins enable no_such_plugin succeeds, since plugin_config.enable (src/doberman/engine/plugin_config.py:130) only checks the name's format. After that nothing mentions that no installed package provides it, and doberman doctor has no plugin row (src/doberman/cli/doctor.py:584-601).
What to do: add a non-critical "Plugins" check to run_checks that compares the enabled names with the installed entry points and shows [warn] enabled but not installed: <name>. Find installed names through _iter_entry_points only. The check must never import or load a plugin.
Test (tests/unit/test_cli_doctor.py): enable a made-up name (point DOBERMAN_PLUGINS_FILE at tmp_path so the real config isn't touched) and assert the warn row. With nothing enabled the row passes.
Stretch: plugins enable prints the same warning to stderr when the name matches nothing installed.
This is separate from #638, which is about the allowlist trusting a name under every entry-point group.
doberman plugins enable no_such_pluginsucceeds, sinceplugin_config.enable(src/doberman/engine/plugin_config.py:130) only checks the name's format. After that nothing mentions that no installed package provides it, anddoberman doctorhas no plugin row (src/doberman/cli/doctor.py:584-601).What to do: add a non-critical "Plugins" check to
run_checksthat compares the enabled names with the installed entry points and shows[warn] enabled but not installed: <name>. Find installed names through_iter_entry_pointsonly. The check must never import or load a plugin.Test (
tests/unit/test_cli_doctor.py): enable a made-up name (pointDOBERMAN_PLUGINS_FILEattmp_pathso the real config isn't touched) and assert the warn row. With nothing enabled the row passes.Stretch:
plugins enableprints the same warning to stderr when the name matches nothing installed.This is separate from #638, which is about the allowlist trusting a name under every entry-point group.