Metadata-Version: 2.5
Name: skillery-cli
Version: 0.5.94
Summary: Skillery CLI — клиент маркетплейса AI-навыков для агентов (Claude Code, Codex).
Author: Dmitry
License: MIT
License-File: LICENSE
Keywords: ai,claude-code,cli,codex,skillery,skills
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Requires-Python: >=3.11
Requires-Dist: httpx>=0.28
Requires-Dist: keyring>=25.0
Requires-Dist: pathspec>=0.12.0
Requires-Dist: rich>=13.9
Requires-Dist: s-clikit<0.3,>=0.2.0
Requires-Dist: s-corekit<0.2,>=0.1.0
Requires-Dist: s-leasekit<0.2,>=0.1.2
Requires-Dist: s-librarykit<0.9,>=0.7.1
Requires-Dist: s-netkit<0.2,>=0.1.1
Requires-Dist: s-skillgate<0.2,>=0.1.7
Requires-Dist: s-skillkit<0.7,>=0.6.3
Requires-Dist: s-telemetrykit<0.4,>=0.2.0
Requires-Dist: tomli-w>=1.0
Requires-Dist: typer>=0.15
Provides-Extra: dev
Requires-Dist: pytest-asyncio>=0.24; extra == 'dev'
Requires-Dist: pytest>=8.3; extra == 'dev'
Requires-Dist: pyyaml<7,>=6.0.3; extra == 'dev'
Requires-Dist: respx>=0.21; extra == 'dev'
Requires-Dist: ruff>=0.8; extra == 'dev'
Description-Content-Type: text/markdown

# skillery-cli

CLI-клиент для **Skillery** — маркетплейса AI-навыков (skills) для агентов
(Claude Code, Codex и совместимых). Ставит навыки в центральный стор, линкует
их в проект или глобально, синхронизирует и обновляет.

## Shared collections across agents

Install a collection into one central store and expose it to several agents:

```bash
skillery cli config --projection link
skillery collection install my-stack --scope global --agents claude_code,codex,deepseek --projection link
skillery collection install my-stack --local --scope project --agents codex,deepseek --projection link
```

Each release is downloaded once. Secondary agents receive junctions on Windows
or symbolic links on Linux. `--projection link` fails if sharing is unavailable;
it never silently creates a copy. Clean Skillery copies can become links, while
edited files, private scope state and foreign directories are preserved and
reported as refused. Dependencies hidden from the primary agent stay hidden.
The primary installation handles tooling; secondary sharing does not register
MCP servers, run hooks or copy account data. Inspect `failed` (server collections)
or `skipped` (local collections) in the JSON result before claiming full coverage.
`--agents` and `--agent` are mutually exclusive.

When accessing a Windows store from WSL, point Linux skill links at the same
physical files under `/mnt/c/...`; keep agent credentials and session directories
outside those links. A protected container needs an explicitly approved payload
mount. Linking host account directories into it is not part of this command.

For a container, expose only the released files of a local collection:

```bash
skillery store expose --collection my-stack
skillery store expose --collection my-stack --path /same-filesystem/skill-payloads
```

The default location is `payloads/<collection>` beside the store. Files are hard
links to verified Hub content, so their bytes occupy one place. Unreleased state
such as `.env`, `_local/`, browser profiles and package caches is excluded.
Keep the destination on the same filesystem: link failures never fall back to
copies. Mount this view read-only, using the provider's normal mount controls.
Normal skill updates refresh registered views and preserve their directory
identity so an existing bind mount observes updated files. Edited or unknown
view files are preserved and reported. `skillery store refresh-views` performs
the same checks explicitly. A daemon that predates this feature must be upgraded
and restarted through its normal lifecycle before relying on automatic refresh.

## Установка

```bash
# Изолированно через pipx (рекомендуется):
pipx install skillery-cli

# либо в текущее окружение:
pip install skillery-cli
```

После установки доступна команда `skillery`:

```bash
skillery --help
```

> Прежнее имя команды `skills-hub` оставлено как совместимость и лишь
> подсказывает перейти на `skillery`.

## Канон команд: `skillery <ресурс> <глагол>`

Команды сгруппированы по ресурсам (ресурс — в единственном числе):

| Ресурс | Про что | Глаголы |
|--------|---------|---------|
| `skill` | навыки | `list` `show` `suggest` `contributors` `install` `remove` `enable` `disable` `update` `installed` `sync` `pull` `push` `publish` `report` `new` |
| `auth` | аккаунт и сессия | `login` `logout` `whoami` `passwd` `register` `join` |
| `cli` | сам CLI | `status` `doctor` `logs` `config` `upgrade` |
| `store` | центральный стор | `list` `path` `gc` `migrate` |
| `device` | устройства | `list` |
| `collection` · `rating` · `comment` · `ticket` · `webhook` · `event` · `daemon` | — | `<группа> --help` |
| `member` · `role` · `permission` · `company` · `invite` · `admin` | администрирование | `<группа> --help` |

Вне групп остались `run` (обёртка запуска навыка — вшита в каждый `SKILL.md`),
`ask`, `web` и `onboard`: это разовые действия без ресурса-собрата.

**Старые плоские имена продолжают работать.** `skillery install …`,
`skillery members`, `skillery status` вызывают ровно те же функции, что и
новые формы — ни один существующий скрипт, `SKILL.md` или вызов из демона не
ломается. При вызове старого имени в **stderr** уходит подсказка с новой
формой; stdout не затрагивается, поэтому разбор вывода (в т.ч. `--json`)
остаётся валидным. Заглушить подсказку — `SKILLERY_NO_DEPRECATION_WARNINGS=1`.

## Quickstart

```bash
# Онбординг: зарегистрироваться самому либо принять инвайт-ссылку/токен.
skillery auth register
skillery auth join <ссылка-или-токен>
# либо, если уже есть учётка:
skillery auth login --email me@example.com --password ...

# Посмотреть доступные навыки (доступ фильтруется правами):
skillery skill list
skillery collection list             # кураторские подборки

# Навыки ставятся в центральный стор (~/.skillery/store) и линкуются junction/
# symlink. Дефолтный scope — project (текущая папка).
skillery skill install bitrix24                 # → стор + ссылка в ./.claude/skills
skillery skill install bitrix24 --scope global  # → стор + ссылка в ~/.claude/skills

# Автономно — без хаба, из локальной папки или git (логин не нужен):
skillery skill install --path ./my-skill
skillery skill install --from-git <url> --ref v1.0.0

# Динамический набор проекта:
skillery skill enable wb-api     # включить в текущем проекте
skillery skill disable wb-api    # выключить (стор цел)
skillery skill sync              # применить манифест проекта
skillery store list              # что в сторе

# Обновить установленные навыки:
skillery skill update --all
```

## Установка под всех агентов

CLI автодетектит установленного агента (Claude Code / Codex) по наличию
`~/.claude` или `~/.codex` и кладёт навыки в правильный каталог. Можно
форсировать конкретного агента или поставить сразу под всех:

```bash
skillery skill install bitrix24 --agent codex
skillery skill install bitrix24 --all-agents
```

## Оценки, комментарии, тикеты, коллекции

После логина (по правам) доступны:

```bash
# Оценить навык (1..5) и посмотреть сводку:
skillery rating set bitrix24 5
skillery rating summary bitrix24

# Комментарий (с необязательным скриншотом):
skillery comment add bitrix24 "работает в облаке" --screenshot ~/proof.png
skillery comment list bitrix24 --limit 25

# Тикеты в поддержку:
skillery ticket create "OAuth ломается" --skill bitrix24 --kind bug
skillery ticket list --status open

# Коллекции (просмотр из CLI):
skillery collection list --type dynamic
skillery collection show popular
```

## Автообновления навыка из git (webhook)

Чтобы новая версия навыка приезжала на хаб сама (push в репо → синк), у навыка
должен быть webhook. Команда делает обе половины: регистрирует его на хабе И
создаёт hook у провайдера локальным `gh` / `glab` (те же права, что у вас в
терминале — account-wide PAT не нужен).

```bash
# Включить автообновления (идемпотентно: повтор обновляет, а не дублирует hook):
skillery webhook register my-skill

# Состояние: настроен ли, какой провайдер, куда шлёт.
# --probe дополнительно спросит провайдера: есть ли hook и когда была доставка.
skillery webhook status my-skill --probe

# Отключить: снять запись на хабе и hook у провайдера.
skillery webhook revoke my-skill
```

Если `gh`/`glab` не установлен или не авторизован, команда не падает: она
печатает точные ручные шаги (URL приёмника, тип событий) и ОДИН раз — секрет
webhook'а для вставки в настройки репозитория. В `--json` секрет не выводится
никогда (только отпечаток `sha256:…`).

Монорепо (несколько навыков в одном репозитории) поддержано: у каждого навыка
СВОЙ hook — адрес приёмника один, но в нём стоит маркер навыка
(`…/webhooks/git/github?skillery_skill=<id>`). Секрет хаб выдаёт на каждый
навык отдельно, поэтому общий hook на репо ломал бы всех соседей: он хранит
один секрет, и доставки остальных навыков молча отбивались бы 401. Регистрация
навыка чужие hook'и не трогает — ни при `register`, ни при `revoke`.

Права: у GitHub нужен доступ admin к репо (scope `repo` у `gh` его покрывает),
у GitLab — роль Maintainer/Owner в проекте.

## Онбординг проекта

```bash
# Детект стека (python / nodejs / nextjs / react / docker / terraform / go /
# rust / claude-code) → подбор навыков → включение в проект.
skillery onboard --yes
```

## Event tracking + daemon

CLI не шлёт события синхронно: он кладёт их в локальную очередь
(`~/.skillery/events.queue.json`) — сбой записи никогда не ломает команду.
Отдельный демон периодически берёт batch и отправляет его на бэкенд.

```bash
skillery event queue --show      # что в локальной очереди
skillery daemon start            # запустить фоновый sender
skillery daemon status           # alive + последний цикл + размер очереди
skillery daemon install          # сгенерировать autostart-юнит (launchd / systemd / Task Scheduler)
```

`daemon install` не трогает system-wide настройки — он лишь пишет unit-файл в
user-scope и печатает инструкцию по активации. Это безопасно для CI и
разделяемых окружений. Отправка событий работает и анонимно: протухшая сессия
не глушит телеметрию автономного CLI.

## Конфиг

`~/.skillery/config.toml`:

```toml
base_url   = "https://hub.example.com"
web_ui_url = "https://hub.example.com/app"
output_format = "text"                # text | json
auto_update = false                   # true → тихо обновляет навыки при следующей команде
default_install_scope = "project"     # project | global
# store_dir = "~/.skillery/store"     # центральный стор (env: SKILLS_HUB_STORE_DIR)
```

Токены (access + refresh) хранятся в **OS keyring**:

- Windows — Credential Manager;
- macOS — Keychain;
- Linux — Secret Service (GNOME Keyring, KWallet, …).

Установки со старым каталогом `~/.skills-hub` подхватываются автоматически и
мигрируются в `~/.skillery` при первой записи.

## Профили

`~/.skillery/profiles/staging.toml` + `--profile staging` — отдельный backend и
отдельные токены для другой среды.

## Вывод: text | json

По умолчанию команды печатают человекочитаемый текст. Флаг `--json` (или
`output_format = "json"` в конфиге) переключает вывод в JSON Lines — удобно для
скриптов и агентов: результат идёт в stdout, сообщения и ошибки — в stderr.

## Лицензия

MIT — см. [LICENSE](LICENSE).
