feat(cli,wizard): auto-offer telegram_bot setup after install; integrate into pyra setup

cli.py — plugin_install() now asks "Configure now?" after a successful install,
runs the plugin's setup wizard, and offers to enable inline. Failing to install
short-circuits before the prompt is shown.

wizard.py — _offer_telegram_setup_if_selected() runs install + wizard + enable
automatically at the end of pyra setup when the user selected "Communication bots".
Adds load_config import (was missing alongside save_config).

Tests: test_plugin_install_decline_setup, test_plugin_install_error_does_not_prompt.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
curo1305
2026-05-19 23:15:29 +02:00
parent f59aa1a758
commit aba28293b7
3 changed files with 154 additions and 3 deletions
+44
View File
@@ -137,3 +137,47 @@ def test_main_skips_setup_when_config_exists(tmp_pyra_home, monkeypatch):
def test_config_slash_command_registered():
from pyra.chat.session import _STATIC_COMMANDS
assert "/config" in _STATIC_COMMANDS
# ── plugin install ────────────────────────────────────────────────────────────
def test_plugin_install_decline_setup(tmp_pyra_home, monkeypatch):
"""Declining 'Configure now?' shows manual instructions and exits cleanly."""
from unittest.mock import MagicMock
import questionary
monkeypatch.setattr(
"pyra.plugins.install.install_bundled_plugin", lambda *a, **kw: None
)
monkeypatch.setattr(
questionary, "confirm",
lambda *a, **kw: MagicMock(ask=lambda: False),
)
runner = CliRunner()
result = runner.invoke(main, ["plugin", "install", "telegram_bot"])
assert result.exit_code == 0
assert "Installed" in result.output
assert "Configure later" in result.output
def test_plugin_install_error_does_not_prompt(tmp_pyra_home, monkeypatch):
"""If install fails, the configure prompt is never shown."""
from unittest.mock import MagicMock
import questionary
monkeypatch.setattr(
"pyra.plugins.install.install_bundled_plugin",
lambda *a, **kw: (_ for _ in ()).throw(FileNotFoundError("not found")),
)
confirm_calls = []
monkeypatch.setattr(
questionary, "confirm",
lambda *a, **kw: confirm_calls.append(1) or MagicMock(ask=lambda: False),
)
runner = CliRunner()
result = runner.invoke(main, ["plugin", "install", "telegram_bot"])
assert result.exit_code == 0
assert "Error" in result.output
assert len(confirm_calls) == 0 # prompt never reached