Skip to main content

Shared chassis for agent-ready CLIs: the exit-code contract, JSON/table/markdown/CSV output with field projection, and keyring-backed credentials.

Project description

agent-tool-shared-cli

The shared chassis for the agent-tool-<x>-cli family — agent-ready command-line tools that an LLM can drive with no prior knowledge of them.

PyPI CI Python License: MIT

pip install agent-tool-shared-cli

The tools built on it — each learns the same contract, so an agent that knows one knows them all:

Tool Install For
drone-cli pipx install agent-tool-drone-cli Drone CI — builds, failing-step logs, promotions
grafana-cli pipx install agent-tool-grafana-cli Grafana — log discovery, health scan, alert routing
openproject pipx install agent-tool-openproject-cli OpenProject — work packages, time, invoicing
lexware-office pipx install agent-tool-lexware-office-cli Lexware Office — invoices, contacts, AR-aging

This repo also holds the family's engineering docs — read these first if you are standing up a new tool:

Keywords: agent CLI chassis, LLM tool contract, exit-code taxonomy, JSON output CLI, keyring credentials, Python CLI library, AI agent tooling, Claude.

What's in it

This package is deliberately small. It holds the agent contract and the pure utilities that implement it — the things that must be identical across every tool, because an agent learns the contract once and applies it everywhere.

Module What
agentcli.errors The exit-code taxonomy (0/1/3/4/5/6/7/130) + DryRun
agentcli.output Emitter: json/table/markdown/csv, --fields projection, NDJSON streaming
agentcli.credentials Keyring storage with a 0600 fallback and an env override
agentcli.appspec AppSpec — the two strings that make all of the above tool-specific
from agentcli import AppSpec, Credentials, Emitter, OutputFormat, NotFoundError

SPEC = AppSpec(name="drone-cli", env_prefix="DRONECLI")

SPEC.config_dir()            # ~/.config/drone-cli  (or $DRONECLI_CONFIG_DIR)
SPEC.env("TOKEN")            # "DRONECLI_TOKEN"

Credentials(SPEC).get_token("default")     # env > keyring > 0600 file
Emitter(OutputFormat.json, fields=["id", "status"]).emit(rows)
raise NotFoundError("no such build")       # -> exit 5, JSON on stderr

The exit-code contract

Published API. You may leave a code unallocated, or repurpose one deliberately. You may never renumber one — agents branch on these, and they are documented in three places per tool (README, the in-binary guide, and the Claude skill).

Code Meaning
0 success (including a successful --dry-run)
1 generic error
2 reserved for Click/Typer usage errors — never allocate
3 config error
4 auth error (401/403)
5 not found (404)
6 conflict (409 / optimistic locking)
7 validation error (422) — see fieldErrors
8+ per-tool, and only for a condition you have observed
130 SIGINT

What is deliberately NOT here

client.py, serialize.py, resolve.py and the domain commands stay in each tool. They look shareable and are not:

OpenProject stops paginating on an authoritative total — "never stop on a short page". Drone has no total, and a short page is the terminator. The rule that inverts between tool #1 and tool #2 is exactly the rule you must not hoist.

Auth schemes, retry matrices and error-body shapes are the same story. Pulling them in would make this a framework with a config object per tool, which is how shared-code projects die.

Share the contract, not the transport.

Contributing

You need nothing but Python:

pip install -e '.[test]'
pytest                       # 74 tests, no network, no services

Changes here affect every downstream CLI. Two rules:

  1. Never renumber an exit code, and never change an output shape without treating it as a breaking change — downstream agents depend on both.
  2. Don't add a module because two tools happen to share it today. Wait until a third does, and until you can state the rule it obeys. tests/test_contract.py is the tripwire: if a change makes you edit it, stop and think.

License

MIT — see LICENSE.

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

agent_tool_shared_cli-0.1.3.tar.gz (20.0 kB view details)

Uploaded Source

Built Distribution

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

agent_tool_shared_cli-0.1.3-py3-none-any.whl (15.7 kB view details)

Uploaded Python 3

File details

Details for the file agent_tool_shared_cli-0.1.3.tar.gz.

File metadata

  • Download URL: agent_tool_shared_cli-0.1.3.tar.gz
  • Upload date:
  • Size: 20.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for agent_tool_shared_cli-0.1.3.tar.gz
Algorithm Hash digest
SHA256 b14ea4e294d7f90d68b806c283830bdebdbce4efa68478c3343638a65eeea8e8
MD5 52bfb8e7874bd78a1acf6f6f9c5d50c9
BLAKE2b-256 73c91b8fd8318948f88084e1f3d716c6b13ba7f6f4c4b438761eda284be85956

See more details on using hashes here.

Provenance

The following attestation bundles were made for agent_tool_shared_cli-0.1.3.tar.gz:

Publisher: release.yml on alexander-zierhut/agent-tool-shared-cli

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file agent_tool_shared_cli-0.1.3-py3-none-any.whl.

File metadata

File hashes

Hashes for agent_tool_shared_cli-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 d78ea78ee4206a9fbcdd4fdbdf922b000b02ee15e84a7a75a1e9c6c20a7a6458
MD5 73a0e9568404fd0dbe5657c7497479b7
BLAKE2b-256 3eba27ab01da94ae6bcf80646667818c8e4f9df8c6bee9e11841334231e835bb

See more details on using hashes here.

Provenance

The following attestation bundles were made for agent_tool_shared_cli-0.1.3-py3-none-any.whl:

Publisher: release.yml on alexander-zierhut/agent-tool-shared-cli

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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