mirror of
https://github.com/jhd3197/ServerKit.git
synced 2026-10-30 16:47:01 +09:00
Plan 55 task 6, backend half. Installing a plugin's requirements runs pip with the backend's privileges, and a setup.py hook is arbitrary code, so it is opt-in and off by default -- correct, and the part that was missing is that nothing ever said so. The skip was a logger.warning: the requirements.txt was written next to the extension and the panel showed nothing, so an extension could sit there running with imports it does not have and the operator had no way to find out short of reading the install log. pending_requirements() answers it: whether a file is pending, its contents, its path, the parsed package lines, and the exact env var that changes the behaviour. GET /plugins/<id>/requirements exposes it, admin-only. Strictly read-only. Nothing here installs anything -- the plan is explicit that this surface introduces no auto-install behaviour change -- and a test pins that by failing if _install_requirements is reached. The env check the installer inlined is now plugin_pip_enabled(), shared by both sides. If the surface and the installer ever disagreed about what "enabled" means, the page would describe a behaviour the installer does not have. Two honest edges: the content is capped at 64KB before being echoed into a browser, and pip_enabled is reported alongside pending, because a file written while the opt-in was off survives turning it on -- the surface reports both facts rather than guessing which applies. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>