Metadata-Version: 2.4
Name: s-skillkit
Version: 0.1.0
Summary: Локальное ядро управления навыками: install из git/локальной папки, junction/symlink-линковка в scope агента, .skillignore-фильтр, build manifest, project-манифест. 0 завязок на сеть/auth — stdlib + tomli-w + pathspec + platformdirs.
Author: Dmitry
License: MIT
License-File: LICENSE
Requires-Python: >=3.11
Requires-Dist: pathspec>=0.12.0
Requires-Dist: platformdirs>=4.0
Requires-Dist: tomli-w>=1.0
Provides-Extra: dev
Requires-Dist: pytest-asyncio>=0.24; extra == 'dev'
Requires-Dist: pytest>=8; extra == 'dev'
Description-Content-Type: text/markdown

# s-skillkit

Локальное ядро управления навыками (skills) — **SIBLING** `librarykit`
(не зависит от него, от httpx, auth или сети). Только локальная ФС-механика.

## Что внутри

- **`SkillStore`** (`skillkit.installer`) — материализация навыка в центральный
  стор и линковка (junction на Windows / symlink на POSIX) в scope агента:
  - `install_from_git` / `install_from_path` / `install` / `materialize`
  - `update` (инкрементальный sha-diff), `link_existing`, `migrate_scope`
  - `remove` (keep-local / purge)
  - P0 **stub-would-clobber guard** (stub не затирает живой контент).
- **`targets`** — `IAgentTarget` + `detect_agent` / `get_target` (Claude Code,
  Codex, Antigravity).
- **`manifest`** — `build_manifest` для publish + ридеры frontmatter /
  `_skill_meta.toml`.
- **`filter`** — `.skillignore` / `files`-allowlist фильтр (pathspec).
- **`project`** — проектный манифест `.skills-hub/skills.toml`.
- **`Paths`** — инъекция каталогов (`store_dir` / `config_dir` / `bin_dir`).
  `Paths.default()` — нативная раскладка через platformdirs.

## Инъекция вместо завязки на конфиг

Кит НЕ читает env/config. Каталоги передаются явным `Paths`; git-учётка —
инъектируемым `credential_resolver` (callable `url -> url`). Потребитель (CLI)
читает env-токен и собирает резолвер:

```python
from skillkit import SkillStore, Paths, get_target

paths = Paths.default()  # или из ClientConfig

def resolver(url: str) -> str:
    token = os.environ.get("SKILLS_HUB_GIT_TOKEN")
    if token and url.startswith("https://") and "@" not in url:
        return url.replace("https://", f"https://oauth2:{token}@", 1)
    return url

store = SkillStore(get_target(None), paths.store_dir, credential_resolver=resolver)
```

## Зависимости

`tomli-w`, `pathspec`, `platformdirs`. requires-python `>=3.11`. MIT.
