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.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file s_installerkit-0.1.0.tar.gz.
File metadata
- Download URL: s_installerkit-0.1.0.tar.gz
- Upload date:
- Size: 75.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
41de3fde8872b700753832442ddeb84b71e3067a6049b730c6b9d2c923cb7541
|
|
| MD5 |
0120a714ba7f261ae87f52fa30a03900
|
|
| BLAKE2b-256 |
e7919fe2f1b802bc7c5de8849fcb3d562781a82073dffb2ac03431683de3318a
|
File details
Details for the file s_installerkit-0.1.0-py3-none-any.whl.
File metadata
- Download URL: s_installerkit-0.1.0-py3-none-any.whl
- Upload date:
- Size: 33.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f355c58d5df77bc36323e13f977cdf18f042dd2b2104b3c38209c49ab06767af
|
|
| MD5 |
91aaedf7e09255754ab3b3d2cf2978d7
|
|
| BLAKE2b-256 |
ad818d63d181fd9c848e3fd23ea7b08dfb58c1489245cc3d253927ade7cd6e8a
|