external-electron-apps
Skill883 starsChanged 3 months agoMITView on GitHub
Automate user-installed Electron desktop apps (Slack, Discord, VS Code, Notion, Figma, Spotify, etc.) via CDP using this repo's Libretto CLI. Use when the task is to control a local desktop app on the user's machine, not this repo's own Electron app. Triggers: "desktop Slack app", "connect to Electron app", "remote-debugging-port", "CDP desktop app", "automate VS Code desktop app".
We split this skill into the rules it gives an agent
12 rules. About 0 are common, 4 are distinctive, and 8 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈4
Distinctive · estimate
This author's own choices. Worth a look.
8
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 9
Use this skill for external Electron desktop apps running on the user's machine.
- Distinctive: line 10
Do not default to this for this repository's own Electron app unless the user explicitly asks.
- Very specific: line 17
Verify targets with npx libretto pages --session <session>.
- Very specific: line 18
Run interactions with npx libretto exec "<code>" --session <session>.
- Very specific: line 20
When a reusable workflow file is ready, execute it with npx libretto run ./workflow.ts --cdp http://127.0.0.1:<port> (optional --page …
- Distinctive: line 49
Use one session per app:
- Distinctive: line 66
When selectors are unstable, inspect first:
- Very specific: line 94
If connection fails, make sure the app was launched with --remote-debugging-port and relaunch it.
- Very specific: line 95
Prefer 127.0.0.1 over localhost in CDP URLs.
- Very specific: line 96
If no pages are listed right after launch, wait 2-5 seconds and retry pages.
- Very specific: line 97
If a session is stale, run connect again with the same --session.
- Very specific: line 99
Use npx libretto close --session <session> to clear the session.
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill 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
External Electron App Automation
Use this skill for external Electron desktop apps running on the user's machine. Do not default to this for this repository's own Electron app unless the user explicitly asks.
Core workflow
- Quit the app if it is already running.
- Relaunch the app with
--remote-debugging-port=<port>. - Connect with
npx libretto connect http://127.0.0.1:<port> --session <session>. - Verify targets with
npx libretto pages --session <session>. - Run interactions with
npx libretto exec "<code>" --session <session>. - Capture evidence with
npx libretto snapshot --session <session>. - When a reusable workflow file is ready, execute it with
npx libretto run ./workflow.ts --cdp http://127.0.0.1:<port>(optional--page page-N).
Launch examples
macOS
open -a "Slack" --args --remote-debugging-port=9222
open -a "Visual Studio Code" --args --remote-debugging-port=9223
open -a "Discord" --args --remote-debugging-port=9224Linux
slack --remote-debugging-port=9222
code --remote-debugging-port=9223
discord --remote-debugging-port=9224Windows
"C:\Users\%USERNAME%\AppData\Local\slack\slack.exe" --remote-debugging-port=9222
"C:\Users\%USERNAME%\AppData\Local\Programs\Microsoft VS Code\Code.exe" --remote-debugging-port=9223Session pattern
Use one session per app:
npx libretto connect http://127.0.0.1:9222 --session slack-desktop
npx libretto pages --session slack-desktop
npx libretto exec "return await page.title()" --session slack-desktop
npx libretto snapshot --session slack-desktopInteraction examples
npx libretto exec "await page.locator('button:has-text(\"Search\")').click()" --session slack-desktop
npx libretto exec "await page.keyboard.type('incident-123')" --session slack-desktop
npx libretto exec "await page.keyboard.press('Enter')" --session slack-desktopWhen selectors are unstable, inspect first:
npx libretto snapshot --session slack-desktop
npx libretto exec "return await page.content()" --session slack-desktopMultiple pages
Electron apps often have multiple windows/pages. Use pages to list them and --page to target a specific one:
npx libretto pages --session slack-desktop
npx libretto exec --session slack-desktop --page <page-id> "return await page.url()"
npx libretto snapshot --session slack-desktop --page <page-id>Scripted workflows
After interactive discovery, run a default-exported workflow() against the same CDP endpoint. Libretto attaches to the selected page without navigating to workflow startUrl, so leave the app on the target screen first (or navigate in the handler). Closing the Libretto session does not quit the Electron app.
npx libretto run ./slack-workflow.ts --cdp http://127.0.0.1:9222
npx libretto run ./slack-workflow.ts --cdp http://127.0.0.1:9222 --page page-1Troubleshooting
- If connection fails, make sure the app was launched with
--remote-debugging-portand relaunch it. - Prefer
127.0.0.1overlocalhostin CDP URLs. - If no pages are listed right after launch, wait 2-5 seconds and retry
pages. - If a session is stale, run
connectagain with the same--session.
Use npx libretto close --session <session> to clear the session. This does not terminate the external app — it only removes the session state so Libretto stops tracking it.
Other versions1 project uses a version of this.
Word for word · 1
- cashew-labs/libretto★ 898100% same
Edited · 0
None found.
Wrote their own version · 0
None found.
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository30 other files it gives its agents.
- AGENTS.mdAGENTS.md
- .deepsec/AGENTS.mdAGENTS.md
- docs/AGENTS.mdAGENTS.md
- .opencode/AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- docs/CLAUDE.mdCLAUDE.md
- address-reviewSkill
- cli-developmentSkill
- erroreSkill
- fix-merge-conflictsSkill
- generate-specSkill
- generate-spec-v2Skill
- get-pr-reviewsSkill
- glimpse-changesSkill
- implement-specSkill
- improve-codebase-architectureSkill
- libretto-readonlySkill
- librettoSkill
- promptingSkill
- push-everythingSkill
- pushSkill
- reviewSkill
- spec-reviewSkill
- summarizeSkill
- technical-writingSkill
- turborepoSkill
- update-docsSkill
- writing-testsSkill
- libretto-readonlySkill
- librettoSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
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.

