arul28/ade/ade-app-control
Claude Code and agent skill by arul28/ade
- community
Checking that the SKILL.md file is still in the repository.
Use this skill 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, click and type in it, record a video or file proof of it, show it to the user, or pull screenshot-backed DOM/source context into the chat — through `ade app-control`.
Install
npx vskill@latest install arul28/ade/ade-app-controlSKILL.md
ADE App Control
App Control drives a desktop app you are building. Today that means an Electron app. ADE launches it (or attaches to one that is running) through a Chrome DevTools Protocol (CDP) port. Then you observe it, act on it, record it and file proof from it. It works in the background: no cursor, no focus stealing, and it captures the app's own window, not the user's screen.
Not sure App Control is the right surface? The ade-computer-use skill picks between ade apple, ade screen, ade app-control and ade browser.
Rules before your first command
- One session per lane.
--lanedefaults toADE_LANE_IDand the chat to
ADE_CHAT_SESSION_ID, so an agent never passes them. Every command acts on your lane's session. Another lane's session is not yours to drive.
- `launch` refuses when your lane already has a live session. Check
status first. Use the running app, or stop it, or pass --force to replace it. --force only replaces a session in your own lane.
- A relaunch reuses your launch terminal. After
stop(or with
--force), your next launch usually runs in the same terminal session, so a rebuild-and-relaunch loop leaves one shell. (It gets a new one when someone typed into the old shell or the old app would not exit.) Pass --new-shell only when you truly need a separate terminal.
- Check each step before you report it. An act that returns
okonly
means ADE sent the input. Read the hit: and effect: lines and the new observation. Report only what you confirmed.
- **
ade: Unknown command 'app-control'means your shell found an older
ade.** Run the same command as "$ADE_CLI_PATH" app-control ... (PowerShell: & $env:ADE_CLI_PATH app-control ...) and keep using it for the rest of the task.
- App Control needs the running ADE brain. A session lives in the brain,
so --headless is refused. If a command says no brain answered, you are running the wrong ade: use $ADE_CLI_PATH. Never start, stop or install a brain or service, and never npm install in the user's repo to fix ADE. Report the error instead.
Common tasks
Use these directly; you do not need --help for them.
| Task | Command | |
|---|---|---|
| What is running in this lane | ade app-control status --text | |
| Launch the app | ade app-control launch --command "npm run dev" --text | |
| Attach to a running app | ade app-control connect --cdp-port 9222 --text | |
| What is on screen | ade app-control observe --map --text | |
| Click a control by its label | ade app-control click --text-match "Save" --text | |
| Right-click a control | ade app-control right-click --text-match "Row" --text | |
| Fill a field | ade app-control fill --selector "#name" --value "Ada" --text | |
| Wait for text to appear | ade app-control wait --text-match "Saved" --timeout-ms 8000 --text | |
| Record a video | ade app-control record start --caption "<what>" --text, then record stop --text | |
| File a still as proof | ade app-control proof --caption "<what>" --text | |
| Show the app to the user | ade app-control show --floating --text | |
| Read the app's terminal | ade app-control logs --text | |
| Stop | ade app-control stop --text |
The loop
1. Launch or attach
launch runs the command in a visible terminal that belongs to your chat. ADE sets ADE_APP_CONTROL_CDP_PORT and ADE_APP_CONTROL_DEBUG_FLAGS in its environment. It forwards the debug flags on its own for npm, pnpm, yarn and bun scripts and for a direct electron command. --cwd resolves a relative path from the directory you run ade in.
An installed Electron app (Slack, a packaged build of the app you work on) is launched the same way: name its binary and add $ADE_APP_CONTROL_DEBUG_FLAGS, which ADE fills in itself, so it works in zsh too. The app must not already be running; quit the user's copy only if they say so.
connect attaches to an app you did not launch. The app must already expose a CDP port (--remote-debugging-port). When you attach to something that is already running, ade app-control claim --lane <lane-id> --text attributes it to your lane.
2. Observe before you act
An observation gives you a screenshot and numbered elements with handles (obs-…:e:7). A handle is valid only for recent observations. ADE keeps the newest 3 per session, so observe again when a handle is refused as expired. Act by handle or by label, not by coordinates. A point is a guess that the layout did not move.
Observations also carry console output, failed network requests and the in-flight request count. That is usually the fastest way to see why a click did nothing.
3. Act, then read the answer
Targets are --handle, --selector, --text-match, --test-id, --element <n>, or --x/--y. A disabled target is refused, not clicked.
Every act answers with two lines and a fresh observation:
hit:— the element the command actually hit.effect:—observed(ADE saw the app change),unconfirmed(ADE looked
and saw no change), or not_checked (ADE did not look).
When the effect is unconfirmed, observe again before you act again or report the step. Do not repeat the action blindly. If the change takes time, use wait instead of acting again. --fast skips the settle delay; --no-observe skips the observation (then you must check the step yourself). --session <id> makes a command fail if the session has changed under you.
4. Record and file proof
Use a video when the claim is about behavior over time: a flow, an animation, a retry. Use a still (proof) when one screen proves the claim.
record startcaptures the app's own window. When it stops, it becomes a
demo: still time cut, waits sped up, zoom to each action, a pointer and click rings, under 10 MB. --plain keeps it as recorded; use it only when the user asks.
- Mark each step while recording with
ade proof step "<what happens next>".
Each step is a caption in the video and a chapter in ADE's player.
- A recording stops itself after 5 minutes of real time, or after 2 minutes
with no action. --max-seconds <n> sets a shorter limit. Record the flow that shows the claim, not the whole task.
- Always pass
--caption.record stopfiles a captioned video as proof under
your lane, your chat and the lane's PR. A video with no caption stays a scratch file (unless the cap or the app closing ended it).
record stopprintsduration(the demo),real timewith the time cut,
the file, and a proof line with the proof id. If it prints an error line, the recording failed: report that. Never attach an older file in its place. On macOS the first recording can need the Screen Recording grant; the answer says so.
- A recording also stops when the app closes (
stopped: the app closed). - Confirm the final state before
record stop, so the video ends on it. proofobserves the app and files that screenshot with your caption. Write
a caption that says what the capture shows, then check that the screenshot really shows it. screenshot captures without filing anything.
The ade-proof-artifacts skill covers ade proof attach, allowed roots and how to confirm a filing.
5. Show the user
When the user asks to see the app, or you want them to watch:
ade ui show app-control and ade ui show floating-app-control do the same. The answer says what really happened: shown, held (the user is not on your chat yet; it opens when they go there), or no_desktop (exit 1; nothing was shown, so tell the user). The user can also watch the session live from ADE on the web or the phone.
6. Stop
stop quits an app ADE launched, with its whole process tree. It only detaches from an app you attached with connect; that app keeps running. Save anything that matters first. ADE also releases the session when your chat ends and when the lane is archived or deleted.
Optional: keep the app off the user's screen
App Control never needs the user's screen. On a Mac host you may still move the app's window onto the lane's private Mac Desktop:
This is optional. Keep driving it with ade app-control.
Context for the chat
select returns screenshot-backed DOM, selector and source context, and attaches it to the chat that owns the session.
Windows, targets and drivers
Switching windows clears the action trace, and handles from the old window stop resolving. Observe again after a switch. computer_use is listed but not implemented; it reports unavailable.
Logs and terminal
Use ade terminal list --text and ade terminal read ... only when no App Control terminal is active.
Troubleshooting
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingapps/desktop/resources/agent-skills/ade-app-control/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/arul28/ade/ade-app-control)