s-installerkit
Универсальный installer-kit: uv-bootstrap, self-update (модель skillery), генератор install-скриптов, прямая регистрация навыка + публикация в skillery. Тонкий слой над s-skillkit+clikit+librarykit.
Что это
Тонкий верхний слой над s-skillkit: даёт CLI-продукту установку и
самообновление «под ключ», НЕ дублируя механику skillkit (ensure_uv,
bootstrap_skill, manifest, линковка навыка — импортируются из него).
Dist-имя — s-installerkit; имя для импорта — installerkit.
uv add s-installerkit
Публичный API
from installerkit import (
configure, InstallerConfig, # единая конфигурация (прокси на skillkit + dist-имя)
make_self_update_command, # фабрика clikit-команды `self-update` (PyPI)
render_install_script, # генератор ASCII bootstrap-скриптов (sh/ps1)
ensure_uv, run_doctor, # окружение продукта: uv + scripts/self_check.py
install_direct, # прямая установка навыка (линковка + bootstrap)
publish_to_store, # публикация в skillery-store (с секрет-гейтом)
run_publish_gate, # секрет-скан + денилист (gitleaks + s-skillgate)
build_publish_payload, # payload POST /skills по манифесту навыка
)
Кит ставит и CLI installer:
installer install <путь-к-навыку> [--scope global|project] [--all-agents]
installer ensure-uv
installer doctor <каталог-продукта> [--no-self-check]
installer publish <путь-к-навыку> --tag v1.2.3 [--dry-run] [--force]
configure(InstallerConfig(app_name, dist_name, ...))— идемпотентно проецирует брендинг/каталоги наskillkit.configureи запоминаетdist_nameдля self-update. Каталоги — ленивыми провайдерами (кит env сам не читает).make_self_update_command(dist_name)→ clikit-команда: сверяет версию с PyPI JSON API (pypi.org/pypi/<dist>/json), обновляет авто-детектом менеджера (uv tool/pipx/pip),--check— только показать. На Windows апгрейд — detached-процессом (launcher.exeзалочен), применяется со след. запуска. Регистрация:app.command(name="self-update")(make_self_update_command("s-myctl")).render_install_script("sh"|"ps1", dist_name, cli_name)→ строка ASCII-only bootstrap-скрипта (ставитuvпри отсутствии →uv tool install --upgrade <dist>). ASCII гарантируется (иначеcurl|sh/irm|iexломаются).install_direct(path, scope=..., all_agents=...)— прямой путь установки (без хаба): материализует навык в центральный стор и линкует junction/symlink'ом в~/.claude/skills/<slug>(или в project-scope), гоняетskillkit.bootstrap_skill(ensure_uv → deps → бинари → self_check), дляkind = "tooling"регистрирует MCP-серверы у агента. Возвращает graceful-отчёт{ok, slug, agents, bootstrap, mcp, errors}и НЕ бросает; битая ссылка в scope детектится (link_status = "broken").ensure_uv()— идемпотентно найти/поставитьuv:{"uv": <путь|None>, "status": "found" | "installed" | "missing"}.found— uv уже был и ничего не делалось.run_doctor(product_dir)— сводная проверка окружения продукта: uv,.venv, наличие и прогонscripts/self_check.py. Возвращает{ok, uv, venv, self_check_script, self_check, problems}, не бросает;installer doctorпечатает отчёт и выходит с кодом 1, еслиok=False.publish_to_store(path, tag=..., client=...)— публикация навыка: сначала ГЕЙТ (run_publish_gate: gitleaks, если бинарь есть в PATH, плюсs-skillgate— regex-секреты и денилист внутренней инфы), затем сборка манифеста (kind/cli/mcp/runtime_dependencies— без них хаб не поставит сам инструмент), затем отправка черезclient.publish_skill(payload)(sync и async-клиенты оба). Блокирующие находки →CliError(publish_gate_failed, exit 1) ДО сборки и сети;force=True— сознательный обход.dry_run=Trueвозвращает payload, не отправляя (секретные поля в нём замаскированы). Транспорта кит не несёт — клиент инъектирует потребитель; командаinstaller publishбез клиента умеет--dry-run.- Команда
installer publishзакрыта правомskill.publish: если задан envINSTALLER_PERMISSIONS, она регистрируется только при наличии права.
Контракт scripts/self_check.py (самопроверка продукта)
Финальный gate установки: его гоняет и skillkit.bootstrap_skill, и
installer doctor. Продукт обязан положить скрипт по пути
scripts/self_check.py в своём корне.
- Вход: аргументов нет, stdin не читается (запуск неинтерактивный).
Рабочий каталог — корень продукта; интерпретатор выбирается в порядке
<продукт>/.venv/bin/python→uv run python→ текущийsys.executable. - Выход: человекочитаемый отчёт в stdout/stderr (оба потока попадают в
self_check.output). Формат свободный; пишите, ЧТО именно не так. - Коды возврата:
0— окружение исправно; любой ненулевой — нет (различать 1/2/3 инсталлятор не станет, коды нужны только вашим тестам). - Ограничения: без сети и без секретов в выводе; таймаут 300 с (skillkit
убьёт зависший скрипт). Скрипта нет ⇒ это САМО ПО СЕБЕ проблема:
подтвердить окружение нечем,
doctorвернётok=False.
# scripts/self_check.py
import shutil, sys
problems = [] if shutil.which("uv") else ["нет uv в PATH"]
print("
".join(problems) or "окружение исправно")
sys.exit(1 if problems else 0)
Разработка
uv sync --extra dev
uv run --extra dev pytest -q
uv run --extra dev ruff check installerkit tests
Статус
- Type:
kit - Status:
experiment - Priority: P1
- Slug:
s-installerkit - Prefix:
si - Tags: —
- Создан: 2026-07-17
Atlas
Карточка проекта в Atlas-БД (Atlas):
atlas projects get s-installerkit
Физический layout:
- Storage:
_storage/s-installerkit/ - Junction:
Products\s-installerkit→_storage/s-installerkit
TODO (placeholder)
- Заполнить README реальным контентом проекта.
- Подключить GitLab-репозиторий (если ещё нет):
atlas projects git init s-installerkit.
Metadata
Release files for s-installerkit 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| s_installerkit-0.2.0.tar.gz | 71.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| s_installerkit-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 83.3 kB
Release files / s_installerkit-0.2.0.tar.gz
| Download URL | s_installerkit-0.2.0.tar.gz |
|---|---|
| Size | 71.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
db0af8e8df362c12d6296d73079f04837a0cc38f5199c864bbe5a8264b18bdd7
|
|
BLAKE2b-256 checksum How to use checksums |
4e61b2a7bef2de5577baf06296e1014bdb4c09ca609e22ab5fdb8dd0107445d1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / s_installerkit-0.2.0-py3-none-any.whl
| Download URL | s_installerkit-0.2.0-py3-none-any.whl |
|---|---|
| Size | 11.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
61da6da0dc2e0e96baf2457abfba57267304dfddef78dd48b5241992d4bf144b
|
|
BLAKE2b-256 checksum How to use checksums |
bd1860c072ae07b33371e901277bc537ba8d8649c2d6c1c975b94656a7135b07
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|