GitHunt
GE

geronimo-iia/agentctl

CLI for agent hub validation, index generation, skill management, and local config

agentctl

CLI for agent hub validation, index generation, and skill management.
Implements the hub formats defined in agent-foundation.

See docs/roadmap.md for current development plans and upcoming features.

Install

Homebrew (macOS/Linux):

brew tap geronimo-iia/agent
brew install agentctl

Chocolatey (Windows):

choco install agentctl

asdf (version manager):

asdf plugin add agentctl https://github.com/geronimo-iia/asdf-agentctl.git
asdf install agentctl latest
asdf global agentctl latest

cargo-binstall (installs pre-built binary):

cargo binstall agent-ctl

cargo (builds from source):

cargo install agent-ctl

Binary download: grab the latest release from GitHub Releases.

Quickstart

Validate a hub directory:

agentctl hub validate --type docs --path ./my-hub
agentctl hub validate --type skills --path ./my-skills

Generate index.json:

agentctl hub generate --type docs --path ./my-hub --output index.json
agentctl hub generate --type skills --path ./my-skills --hub-id my-hub --output index.json

Usage

agentctl --help
agentctl hub --help

Validation output

On success:

✓ Validation passed

On failure (exit code 1):

  ✗ skills/my-skill/SKILL.md:1: missing required field: name
  ✗ skills/my-skill/SKILL.md:1: missing required field: description
✗ Validation failed (2 error(s))

Generated index.json (skills)

{
  "hub_id": "my-hub",
  "generated_at": "2026-07-14T10:00:00Z",
  "skills": [
    {
      "name": "python-scaffold",
      "description": "Scaffold a Python project",
      "path": "python-scaffold",
      "commit_hash": "abc1234"
    }
  ]
}

Config Management

Inspect and modify ~/.agentctl/config.json without editing JSON by hand.

# create a default config file (errors if already exists)
agentctl config init
agentctl config init --force   # overwrite existing

# print the config file path
agentctl config path

# print the full config as pretty JSON
agentctl config show

# get / set scalar values
agentctl config get skills_root
agentctl config set skills_root ~/.agent/skills

Supported keys: skills_root — overrides the default skill install root. Hub entries are managed via hub add/remove/enable/disable.

Hub Registry

Register and manage hub sources in ~/.agentctl/config.json:

agentctl hub add --type skills agent-foundation https://raw.githubusercontent.com/geronimo-iia/agent-foundation/main/skills/index.json
agentctl hub add --type docs agent-foundation https://raw.githubusercontent.com/geronimo-iia/agent-foundation/main/docs/index.json
agentctl hub list
agentctl hub disable agent-foundation
agentctl hub enable agent-foundation
agentctl hub remove agent-foundation
agentctl hub refresh agent-foundation   # force-refresh one hub
agentctl hub refresh --force agent-foundation  # bypass cache entirely
agentctl hub refresh                    # refresh all enabled hubs
agentctl hub refresh --force            # force refresh all hubs

Skill Management

Install, list, remove, and update skills from registered hubs.

# install from the first enabled skill hub
agentctl skill install python-scaffold

# install from a specific hub
agentctl skill install python-scaffold --hub agent-foundation

# install into a named mode (path: ~/.agent/skills-dev/)
agentctl skill install python-scaffold --mode dev

# list installed skills
agentctl skill list

# remove a skill
agentctl skill remove python-scaffold --hub agent-foundation

# update a skill (errors if no update lifecycle — use --force to reinstall)
agentctl skill update python-scaffold
agentctl skill update python-scaffold --force

# update all installed skills
agentctl skill update

# export current skill installations for backup/sharing
agentctl skill export > skills.lock.json

Global flags:

  • -q / --quiet — suppress all step output; implies --yes
  • -y / --yes — auto-approve all requires_approval lifecycle steps

Skills are installed to ~/.agent/skills/<name>/ and tracked in ~/.agentctl/skills.lock.json.
Each skill may include a lifecycle.yaml with install, update, and uninstall sections.

agentctl.toml

Optional file at the hub root. When present, values are used as defaults; CLI flags always take precedence.

[hub]
id = "agent-foundation"  # overrides --hub-id on generate

[generate]
# Replaces the default exclusion list when present.
# Supports filename patterns, directory patterns, and path wildcards.
ignore = [
  "README.md",              # exact filename match
  "CHANGELOG.md",
  "CONTRIBUTING.md",
  "ARCHIVED.md",
  "draft-*.md",             # filename wildcard
  "rules/templates/",       # directory pattern (excludes all files in directory)
  "docs/internal/*.md",     # path wildcard (specific pattern in directory)
]

Pattern types:

  • Filename patterns: "README.md" (exact), "draft-*.md" (wildcard) — matched case-insensitively at any path level
  • Directory patterns: "templates/", "rules/templates/" — excludes all files in the specified directory
  • Path wildcards: "rules/*.md", "docs/internal/*.md" — excludes files matching the pattern in the specific directory path

When agentctl.toml is absent or has no [generate] ignore key, the default exclusions apply: README.md, CHANGELOG.md, CONTRIBUTING.md, LICENSE*, ARCHIVED.md.

See docs/hub-config.md for full details including cache layout and TTL behaviour.

CI Integration

Example GitHub Actions workflow for a docs or skills hub:

name: Publish Index

on:
  push:
    branches: [main]

jobs:
  publish:
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - uses: actions/checkout@v4

      - name: Install agentctl
        run: |
          curl -sSL https://github.com/geronimo-iia/agentctl/releases/latest/download/x86_64-unknown-linux-gnu.tar.gz | tar xz -C /usr/local/bin

      - name: Validate
        run: agentctl hub validate --type docs --path .

      - name: Generate index.json
        run: agentctl hub generate --type docs --path . --output index.json

      - name: Commit index.json
        run: |
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"
          git add index.json
          git diff --staged --quiet || git commit -m "chore: regenerate index.json [skip ci]"
          git push

Replace --type docs with --type skills for a skills hub.

License

MIT OR Apache-2.0