Drive any agent CLI from an agent-neutral source shape (AGENTS.md + .agents/skills), translating per harness at launch.
Project description
agedum
Latin agedum — "go on! / get going!"
Drive any agent CLI from an agent-neutral source shape, translating per harness at launch. You keep one set of sources; agedum renders them for whichever agent CLI you run.
- Instructions live in a root
AGENTS.md(plain markdown). - Skills live in
.agents/skills/<name>/asSKILL.md(+ optional task files, scripts, and a per-harnessSKILL.<harness>.mdoverlay).
agedum has two modes:
agedum --wrapper <harness> -- <command>— at launch, compile the source to the harness's native layout in a throwaway dir, then run your command inside a private mount namespace (bubblewrap) where the compiled files appear at their expected paths — visible only to that process, never written into your real tree or$HOME. For Claude:AGENTS.md→CLAUDE.mdand.agents/skills/<name>/→.claude/skills/<name>/(the baseSKILL.mdmerged with an optionalSKILL.claude.mdoverlay).agedum --build-script conf.json [out.sh]— compile a provider config JSON into a standalone shell wrapper that sources a.env, validates the required vars, exports the provider/model/auth environment, andexecsagedum --wrapper. The two compose: the generated wrapper sets the environment, then hands off to the wrapper mode for skills/instructions injection.
Status: Claude harness, project + global scope, implemented. Each scope lands at its own Claude location — project →
./CLAUDE.md+./.claude/skills/, global (~/.config/agents/AGENTS.md+~/.agents/skills/) →~/.claude/CLAUDE.md
~/.claude/skills/(honours$CLAUDE_CONFIG_DIR). They're never merged; Claude reads both. Only those two~/.claudepaths are overlaid for the child — your~/.claude.jsonauth and other settings are untouched.kimi (
--wrapper kimi) is also supported. kimi reads the projectAGENTS.mdnatively, so agedum leaves it in place; it has no user-scopeAGENTS.md, so the globalAGENTS.mdis injected via a transient--agent-fileYAML (no--agent-fileis added when there's no global scope). Skills are binds: global →~/.kimi/skills/, project →./.kimi/skills/(both auto-read by kimi).opencode (
--wrapper opencode) is supported too — pure path-discovery, like Claude. The projectAGENTS.mdis read natively (./AGENTS.md); the globalAGENTS.mdbinds to~/.config/opencode/AGENTS.md; skills bind to./.opencode/skills/(project) and~/.config/opencode/skills/(global), both searched before.agents/skills/so the overlaid copy wins. No extra flags. Wrapper mode is Linux-only and requiresbwrapon PATH.
Usage
# Wrapper mode — virtual files injected from the project + global source:
agedum --wrapper claude -- claude --model sonnet -p "review this"
agedum --wrapper claude -- claude # interactive
agedum --wrapper kimi -- kimi -p "explain this code"
agedum --wrapper opencode -- opencode run "explain this code"
# Build-script mode — compile a provider config into a launcher script:
agedum --build-script providers/claude-deepseek-auto.json bin/claude-deepseek-auto.sh
agedum --build-script --check providers/claude-deepseek-auto.json bin/claude-deepseek-auto.sh
agedum --version
In wrapper mode, everything after -- is the command, run verbatim; --wrapper <harness>
chooses the format. The two are decoupled, so one context can front any command. Injected
paths must be gitignored — agedum refuses to overlay a git-tracked file (the namespace
shares your real .git). The bare --claude / --kimi / --opencode flags remain as
deprecated aliases for --wrapper <harness>.
Documentation
Full docs at agedum.vcoeur.com:
- Source shape — the structure of
AGENTS.mdand.agents/skills/ - Scopes — project vs global (user) scope, and where each lands
- Harnesses — exactly what agedum does for each
--wrapper <harness> - Build-script — compile a provider config JSON into a launcher script
- CLI reference and Internals — the mount-namespace launch and its safety rules
Install
pipx install agedum # standalone CLI (once published)
Develop
make dev-install # uv sync --all-groups
make test # pytest
make lint # ruff check + format --check
make run -- --version
make docs # build the docs site (strict); docs-serve for live preview
Python ≥ 3.12, managed with uv. The version is
derived from the git tag (vX.Y.Z) at build time via hatch-vcs — never committed.
Release
Tag the commit vX.Y.Z and push the tag; the release workflow builds and
publishes to PyPI via OIDC trusted publishing.
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
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 agedum-0.6.0.tar.gz.
File metadata
- Download URL: agedum-0.6.0.tar.gz
- Upload date:
- Size: 165.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f1906316d031670debb1fe449caab6bc5a4095cfbfd807457768ff4998c47cba
|
|
| MD5 |
aa1dbab2af3332edda1d747085ec22d9
|
|
| BLAKE2b-256 |
bb594600588fd6875ab72fb8d10c5e82c8fd8b1c73f0a2568452c9c89f5dd699
|
Provenance
The following attestation bundles were made for agedum-0.6.0.tar.gz:
Publisher:
release.yml on vcoeur/agedum
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
agedum-0.6.0.tar.gz -
Subject digest:
f1906316d031670debb1fe449caab6bc5a4095cfbfd807457768ff4998c47cba - Sigstore transparency entry: 1640216064
- Sigstore integration time:
-
Permalink:
vcoeur/agedum@84a29a62038dfceeabc838cbd270f98a1a406f45 -
Branch / Tag:
refs/tags/v0.6.0 - Owner: https://github.com/vcoeur
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@84a29a62038dfceeabc838cbd270f98a1a406f45 -
Trigger Event:
push
-
Statement type:
File details
Details for the file agedum-0.6.0-py3-none-any.whl.
File metadata
- Download URL: agedum-0.6.0-py3-none-any.whl
- Upload date:
- Size: 18.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e0022a55f57544d05785148d8aa6b84431ea265f838d7c0e0518cba2732bd191
|
|
| MD5 |
a65dc64d0a14b1f8da656d262d43a01f
|
|
| BLAKE2b-256 |
20c65e4824dc4d1463203e8891e932829d5bbccde8096b8ce98d8a89c548aace
|
Provenance
The following attestation bundles were made for agedum-0.6.0-py3-none-any.whl:
Publisher:
release.yml on vcoeur/agedum
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
agedum-0.6.0-py3-none-any.whl -
Subject digest:
e0022a55f57544d05785148d8aa6b84431ea265f838d7c0e0518cba2732bd191 - Sigstore transparency entry: 1640216194
- Sigstore integration time:
-
Permalink:
vcoeur/agedum@84a29a62038dfceeabc838cbd270f98a1a406f45 -
Branch / Tag:
refs/tags/v0.6.0 - Owner: https://github.com/vcoeur
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@84a29a62038dfceeabc838cbd270f98a1a406f45 -
Trigger Event:
push
-
Statement type: