Auto-bootstrap BSIPA when re-enabling plugins
Run bootstrap automatically on enable paths when health is bad, skip bsipa in disable-all, and add tests for the shared bootstrap gate. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -9,7 +9,7 @@ from zipfile import ZipFile
|
||||
|
||||
from .fsutil import ensure_relative, sha256_bytes, sha256_file
|
||||
from .models import Lockfile, Registry, VALID_STRATEGIES
|
||||
from .bsipa import BSIPA_PLUGIN_ID, check_bsipa_health
|
||||
from .bsipa import bootstrap_health_error, check_bsipa_health, planning_requires_bootstrap
|
||||
from .state import downloads_dir, plans_dir, plugin_downloads_dir
|
||||
|
||||
|
||||
@@ -81,13 +81,10 @@ def create_plan(
|
||||
changes: list[dict[str, Any]] = []
|
||||
warnings: list[str] = []
|
||||
|
||||
has_locked_bsipa = any(plugin.id == BSIPA_PLUGIN_ID for plugin in lockfile.plugins)
|
||||
planning_ordinary_plugins = any(plugin_id != BSIPA_PLUGIN_ID for plugin_id in selected_ids)
|
||||
if require_bootstrap and has_locked_bsipa and planning_ordinary_plugins:
|
||||
if require_bootstrap and planning_requires_bootstrap(lockfile.plugins, selected_ids):
|
||||
health = check_bsipa_health(instance_path, state_root, instance)
|
||||
if not health["ok"]:
|
||||
joined = "; ".join(health["messages"])
|
||||
raise ValueError(f"BSIPA bootstrap is not healthy; run bootstrap first: {joined}")
|
||||
raise ValueError(bootstrap_health_error(health))
|
||||
|
||||
for locked in lockfile.plugins:
|
||||
if locked.id not in selected_ids:
|
||||
|
||||
Reference in New Issue
Block a user