tmact
AGENTS.md4 starsChanged 4 months agoApache-2.0View on GitHub
tmact is a Go CLI for local tmux automation, mainly for people running AI agents in terminal panes. It can list and inspect panes, detect idle/running or asking states, send guarded input, create/reuse agent sessions, run scheduled loops, answer narrow allowlisted prompts, and publish pane status for a local web UI. The entrypoint is cmd/tmact/main.go; most behavior lives under internal/. Common commands: - tmact ls lists tmux panes and caches numbered targets like -t 0. - tmact inspect --all classifies…
Where files are headingNew AGENTS.md files have more rules about keeping secrets out of the code, and fewer about code style.
Of the AGENTS.md files we read, the 31,774 first seen in the last six months, against the older ones: the kind of rule that gained most share, and the kind that lost most. About files like this in general, not this one, and an estimate, since a kind is a pattern in the words.
In this repository6 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- agent-loopSkill
- handoffSkill
- tmact-askSkill
- tmact-dispatchSkill
- tmact-loopSkill
The file
We split this AGENTS.md into the rules it gives an agent
5 rules. About 0 are common, 0 are distinctive, and 5 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈0
Distinctive · estimate
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 72
Run tests: make test (frontend Vitest + go test ./...).
- Very specific: line 79
Run local commands with go run ./cmd/tmact ...
- Very specific: line 81
Use gofmt on edited Go files.
- Very specific: line 83
Keep Go dependencies minimal.
- Very specific: line 103
Keep the web UI on 127.0.0.1 unless the operator explicitly chooses a trusted-network bind.
≈ “Common” is an estimate: at least 1 in 5 of the 40,246 AGENTS.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Repository Guidelines
tmact is a Go CLI for local tmux automation, mainly for people running AI
agents in terminal panes. It can list and inspect panes, detect idle/running or
asking states, send guarded input, create/reuse agent sessions, run scheduled
loops, answer narrow allowlisted prompts, and publish pane status for a local
web UI.
CLI
The entrypoint is cmd/tmact/main.go; most behavior lives under internal/.
Common commands:
tmact lslists tmux panes and caches numbered targets like-t 0.tmact inspect --allclassifies panes by runtime and activity state.tmact wait --target session:0.0 --until input-ready --timeout 5mwaits read-only for a bounded pane state transition or terminal blocker.tmact -t 0 send --text "status?" --enterpreviews input;--executeactually sends it.tmact detect --target session:0.0 --jsondetects directory-access prompts.tmact status,inbox,summarize,broadcast, andpanelsuse an agent YAML config.tmact loopandtmact watchrun pane automation with dry-run support.tmact loop example [--quota]prints a complete self-contained YAML template. Loops accept an optionalquotablock that skips cycles when the target agent lacks the configured 5-hour reserve or positive weekly pace headroom (seeexamples/quota-aware-loop.yaml). An optional top-levelcalendarblock (IANAtimezone,weekdays,windowsofHH:MMstart-inclusive/end-exclusive) limits when actions and flows may start (seeexamples/workday-loop.yaml).tmact dispatch-workstarts or reuses a tmux session, launches an agent CLI, and sends it a prompt. For a configured remote machine, usetmact dispatch-work SESSION --peer NAME ...; this creates or reuses the session on that peer. Do not SSH to the peer to invoke tmact unless the operator explicitly requests SSH.tmact statusdmaintains the cached pane snapshot used by status lines and the browser UI.tmact feedback "message" --category ux|bug|feature|docs|perf --command NAMEappends local usage feedback to~/.tmact/feedback.jsonl.
Feedback
Whenever tmact gets in your way (a confusing command, missing flag, unparseable
output, or unhelpful error), record it in the moment with
tmact feedback "<what was awkward + what you expected>" --category ux|bug|feature|docs|perf --command <cmd>.
The entry stays local and is never uploaded.
Web Interface
statusd can serve a local browser UI, bound to 127.0.0.1 by default. The UI
shows sessions and panes, streams selected pane output, sends text or keys back
to panes, offers quick prompt buttons, uploads files or clipboard images and
pastes their saved paths, and can use configured speech-to-text for voice input.
It also owns same-origin PWA Web Push: /sw.js handles push and
notificationclick, focuses an existing same-origin vibe window when possible,
and only opens same-origin paths. Configure VAPID with
TMACT_WEBPUSH_VAPID_PRIVATE_KEY, TMACT_WEBPUSH_VAPID_PUBLIC_KEY,
TMACT_WEBPUSH_VAPID_SUBJECT or the matching webpush_* keys in
~/.tmact/statusd.json; do not commit private keys. Subscriptions default to
~/.tmact/webpush_subscriptions.json.
Development
The browser UI is a Vite + React + TypeScript app under internal/web/frontend/.
Its production build is emitted into internal/web/static/ (embedded via
go:embed) and is not committed — internal/web/static/ holds only
.gitkeep in git. Build it before building/testing the Go binary.
- Build everything:
make build(runs the frontend build, thengo build ./...). - Build just the UI:
make web(Vite →internal/web/static/). Requires Node (the repo was set up with Node 22 + npm 10). - Run tests:
make test(frontend Vitest +go test ./...). For Go-only after a build,go test ./...works; the build-dependent web testst.Skipwhen the UI has not been built. - Live UI dev loop:
make web-devruns the Vite dev server on:5234and proxies/api+/wsto a running statusd (default127.0.0.1:7890; override withTMACT_STATUSD=host:port). Lets you iterate on the UI without rebuilding the Go binary. - Run local commands with
go run ./cmd/tmact ...(build the UI first if you need the web server). - Use
gofmton edited Go files; the frontend is TypeScript-strict (make webtype-checks viatscbefore bundling). - Keep Go dependencies minimal; current external Go deps are YAML config,
websocket packages, and Web Push/VAPID support. The frontend's npm deps live
in
internal/web/frontend/.
Agent Skills
Canonical tmact-owned skills live under skills/. The matching entries in
.agents/skills/, .claude/skills/, ~/.codex/skills/, and
~/.claude/skills/ are symlinks; edit only the canonical directories. After a
skill change, run the skill-creator quick_validate.py and
scripts/install-skills.sh --check. Keep machine-specific local-* skills
ignored unless their host and path configuration has first been externalized.
Safety
This tool presses keys in live tmux panes. Default to dry-runs, keep targets
explicit, preserve watcher allowlists, and do not auto-confirm permission,
approval, or broad path prompts. Folder trust is the only opt-in exception: it
must use --trust-folder, --trust-folders, or trust_folder: true, support
only Claude/Codex, and require exact canonical pane-cwd/allowed-dir equality.
Keep the web UI on 127.0.0.1
unless the operator explicitly chooses a trusted-network bind.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

