Parent Epic
Part of #32 — Plugin system: toggleable internal subsystems
Blocked by #39 (memory must be a plugin before its wizard step folds in). Depends on #37 (cost-report) being a plugin too.
Task
Collapse the two hardcoded per-feature wizard steps — memory (step 7) and cost-report (step 8) — into a single plugin-selection step driven by the registry. New subsystems then cost zero hardcoded wizard steps.
Location
agent_notes/commands/wizard/orchestrator.py:53,84-88,116,135 — TOTAL_STEPS, the two _select_* calls, the execute payload
agent_notes/commands/wizard/ — NEW _select_plugins step; retire cost_report.py's _select_cost_report and fold memory-backend selection appropriately
agent_notes/commands/wizard/execute.py:152,277-281 — replace the cost_report_enabled param with resolved enabled_plugins
tests/unit/commands/test_wizard*.py — update step count and assertions
Changes
TOTAL_STEPS drops from 9 to 8.
- The new step presents a checklist of plugins with their
default pre-selected and description shown: memory, cost-report, cred-guard, plus any future plugin — all sourced from plugin_registry.all(), nothing hardcoded.
- Memory keeps its backend sub-question. Selecting the memory plugin still needs obsidian-vs-local and, for obsidian, a path. Two clean options — pick one and document it:
- (a) plugin checklist first, then a conditional memory-backend follow-up when memory is selected;
- (b) memory stays a richer step, other plugins are simple toggles beneath it.
Recommendation: (a) — it generalizes, and the follow-up pattern is reusable for any future plugin that needs sub-configuration.
execute.py receives enabled_plugins: dict and memory_backend/memory_path, drops the standalone cost_report_enabled param.
Verification
uv run pytest tests/unit/commands/test_wizard_role_model_default.py tests/unit/commands/ -k wizard -v
uv run pytest tests/ -v
Manual: run the wizard, confirm 8 steps, the plugin checklist reflects registry defaults, and selecting memory prompts for backend + path.
Dist: byte-identical for equivalent selections. The wizard writes config; a run that reproduces today's default choices must produce today's dist.
Parent Epic
Part of #32 — Plugin system: toggleable internal subsystems
Blocked by #39 (memory must be a plugin before its wizard step folds in). Depends on #37 (cost-report) being a plugin too.
Task
Collapse the two hardcoded per-feature wizard steps — memory (step 7) and cost-report (step 8) — into a single plugin-selection step driven by the registry. New subsystems then cost zero hardcoded wizard steps.
Location
agent_notes/commands/wizard/orchestrator.py:53,84-88,116,135—TOTAL_STEPS, the two_select_*calls, the execute payloadagent_notes/commands/wizard/— NEW_select_pluginsstep; retirecost_report.py's_select_cost_reportand fold memory-backend selection appropriatelyagent_notes/commands/wizard/execute.py:152,277-281— replace thecost_report_enabledparam with resolvedenabled_pluginstests/unit/commands/test_wizard*.py— update step count and assertionsChanges
TOTAL_STEPSdrops from 9 to 8.defaultpre-selected anddescriptionshown: memory, cost-report, cred-guard, plus any future plugin — all sourced fromplugin_registry.all(), nothing hardcoded.Recommendation: (a) — it generalizes, and the follow-up pattern is reusable for any future plugin that needs sub-configuration.
execute.pyreceivesenabled_plugins: dictandmemory_backend/memory_path, drops the standalonecost_report_enabledparam.Verification
Manual: run the wizard, confirm 8 steps, the plugin checklist reflects registry defaults, and selecting memory prompts for backend + path.
Dist: byte-identical for equivalent selections. The wizard writes config; a run that reproduces today's default choices must produce today's dist.