Стандартная библиотека построения CLI: transport+retry, config+профили, session(keyring+fallback), output-контракт, errors, command-kit, локальные сессии.
Project description
clikit
Стандартная библиотека построения CLI поверх librarykit.
Новый CLI собирается за ~10 строк: единый root-app с --json/--text/--profile/--version,
4-слойный конфиг с валидацией, JSON-first вывод для агентов и скриптов,
структурированные команды. Сетевой слой — транспорт, retry, секреты, пути — это
зона КОРНЯ librarykit; clikit на нём построен и тянет его как зависимость, но
больше НЕ фасадит (строгие зоны). Единая иерархия ошибок (errors) — общий
контракт между слоями.
librarykit ← КОРЕНЬ: errors · retry · transport · sessions · paths · config_util
▲
clikit ← ЭТОТ КИТ: command_kit · config · output · scaffold + errors.
transport/retry/session/paths — бери из librarykit напрямую.
Установка
uv add s-clikit
Имя дистрибутива — s-clikit, имя для импорта — clikit. librarykit подтянется
автоматически как зависимость.
Быстрый старт
CLI за 10 строк — build_root_app даёт root с флагами --json/--text/--profile/--version:
from clikit import build_root_app, command, AppConfig, emit_data
from librarykit.transport import RestHttpClient # транспорт — зона librarykit
app = build_root_app(brand="acme", help="ACME CLI")
@app.command()
@command
def items():
cfg = AppConfig.load("acme")
client = RestHttpClient(cfg.base_url, access_token=...)
emit_data(..., text_renderer=...)
Запуск: acme items отдаёт машинный JSON; acme items --text — человеко-читаемый
вывод. Скаффолд нового проекта: clikit new <name> (см. clikit.scaffold).
JSON по умолчанию
Дефолтный режим вывода — json (для AI-агентов и скриптинга): без флагов команда печатает машинный JSON Lines в stdout. Человек переключается в текст:
- флагом
--text/--plain; - env
{BRAND}_OUTPUT=text; - в
config.toml→output_format = "text".
--json форсит json (перебивает --text, если переданы оба).
Слои конфига: global + project + local
AppConfig.load(brand) собирает значения по слоям (низ→верх приоритета), per-key
мерж (верхний слой переопределяет только заданные ключи, не заменяет объект целиком):
defaults(модель) < global(config_dir/config.toml)
< project(.<brand>.toml | .<brand>/config.toml — найден ВВЕРХ от cwd до .git)
< local(*.local.toml рядом с project, gitignored)
< ENV({BRAND}_<FIELD>) < init-kwargs
- project-discovery: подъём от cwd до маркера
.git; ищется.<brand>.tomlв корне ИЛИ.<brand>/config.toml— «конфиг рядом с проектом». - local-оверрайд:
.<brand>.local.toml— приватные правки поверх командного конфига (в.gitignore). - Профили (
{BRAND}_PROFILE→profiles/<p>/) — на уровне global.
AppConfig построен на pydantic-settings (типизация + fail-fast валидация). Пути
по ОС (librarykit.config_util.AppPaths) — на platformdirs (%APPDATA% /
~/Library / ~/.config), ENV-override {BRAND}_HOME.
env-интерполяция секретов
Строковые значения резолвятся из окружения при load (секрет не лежит в git):
api_token = "${ACME_TOKEN}" # из env ACME_TOKEN
base_url = "${ACME_HOST:-http://localhost:8000}" # с дефолтом
Поддержаны ${VAR} и ${VAR:-default}. Подстановка команд $(...) не
поддержана (поверхность атаки). Заряжать env можно load_dotenv_file или keyring
(librarykit.secret_store.SecretStore).
MCP-секция
AppConfig.mcp: dict[str, McpServer] — единая форма манифеста MCP-сервера
(transport/command/args/env/url/headers/enabled):
[mcp.skills-hub]
transport = "stdio"
command = "skills-hub-mcp"
args = ["--stdio"]
env = { TOKEN = "${SH_TOKEN}" }
$schema для редактора
AppConfig.json_schema() отдаёт JSON Schema модели. Команда для CLI —
make_schema_command(MyConfig):
from clikit import make_schema_command, AppConfig
app.command(name="schema")(make_schema_command(MyConfig)) # `acme schema` печатает схему
Публичный API
Зона clikit (clikit.__all__): CliError, AuthRequired, SessionExpired,
RateLimited, NotImplementedYet, ValidationError, init_output_mode, is_json,
console, emit_data, emit_message, emit_error, AppConfig, McpServer,
AdapterConfig, validate_adapters_installed, load_dotenv_file, interpolate_env,
discover_project_config, build_root_app, command, async_command, gated,
make_schema_command, scaffold_cli.
Депрекейт (строгие зоны): HttpClient / ApiError / RefreshCallback,
RetryPolicy / DEFAULT_RETRY, SecretStore, AppPaths / atomic_write_text /
chmod_600 / slugify ещё доступны из clikit (back-compat), но кидают
DeprecationWarning. Бери их канон напрямую из librarykit.transport /
librarykit.retry / librarykit.secret_store / librarykit.config_util.
Разработка
uv sync --extra dev
uv run --extra dev pytest -q
uv run --extra dev ruff check clikit
Лицензия
MIT © 2026 Dmitry.
Project details
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_clikit-0.1.3.tar.gz.
File metadata
- Download URL: s_clikit-0.1.3.tar.gz
- Upload date:
- Size: 101.8 kB
- Tags: Source
- Uploaded using 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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3e636ae8db131577f61030a9280b1dc840b0b951d0f7dd6633a9efcf14f1bc81
|
|
| MD5 |
0459888f70b666042f99e979c3d204b5
|
|
| BLAKE2b-256 |
459534cda976bb7fa8e3a1850d27650eae560bca4d071f49e01589335c94a5cc
|
File details
Details for the file s_clikit-0.1.3-py3-none-any.whl.
File metadata
- Download URL: s_clikit-0.1.3-py3-none-any.whl
- Upload date:
- Size: 34.2 kB
- Tags: Python 3
- Uploaded using 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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
53c32653ec31e2b91baa04a7ab227f1dfc3c808184c053ce7f02c843e5e6db7f
|
|
| MD5 |
af9fe0cc2a0a0c19c5473f10808baa24
|
|
| BLAKE2b-256 |
d9a0dc1e4f26c5e6a55e3830fe3c79b43b2070bcba9b155922a000f6523ad911
|