The Argus plugin - andreaderuvo/argus GitHub Wiki
The Argus plugin
One install that connects an agent to Argus, both ways:
- It tells Argus what it is doing. When a turn starts, when it finishes (with its last words), and when it needs you β naming what it wants: "needs your permission to use Bash: rm -rf build". The desk tab's light, the bell on your phone and "working / waiting" come from the agent itself instead of from watching its screen.
- It can use Argus. The MCP tools:
askyou something and wait for the tap on your phone,ring, seewhoelse is working,relayto another session,start_agent(in its own worktree), read theteamsand yourprompts. See what that is good for.
What you can ask it
The whole list β what it does by itself, what it does on your tap, what it cannot do and why β is
What an agent can do. The plugin's argus skill carries the same table,
so the agent knows it without being told.
Say it in your own words to Claude or Codex; it picks the tool from what you asked.
| You say | It does | Tool |
|---|---|---|
| "open a new desk called pippo" | the tab appears in your browser and switches to it | open_desk |
| "rename the desk Desk 11 to Pippo" | renamed on the machine and on every open page | rename_desk |
| "rename the desk appropriately" | the desk the agent is in, with a name it chose | rename_desk without desk |
| "open a Claude and a Codex in pippo, in ~/work/parser" | two sessions start, their windows land in that desk | start_agent (desk) |
| "start a Codex reviewer on branch fix-42 with this briefβ¦" | a new session in its own git worktree, prompt sent | start_agent (worktree_branch, prompt) |
| "start Claude with sonnet, allowed to edit files" | the flags come from the agent's own --help |
launchers, start_agent (options) |
| "work on to-do #3 and mark it done when you have" | marks #3 doing, works on it, marks it done; the To do screen shows "by" its session | todos, todo_set |
| "add a to-do to check the CI later" | a new line on your list, with the next number | todo_add |
| "who else is working here?" | every session, its agent, folder, working or waiting | who |
| "tell the reviewer the diff is ready" | the sentence typed into that session | relay |
| "ask me before you delete anything" | the question on your phone with buttons; it waits for the tap | ask |
| "ring me when you're done" | one bell, with what happened | ring |
| "how is the team doing?" | round, whose turn, the last check | teams |
| (in a team, by itself) "what is my task?" / "I'm done" | reads its task; reports its turn with a summary and a verdict | team_task, team_done |
| "make me a team that speeds up the parser, with a reviewer" | writes the team, checks it, writes it as team.yaml and rings you β you start it |
team_check, team_propose |
| "use my Referee prompt" | your prompt library, read from Argus | prompts |
| "make me a worktree on branch x" | a second checkout, inside the folders Argus serves | worktree |
And without being asked, through the hooks: it tells Argus when a turn starts, when it ends (with its last words) and when it is waiting for you (naming what it wants to run) β the lights on the desk tabs and the bells come from there.
In a team the plugin does three more things, so an agent takes part without being taught the
protocol in every prompt: the argus-team skill (the protocol in one page: read your task, do
one turn, report it, stop), the tools team_task and team_done, and the Stop guard β
an agent that tries to stop with its turn unreported is sent back to report it, twice at most. See
Teams.
Designing a team is the other skill, argus-team-author: the team language (Mermaid and
YAML), the rules Argus checks and what makes a good team, with examples β so "make me a team
thatβ¦" works without pasting the documentation. With team_check and team_propose the agent
writes it, checks it and leaves it for you to start. See
Asking an agent to design one.
With your OK β the tool request: what its key cannot do (start a team in a desk, continue
or stop one, end or rename a session, start an agent with no questions, remove a worktree, delete a
to-do) it asks for; you get Do it / No, and on Do it Argus does it. "Start the team Kraken
paper in the desk Trading" works this way.
What it cannot do, on purpose: answer a question meant for you, remove a desk or anything in it,
delete files through Argus. And by itself β without your tap on a request β start an agent that
asks nobody anything, or start, pause or stop a team.
Argus must be running on the same machine; the plugin finds it through
~/.config/argus/config.yaml, as argus-say does.
Installing it
From Argus, with a press. Settings β Interruptions has a row per agent on the machine:
The Argus plugin in Claude Code β not installed [Install], or 0.1.3 β 0.1.5 is out
[Update]. The button runs the agent's own plugin commands for you. When the agent has no
marketplace called argus yet, it uses your Argus checkout as the marketplace, so the plugin
always matches the server that offers it: pull Argus, press Update, and the two move together.
By hand, from the agent. Claude Code:
/plugin marketplace add andreaderuvo/argus
/plugin install argus@argus
Codex (0.160 or later) reads the same plugin:
codex plugin marketplace add andreaderuvo/argus
codex plugin add argus@argus
Codex then asks you once, at its next start, to review the plugin's hooks; until you do, they do not run. Its MCP calls ask for approval the first time, as any tool does.
Gemini CLI gets the tools as an extension (plugin/gemini-extension.json); its hooks come
from Settings β Interruptions β Let your agents ring in Argus.
Updating it
You are told when it is time:
- in Argus, once per version, a dialog: which agent has an older plugin, Update (or Update all), and then, in the same dialog, Reload in N waiting for the sessions already open. Later keeps quiet until the next version; Alt+V shows the same at any time;
- in the agent, at the start of each session: the plugin's
SessionStarthook asks Argus for the version it offers and, when it is newer, Claude shows "Argus plugin 0.1.5 is availableβ¦" at the top of the session. It says nothing when Argus is not there or is up to date.
Each window says when its session is behind. The plugin's hooks tell Argus which plugin
version their session runs (at session start, and with every bell), so a terminal window whose
agent still runs an older one shows plugin 0.1.4 β reload (Claude: one press types
/reload-plugins, only if the session sits at its prompt) or plugin 0.1.4 β restart (Codex,
which has no reload and takes the plugin when the session starts again). A session that never
said is not guessed about.
After an update, sessions already open still run the old plugin until they reload. Argus offers
Reload in N waiting: it types /reload-plugins into the Claude sessions sitting at their
prompt β the ones whose last word was done. Never into one that is working, and never into one
that is asking you something, where an Enter would answer the question. The others take the new
plugin when you reload them by hand or open a new session.
An agent can do it too, through request: update_plugin (agent: claude or codex) is asked
first, like any change to an agent's configuration; reload_plugins is never asked, since it only
makes the sessions at their prompt run the plugin already installed.
By hand:
/plugin marketplace update argus
/plugin update argus@argus
/reload-plugins
An agent refreshes an installed plugin only when its version changes; the repository's tests keep
the version moving with the content (on 2026-10-06 a tool added under the same version never
reached anyone who updated). A new tool is there after /reload-plugins, or in a new session.
The plugin or the switch?
Either. Let your agents ring writes the same hooks into the agent's own settings, from Argus;
the plugin brings them from the agent's side, with the MCP tools as well, and updates with
/plugin update. Settings shows "the Argus plugin" for an agent that has it. Having both does no
harm: the two rings of one turn are folded into one.
What it is made of
plugin/ in the repository:
.claude-plugin/plugin.jsonβ the name and the version;hooks/hooks.jsonβ UserPromptSubmit βargus-bell start, Notification and PermissionRequest βargus-bell asking, Stop βargus-stop(the team guard; otherwise it rings asargus-bell done), SessionStart βargus-check(says which plugin version the session runs, and whether a newer is out);.mcp.jsonβ theargus-mcpserver;skills/argus/(what the agent can do in Argus, and what it requests),skills/argus-team/(working in a team),skills/argus-team-author/(writing one β its examples are checked by the tests);gemini-extension.jsonβ the MCP tools for Gemini CLI (no hooks, no skills there);bin/βargus-bell,argus-stop,argus-check,argus-mcp, and copies ofargus_client.pyandargus_mcp.py, kept identical totools/by the tests.
Where it finds Argus: ~/.config/argus/config.yaml β its listen port and, when tls_cert is
set, https; the hooks sign with the config's token:, the MCP server prefers an agents: key (on loopback, without checking the certificate, which names the public host). Before
0.1.7 the hooks assumed http://127.0.0.1:8090, and an Argus on another port or on https never heard
a single ring: update the plugin. The repository root is the marketplace
(.claude-plugin/marketplace.json).
One detail that cost a probe: Codex expands ${CLAUDE_PLUGIN_ROOT} in hooks but not in an MCP
command, so the MCP command is a small sh -c that uses it when it is there and otherwise finds
the copy Codex installed under ~/.codex/plugins/cache/argus/argus/.