A batteries-included CLI framework for building standalone DevOps tools.
Project description
untaped
untaped is a batteries-included CLI framework for building standalone
DevOps tools on cyclopts. It is an SDK, not
an app: there is no central untaped command. You build a tool, depend on the
SDK, and ship an independent CLI.
The SDK gives every tool, for free:
- Config — a shared
~/.untaped/config.ymlwith top-levelactive:/profiles:, per-profile SDKhttp/uisettings, and each tool's own profile settings plus tool-managed top-level state. - Profiles — named overlays (
dev,prod,homelab) and a--profileroot option, built in. - Themes — built-in theme presets for consistent terminal styling.
- Output — consistent
--format json|yaml|table|raw|pipeand--columns, so commands compose.pipeis a self-describing NDJSON record stream another untaped tool can read back.emit(...)renders a single entity as a vertical detail view or a sequence as a collection, dispatching by shape. - HTTP / UI helpers — an
HttpClientwith profile-aware TLS, automatic retries for transient failures (RetryPolicy), and pagination helpers, plus aUiContextfor messages, prompts, and progress. - Config tooling —
<tool> config doctordiagnoses the shared file and<tool> config editopens it in$VISUAL/$EDITOR; a--quietroot option mutes progress andsuccess/infochatter.
You import the surface from untaped.api (re-exported from the untaped
package root), declare a ToolSpec, and call run_tool(app, spec) from your
tool's main(). The contract surface is the __all__ list in
src/untaped/api.py.
# my_tool/__main__.py
from untaped.api import create_app, run_tool, ToolSpec
from my_tool.settings import MyProfile
app = create_app(...)
def main() -> None:
run_tool(app, ToolSpec(
command="untaped-mytool",
section="mytool",
profile_model=MyProfile,
))
# pyproject.toml
[project]
dependencies = [
"untaped>=3.0.0,<4",
]
[project.scripts]
untaped-mytool = "my_tool.__main__:main"
Tools resolve the SDK from PyPI in development and CI alike. Published wheels
are built with uv build --no-sources as defense in depth, so package
metadata always resolves from the declared PyPI range.
Requirements
Python 3.14 and uv.
The suite
Seven tools are built on the SDK. Each is an independent CLI installed into its
own uv tool environment. As each PyPI-backed tool completes its first package
release, install it by package name:
uv tool install untaped-github
uv tool install untaped-jira
uv tool install untaped-awx
uv tool install untaped-ansible
uv tool install untaped-workspace
uv tool install untaped-recipe
uv tool install git+https://github.com/alexisbeaulieu97/untaped-apple-health.git
untaped-apple-health is outside the current PyPI release wave; install it from
git until that repo owns a package release workflow.
Because every tool reads the same ~/.untaped/config.yml and shares the same
--format pipe envelope, independently installed tools interoperate and
compose:
untaped-awx job-templates list --format raw --columns name \
| fzf \
| untaped-awx job-templates get --stdin --format json
Documentation
User-facing docs live in docs/:
- Building a tool with the untaped SDK — the guide to
declaring a
ToolSpec, wiringrun_tool, and packaging an independent CLI. - Configuration — the
~/.untaped/config.ymlformat, profiles, secrets, and TLS. - Agent Skills — how each tool ships and installs Codex/Claude agent skills.
- Releasing — PyPI/TestPyPI workflow, Trusted Publisher setup, and recovery rules.
- Architecture decisions — the settled ADRs behind the SDK-only direction.
Per-tool command references live in each tool's own repo:
Security
Please report suspected vulnerabilities privately. See SECURITY.md.
Contributing
See CONTRIBUTING.md and AGENTS.md for the local workflow, architecture rules, and recipes for extending the SDK and its tools.
License
MIT. See LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file untaped-3.0.0.tar.gz.
File metadata
- Download URL: untaped-3.0.0.tar.gz
- Upload date:
- Size: 77.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
05a471e8cfe3f21bcc9288ca96b9dbad2369c2e84900bc12714cdc06efb8478b
|
|
| MD5 |
ad86437eeaa05b48ab47b41d329e2e10
|
|
| BLAKE2b-256 |
bde726d93adb9e19bf15c67fc90bffc486ebc29e3a5037281aa446bc9c0919c5
|
Provenance
The following attestation bundles were made for untaped-3.0.0.tar.gz:
Publisher:
release.yml on alexisbeaulieu97/untaped
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
untaped-3.0.0.tar.gz -
Subject digest:
05a471e8cfe3f21bcc9288ca96b9dbad2369c2e84900bc12714cdc06efb8478b - Sigstore transparency entry: 2061564061
- Sigstore integration time:
-
Permalink:
alexisbeaulieu97/untaped@c25ceb561d10f56ea627aa462f6756cc4b797a81 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/alexisbeaulieu97
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c25ceb561d10f56ea627aa462f6756cc4b797a81 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file untaped-3.0.0-py3-none-any.whl.
File metadata
- Download URL: untaped-3.0.0-py3-none-any.whl
- Upload date:
- Size: 98.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cc65fb6b059becb3ac2186f63f8f8e19c31785c73ac01c30b3bd79020bc741f7
|
|
| MD5 |
d47bc788eac30cdf8efb4e07437a7142
|
|
| BLAKE2b-256 |
3f19f9054a52aafc59f22f0083874630d9a213e34c40f2a231be9c6b025ca334
|
Provenance
The following attestation bundles were made for untaped-3.0.0-py3-none-any.whl:
Publisher:
release.yml on alexisbeaulieu97/untaped
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
untaped-3.0.0-py3-none-any.whl -
Subject digest:
cc65fb6b059becb3ac2186f63f8f8e19c31785c73ac01c30b3bd79020bc741f7 - Sigstore transparency entry: 2061565306
- Sigstore integration time:
-
Permalink:
alexisbeaulieu97/untaped@c25ceb561d10f56ea627aa462f6756cc4b797a81 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/alexisbeaulieu97
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c25ceb561d10f56ea627aa462f6756cc4b797a81 -
Trigger Event:
workflow_dispatch
-
Statement type: