Configuring Horizon
coollabsio/coolify
A skill your agent uses whenever the user mentions Horizon by name in a Laravel context.
A skill your agent uses when you need to hand work to another ADE agent, wait for or check whether delegated work has finished, read another agent's chat transcript, report status or raise a…
$ npx skills add arul28/ADE --skill ade-cli-control-plane -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install arul28/ADE ade-cli-control-plane --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/arul28/ADE.git skills-src && mkdir -p .claude/skills && cp -r skills-src/apps/desktop/resources/agent-skills/ade-cli-control-plane .claude/skills/ade-cli-control-plane && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "ade-cli-control-plane" agent skill from https://github.com/arul28/ADE/tree/main/apps/desktop/resources/agent-skills/ade-cli-control-plane into .claude/skills/ade-cli-control-plane/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ade-cli-control-plane", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/arul28/ADE/tree/main/apps/desktop/resources/agent-skills/ade-cli-control-planeType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add arul28/ADE --skill ade-cli-control-plane -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install arul28/ADE ade-cli-control-plane --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/arul28/ADE.git skills-src && mkdir -p .agents/skills && cp -r skills-src/apps/desktop/resources/agent-skills/ade-cli-control-plane .agents/skills/ade-cli-control-plane && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "ade-cli-control-plane" agent skill from https://github.com/arul28/ADE/tree/main/apps/desktop/resources/agent-skills/ade-cli-control-plane into .agents/skills/ade-cli-control-plane/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ade-cli-control-plane", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add arul28/ADE --skill ade-cli-control-plane -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install arul28/ADE ade-cli-control-plane --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/arul28/ADE.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/apps/desktop/resources/agent-skills/ade-cli-control-plane .cursor/skills/ade-cli-control-plane && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "ade-cli-control-plane" agent skill from https://github.com/arul28/ADE/tree/main/apps/desktop/resources/agent-skills/ade-cli-control-plane into .cursor/skills/ade-cli-control-plane/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ade-cli-control-plane", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/arul28/ADE.git --path apps/desktop/resources/agent-skills/ade-cli-control-plane--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add arul28/ADE --skill ade-cli-control-plane -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install arul28/ADE ade-cli-control-plane --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/arul28/ADE.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/apps/desktop/resources/agent-skills/ade-cli-control-plane .gemini/skills/ade-cli-control-plane && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "ade-cli-control-plane" agent skill from https://github.com/arul28/ADE/tree/main/apps/desktop/resources/agent-skills/ade-cli-control-plane into .gemini/skills/ade-cli-control-plane/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ade-cli-control-plane", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install arul28/ADE ade-cli-control-planeInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add arul28/ADE --skill ade-cli-control-plane -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/arul28/ADE.git skills-src && mkdir -p .github/skills && cp -r skills-src/apps/desktop/resources/agent-skills/ade-cli-control-plane .github/skills/ade-cli-control-plane && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "ade-cli-control-plane" agent skill from https://github.com/arul28/ADE/tree/main/apps/desktop/resources/agent-skills/ade-cli-control-plane into .github/skills/ade-cli-control-plane/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ade-cli-control-plane", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add arul28/ADE --skill ade-cli-control-plane -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install arul28/ADE ade-cli-control-plane --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/arul28/ADE.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/apps/desktop/resources/agent-skills/ade-cli-control-plane .opencode/skills/ade-cli-control-plane && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "ade-cli-control-plane" agent skill from https://github.com/arul28/ADE/tree/main/apps/desktop/resources/agent-skills/ade-cli-control-plane into .opencode/skills/ade-cli-control-plane/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ade-cli-control-plane", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
ade-cli-control-planeA skill your agent uses when you need to hand work to another ADE agent, wait for or check whether delegated work has finished, read another agent's chat transcript, report status or raise a…
Ade CLI Control Plane is an agent skill from arul28/ADE. Use this skill when you need to hand work to another ADE agent, wait for or check whether delegated work has finished, read another agent's chat transcript, report status or raise a question on the Work row, schedule a wake-up for later, or spawn a child lane — and generally whenever you need ADE's own state (lanes, chats, actions, proof, secrets, runtime/socket status) through the ade CLI.
Its SKILL.md is about 7.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Backend & APIs. The licence is AGPL-3.0.
4 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 7390d95. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
codexghgitnodenpmFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use gh, git and npm, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
STRIPE_API_KEYGITHUB_WEBHOOK_SECRETFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Ade CLI Control Plane loads about 7.9k tokens when it runs. Until then it costs about 104 tokens; SKILL.md has 4,144 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from arul28/ADE at commit 7390d95, republished under its AGPL-3.0 licence (© arul28). 4,144 words, ~7,862 tokens.
.claude/skills/ade-cli-control-plane/SKILL.md (or your agent's skills folder).Use normal shell commands for local repo edits, tests, and Git inspection. Use ade when you need ADE state or ADE-owned services: lanes, chats, PR metadata, proof/artifacts, managed terminals, App Control, iOS Simulator, browser, settings, project secrets, usage, updates, or service actions.
Do not route ordinary repo commands through ADE chat-attached terminals. Those
terminals exist so ADE Work chats can expose long-running process logs or let a
user inspect/control a chat-owned shell. In a tracked CLI session, run normal
shell commands through the CLI's own shell/tooling; use ade terminal ... only
to inspect or control an existing ADE-owned terminal session.
ade doctor --text when the ADE environment is unclear.ade help <command> or ade help <command> <subcommand> before guessing flags.--text for human-readable output and JSON output when scripting.ade actions list --text or ade actions list --domain <domain> --text as the escape hatch for service methods without a typed command.ADE project secrets are encrypted, project-scoped, and shared by ADE Desktop, the CLI, runtime-backed actions, lanes, and agents on the same machine. They live under the active project root, not inside an individual lane worktree.
Use them only when the user names a secret or clearly asks you to use a stored
credential. List output is metadata-only; get prints the value, so avoid
echoing it into logs or chat unless the user explicitly asks.
ade secrets list --text
ade secrets pull --text # take this repository's account secrets out of the vault
ade secrets get STRIPE_API_KEY --text
ade secrets set STRIPE_API_KEY --value sk_...
printf %s "$TOKEN" | ade secrets set TOKEN --stdin
ade secrets set TOKEN --value-file token.txt
ade secrets delete STRIPE_API_KEY
ade actions list --domain project_secret --textNever ask the user to paste a secret into chat. When you need a key, token, or webhook secret the project does not have yet, ask for it with the private secret card:
ade secrets request GITHUB_WEBHOOK_SECRET --reason "Signs GitHub deliveries to your triage webhook" --generateThe chat shows the user a password field (with a "Generate a strong one"
button; --generate marks it as suggested). The command blocks until they
answer and prints only the outcome — {name, saved: true}, {name, saved: false, kept: true} or {name, saved: false, declined: true} — never the
value. Then use the secret by name without printing it, e.g.
gh secret set X --body "$(ade secrets get NAME --text)". If the user
declines, carry on without it or explain what is blocked.
To run an agent whenever another service does something (GitHub, Stripe,
Linear, Sentry, a deploy hook), read the ade-webhooks skill. The short
version: ade automations webhook create --preset github --filter body.action=opened --in-this-chat --text makes the URL and the rule;
ade secrets request <NAME> --reason "…" collects the signing secret without
it ever entering chat; ade automations webhook deliveries <wh-id> --text
shows what arrived and why it ran or was skipped.
Use --socket when the CLI and ADE desktop drawer must share live state. This matters for App Control, Apple devices / Preview Lab, browser tabs, terminal logs, context selection, and proof drawer updates. The ade-app-control, ade-apple, and ade-browser skills all assume it. ade-ios-simulator still resolves and points at ade-apple.
ADE injects ADE_LANE_ID and ADE_CHAT_SESSION_ID into every agent it launches, and the drawer services (App Control, Apple device, browser) carry them so the Work tools pane attributes what you drive to your lane rather than to the visible chat. When you attach to something already running instead of starting it yourself, run that surface's claim subcommand first — ade --socket app-control claim, ade --socket apple claim, ade --socket browser claim — or Work will keep showing the previous owner.
ade ui show apple | floating-apple | browser | proof asks the desktop window that has your chat in front to open that surface (ade apple show is the Apple alias). It prints shown, held (a window has the project but the user cannot see your chat yet — another chat is in front or the window is hidden; it opens when the user goes there) or no_desktop (exit 1, nothing was shown — tell the user rather than claiming it opened). A shell with no ADE_CHAT_SESSION_ID (an OpenCode agent shell, for one) cannot use it; ask the user to open the surface.
Most domains (lane, git, chat, app_control, ios_simulator, etc.) run inside the runtime daemon at ~/.ade/sock/ade.sock and work whether or not the desktop is open.
A small set of domains require the desktop bridge because the underlying service needs real Electron APIs. Today that is just built_in_browser; the ade-browser skill documents that hop, its socket path, and the exact failure text when no desktop is running. A bridge-backed domain with no desktop also surfaces as Domain unavailable — report the blocker and continue with the rest of the control plane, which is unaffected.
The ade-linear skill is the home for working an attached Linear issue: the env vars ADE injects, the read/write commands, and attach/detach. You never need a Linear token — ade linear ... routes over the daemon to the desktop runtime, which holds the credentials. Two attachment commands live outside that skill's ade linear surface:
ade chat attach-linear-issue <session> --issue-id ENG-431
ade lanes link-linear-issue <lane> --linear-issue-json '{...}'ade sync web [--open] — print + copy the web-client pairing link and code (pair a browser to this machine).Start work from an issue:
ade new chat --mode chat --lane <lane> --provider codex --model <m> --type subagent --prompt "Work this issue"
ade lanes create-from-linear --issue-id ENG-431 --start-chat --provider codex --model <m> --type subagent
ade chat create --from-linear-issue ENG-431 --type subagent # compatibility path: chat with the issue attached + kickoffUse ade new chat as the canonical launch command. It mirrors the desktop New
Chat mode toggle:
ade new chat --mode chat --lane <lane> --provider codex --model openai/gpt-5.6-sol --type subagent --reasoning-effort xhigh --permissions full-auto --no-fast --prompt "Fix the issue"
ade new chat --mode cli --lane <lane> --provider codex --model openai/gpt-5.6-sol --type subagent --reasoning-effort xhigh --permissions full-auto --no-fast --prompt "Fix the issue"
ade new chat --mode chat --lane auto --lane-name fix-issue --type subagent --prompt "Fix the issue"--mode chat creates a persistent ADE Work chat. --mode cli starts a tracked
provider CLI terminal. Both accept lane, provider, model, reasoning effort,
permission mode, fast/no-fast, and prompt flags. Use --lane auto or
--auto-create-lane when the desktop UI would use the auto-create lane row.
ade new chat --mode chat --provider <p> --type <subagent|peer> --prompt "..."
spawns a tracked ADE agent and automatically links it to the current chat
through ADE_CHAT_SESSION_ID. The type is required for every parented agent
spawn; omitting it is a hard error whose message includes the decision rule.
There is no silent none type.
The type controls what happens to the parent when the child finishes: a
subagent turn wakes or steers the parent, a peer turn only leaves a quiet
completion note. --no-parent creates an unparented top-level session.
For persistent Work chats, a subagent turn reports back with its child turn id
and latest assistant summary whenever the parent still owns the child's
mission — including turns the child's own scheduled wakeups start, so a long
self-paced mission still reports when it actually finishes. ADE steers an active
parent or wakes an idle parent. Once a human messages the child directly,
ownership moves to the human and completions become quiet notes until the parent
dispatches again. The persisted parent link and
turn metadata survive brain restarts; a missing parent is noted once in the
child and stops the report channel. A delivery failure against a parent that
still exists retries and then becomes one visible warning in the child. Every
child receives ADE_PARENT_CHAT_SESSION_ID and direct-report guidance while
that parent is reachable.
Tracked provider CLI sessions also require subagent or peer when parented
and receive the same lineage environment. The parent thread shows a CLI child
as a subagent card, but the card closes (and a subagent wakes the parent with
the CLI's last message) only when the CLI process exits. An interactive CLI
that finishes its task and stays open reports nothing until it is closed.
Poll CLI children with ade chat status <id> (running / blocked / idle), find
them with ade chat list (archived ones need --include-archived), and read their last message plus terminal tail with
ade chat read <id> (ade terminal read <id> for the full output). Default
to --mode chat for a subagent that must report back: a chat child reports
after every turn it finishes.
When the new work must carry the current lane's unmerged commits, follow the
child-lane rule in the ade-lanes-git skill and use
ade lanes child --lane <current> --name <n> instead of a fresh lane.
Transcript reads are silent and available for any project-backed chat in any
registered project on this machine. Personal/no-project chats remain on the
separate --personal surface and are not included. Reads are bounded by
default; inspect a recent window, then page older content deliberately:
ade chat read <session> --limit 20 --max-chars 8000 --text
ade chat read <session> --page --cursor <nextCursor> --limit 20 --max-chars 8000 --textThe first read returns truncated when more content exists. A paged read
returns nextCursor; repeat only while you actually need older context. Do not
dump an entire long transcript into the model context. --max-chars is a hard
response ceiling; a single oversized entry is visibly clipped and the response
sets truncated. This machine-wide route is read-only; it does not broaden
cross-project message or mutation routing.
Within the active project, use ade chat show <session> --text before messaging
a chat you do not own:
ade chat message <session> --kind auto --text .... ADE inspects the target:
active turns are steered, idle chats are woken with a new turn, and the result
reports the route (sendMessage, steer, or interrupt-replace) plus whether
a steer was queued.status is active and it is not waiting for user input, use
ade chat steer <session> --text .... This routes through the provider's
active-turn path: Codex receives turn/steer, Claude stages a steer message,
and Cursor/Droid/OpenCode queue the message for the next safe boundary.ade chat send <session> --text ... to start
the next turn. The CLI also checks the session summary and will steer instead
of sending when the target is already active, but prefer the explicit verb
when your intent is to steer.ade chat wait <session> --for idle --timeout-ms <ms> (also supports
active, awaiting-input, and terminal).ade chat wait <id> <id> --async [--any] [--for idle] — ADE wakes
you once all (or any) of them get there, even across a restart. List with
ade chat waits, cancel with ade chat wait --cancel <waitId>.ade chat send <B> --after <A> "<prompt>" sends B the prompt once A is idle.ade chat wait --background [--job <id>], then end your turn (Claude and OpenCode already wake you on
their own; this matters for Codex).ade chat message <session> --kind interrupt-replace --text ... or, when
you need manual control, ade chat interrupt <session> first, then
ade chat send ... with the new instruction. Do not send a second normal turn
into an active chat and hope the provider interprets it as steering.Prefer harness-tracked delegation and wait on the tracked handle — do not background a raw CLI and then guess at its state:
Use the provider's native subagent tool first when the current chat exposes one
and the result belongs in the same provider SDK thread. This is especially
important for Claude: a Claude chat should use its native Agent/Task tool
(and its native model override for another Anthropic-family model) instead of
creating a second ADE chat in the same lane with --type subagent merely to
run Opus, Sonnet, or another Claude model.
Use an ADE child chat when the work needs an independent durable transcript,
its own wake/schedule, cross-provider execution, separate permissions, or a
user-visible tracked lifecycle. Do not treat --type subagent as the generic
replacement for a provider-native child; it adds a separate ADE session and
should be intentional.
--type subagent; every completed
turn wakes or steers the parent while the parent owns the mission. Read the
bounded transcript after that signal when you need more detail. You never poll
a transcript in a loop.ade chat wait <session> --for idle|terminal --timeout-ms <ms> or require an explicit direct report through
$ADE_PARENT_CHAT_SESSION_ID.codex exec): run it detached with its own
log and stdin closed, capturing the PID immediately, e.g.
codex exec "…" </dev/null >"$LOG" 2>&1 & CODEX_PID=$! (closing stdin is
required — without it codex blocks forever on "Reading additional input from
stdin…"). The authoritative completion signal is the waited PID: run
wait "$CODEX_PID" and read its exit status as the outcome. Log end-of-run
markers, a new session file under ~/.codex/sessions/<date>/, and pgrep are
supporting evidence only — not a deterministic done signal. Do keep the
session-file existence check as a liveness diagnostic for wedge detection: no
session file after ~2 min means the process wedged (kill and relaunch). Never
check completion with a bare pgrep <name> — it matches your own shell and
sibling processes (the self-match trap); if you must use pgrep at all, match
the full command line and exclude yourself (pgrep -f "codex exec" | grep -v $$),
never the bare program name.You cannot settle or unsettle a session. ade chat settle, ade chat unsettle,
ade session settle, and ade session unsettle were removed: whether work is
actually finished is a subjective judgment, and a chat that settles itself
disappears from the user's active list on your say-so. A row leaves the active
list only when the user settles it in ADE, or when its PR merges and the
deterministic autoSettleLaneSessionsOnPrMerge policy files the lane's
sessions. Running a removed command fails with that explanation.
What to do instead when you finish: say so in your final message, and use
ade chat note "<one-line status>" to leave a durable status line on the Work
row. If you are blocked, ade chat ask "<question>" raises the row's hand.
Update the note along the way as the state changes; do not wait until the end.
Lane and chat names are yours to keep accurate. When the work changes direction or moves to a new branch, rename the lane or the chat without asking. A lane keeps its name when its branch changes, so a name that still describes the old work is yours to fix:
ade chat generate-names # title, lane name, and status line
ade chat generate-names --title --status # subset of fields
ade chat update --title "Better chat title" # defaults to $ADE_CHAT_SESSION_ID
ade lanes rename <lane> --name "Better name"note and ask do to the Work rowThey are two separate signals on the row the user is looking at:
ade chat note sets the row's status line. It shows a durable one-line
summary of the current state; it does not change the row's phase. Length
guidance and the hard display bound live in
apps/desktop/src/shared/sessionStatusNote.ts (a note past that bound is
truncated with an ellipsis, so put the decisive state first).
Good: CI green; awaiting Codex review
Bad: Working, Still looking, Blocked, or Done.ade chat ask raises the row's hand, moving it to Needs you. Because
a note alone never changes the phase, an idle row with only a note can read as
Done — when you are genuinely blocked on the user, call note for the
context and then ask for the exact question.ask again.ADE derives the parent state automatically, and for ADE chats it also detects
the activity detail (Exploring, Implementing, Testing, Reviewing, Shipping,
Monitoring) from your tool calls, so you do not need to report it. Some
provider adapters also surface structured activity, such as Plan mode or a
background monitor. ADE offers agent-reported activity only when the current
provider can invoke the session's ADE CLI; use it to correct or refine the
detected state (Debugging, which looks like testing to the detector). When available, session-specific guidance gives the exact
command and allowed values. For tracked terminals, ade chat activity targets
ADE_ACTIVITY_SESSION_ID, while other ADE commands continue to use the owning
chat in ADE_CHAT_SESSION_ID. Use that guidance to report or clear a detail;
when it is absent, do not try to set one.
An activity report refines a Working card and never moves it to Needs you, Waiting, or Done. ADE clears it when a new user turn is accepted. Update it when the work changes; do not keep a stale label. Each card shows at most one status: Needs you has priority, otherwise one current activity detail occupies the label in place of generic Working.
The Work tab has a board view with four columns. Your row sits in exactly one of them. The host derives the column; you never write it directly.
| Column | How the host derives it |
|---|---|
| Needs you | Your row has a raised hand or an unanswered approval card. |
| Working | A turn is running and nothing waits on the user. |
| Waiting | The row is snoozed, or its lane PR has CI pending or a review requested. |
| Done | The session ended or the user settled it. |
Two rules follow from that:
ade chat note when
the state changes, and call ade chat ask the moment you are actually blocked
on the user. A stale note makes a correct column read as the wrong work.The user can drag your card. A drag writes the status and then delivers one message to you. It arrives as a normal message with a board-move marker and a fixed sentence. React to it, do not ignore it:
If your provider cannot take a message mid-turn, the board move still applies and the message arrives at the next turn boundary. Handle it then.
Snooze is the lifecycle verb you do own. The typed family takes the session id
as a positional, also accepts --session, and falls back to
ADE_CHAT_SESSION_ID when you omit it.
ade session show <id> --text # lifecycle state incl. wake reason
ade session snooze <id> --for 1h # also 30m, 4h, 1d (cap 30d)
ade session snooze <id> --until <iso> # mutually exclusive with --for
ade session snooze <id> --until-asked # no deadline; only a hand-raise returns it
ade session wake <id> [--reason <reason>]
ade session clear-woke <id>Semantics that hold on every surface:
snoozedUntil to now — nothing schedules a wakeup.
This is why snooze is safe for you and settling is not: snooze quiets a row
you are waiting on without claiming the work is done.needs approval,
errored, turn finished, snooze ended).ended, never settled.Generic action-domain equivalents you can call: session.snoozeSession,
session.snoozeSessions, session.wakeSession, session.wakeSessions,
session.clearWokeMarker. The settle writers (session.settleSession,
session.unsettleSession, session.settleSessions,
session.unsettleSessions, session.setSettleOverride) are CTO-only and will
refuse your calls.
When a provider rejects a turn for a usage limit, ADE parks the chat and re-sends
a continue prompt on its own once the published reset passes. Nothing is lost —
subagents restart with the resumed turn — so the default answer is to wait.
ade chat status <session> --text prints a resume line whenever a limit is
live, next to tool / queued / ask:
resume resumes 2026-09-07T23:31:30Z (in 3 min) · usage limit · attempts 1/2
resume resuming now · usage limit · attempts 1/2
resume paused after 2 tries · turn auto-resume back on to try at <reset>
resume won't auto-resume (opted out)
resume usage limit · no reset time--json carries the raw usageLimitResume object under summary. The line is
absent when no limit is live, and the exit codes are unchanged (0 running,
1 idle, 2 blocked).
ade chat resume-now <session> --text # alias: ade chat resumeresume-now cancels the armed row, clears the paused streak, and sends the same
continue prompt immediately as an ordinary turn: Resume sent · turn <turnId>.
It exits 1 with a one-line reason when the host reports no live usage limit.
Use it only when you know the limit has actually lifted early — calling it while
the limit is still live burns the attempt and re-parks the chat. Action:
chat.resumeUsageLimitNow. To stop auto-resuming altogether, or to turn it back
on after a pause, use chat.updateSession with autoContinueAtUsageLimit.
A lane's worktree HEAD can drift from the branch ADE recorded (someone runs
git checkout inside it). While drifted, PR matching is paused, because a PR
created from that lane would target the wrong branch.
ade lane drift [--lane <id>] --text
ade lane drift resolve --switch-back # restore the recorded branch
ade lane drift resolve --keep-head # adopt the live branch instead--switch-back refuses on a dirty worktree rather than risking work. --keep-head
re-points the lane's branch and renames the lane only when its name was literally
advertising the old branch. Actions: lane.getBranchDrift, lane.resolveBranchDrift.
Persistent ADE chats and tracked provider CLI sessions can schedule their own
durable wakeups. Use the typed ade chat scheduled-work create|list|cancel
commands or the generic chat.createScheduledWork, chat.listScheduledWork,
and chat.cancelScheduledWork actions. Pause or resume that session with
ade chat schedules <session> --pause|--resume or
chat.setScheduledWorkPaused. Omit the pause/resume flag, or call
chat.getScheduledWorkState, to inspect pause state, the next wake, and active
jobs for either a chat or tracked provider CLI session.
Omitting the target in an ADE-bound agent defaults create/list to
ADE_CHAT_SESSION_ID; an agent cannot schedule another session, and an
ordinary untracked shell fails instead of creating orphaned work. Chat delivery
starts a new turn at the next safe turn boundary. Tracked provider CLI delivery
waits for the provider's visible composer boundary, or resumes the same ended
CLI session before sending the prompt. Both survive brain restarts, and
recurring schedules expire seven days after creation. Users can pause chat jobs
in Chat Info or all scheduled work in Settings; CLI-owned jobs remain
manageable through these commands and the Settings recovery list.
Prefer a relative one-shot whenever the intent is "wake me in N minutes":
--in 12m in the typed CLI or delaySeconds: 720 in the action. This avoids
timezone conversion entirely. Absolute one-shots use --at / runAt and must
include Z or an explicit UTC offset. Five-field cron is interpreted in the
ADE brain machine's local timezone, not UTC unless that machine itself uses UTC.
The create result prints the computed next run in both local and ISO form;
verify that time before ending the turn.
ade chat scheduled-work create --in 12m --prompt "Check CI and report" --text
ade actions run chat.createScheduledWork --input-json '{"delaySeconds":720,"prompt":"Check CI and report"}' --text
ade chat scheduled-work create --at "2026-07-23T01:05:00-04:00" --prompt "Check CI and report" --text
ade chat scheduled-work create --cron "9,29,49 * * * *" --prompt "Check CI and report" --text
ade chat scheduled-work list --all --text
ade chat schedules "$ADE_CHAT_SESSION_ID" --pause --textCompatibility commands still exist, but do not teach them as the first choice:
ade chat create --lane <lane> --provider codex --model <m> --type subagent --prompt "Fix" # persistent Work chat
ade shell start-cli codex --lane <lane> --model <m> --prompt "Fix" # tracked provider CLI terminalade agent spawn is the older CLI-session launcher and rejects
--reasoning-effort; avoid it for new flows. Common reasoning tiers include
minimal, low, medium, high, xhigh, max, and ultracode; confirm
model-specific support with ade actions run chat.modelCatalog --json.
Chats, lanes and devices on the user's other machines are reachable with
--machine <name> (a machine key or an unambiguous name). You act there as an
agent, under that machine's own policy.
ade machines list --projects --text # who is online, what projects each has
ade chat list --all-machines --text # every machine in one table
ade chat create --machine "Mac mini" --lane <lane there> --type subagent \
--provider claude --model anthropic/claude-opus-5 --prompt "…"
ade chat launch "…" --machine "Mac mini" # in a new lane there
ade chat read <id> --machine "Mac mini" --text
ade chat wait <id> --machine "Mac mini" --for idle --timeout-ms 900000--project <name|path|id>, add --clone to set a missing GitHub repo up,
or use --personal for projectless chats. Your own lane is never sent: get a
lane id with ade lanes list --machine ….--type subagent child there wakes you when it finishes, like a local one,
with "· on <machine>" and the ade chat read … --machine command.--machine "a,b" on chat create starts one child per machine.Archiving hides an item; ADE never deletes anything on its own. Archived chats
and shells are left out of ade chat list, ade terminal list, and ade search
by default. Pass --include-archived to see them in a list. A known id still
works: ade chat read <id>, ade chat show <id>, ade terminal read <id>.
ade archive list --text # everything archived, newest first
ade archive list --kind chat --older-than 14 --text
ade archive summary --text # counts per kind, what is 14+ days oldRestoring is for the CTO (ade archive restore <kind>:<id>). Deleting is the
user's alone: agents and automations are refused. When old archived items pile
up, tell the user and point them to Settings → Archive; do not try to delete
them yourself.
If command -v ade fails (PowerShell: Get-Command ade):
${ADE_CLI_PATH:-} if set (PowerShell: & $env:ADE_CLI_PATH ...).${ADE_CLI_BIN_DIR:-}/ade if set (PowerShell: & "$env:ADE_CLI_BIN_DIR\ade.cmd" ...).node apps/ade-cli/dist/cli.cjs ....The normal reason to skip ADE CLI is that it is truly unreachable after these fallbacks.
ade your shell was given. It names the brain that started you.
Another ade (for example ~/.ade/bin/ade.exe) can belong to another
channel and reach a different brain, or none.ade brain start|stop|restart|update, ade runtime run). It may belong to
another channel, and the user's running ADE depends on it.npm install (or pnpm, yarn, bun) in the user's repo to fix ADE
itself, for example after Cannot find module from ADE's cli.cjs.© arul28, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in apps/desktop/resources/agent-skills/ade-cli-control-plane of arul28/ADE.
Open the folder on GitHubat commit 7390d95
Ade CLI Control Plane next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Ade CLI Control Plane this skillarul28/ADE | 113 | — | ~7.9k | Automated safety check: Pass | AGPL-3.0 | |
| Configuring Horizoncoollabsio/coolify | 63k | 4 repos | ~898 | Automated safety check: Pass | MIT | |
| Nestjs Best Practicesrolling-scopes/rsschool-app | 10k | 6 repos | ~1.2k | Automated safety check: Pass | MIT | |
| Sub2API AdminWei-Shaw/sub2api | 43k | 1 repos | ~717 | Automated safety check: Pass | LGPL-3.0 | |
| Firecrawl Build Onboardingfirecrawl/firecrawl | 189k | 1 repos | ~1.4k | Automated safety check: Notes | ISC | |
| Obsidian BasesAtmosphere/atmosphere | 3.8k | 22 repos | ~3.2k | Automated safety check: Pass | Apache-2.0 |
coollabsio/coolify
A skill your agent uses whenever the user mentions Horizon by name in a Laravel context.
rolling-scopes/rsschool-app
NestJS best practices and architecture patterns for building production-ready applications.
Wei-Shaw/sub2api
Manages a Sub2API deployment from the command line: accounts, redeem and invitation codes, groups, proxies, imports, exports and raw admin API calls.
firecrawl/firecrawl
Gets Firecrawl working in a project: signs you in through the browser, saves FIRECRAWL_API_KEY to .env and picks the first SDK or REST path.
Atmosphere/atmosphere
Create and edit Obsidian Bases (.base files) with views, filters, formulas, and summaries.
coollabsio/coolify
ACTIVATE when the user works on authentication in Laravel. An agent skill from coollabsio/coolify.
arul28/ADE
A skill your agent uses when you need to run or drive a local Electron/desktop app and capture what it does — launch it or attach to a running renderer, read its logs or answer its terminal prompts…
arul28/ADE
Iteratively optimize an ADE tab's CPU/memory/IPC/render performance.
arul28/ADE
A skill your agent uses for any browser behavior at all — opening a URL, checking a localhost page, clicking or filling a form, logging in, screenshotting, inspecting the DOM, or verifying a page…
arul28/ADE
A skill your agent uses when an agent needs to mint, share, or open ADE deeplinks (lane, work session, file, commit, artifact, branch, PR, Linear issue) so users — or the agent itself — can jump…
arul28/ADE
A skill your agent uses when you need to run a chat, a CLI session, or a subagent on a specific setup — any model you pay for inside any harness (e.g.
arul28/ADE
A skill your agent uses when creating, inspecting, syncing, committing, pushing, archiving, or rebasing ADE lanes and lane worktrees through ade lanes and ade git.
Categories
A skill your agent uses when you need to hand work to another ADE agent, wait for or check whether delegated work has finished, read another agent's chat transcript, report status or raise a…. Ade CLI Control Plane is an agent skill from arul28/ADE. Use this skill when you need to hand work to another ADE agent, wait for or check whether delegated work has finished, read another agent's chat transcript, report status or raise a question on the Work row, schedule a wake-up for later, or spawn a child lane — and generally whenever you need ADE's own state (lanes, chats, actions, proof, secrets, runtime/socket status) through the ade CLI.
Ade CLI Control Plane fits situations like: you need to hand work to another ADE agent; check whether delegated work has finished; read another agents chat transcript; raise a question on the Work row.
Run `npx skills add arul28/ADE --skill ade-cli-control-plane -a claude-code`. Or copy the skill folder (apps/desktop/resources/agent-skills/ade-cli-control-plane in arul28/ADE) into .claude/skills/ade-cli-control-plane in your project. Claude Code loads it when a task matches its description.
Run `npx skills add arul28/ADE --skill ade-cli-control-plane -a codex`. Or copy the skill folder (apps/desktop/resources/agent-skills/ade-cli-control-plane in arul28/ADE) into .agents/skills/ade-cli-control-plane in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add arul28/ADE --skill ade-cli-control-plane -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ade-cli-control-plane, .gemini/skills/ade-cli-control-plane, .github/skills/ade-cli-control-plane and .opencode/skills/ade-cli-control-plane in your project.
Going by SKILL.md and its folder, Ade CLI Control Plane needs the command-line tools its instructions call (codex, gh, git, node and npm) and credentials named STRIPE_API_KEY and GITHUB_WEBHOOK_SECRET. Our summary lists: A credential in STRIPE_API_KEY; A credential in GITHUB_WEBHOOK_SECRET.
SKILL.md contains no URLs. Its commands use gh, git and npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Ade CLI Control Plane is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 7.9k tokens (SKILL.md is roughly 31k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Ade CLI Control Plane: Configuring Horizon (coollabsio/coolify, 63k stars), Nestjs Best Practices (rolling-scopes/rsschool-app, 10k stars), Sub2API Admin (Wei-Shaw/sub2api, 43k stars) and Firecrawl Build Onboarding (firecrawl/firecrawl, 189k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
arul28 (a GitHub user) maintains it in arul28/ADE, which has 113 GitHub stars. The repository holds 30 skills in this directory. The repository was last updated on October 7, 2026.
Source: arul28/ADE on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.