- Shell 100%
Substrate-agnostic helpers for the three T.A.S.K.S. surfaces (Claudian / Hermes / Nova). Each tool is single-file bash; no external runtime dependencies beyond psql, curl, python3, and a netrc at ~/.config/forgejo/netrc. - chronicle-check: read unread chronicle rows, advance read_by[] - chronicle-post: INSERT new chronicle rows (the write-side counterpart) - forgejo-cli: REST wrapper (whoami / issues / issue / pr) install.sh symlinks bin/* into ~/.local/bin/, idempotent and safe to re-run on any agent surface. |
||
|---|---|---|
| bin | ||
| install.sh | ||
| README.md | ||
agent-tools
Shared command-line helpers for the three T.A.S.K.S. agent surfaces (Claudian / Hermes / Nova) — substrate-agnostic enough that any of them can use them.
These wrap two things every agent surface needs:
- chronicle access — read/write
master_chronicle.conversationson the droplet via theforgejo-tunnel(psql at127.0.0.1:25432) - Forgejo REST access — HTTP Basic auth via netrc, no PAT bootstrap
Each helper is single-file bash with no external runtime dependencies beyond psql, curl, python3, and a netrc at ~/.config/forgejo/netrc.
Contents
| Path | Role |
|---|---|
bin/chronicle-check |
Read unread chronicle rows addressed to $RALPH_AGENT (default: claudian), advance read_by[]. Flags: --all, --no-mark, --agent=<name>, --limit=<N>, --since=<ts>. |
bin/chronicle-post |
INSERT a new chronicle row. Args: --from, --to <comma-sep>, --type, --message, [--channel], [--metadata <json>], [--thread <uuid>]. Returns new id. |
bin/forgejo-cli |
curl wrapper around Forgejo REST API. Subcommands: whoami, issues list, issue {get,close,comment}, pr {create,list,merge}. Auth via ~/.config/forgejo/netrc. |
Install (any agent surface)
git clone forgejo.claudian:claudian/agent-tools.git ~/Development/agent-tools
~/Development/agent-tools/install.sh
The installer symlinks each bin/<tool> into ~/.local/bin/<tool>, backing up any pre-existing file with a .bak.<ts> suffix. Idempotent — safe to re-run.
Prerequisites
- forgejo-tunnel — a systemd user service forwarding local
127.0.0.1:25432 → droplet:5432. The chronicle helpers will fail fast with a clear error if the tunnel's down. Standard service definition is in each surface's substrate repo (e.g.claudian-laptop/dot-config/systemd/user/forgejo-tunnel.service). - Forgejo netrc —
~/.config/forgejo/netrcmode 600, format:
The Forgejo passwords formachine forgejo.eckenrodemuziekopname.com login <agent-login> password <agent-password>claudian/hermes/novaare documented at~/.config/credentials/forgejo.md(or its equivalent on each surface). $PATH—~/.local/bin/must be on PATH (most distros default this; Quickshell-on-Sway needs an explicit prepend, see the laptop'sautostart.sh).
Why these exist (the design point)
Per T.A.S.K.S. Pipeline Law (innatescript/docs/CHOREOGRAPHY.md), the chronicle is the wire between surfaces. Each surface needs to read it, write to it, and read Forgejo issues that chronicle rows reference. These three helpers are the minimum substrate-agnostic toolkit for participating in the pipeline.
They're explicitly NOT smart — no LLM in any of them. Smart-ness happens in the per-surface execute loops (e.g. Claudian's ralph-execute skill); these tools just make the substrate addressable.
Compatibility
- Tested on EndeavorOS Arch Linux (Claudian / laptop). Should work on any Linux with bash 4+, psql, curl, python3.
- macOS untested but should work — bash 3.2 compat may need light edits in
chronicle-post's argument parsing.
Hard rails (intentional gaps in the API surface)
forgejo-clihas norepo delete, nobranch delete, no--forceflag onpr merge— these are unsafe operations and intentionally absent.chronicle-postwrites only; there is no chronicle-DELETE helper. The chronicle is event-sourced; rows are immutable except forread_by[].
If you find yourself needing a destructive operation here, the right path is to surface a blocked chronicle row to Nathan and let the human decide.