- core/hardware: драйверы real (atxctl/pyserial) + mock, ATXPI_DRIVER - core/power, console, mock: операции питания и RS232-консоли - cli/atxpi: status/on/off/reset/cycle/console (stdlib, без deps) - install.sh: one-shot curl|bash, идемпотентный, хост-агностичный - deploy: systemd-юнит, шаблон env, update.sh - README, AGENTS.md: документация и проектные решения - AGENTS.md и доки очищены от внутренних хостов/адресов (публичный репо)
5.4 KiB
5.4 KiB
AGENTS.md — atxpi (diy/arm)
Aгент-инструкции для работы с проектом. Загружаются автоматически, когда Hermes работает внутри репозитория.
Что это
atxpi — управляющая плоскость для сервера на базе Raspberry Pi:
питание (ATX) + RS232-консоль + статус. По сути компактный «бедняцкий IPMI».
Репо — на внутреннем git-хостинге (ветка main). Адрес/хост в публичном репо не указываем.
Принятые решения (утверждено)
| # | Решение |
|---|---|
| 1 | Имя пакета/системы — atxpi |
| 2 | Интерфейсы: браузерный web-UI + CLI-инструменты + MCP-сервер для агентов |
| 3 | Всё лёгкое под Raspberry Pi 2B (armv7, 1 ГБ): без node/сборки, без тяжёлых БД |
| 4 | Питание — на базе существующего модуля atxctl (I2C-expander HAT: PWRBTN/RESET/статус) |
| 5 | Консоль — ttyUSB0 (PL2303, RS232-TTL), поверх — браузерный терминал + CLI + MCP |
| 6 | Никаких реальных проверок питания на «живых» серверах (продакшн). Только стенд/макет. ATXPI_DRIVER=mock для разработки |
| 7 | Доступ: локально через SSH (key-only); удалённо — через VPN/Tailscale. Управляющая плоскость не светится в интернет |
| 8 | Временные файлы — только в atxpi/tmp/ (НЕ в /tmp корня ФС), чтобы агент не запрашивал разрешений на системные пути |
| 9 | Распространение: нативно (система + systemd), один сервис atxpi.service = FastAPI (REST + WebSocket-консоль + MCP-HTTP + статика). Без Docker |
| 10 | Установка — one-shot install.sh (curl | sudo bash), идемпотентный; обновление — deploy/update.sh |
| 11 | MCP для агентов — HTTP-эндпоинт на самом устройстве (/mcp), Hermes подключается по URL+Bearer |
| 12 | Раскладка: /opt/arm (чекаут репо), /opt/arm/atxpi/venv, /etc/atxpi/atxpi.env (0600, генерится, не в git), сервис-юзер atxpi |
Структура репозитория
arm/
├── AGENTS.md # этот файл
├── .gitignore
├── atxctl/ # питание: I2C HAT (существующий модуль)
├── lcd/ # статусный OLED 52pi (существующий)
├── ups/ # защита батареи, INA219 (существующий)
└── atxpi/ # НОВЫЙ управляющий слой
├── core/ # hardware.py (абстракция+драйверы), mock.py, power.py, console.py
├── cli/atxpi # CLI: status/on/off/reset/cycle/console
├── webui/ # (далее) FastAPI: REST + WebSocket-консоль + статика
├── mcp/ # (далее) MCP-сервер (stdio) для агентов
├── deploy/ # (далее) systemd-юниты + setup.sh
├── tmp/ # временные файлы (в gitignore)
└── README.md
Конвенции и инструменты
- CLI-вызов:
cd atxpi && ATXPI_DRIVER=mock ./cli/atxpi status - Драйвер:
ATXPI_DRIVER=real(дефолт, железо) |mock(разработка). Реальный: питание =atxctl/main.py, консоль =pyserialнаSERIAL_PORT(/dev/ttyUSB0, 115200). - Mock-состояние питания хранится в
atxpi/tmp/atxpi_mock_power.json(не в/tmp). - SSH-ключ:
~/.ssh/id_ed25519(в Gitea названToros), пользовательeka. - Python: stdlib для core/CLI; полный набор (
pyserial,fastapi,uvicorn,mcp) — вatxpi/requirements.txt, ставится в venv на устройстве, не на HP Omen. - Коммиты: conventional (
feat:,fix:,chore:), по чекпоинтам.
Важно (безопасность)
- Живой сервер (продакшн) — только чтение кода, никаких команд питания.
- Питание/сброс — деструктивны: логировать действие, требовать аутентификацию.
- Управляющая плоскость биндится на VPN/loopback,
0.0.0.0запрещён. - Никаких
rm/записей в/tmpкорня ФС и вне рабочего каталога.
Статус
- ✅ Шаг ①: core + CLI + mock (работает на stdlib, проверено на mock)
- ⬜ Шаг ②: консоль на
pyserial - ⬜ Шаг ③: web-UI (FastAPI + REST + WS-консоль)
- ⬜ Шаг ④: MCP-сервер для агентов
- ⬜ Шаг ⑤: systemd + деплой на Pi 2B