Skip to main content

Стандартная библиотека построения 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 вывод для агентов и скриптов, структурированные команды. Транспорт, сессии, пути и иерархия ошибок берутся из librarykit (clikit их реэкспортирует), поэтому CLI и сетевые адаптеры говорят на одном контракте.

librarykit   ← КОРЕНЬ: errors · retry · transport · sessions · paths
   ▲
clikit       ← ЭТОТ КИТ: command_kit · config · output · scaffold.
                        transport/session/paths/errors/retry — реэкспорт 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, HttpClient, AppConfig, emit_data

app = build_root_app(brand="acme", help="ACME CLI")

@app.command()
@command
def items():
    cfg = AppConfig.load("acme")
    client = HttpClient(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.tomloutput_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}_PROFILEprofiles/<p>/) — на уровне global.

AppConfig построен на pydantic-settings (типизация + fail-fast валидация). Пути по ОС (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 (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.__all__: CliError, AuthRequired, SessionExpired, RateLimited, NotImplementedYet, ValidationError, RetryPolicy, DEFAULT_RETRY, init_output_mode, is_json, console, emit_data, emit_message, emit_error, HttpClient, ApiError, RefreshCallback, AppConfig, McpServer, load_dotenv_file, interpolate_env, discover_project_config, SecretStore, AppPaths, atomic_write_text, chmod_600, slugify, build_root_app, command, async_command, gated, make_schema_command, scaffold_cli.

Разработка

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

s_clikit-0.1.1.tar.gz (92.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

s_clikit-0.1.1-py3-none-any.whl (28.2 kB view details)

Uploaded Python 3

File details

Details for the file s_clikit-0.1.1.tar.gz.

File metadata

  • Download URL: s_clikit-0.1.1.tar.gz
  • Upload date:
  • Size: 92.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.27 {"installer":{"name":"uv","version":"0.9.27","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

Hashes for s_clikit-0.1.1.tar.gz
Algorithm Hash digest
SHA256 c0a9cb8202ce77eba2bf008ca98b029a3a5d26f439ed2689c3124f82c75c5f87
MD5 88fcb96effe062fff26baeda58f1ac1a
BLAKE2b-256 0ae37154b3c4eadf9747434adf48312b59e8360eee08a80b257cca9d59f9fc11

See more details on using hashes here.

File details

Details for the file s_clikit-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: s_clikit-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 28.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.27 {"installer":{"name":"uv","version":"0.9.27","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

Hashes for s_clikit-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 a6ca3291f7f84d89668ac7bad31df9301e21388043faa12063b90b32d3900a1b
MD5 342ed35c4abdc4cb73c331e3e0b7b3b5
BLAKE2b-256 50752b27d4fda7755a68766411b4732d88b022199a08d8b0f8cdf06e643ffea5

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page