OpenCove
Coordinate agents and share work using OpenCove's command-line interface.
Installation
- Make sure Claude is on your device and in your terminal.
Skills load from
~/.claude/skills/when Claude Code starts up β so you need it on your machine first. If you don't have it yet, install it once with the command below, then runclaudein any terminal to verify.One-time setupnpm i -g @anthropic-ai/claude-codeAlready have it? Skip ahead.
- Paste into Claude Code or into your terminal.
This copies the whole skill folder into
~/.claude/skills/opencove-deadwavewave/β the SKILL.md plus any scripts, reference docs, or templates the skill ships with. Safe default: works for every skill.Faster alternative (instruction-only skills)
Skips the clone and grabs only the SKILL.md file. Don't use this if the skill ships Python scripts, reference markdowns, or asset templates β they won't be downloaded and the skill will fail when it tries to load them.
Quick install (SKILL.md only)Sign up to copy - Restart Claude Code.
Quit and reopen Claude Code (or any other agent that loads from
~/.claude/skills/). New skills are picked up on startup. - Just ask Claude.
Skills auto-activate when your request matches the skill's description β no slash command needed. Trigger phrases live in the skill's own frontmatter; you can read them in the βWhat this skill doesβ section above.
Prefer to read the source first? Open on GitHub.
When Claude uses it
Coordinate agents and share work inside OpenCove using its bundled CLI.
What this skill does
OpenCove agent guide
This guide ships inside the CLI build. Use opencove --version to identify it;
opencove skill -o json includes the matching version and guide content.
All example IDs, names and paths must be replaced with actual query results.
Establish identity before acting
Check the environment variable OPENCOVE_ENV=1 before using session defaults.
If it is absent, stop and obtain an explicitly authorized endpoint/profile;
do not search or modify a real user's profile. Never print control tokens.
opencove --version
opencove whoami
opencove context
opencove node get --node @self
whoami reports your grant and scope; context orients you in the project/space.
For agents, context.nodes[].state is run state; sessionStatus is session
lifecycle (running does not mean working). node list keeps raw status as lifecycle;
use agent list/get
for run state. Missing context run observations are unknown, never inferred idle.
Use command --help without a connection whenever an option is unclear.
Success stdout is the result itself, without an ok/value wrapper.
Errors go to stderr; non-TTY or -o json uses a structured error object.
Select targets explicitly
Node, space and project selectors accept a full ID, exact case-sensitive title/name,
or a unique ID prefix of at least six characters. Ambiguity exits 6: use a full ID.
@self uses your authenticated terminal identity, not your working directory.
Inside OpenCove, omitted space targets default to your space; explicit --project
selects project scope for lists. Names/prefixes use your project unless overridden.
Terminal nodes can report observed agents; only agent windows can receive prompts.
Resolve targets from the agent list before prompting.
opencove node list -o table
opencove agent list --space @self -o table
opencove agent get --node "Reviewer" --pretty
Notes and tasks are a shared blackboard
Read existing notes/tasks before changing them. Keep task ownership visible.
Claim a task by setting status doing and putting your actual node ID from
whoami in a tag or requirement note. This is a coordination convention, not an
atomic lock: re-read and negotiate any conflicting claim. --tag replaces the
provided tag list, so preserve existing tags or use a requirement note.
Finish with ai_done; reserve done for human acceptance.
opencove node list --kind note
opencove node list --kind task
opencove node get --node task-123
opencove node create note --title "Progress" --text "Review started"
opencove node update note --node note-123 --text-file ./progress.txt
opencove node create task --title "Review" --requirement "Review the implementation"
opencove node update task --node task-123 --status doing --requirement "Original requirement; claimed by node-123"
opencove node get --node task-123
opencove node update task --node task-123 --status ai_done
Long text accepts --text-file or --requirement-file and - for stdin.
Do not supply both inline and file variants. Preserve others' findings and claims.
Coordinate: list β prompt β wait β read
Only create an agent when authorized for its provider, model and workspace.
Do not close or prompt nodes you did not create unless explicitly asked.
Never answer another agent's permission prompt; ask the human to handle it.
A waiting agent may be asking a question or permission, even with null blockedReason.
opencove agent list -o table
opencove agent get --node agent-123
opencove agent read --node agent-123 --screen
opencove agent prompt --node agent-123 --text-file ./assignment.txt --timeout 20s
opencove agent wait --node agent-123 --turn turn-123 --timeout 10m
opencove agent read --node agent-123 --turn turn-123
opencove agent read --node agent-123 --turn turn-123 -o json
Prompt works only with agent windows OpenCove launched (from a task, the agent
launcher or node create agent) running Claude Code, or Codex with its
lifecycle hooks, at authoritative working state or after an observed finished turn. Agent windows started with a custom
executable path are refused.
Agents typed into a terminal cannot receive prompts because the shell would receive the input after the agent stops.
Start an agent meant to receive prompts, such as a lead agent other agents report to, as an agent window using Run Agent on a task, the agent launcher, or opencove node create agent --space <space> --prompt <text>; it can still use the opencove CLI from there.
Newly opened/resumed sessions may need a completed turn first.
Save the successful prompt's turnId (replace turn-123 above). The normal loop is
prompt (save deliveryId/turnId) β delivery status β wait --turn <turnId> (the containing turn ended; check outcome) β read --turn <turnId> (Claude correlated; Codex reply reads stay uncorrelated).
A successful prompt reports textComparison: matched means Claude Code's reported
text equals what you sent (newlines and trailing spaces aside); different (for
example a draft was submitted with it) still exits 0 but means stop, inspect with
agent read --screen, and never resend; Codex reports unavailable.
The command attempts one bracketed paste and one Enter; an existing editor draft
is submitted too. Inspect drafts and dialogs first with
opencove agent read --node <selector> --screen; unseen dialogs may consume input.
Screen reads replay the snapshot at its columns/rows, preserving cursor-created
spaces, overwrites and wide CJK/emoji cells. They select its normal/alternate buffer,
ignore styling/modes, trim row-end spaces and trailing blank rows, then return the
last 40 rendered viewport rows. Use --lines 20 to change the tail;
-o json returns nodeId, sessionId and lines. Never answer another agent's permission
prompt. Screen inspection grants no authority to resolve it.
submission_observed confirms a matching authenticated UserPromptSubmit observation,
not exact text processing, causation, successful work, or turn completion.
Refusals describe this call only; they do not cancel another delivery:
agent.blocked: waiting for input (reason may be null); human resolves the dialog.agent.busy/working: legacy Worker or--if-busy refuse; wait for completion.agent.busy/delivery_in_progress: await that delivery's result before deciding.agent.state_unknown/readiness_unobserved: finish a turn in the terminal first.agent.state_unknown/observation_degraded: check hooks and await reliable evidence.agent.not_running: inspect the node; start/resume only when authorized.agent.prompt_unsupported: the reason says what is missing (another provider,terminal_agent_unsupported,executable_override_unverified, Codexcodex_hooks_notify_only);bracketed_paste_offmeans the terminal has not enabled bracketed paste. Check the terminal prompt.agent.prompt_timeoutbefore paste: check target and attempt flags before deciding whether a new call is appropriate.
agent.prompt_interrupted means paste was attempted, but this call did not attempt
Enter. Text may remain in the editor. Never resend after interrupted; inspect
the editor with agent read --node <selector> --screen and have the human resolve
dialogs before continuing.
agent.prompt_stalled means Enter was attempted without a matching submission
receipt. Never resend after stalled; inspect
agent read --node <selector> --screen and the conversation to establish whether
it submitted. Transport loss, CLI interruption, invalid response
or Worker restart also leaves a potentially submitted prompt: do not resend.
pasteDispatchAttempted and submitDispatchAttempted describe attempts, not receipt.
Missing flags do not mean false. A deadline preserves the phase and attempt flags.
Wait never sends input. After a prompt, save turnId and wait --turn <turnId>.
This selects that exact end, even if a newer turn starts, and keeps waiting during
permission/question pauses. It returns {nodeId, sessionId, turnId, outcome, endedAt?, state};
all ended outcomes exit 0. Check outcome (completed, failed, aborted or unknown).
--turn requires exactly one node and conflicts with --until, multiple nodes and
--any. Unknown/evicted turns or missing retained evidence exit 1; inspect
agent get. Its lastEndedTurn identifies the latest end and persists during the
next turn; replacement/restart clears it. Older Workers omit it; events/history
remain usable. History fallback requires interact scope.
For node-level state waits, a state that already holds counts immediately; unknown
or degraded never counts as idle. --until turn-end observes a subsequent end.
Default is --all, timeout 20s; minimum is 250ms (smaller budgets exit 2 before
connection/target lookup). Set --timeout for real work.
Live list excludes exited sessions; inspect a known exited node with get or wait.
opencove agent wait --node agent-123 --node agent-456 --until waiting --any --timeout 30s
opencove agent wait --node agent-123 --node agent-456 --until idle --all --timeout 2m
opencove agent get --node agent-123 --fields state,quality,turnOutcome
State waits print all selected snapshots; exact-turn waits print one result. Timeout prints lastKnown on stderr, stdout empty.
Ctrl-C exits 130 and closes subscriptions. It never stops the target agent.
Read tries the latest ended turn's agent.finalMessage first. --turn <turnId>
selects exactly the OpenCove turn ID returned by prompt: no prefixes or fallback.
Hook replies (β€64 KiB), outcome and IDs are private; exact local --turn reads survive restarts.
Archive caps: 60 turns/node, 30 days, 20,000 global records and 128 MiB of message text.
JSON includes persisted and memoryOnlyReason when false; archive_unavailable differs from a miss.
Deleting the node removes OpenCove history, not provider transcripts or existing backups.
No prompt text or delivery records are archived.
opencove agent history clear --node <selector> deletes that nodeβs archived and in-memory replies, leaving the node, provider transcripts, backups, run state, active turns and delivery records unchanged; later ends store normally, and archive unavailability clears memory but exits 1.
Remote waits use mirrored snapshots/events; older history requires the executing Worker.
Correlated local Claude hooks supply messages. Check outcome; ended does not mean successful.
Only a read without --turn falls back to the transcript when the hook reports
no_ended_turn or provider_sent_no_message. Exact-turn reads preserve
agent.final_message_unavailable and details.reason: turn_not_ended means
still active, turn_not_found means unknown/evicted, provider_sent_no_message
means no correlated content, and no_ended_turn means no observed end.
Do not resend a prompt because its reply is unavailable.
Read defaults to plain message text even when piped. -o json or --fields keeps
structured results, including source: hook|transcript and truncated. Hook JSON
includes nodeId, sessionId, turnId, optional promptId and outcome; transcript JSON
keeps provider, startedAt, cwd and resumeSessionId. A truncated hook prefix prints
one stderr notice: look for the rest with session final --session <sessionId>
(transcript) or agent read --node <selector> --screen; no automatic replacement.
Transcript fallback and session final reject null/empty/whitespace-only messages
with session.transcript_not_ready, exit 1. If working, wait --until idle and read
again. If already idle after a completed turn, check provider transcript saving
and inspect --screen; waiting cannot create a transcript. Missing conversation:
check selector/session, do not prompt just to create output. Transcript reads may
cache a discovered transcript identity.
Exit codes and useful output
- 0: success (check outcome, turnOutcome or endedTurnOutcome; a turn boundary alone does not mean successful work).
- 1: operation refused/failed or prompt delivery unconfirmed.
- 2: invalid arguments; use command
--help. - 3: connection unavailable; check endpoint and authorized Worker.
- 4: authorization refused; do not seek another agent's credentials.
- 5: protocol incompatible or invalid stream; use matching CLI/Worker versions.
- 6: ambiguous target; select a full ID.
- 124: deadline/timeout; wait includes lastKnown; prompt may already have sent input.
- 130: interrupted; wait closes streams; prompt outcome may be unknown.
--fields a,b projects declared fields; --pretty indents structured JSON.
-o table works only where command help says supported.
Do not stop Workers or delete nodes owned by someone else. Summarize actual work,
remaining questions, failures and verification in the shared task/note.
Steering an existing turn
agent prompt defaults to steering an authoritative working Claude Code or Codex
agent; the message belongs to the current OpenCove turn. Use --if-busy refuse for
busy refusal. The CLI checks system.operation.describe first; an older Worker
without whenBusy receives no new fields, and busy refusal stays visible. No retry
is made after an error. Waiting/dialogs and unknown/degraded states refuse.
The CLI prints its generated deliveryId before sending; retain it even if the
response is lost. Codex steering returns dispatched, exit 0, while awaiting
consumption. Check opencove agent delivery <id> --wait --timeout 2m before treating
it as submitted. Confirmation is in order only while no other PTY input intervenes;
other input makes it ambiguous, and interruption/end can leave it unknown.
Claude same-ID receipts confirm submission independently of run-state acceptance.
textComparison never decides submission. The submitted text differed from what you
sent; an existing draft may have been included. Do not resend; inspect the screen.
The orchestration loop is prompt β delivery status β wait --turn = the containing
turn ended (check outcome) β read --turn (Claude correlated; Codex reply reads
stay uncorrelated). Turn end does not prove a steer was handled. agent delivery
exits 0 for submitted, 1 for not_sent/ambiguous/unknown/unavailable or an unconfirmed
snapshot, 124 for a wait timeout. Self-wait returns immediately so consumption can
proceed. Unresolved records are pinned; capacity refuses before bytes. A closed evidenceWindow is not a result. Worker restart/expiry makes lookup unavailable, never
proof of not_sent. A pasted draft may remain after not_sent (no CR).
Late qualifying hooks can upgrade retained uncertainty within the existing 60 s
trust window. Claude transcript-based reconciliation is out of scope, a known
limit. Never resend; check delivery status or the screen.
Use agent prompt --expect-turn <turnId> to steer only that exact active turn; idle or a changed turn refuses before paste and is checked again before Enter.
The CLI negotiates expectTurnId; unsupported Workers refuse without writing.
Without the option, an ended turn may become a new turn; --if-busy refuse still refuses working agents.
evidenceWindow: open | closed describes collecting delivery evidence, not the agent's work; closed does not mean the containing turn finished.
A completed turn means the agent stopped, not that your request was fulfilled β check the reply covers what you asked before marking work done.
Scripts should read replies with -o json.
Related skills
Claude API Helper
anthropics
Build, debug, and optimize Claude API applications with caching and model migration support.
Documentation Co-Authoring
anthropics
Guide structured workflows for writing docs, proposals, and technical specs collaboratively.
PPTX Text Extractor
axoviq-ai
Extract text and speaker notes from PowerPoint presentations.
Memory Search
davila7
Search conversation history and recall previous discussions, decisions, and context.