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 <provider-name|config.json|.yaml> [harness args]— the primary form. Read a provider config — JSON, or YAML declaringschema: agedum-provider/v1— (a name resolved under~/.config/agents/providers, or a path), resolve its secrets from a.env, set the provider/model/auth environment, and launch the harness named in the config — inside the virtual-file context below.--prompt "<text>"seeds an initial prompt and stays interactive;--run "<text>"runs it non-interactively and exits.--dry-runprints the resolved env (secrets masked) + argv without launching.agedum --wrapper <harness> -- <command>— 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). Provider mode runs this same launch after setting the environment.
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+~/.config/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.Cline (
--wrapper cline) is supported as well — like opencode, pure path-discovery. The projectAGENTS.mdis read natively (Cline reads it as a cross-tool rules file); the globalAGENTS.mdbinds to the cross-tool path~/.agents/AGENTS.md; skills bind to./.cline/skills/(project) and~/.cline/skills/(global,$CLINE_DATA_DIR-aware). No extra flags. Cline also works in provider mode —agedum <provider>maps the config to Cline's CLI flags (--model/--provider/--thinking/--plan) and passes the token via--key.reasonix (
--wrapper reasonix) is supported as well — the DeepSeek-native reasonix agent, pure path-discovery like opencode/Cline. The projectAGENTS.mdis read natively (one of its memory docs); the globalAGENTS.mdbinds to~/.config/reasonix/AGENTS.md; skills bind to./.reasonix/skills/(project) and~/.reasonix/skills/(global), both outranking.agents/skills/so the overlaid copy wins. No extra flags. reasonix also works in provider mode —agedum <provider>mapsmodelto--model <name>on thechat/runsubcommand and exports the token (reasonix reads it via the provider'sapi_key_env);--runmaps toreasonix run "<text>", while--promptis unsupported (chatcan't be pre-seeded).aider (
--wrapper aider) is supported as well — but it differs from the others. aider has no native instruction discovery and no skills mechanism, so agedum injects each scope'sAGENTS.mdvia aider's--readread-only-context flag (the instructions analogue of kimi's--agent-file; no binds), and does not inject skills. In provider mode the config maps to aider's CLI flags (--model/--weak-model/--editor-model/--reasoning-effort), the key rides the environment (litellm), and abaseUrlsetsOPENAI_API_BASE. Git integration is disabled by default (--no-git), because agedum's namespace shares the real.gitand aider auto-commits — setgit: trueto opt back in.--runmaps toaider --message "<text>";--promptis unsupported (--messageruns once and exits).
[!NOTE] pi (
--wrapper pi) is supported as well — the earendil-works pi agent, pure path-discovery like opencode/Cline/reasonix. The projectAGENTS.mdis read natively (cwd→root walk); the globalAGENTS.mdbinds to~/.pi/agent/AGENTS.md; skills bind to./.pi/skills/(project) and~/.pi/agent/skills/(global). No extra flags. In provider modemodel/provider/thinkingmap to CLI flags and the key rides the environment by name. pi has no base-URL flag, so abaseUrlmakes agedum generate~/.pi/agent/models.json(a provider namedagedum, key referenced by$VAR); asubagentModelgenerates~/.pi/agent/settings.jsonrouting every pi-subagents built-in agent — both merged onto your existing files.--promptseedspi "<text>";--runmaps topi --print "<text>".
[!NOTE] codex (
--wrapper codex) is supported as well — the OpenAI Codex CLI, pure path-discovery like opencode/Cline/reasonix/pi. The projectAGENTS.mdis read natively (work-dir→root walk); the globalAGENTS.mdbinds to~/.codex/AGENTS.md($CODEX_HOME-aware); skills bind to./.codex/skills/(project) and~/.codex/skills/(global). No extra flags. In provider modemodelmaps to-mand the key rides the environment by name. codex has no base-URL flag, so abaseUrlis passed as-c model_providers.…overrides (a provider namedagedum). Recent codex speaks only the Responses API, so a Chat-Completions endpoint (DeepSeek etc.) setschatCompletions: trueand agedum interposes a localResponsesToChatProxy(theFoldProxysibling) that translates codex's Responses requests to/from/chat/completions. codex custom agents are bound three ways:subagentModel(one fast~/.codex/agents/flash.toml),codexAgents: <dir>(bind every*.tomlinto~/.codex/agents/, personal scope), andcodexProjectAgents: <dir>(into.codex/agents/, project scope) — sandbox defaulted by agedum, delegates the primary can spawn.--promptseedscodex "<text>";--runmaps tocodex exec "<text>".
Usage
# Provider mode — launch a harness from a provider config, env resolved from .env:
agedum claude-deepseek-auto # resolve the named provider, launch claude
agedum claude-deepseek-auto -p "review this" # extra args go to the harness
agedum claude-deepseek-auto --prompt "review this" # seed an initial prompt, stay interactive
agedum claude-deepseek-auto --run "review this" # run the prompt non-interactively, then exit
agedum ./providers/my-claude.json # a config path instead of a name
agedum claude-deepseek-auto --dry-run # print resolved env, virtual files + argv
# Wrapper mode (low-level; provider mode builds on it) — virtual files, no provider env:
agedum --wrapper claude -- claude --model sonnet -p "review this"
agedum --wrapper cline -- cline task "review this" # drive Cline with the same source
agedum --wrapper reasonix -- reasonix chat # drive reasonix with the same source
agedum --wrapper aider -- aider --no-git # drive aider (pass --no-git in wrapper mode)
agedum --wrapper pi -- pi # drive pi with the same source
agedum --wrapper codex -- codex # drive codex with the same source
agedum --wrapper claude --dry-run -- claude # list what would be injected, don't run
agedum --providers # list the provider configs (name, harness, model)
agedum --version
agedum --providers lists every *.json / *.yaml / *.yml config in $AGENTS_PROVIDERS_DIR (default
~/.config/agents/providers) as name harness model — the names you pass to
agedum <name>.
agedum <name> is the normal way to launch. Wrapper mode is the lower-level entry it
uses: everything after -- is the command, run verbatim, and --wrapper <harness>
chooses the format; --dry-run prints the injected virtual files without running.
Injected paths must be gitignored — agedum refuses to overlay a git-tracked file (the
namespace shares your real .git).
Documentation
Full docs at agedum.vcoeur.com:
- Source & scopes — the
AGENTS.md+.agents/skills/layout, and the project vs global scopes - Wrapper mode — run a command in the injected context; how each harness resolves
- Provider mode — launch a harness from a provider config (JSON or YAML)
- Harnesses — one page per harness: wrapper resolution + provider config
- 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.
Release files for agedum 0.58.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| agedum-0.58.0.tar.gz | 373.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| agedum-0.58.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 480.5 kB
Release files / agedum-0.58.0.tar.gz
| Download URL | agedum-0.58.0.tar.gz |
|---|---|
| Size | 373.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
737a15da1807a87eafcb4fb2534e7e668a3e8e516db3754ead372004cb911da9
|
|
BLAKE2b-256 checksum How to use checksums |
41ed9bb081ac25208a232d9f439fa78a932a737c6dac7dcee07e0596d944ec68
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 13, 2026.
Transparency logRelease files / agedum-0.58.0-py3-none-any.whl
| Download URL | agedum-0.58.0-py3-none-any.whl |
|---|---|
| Size | 107.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
45b0f2745a09629bbd14fa4fe5bc26f4138c96cd51e1fb05865396afba174fa6
|
|
BLAKE2b-256 checksum How to use checksums |
95977099502c01c3e711d1634134fd615dc0ec5be448352a290b2c32c6255fdc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 13, 2026.
Transparency log