-
Notifications
You must be signed in to change notification settings - Fork 0
Split PluginBase: extract DiscoverablePlugin for CLI plugins #90
Copy link
Copy link
Open
Description
Context
PluginBase mixes two responsibilities:
- Discovery/CLI —
name,description,add_cli_options(),activate() - Lifecycle hooks —
setup(),on_test_pass(),on_session_end(), etc.
Internally-wired plugins (HistoryPlugin, EvalHistoryPlugin, EvalResultsWriter) only need lifecycle hooks but are forced to override activate() with return None to prevent auto-discovery. This is a code smell.
Proposal
PluginBase → lifecycle hooks only (setup, on_*)
↑
DiscoverablePlugin → adds name, description, add_cli_options, activate
- Internal plugins inherit
PluginBase - CLI-discoverable plugins inherit
DiscoverablePlugin - No more defensive
return Noneoverrides
Additional motivation: circular import
core/session.py imports evals/history, evals/results_writer, and evals/wrapper to wire eval plugins manually. This creates a dependency inversion — core depends on evals, instead of evals plugging into core. This forces a __getattr__ lazy import hack in evals/__init__.py to break the cycle.
If eval plugins were auto-discovered (via DiscoverablePlugin.activate()), session wouldn't need to import them directly, eliminating the circular dependency entirely.
Files affected
protest/plugin.py— split the class- All plugins that currently override
activate() -> None— simplify toPluginBase - Auto-discovery in session — only scan
DiscoverablePluginsubclasses protest/core/session.py— remove manual eval plugin wiring (_wire_eval_support)protest/evals/__init__.py— remove__getattr__hack once cycle is broken
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels