{"id":50977982,"url":"https://github.com/mavam/skeel","last_synced_at":"2026-06-19T10:32:27.038Z","repository":{"id":364762105,"uuid":"1269107971","full_name":"mavam/skeel","owner":"mavam","description":"Declarative agent skill management for GitOps workflows.","archived":false,"fork":false,"pushed_at":"2026-06-14T10:42:10.000Z","size":37,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-14T12:19:23.856Z","etag":null,"topics":["agent","agentskill","agentskills","ai","skills"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mavam.png","metadata":{"files":{"readme":"README.md","changelog":"changelog/config.yaml","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-06-14T10:11:46.000Z","updated_at":"2026-06-14T11:22:39.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/mavam/skeel","commit_stats":null,"previous_names":["mavam/skeel"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/mavam/skeel","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mavam%2Fskeel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mavam%2Fskeel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mavam%2Fskeel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mavam%2Fskeel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mavam","download_url":"https://codeload.github.com/mavam/skeel/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mavam%2Fskeel/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34528134,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-19T02:00:06.005Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent","agentskill","agentskills","ai","skills"],"created_at":"2026-06-19T10:32:26.293Z","updated_at":"2026-06-19T10:32:27.006Z","avatar_url":"https://github.com/mavam.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🛠️ skeel\n\nDeclarative agent skill management.\n\n**skeel** reads a desired-state manifest and applies it through `gh skill`.\n\n## ✨ Features\n\n- **Desired state**: declare skill sources in one YAML file\n- **Inventory, dry run, and diff**: list manifest skill status, preview\n  commands, and compare managed skills against what's installed locally\n- **Add, apply, and update**: edit desired state, reconcile installed skills\n  with live progress, and update declared installed skills\n- **Target flags**: choose local or global scope from the CLI\n- **JSON output**: pass `--json` for one machine-readable object on stdout\n\n## 🚀 Quickstart\n\nRun `skeel` directly with `uvx`:\n\n```sh\nuvx skeel\n```\n\n## ⚙️ Manifest\n\nDefault path: `.agents/skills.yaml` in project scope, `~/.agents/skills.yaml`\nin user scope.\n\n```yaml\nsources:\n  anthropics/skills:\n    - skill-creator\n  mavam/quarto-brief:\n  openclaw/gogcli:\n    - gog\n  tenzir/skills:\n    pin: main\n    skills:\n      - tenzir-ecs\n```\n\nAn empty value installs all skills from a source. A list is the common form for\nselected skills. Use a nested mapping only for source options, such as `pin` or\ncustom `install` commands.\n\nBy default, `skeel` installs `gh skill` skills into `.agents/skills` in the\ncurrent working directory. Use `--scope user` for global installs into\n`~/.agents/skills`:\n\n```sh\nuvx skeel --scope user apply\n```\n\nUse `--manifest` (`-m`) for a non-default desired-state manifest:\n\n```sh\nuvx skeel --manifest ./skills.yaml apply --dry-run\n```\n\nScope selects the base directory for the implicit manifest and managed skill\ndirectory: project scope uses the current working directory and user scope uses\n`$HOME`. If the implicit manifest does not exist, `apply`, `diff`, `list`, and\n`update` are no-ops; `add` creates the manifest. Use `--manifest` or\n`SKEEL_MANIFEST` to use a manifest from another path.\n\n## ✨ Commands\n\nBy default, `list`, `diff`, `apply`, and `update` read both\n`.agents/skills.yaml` in the current working directory and\n`~/.agents/skills.yaml`. Use `--scope project` or `--scope user` to operate on\none scope. Human output uses the first column for the marker, the second column\nfor the skill name, the third column for the source, and a muted suffix for\nversions or paths. User-scope skills include a muted `⌂` suffix.\n\nFor scripts, pass `--json` to `add`, `apply`, `diff`, `list`, `path`, `remove`,\nor `update` to emit one machine-readable object on stdout.\n\n### `list`\n\nShow manifest skills and whether they are installed. Sources declared without a\nskill list expand to the installed skills from that source instead of showing\n`*`.\n\n```sh\nuvx skeel list\n```\n\n```text\n✔︎ skill-creator anthropics/skills main@3cf9a8d ⌂\n✔︎ wrangler cloudflare/skills main@45cc198 ⌂\n✔︎ quarto-brief mavam/quarto-brief main@e89c555 ⌂\n✔︎ tenzir-docs tenzir/skills main@a5d04ab\n✘ gog openclaw/gogcli\n```\n\n### `diff`\n\nCompare desired state with installed skills. `+` rows would be installed by\n`apply`; `-` rows would be removed.\n\n```sh\nuvx skeel diff\n```\n\n```text\n+ wrangler cloudflare/skills\n+ vectorize cloudflare/skills\n- obsolete-skill installed\n- old-experiment installed\n```\n\n### `apply`\n\nReconcile installed skills with the manifest. Missing skills are installed and\nextra skills are removed. Use `--reinstall` to run every manifest installer\nwithout diffing first, or `apply \u003csource\u003e [skill]` to target one source. A\nselector that does not match the manifest exits with an error.\n\n```sh\nuvx skeel apply --dry-run\n```\n\n```text\n↳ gh skill install cloudflare/skills wrangler --allow-hidden-dirs --dir .agents/skills --force\n↳ gh skill install cloudflare/skills vectorize --allow-hidden-dirs --dir .agents/skills --force\n↳ rm -rf .agents/skills/obsolete-skill\n```\n\n```sh\nuvx skeel apply\n```\n\n```text\n+ wrangler cloudflare/skills\n+ vectorize cloudflare/skills\n- obsolete-skill\n```\n\n### `update`\n\nUpdate installed skills that are represented by the manifest. Each installed\nskill is checked independently, and remote update checks run in parallel. Pass a\nsource, or a source and skill, to update only that manifest selection. A selector\nthat does not match the manifest exits with an error.\n\n```sh\nuvx skeel update\nuvx skeel update tenzir/skills\nuvx skeel update tenzir/skills tenzir-docs\n```\n\n```text\n✔︎ teach mattpocock/skills main@975430f\n✔︎ tenzir-docs tenzir/skills main@f3842c1\n✔︎ clacks downstairs-dawgs/clacks\n✘ broken-skill broken/source\n```\n\nPinned GitHub entries are updated by resolving the configured pin and\nrefreshing installed files when the source changes. Skills installed by\n`gh skill` include provenance in `SKILL.md` frontmatter, so future updates can\ntrack them directly.\n\n### `add`\n\nUpsert a source or source/skill entry into the manifest. Omit the skill to\nselect all skills from the source. Pass `--apply` to reconcile immediately.\n\n```sh\nuvx skeel add tenzir/skills tenzir-docs@main\n```\n\n```text\n✔︎ tenzir-docs tenzir/skills .agents/skills.yaml\n```\n\n```sh\nuvx skeel add mavam/quarto-brief --dry-run\n```\n\n```text\n↳ mavam/quarto-brief .agents/skills.yaml\n```\n\n### `remove`\n\nRemove an unambiguous skill name from the manifest. Pass `--apply` to reconcile\nimmediately. A selector that does not match the manifest exits with an error.\n\n`add` and `remove` are intentionally asymmetric: adding starts from a source\nbecause skeel needs to know where to install from, while removing starts from a\nskill because that is the common user intent. Use `--source` only to\ndisambiguate or remove a whole source.\n\n```sh\nuvx skeel remove tenzir-docs\n```\n\n```text\n✔︎ tenzir-docs tenzir/skills .agents/skills.yaml\n```\n\nWhen multiple sources declare the same skill name, disambiguate with `--source`:\n\n```sh\nuvx skeel remove tenzir-docs --source tenzir/skills\n```\n\nOmit the skill to remove the whole source selected by `--source`:\n\n```sh\nuvx skeel remove --source mavam/quarto-brief --dry-run\n```\n\n```text\n↳ mavam/quarto-brief .agents/skills.yaml\n```\n\n### `path`\n\nPrint the manifest path that `skeel` would use for the selected scope.\n\n```sh\nuvx skeel path\n```\n\n```text\n/Users/alice/project/.agents/skills.yaml\n```\n\n## 🧰 GitHub Skill Policy\n\nWhen applying, `skeel` delegates placement to `gh skill` with:\n\n```sh\ngh skill install \u003crepo\u003e \u003cskill\u003e --dir .agents/skills --force\n```\n\nThe target directory is derived from scope: project scope uses the current\nworking directory and user scope uses `$HOME`. A bare GitHub source installs all\nskills from that repository:\n\n```yaml\nsources:\n  mavam/quarto-brief:\n```\n\nwhich runs:\n\n```sh\ngh skill install mavam/quarto-brief --all --dir .agents/skills --force\n```\n\nFor installers that are not backed by `gh skill`, provide source-level\n`install` commands under the source key. Skeel runs those commands as the\ncomplete install command set:\n\n```yaml\nsources:\n  slack-clacks/clacks:\n    skills:\n      - clacks\n    install:\n      - uvx --from slack-clacks clacks skill --mode universal --force\n```\n\nTo add a GitHub source from the CLI, use the same positional shape as\n`gh skill install`:\n\n```sh\nuvx skeel add tenzir/skills tenzir-docs@main\nuvx skeel remove tenzir/skills tenzir-docs\nuvx skeel add mavam/quarto-brief --apply\n```\n\n## 📄 License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmavam%2Fskeel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmavam%2Fskeel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmavam%2Fskeel/lists"}