[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-deepgram-drive-process":3,"mdc--92yz0q-key":32,"related-repo-deepgram-drive-process":1049,"related-org-deepgram-drive-process":1131},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":22,"repoUrl":23,"updatedAt":24,"license":25,"forks":26,"topics":27,"repo":28,"sourceUrl":30,"mdContent":31},"drive-process","interact with CLI programs via wsh","Use when you need to drive a CLI program through command-and-response interaction via wsh. Examples: \"run a build command and check the output\", \"interact with an installer that asks questions\", \"execute a sequence of shell commands and handle errors\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"deepgram","Deepgram","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fdeepgram.png",[12,16,19],{"name":13,"slug":14,"type":15},"Automation","automation","tag",{"name":17,"slug":18,"type":15},"CLI","cli",{"name":20,"slug":21,"type":15},"Engineering","engineering",5,"https:\u002F\u002Fgithub.com\u002Fdeepgram\u002Fwsh","2026-07-12T08:29:51.485222",null,2,[],{"repoUrl":23,"stars":22,"forks":26,"topics":29,"description":25},[],"https:\u002F\u002Fgithub.com\u002Fdeepgram\u002Fwsh\u002Ftree\u002FHEAD\u002Fskills\u002Fdrive-process","---\nname: drive-process\ndescription: >\n  Use when you need to drive a CLI program through command-and-response\n  interaction via wsh. Examples: \"run a build command and check the output\",\n  \"interact with an installer that asks questions\", \"execute a sequence of\n  shell commands and handle errors\".\n---\n\n> **IMPORTANT: EXECUTION CONTEXT**\n> This skill describes *what to do* — domain patterns and decision-making.\n> It does NOT describe *how* to call the API.\n>\n> 1. **If you have `wsh_*` tools** (check your toolkit for `wsh_send_input`,\n>    `wsh_get_screen`, etc.): use them directly. Operation names in this\n>    skill generally map to tool names (e.g., \"send input\" → `wsh_send_input`).\n>    When in doubt, list your available `wsh_*` tools.\n> 2. **If you do NOT have `wsh_*` tools**: you are in HTTP\u002Fcurl fallback mode.\n>    **DO NOT GUESS endpoints or CLI subcommands.**\n>    Load the full API reference first: search your workspace for\n>    `skills\u002Fcore\u002F` and read `SKILL.md`. It contains every endpoint\n>    with working curl examples and a bootstrap sequence.\n> 3. **Quick bootstrap**: `curl -sf --unix-socket ${XDG_RUNTIME_DIR:-\u002Ftmp}\u002Fwsh\u002Fdefault.http.sock http:\u002F\u002Flocalhost\u002Fhealth`\n>    — if that fails: `wsh server -L agent-$$ --ephemeral &` and retry.\n\n# wsh:drive-process — Driving CLI Programs\n\nYou're operating a terminal programmatically. You send input, wait\nfor output to settle, read the screen, and decide what to do next.\nThis skill teaches you the patterns and pitfalls.\n\n## The Loop\n\nEvery interaction follows the same shape:\n\n1. **Send input** — a command, a response to a prompt, a keystroke\n2. **Wait for idle** — output settles, suggesting the program\n   may be idle. Choose your timeout based on what you expect:\n   - Fast commands (ls, cat, echo): 500-1000ms\n   - Build\u002Finstall commands: 3000-5000ms\n   - Network operations: 2000-3000ms\n   Idle is a *hint*, not a guarantee. The program may still\n   be working — it just hasn't produced output recently.\n3. **Read the screen** — see what happened\n4. **Decide** — did the command succeed? Is there a prompt waiting\n   for input? Did something go wrong? Act accordingly.\n\nWhen re-polling idle (e.g., the command isn't done yet), pass\nback the `generation` from the previous response as `last_generation`\nto avoid busy-loop storms. Or use `fresh=true` for simplicity.\n\n## Sending a Command\n\nAlways include a newline to \"press Enter\":\n\n    send input: npm install\\n\n\nWithout the trailing `\\n`, you've typed the text but haven't\nsubmitted it. Sometimes that's what you want (e.g., building up\na command before sending), but usually you want the newline.\n\n## Reading the Result\n\nAfter waiting for idle, read the screen. Prefer `plain`\nformat when you just need text content. Use `styled` when\nformatting matters (e.g., distinguishing error output highlighted\nin red).\n\nIf the output is long, it may have scrolled off screen. Use\nscrollback to get the full history.\n\n## Handling Interactive Prompts\n\nMany programs ask questions and wait for a response. After reading\nthe screen, look for patterns like:\n\n- `[Y\u002Fn]` or `[y\u002FN]` — yes\u002Fno confirmation\n- `Password:` or `Enter passphrase:` — credential prompts\n- `>` or `?` — interactive selection (fzf, inquirer, etc.)\n- `(yes\u002Fno)` — full-word confirmation (e.g., SSH host verification)\n- `Press any key to continue`\n\nRespond naturally — send the appropriate input:\n\n    send input: y\\n\n    send input: yes\\n\n\nFor password prompts, note that the terminal will not echo your\ninput back. The screen will look unchanged after you type. Wait\nfor idle after sending — the program will advance.\n\n## Control Characters\n\nEmergency exits and special actions: Ctrl+C (interrupt), Ctrl+D\n(EOF\u002Fexit), Ctrl+Z (suspend), Ctrl+L (clear screen), Ctrl+U\n(clear line), Escape.\n\nIf a command hangs, try Ctrl+C first. If unresponsive, Ctrl+Z\nto suspend then `kill %1`.\n\n## Detecting Success and Failure\n\nAfter reading the screen, look for signals:\n\n**Success indicators:**\n- A fresh shell prompt (`$`, `#`, `>`) on the last line\n- Explicit success messages (\"done\", \"completed\", \"ok\")\n- Exit code 0 if visible\n\n**Failure indicators:**\n- Words like \"error\", \"failed\", \"fatal\", \"denied\", \"not found\"\n- Stack traces or tracebacks\n- A shell prompt after unexpectedly short output\n- Non-zero exit codes\n\nWhen in doubt, check the exit code explicitly:\n\n    send input: echo $?\\n\n\nA `0` means the previous command succeeded. Anything else is\na failure.\n\n## Long-Running Commands\n\nSome commands run for minutes or longer — builds, downloads,\ntest suites. Waiting for idle will return when output\npauses, but the command may not be done.\n\nStrategies:\n\n**Poll in a loop.** Wait for idle, read the screen, check\nif a shell prompt has returned. If not, wait again:\n\n    wait for idle (timeout: 5000ms)\n    read screen\n    # No prompt yet? Wait again.\n\n**Use scrollback for full output.** Long commands produce output\nthat scrolls off screen. After the command finishes, read\nscrollback to get everything:\n\n    read scrollback (offset: 0, limit: 500)\n\n**Don't set unreasonably long idle timeouts.** A\n`timeout_ms=30000` means you'll wait 30 seconds of silence\nbefore getting a response. Prefer shorter timeouts with\nrepeated polls — it lets you observe intermediate progress\nand react if something goes wrong.\n\n## Common Patterns\n\n### Chained Commands\nWhen you need to run several commands in sequence, you have two\noptions. Run them as separate send\u002Fwait\u002Fread cycles when you need\nto inspect output between steps:\n\n    # Step 1\n    send: cd \u002Fproject\n    wait, read — verify directory exists\n\n    # Step 2\n    send: npm install\n    wait, read — check for errors\n\n    # Step 3\n    send: npm test\n    wait, read — check results\n\nOr chain with `&&` when intermediate output doesn't matter:\n\n    send: cd \u002Fproject && npm install && npm test\n    wait, read — check final result\n\nPrefer separate cycles. They give you the chance to detect\nproblems early and adjust.\n\n### Piped Commands\nPipes work naturally. Send the full pipeline:\n\n    send: grep -r \"TODO\" src\u002F | wc -l\n\n### Background Processes\nIf you start a background process (`&`), it won't block the shell\nprompt. But its output may interleave with future commands.\nConsider redirecting output:\n\n    send: .\u002Flong-task.sh > \u002Ftmp\u002Ftask.log 2>&1 &\n\nThen check on it later:\n\n    send: cat \u002Ftmp\u002Ftask.log\n\n### Pagers\nCommands like `git log`, `man`, or `less` enter a pager that\nwaits for keyboard navigation. If you just need the content,\nbypass the pager:\n\n    send: git log --no-pager\n    send: PAGER=cat man ls\n\nIf you're already stuck in a pager, press `q` to exit:\n\n    send: q\n\n### Heredocs and Multi-Line Input\nTo write multi-line content, use heredocs:\n\n    send: cat > \u002Ftmp\u002Fconfig.yaml \u003C\u003C 'EOF'\\n\n    send: key: value\\n\n    send: other: thing\\n\n    send: EOF\\n\n\n## Pitfalls\n\n### Don't skip the wait\nIt's tempting to send input immediately after the previous\ncommand. Don't. If the shell hasn't finished processing, your\ninput may land in the wrong place — or be swallowed entirely.\nAlways wait for idle before sending the next input.\n\n### Don't assume the screen is everything\nThe screen shows only the last N lines (typically 24 rows). A\ncommand that produced 500 lines of output will have 476 lines\nin scrollback. If you need full output, read scrollback.\n\n### Watch for prompts you didn't expect\nInstallers, package managers, and system tools love to ask\nsurprise questions. If you read the screen and see no shell\nprompt but also no obvious output-in-progress, look for a\nprompt waiting for your response.\n\n### Destructive commands\nYou are operating a real terminal on a real machine. `rm`,\n`DROP TABLE`, `git push --force` — these do real damage.\nBefore running destructive commands:\n- Confirm with the human via overlay, panel, or input capture\n- Double-check paths and arguments\n- Prefer dry-run flags when available (--dry-run, --whatif, -n)\n\n### Knowing when to give up\nIf a command is stuck and not responding to Ctrl+C, don't\nhammer it with more input. Strategies in order:\n1. Send Ctrl+C\n2. Wait a moment, try Ctrl+C again\n3. Send Ctrl+Z to suspend, then `kill %1`\n4. Tell the human what's happening and ask for help\n\n### Shell state persists\nYou're in a real shell session. Environment variables you set,\ndirectories you `cd` into, background jobs you spawn — they\nall persist. Be mindful of the state you leave behind.\n",{"data":33,"body":34},{"name":4,"description":6},{"type":35,"children":36},"root",[37,189,196,201,208,213,282,311,317,322,334,347,353,374,379,385,390,468,473,482,487,493,498,511,517,522,530,570,578,601,606,615,628,634,639,644,654,663,673,682,700,706,713,718,727,740,749,754,760,765,774,780,793,802,807,816,822,850,859,872,881,887,892,901,907,913,918,924,929,935,940,946,973,991,997,1002,1030,1036],{"type":38,"tag":39,"props":40,"children":41},"element","blockquote",{},[42,70],{"type":38,"tag":43,"props":44,"children":45},"p",{},[46,53,55,61,63,68],{"type":38,"tag":47,"props":48,"children":49},"strong",{},[50],{"type":51,"value":52},"text","IMPORTANT: EXECUTION CONTEXT",{"type":51,"value":54},"\nThis skill describes ",{"type":38,"tag":56,"props":57,"children":58},"em",{},[59],{"type":51,"value":60},"what to do",{"type":51,"value":62}," — domain patterns and decision-making.\nIt does NOT describe ",{"type":38,"tag":56,"props":64,"children":65},{},[66],{"type":51,"value":67},"how",{"type":51,"value":69}," to call the API.",{"type":38,"tag":71,"props":72,"children":73},"ol",{},[74,124,163],{"type":38,"tag":75,"props":76,"children":77},"li",{},[78,92,94,100,102,108,110,115,117,122],{"type":38,"tag":47,"props":79,"children":80},{},[81,83,90],{"type":51,"value":82},"If you have ",{"type":38,"tag":84,"props":85,"children":87},"code",{"className":86},[],[88],{"type":51,"value":89},"wsh_*",{"type":51,"value":91}," tools",{"type":51,"value":93}," (check your toolkit for ",{"type":38,"tag":84,"props":95,"children":97},{"className":96},[],[98],{"type":51,"value":99},"wsh_send_input",{"type":51,"value":101},",\n",{"type":38,"tag":84,"props":103,"children":105},{"className":104},[],[106],{"type":51,"value":107},"wsh_get_screen",{"type":51,"value":109},", etc.): use them directly. Operation names in this\nskill generally map to tool names (e.g., \"send input\" → ",{"type":38,"tag":84,"props":111,"children":113},{"className":112},[],[114],{"type":51,"value":99},{"type":51,"value":116},").\nWhen in doubt, list your available ",{"type":38,"tag":84,"props":118,"children":120},{"className":119},[],[121],{"type":51,"value":89},{"type":51,"value":123}," tools.",{"type":38,"tag":75,"props":125,"children":126},{},[127,138,140,145,147,153,155,161],{"type":38,"tag":47,"props":128,"children":129},{},[130,132,137],{"type":51,"value":131},"If you do NOT have ",{"type":38,"tag":84,"props":133,"children":135},{"className":134},[],[136],{"type":51,"value":89},{"type":51,"value":91},{"type":51,"value":139},": you are in HTTP\u002Fcurl fallback mode.\n",{"type":38,"tag":47,"props":141,"children":142},{},[143],{"type":51,"value":144},"DO NOT GUESS endpoints or CLI subcommands.",{"type":51,"value":146},"\nLoad the full API reference first: search your workspace for\n",{"type":38,"tag":84,"props":148,"children":150},{"className":149},[],[151],{"type":51,"value":152},"skills\u002Fcore\u002F",{"type":51,"value":154}," and read ",{"type":38,"tag":84,"props":156,"children":158},{"className":157},[],[159],{"type":51,"value":160},"SKILL.md",{"type":51,"value":162},". It contains every endpoint\nwith working curl examples and a bootstrap sequence.",{"type":38,"tag":75,"props":164,"children":165},{},[166,171,173,179,181,187],{"type":38,"tag":47,"props":167,"children":168},{},[169],{"type":51,"value":170},"Quick bootstrap",{"type":51,"value":172},": ",{"type":38,"tag":84,"props":174,"children":176},{"className":175},[],[177],{"type":51,"value":178},"curl -sf --unix-socket ${XDG_RUNTIME_DIR:-\u002Ftmp}\u002Fwsh\u002Fdefault.http.sock http:\u002F\u002Flocalhost\u002Fhealth",{"type":51,"value":180},"\n— if that fails: ",{"type":38,"tag":84,"props":182,"children":184},{"className":183},[],[185],{"type":51,"value":186},"wsh server -L agent-$$ --ephemeral &",{"type":51,"value":188}," and retry.",{"type":38,"tag":190,"props":191,"children":193},"h1",{"id":192},"wshdrive-process-driving-cli-programs",[194],{"type":51,"value":195},"wsh:drive-process — Driving CLI Programs",{"type":38,"tag":43,"props":197,"children":198},{},[199],{"type":51,"value":200},"You're operating a terminal programmatically. You send input, wait\nfor output to settle, read the screen, and decide what to do next.\nThis skill teaches you the patterns and pitfalls.",{"type":38,"tag":202,"props":203,"children":205},"h2",{"id":204},"the-loop",[206],{"type":51,"value":207},"The Loop",{"type":38,"tag":43,"props":209,"children":210},{},[211],{"type":51,"value":212},"Every interaction follows the same shape:",{"type":38,"tag":71,"props":214,"children":215},{},[216,226,262,272],{"type":38,"tag":75,"props":217,"children":218},{},[219,224],{"type":38,"tag":47,"props":220,"children":221},{},[222],{"type":51,"value":223},"Send input",{"type":51,"value":225}," — a command, a response to a prompt, a keystroke",{"type":38,"tag":75,"props":227,"children":228},{},[229,234,236],{"type":38,"tag":47,"props":230,"children":231},{},[232],{"type":51,"value":233},"Wait for idle",{"type":51,"value":235}," — output settles, suggesting the program\nmay be idle. Choose your timeout based on what you expect:\n",{"type":38,"tag":237,"props":238,"children":239},"ul",{},[240,245,250],{"type":38,"tag":75,"props":241,"children":242},{},[243],{"type":51,"value":244},"Fast commands (ls, cat, echo): 500-1000ms",{"type":38,"tag":75,"props":246,"children":247},{},[248],{"type":51,"value":249},"Build\u002Finstall commands: 3000-5000ms",{"type":38,"tag":75,"props":251,"children":252},{},[253,255,260],{"type":51,"value":254},"Network operations: 2000-3000ms\nIdle is a ",{"type":38,"tag":56,"props":256,"children":257},{},[258],{"type":51,"value":259},"hint",{"type":51,"value":261},", not a guarantee. The program may still\nbe working — it just hasn't produced output recently.",{"type":38,"tag":75,"props":263,"children":264},{},[265,270],{"type":38,"tag":47,"props":266,"children":267},{},[268],{"type":51,"value":269},"Read the screen",{"type":51,"value":271}," — see what happened",{"type":38,"tag":75,"props":273,"children":274},{},[275,280],{"type":38,"tag":47,"props":276,"children":277},{},[278],{"type":51,"value":279},"Decide",{"type":51,"value":281}," — did the command succeed? Is there a prompt waiting\nfor input? Did something go wrong? Act accordingly.",{"type":38,"tag":43,"props":283,"children":284},{},[285,287,293,295,301,303,309],{"type":51,"value":286},"When re-polling idle (e.g., the command isn't done yet), pass\nback the ",{"type":38,"tag":84,"props":288,"children":290},{"className":289},[],[291],{"type":51,"value":292},"generation",{"type":51,"value":294}," from the previous response as ",{"type":38,"tag":84,"props":296,"children":298},{"className":297},[],[299],{"type":51,"value":300},"last_generation",{"type":51,"value":302},"\nto avoid busy-loop storms. Or use ",{"type":38,"tag":84,"props":304,"children":306},{"className":305},[],[307],{"type":51,"value":308},"fresh=true",{"type":51,"value":310}," for simplicity.",{"type":38,"tag":202,"props":312,"children":314},{"id":313},"sending-a-command",[315],{"type":51,"value":316},"Sending a Command",{"type":38,"tag":43,"props":318,"children":319},{},[320],{"type":51,"value":321},"Always include a newline to \"press Enter\":",{"type":38,"tag":323,"props":324,"children":328},"pre",{"className":325,"code":327,"language":51},[326],"language-text","send input: npm install\\n\n",[329],{"type":38,"tag":84,"props":330,"children":332},{"__ignoreMap":331},"",[333],{"type":51,"value":327},{"type":38,"tag":43,"props":335,"children":336},{},[337,339,345],{"type":51,"value":338},"Without the trailing ",{"type":38,"tag":84,"props":340,"children":342},{"className":341},[],[343],{"type":51,"value":344},"\\n",{"type":51,"value":346},", you've typed the text but haven't\nsubmitted it. Sometimes that's what you want (e.g., building up\na command before sending), but usually you want the newline.",{"type":38,"tag":202,"props":348,"children":350},{"id":349},"reading-the-result",[351],{"type":51,"value":352},"Reading the Result",{"type":38,"tag":43,"props":354,"children":355},{},[356,358,364,366,372],{"type":51,"value":357},"After waiting for idle, read the screen. Prefer ",{"type":38,"tag":84,"props":359,"children":361},{"className":360},[],[362],{"type":51,"value":363},"plain",{"type":51,"value":365},"\nformat when you just need text content. Use ",{"type":38,"tag":84,"props":367,"children":369},{"className":368},[],[370],{"type":51,"value":371},"styled",{"type":51,"value":373}," when\nformatting matters (e.g., distinguishing error output highlighted\nin red).",{"type":38,"tag":43,"props":375,"children":376},{},[377],{"type":51,"value":378},"If the output is long, it may have scrolled off screen. Use\nscrollback to get the full history.",{"type":38,"tag":202,"props":380,"children":382},{"id":381},"handling-interactive-prompts",[383],{"type":51,"value":384},"Handling Interactive Prompts",{"type":38,"tag":43,"props":386,"children":387},{},[388],{"type":51,"value":389},"Many programs ask questions and wait for a response. After reading\nthe screen, look for patterns like:",{"type":38,"tag":237,"props":391,"children":392},{},[393,412,430,448,459],{"type":38,"tag":75,"props":394,"children":395},{},[396,402,404,410],{"type":38,"tag":84,"props":397,"children":399},{"className":398},[],[400],{"type":51,"value":401},"[Y\u002Fn]",{"type":51,"value":403}," or ",{"type":38,"tag":84,"props":405,"children":407},{"className":406},[],[408],{"type":51,"value":409},"[y\u002FN]",{"type":51,"value":411}," — yes\u002Fno confirmation",{"type":38,"tag":75,"props":413,"children":414},{},[415,421,422,428],{"type":38,"tag":84,"props":416,"children":418},{"className":417},[],[419],{"type":51,"value":420},"Password:",{"type":51,"value":403},{"type":38,"tag":84,"props":423,"children":425},{"className":424},[],[426],{"type":51,"value":427},"Enter passphrase:",{"type":51,"value":429}," — credential prompts",{"type":38,"tag":75,"props":431,"children":432},{},[433,439,440,446],{"type":38,"tag":84,"props":434,"children":436},{"className":435},[],[437],{"type":51,"value":438},">",{"type":51,"value":403},{"type":38,"tag":84,"props":441,"children":443},{"className":442},[],[444],{"type":51,"value":445},"?",{"type":51,"value":447}," — interactive selection (fzf, inquirer, etc.)",{"type":38,"tag":75,"props":449,"children":450},{},[451,457],{"type":38,"tag":84,"props":452,"children":454},{"className":453},[],[455],{"type":51,"value":456},"(yes\u002Fno)",{"type":51,"value":458}," — full-word confirmation (e.g., SSH host verification)",{"type":38,"tag":75,"props":460,"children":461},{},[462],{"type":38,"tag":84,"props":463,"children":465},{"className":464},[],[466],{"type":51,"value":467},"Press any key to continue",{"type":38,"tag":43,"props":469,"children":470},{},[471],{"type":51,"value":472},"Respond naturally — send the appropriate input:",{"type":38,"tag":323,"props":474,"children":477},{"className":475,"code":476,"language":51},[326],"send input: y\\n\nsend input: yes\\n\n",[478],{"type":38,"tag":84,"props":479,"children":480},{"__ignoreMap":331},[481],{"type":51,"value":476},{"type":38,"tag":43,"props":483,"children":484},{},[485],{"type":51,"value":486},"For password prompts, note that the terminal will not echo your\ninput back. The screen will look unchanged after you type. Wait\nfor idle after sending — the program will advance.",{"type":38,"tag":202,"props":488,"children":490},{"id":489},"control-characters",[491],{"type":51,"value":492},"Control Characters",{"type":38,"tag":43,"props":494,"children":495},{},[496],{"type":51,"value":497},"Emergency exits and special actions: Ctrl+C (interrupt), Ctrl+D\n(EOF\u002Fexit), Ctrl+Z (suspend), Ctrl+L (clear screen), Ctrl+U\n(clear line), Escape.",{"type":38,"tag":43,"props":499,"children":500},{},[501,503,509],{"type":51,"value":502},"If a command hangs, try Ctrl+C first. If unresponsive, Ctrl+Z\nto suspend then ",{"type":38,"tag":84,"props":504,"children":506},{"className":505},[],[507],{"type":51,"value":508},"kill %1",{"type":51,"value":510},".",{"type":38,"tag":202,"props":512,"children":514},{"id":513},"detecting-success-and-failure",[515],{"type":51,"value":516},"Detecting Success and Failure",{"type":38,"tag":43,"props":518,"children":519},{},[520],{"type":51,"value":521},"After reading the screen, look for signals:",{"type":38,"tag":43,"props":523,"children":524},{},[525],{"type":38,"tag":47,"props":526,"children":527},{},[528],{"type":51,"value":529},"Success indicators:",{"type":38,"tag":237,"props":531,"children":532},{},[533,560,565],{"type":38,"tag":75,"props":534,"children":535},{},[536,538,544,546,552,553,558],{"type":51,"value":537},"A fresh shell prompt (",{"type":38,"tag":84,"props":539,"children":541},{"className":540},[],[542],{"type":51,"value":543},"$",{"type":51,"value":545},", ",{"type":38,"tag":84,"props":547,"children":549},{"className":548},[],[550],{"type":51,"value":551},"#",{"type":51,"value":545},{"type":38,"tag":84,"props":554,"children":556},{"className":555},[],[557],{"type":51,"value":438},{"type":51,"value":559},") on the last line",{"type":38,"tag":75,"props":561,"children":562},{},[563],{"type":51,"value":564},"Explicit success messages (\"done\", \"completed\", \"ok\")",{"type":38,"tag":75,"props":566,"children":567},{},[568],{"type":51,"value":569},"Exit code 0 if visible",{"type":38,"tag":43,"props":571,"children":572},{},[573],{"type":38,"tag":47,"props":574,"children":575},{},[576],{"type":51,"value":577},"Failure indicators:",{"type":38,"tag":237,"props":579,"children":580},{},[581,586,591,596],{"type":38,"tag":75,"props":582,"children":583},{},[584],{"type":51,"value":585},"Words like \"error\", \"failed\", \"fatal\", \"denied\", \"not found\"",{"type":38,"tag":75,"props":587,"children":588},{},[589],{"type":51,"value":590},"Stack traces or tracebacks",{"type":38,"tag":75,"props":592,"children":593},{},[594],{"type":51,"value":595},"A shell prompt after unexpectedly short output",{"type":38,"tag":75,"props":597,"children":598},{},[599],{"type":51,"value":600},"Non-zero exit codes",{"type":38,"tag":43,"props":602,"children":603},{},[604],{"type":51,"value":605},"When in doubt, check the exit code explicitly:",{"type":38,"tag":323,"props":607,"children":610},{"className":608,"code":609,"language":51},[326],"send input: echo $?\\n\n",[611],{"type":38,"tag":84,"props":612,"children":613},{"__ignoreMap":331},[614],{"type":51,"value":609},{"type":38,"tag":43,"props":616,"children":617},{},[618,620,626],{"type":51,"value":619},"A ",{"type":38,"tag":84,"props":621,"children":623},{"className":622},[],[624],{"type":51,"value":625},"0",{"type":51,"value":627}," means the previous command succeeded. Anything else is\na failure.",{"type":38,"tag":202,"props":629,"children":631},{"id":630},"long-running-commands",[632],{"type":51,"value":633},"Long-Running Commands",{"type":38,"tag":43,"props":635,"children":636},{},[637],{"type":51,"value":638},"Some commands run for minutes or longer — builds, downloads,\ntest suites. Waiting for idle will return when output\npauses, but the command may not be done.",{"type":38,"tag":43,"props":640,"children":641},{},[642],{"type":51,"value":643},"Strategies:",{"type":38,"tag":43,"props":645,"children":646},{},[647,652],{"type":38,"tag":47,"props":648,"children":649},{},[650],{"type":51,"value":651},"Poll in a loop.",{"type":51,"value":653}," Wait for idle, read the screen, check\nif a shell prompt has returned. If not, wait again:",{"type":38,"tag":323,"props":655,"children":658},{"className":656,"code":657,"language":51},[326],"wait for idle (timeout: 5000ms)\nread screen\n# No prompt yet? Wait again.\n",[659],{"type":38,"tag":84,"props":660,"children":661},{"__ignoreMap":331},[662],{"type":51,"value":657},{"type":38,"tag":43,"props":664,"children":665},{},[666,671],{"type":38,"tag":47,"props":667,"children":668},{},[669],{"type":51,"value":670},"Use scrollback for full output.",{"type":51,"value":672}," Long commands produce output\nthat scrolls off screen. After the command finishes, read\nscrollback to get everything:",{"type":38,"tag":323,"props":674,"children":677},{"className":675,"code":676,"language":51},[326],"read scrollback (offset: 0, limit: 500)\n",[678],{"type":38,"tag":84,"props":679,"children":680},{"__ignoreMap":331},[681],{"type":51,"value":676},{"type":38,"tag":43,"props":683,"children":684},{},[685,690,692,698],{"type":38,"tag":47,"props":686,"children":687},{},[688],{"type":51,"value":689},"Don't set unreasonably long idle timeouts.",{"type":51,"value":691}," A\n",{"type":38,"tag":84,"props":693,"children":695},{"className":694},[],[696],{"type":51,"value":697},"timeout_ms=30000",{"type":51,"value":699}," means you'll wait 30 seconds of silence\nbefore getting a response. Prefer shorter timeouts with\nrepeated polls — it lets you observe intermediate progress\nand react if something goes wrong.",{"type":38,"tag":202,"props":701,"children":703},{"id":702},"common-patterns",[704],{"type":51,"value":705},"Common Patterns",{"type":38,"tag":707,"props":708,"children":710},"h3",{"id":709},"chained-commands",[711],{"type":51,"value":712},"Chained Commands",{"type":38,"tag":43,"props":714,"children":715},{},[716],{"type":51,"value":717},"When you need to run several commands in sequence, you have two\noptions. Run them as separate send\u002Fwait\u002Fread cycles when you need\nto inspect output between steps:",{"type":38,"tag":323,"props":719,"children":722},{"className":720,"code":721,"language":51},[326],"# Step 1\nsend: cd \u002Fproject\nwait, read — verify directory exists\n\n# Step 2\nsend: npm install\nwait, read — check for errors\n\n# Step 3\nsend: npm test\nwait, read — check results\n",[723],{"type":38,"tag":84,"props":724,"children":725},{"__ignoreMap":331},[726],{"type":51,"value":721},{"type":38,"tag":43,"props":728,"children":729},{},[730,732,738],{"type":51,"value":731},"Or chain with ",{"type":38,"tag":84,"props":733,"children":735},{"className":734},[],[736],{"type":51,"value":737},"&&",{"type":51,"value":739}," when intermediate output doesn't matter:",{"type":38,"tag":323,"props":741,"children":744},{"className":742,"code":743,"language":51},[326],"send: cd \u002Fproject && npm install && npm test\nwait, read — check final result\n",[745],{"type":38,"tag":84,"props":746,"children":747},{"__ignoreMap":331},[748],{"type":51,"value":743},{"type":38,"tag":43,"props":750,"children":751},{},[752],{"type":51,"value":753},"Prefer separate cycles. They give you the chance to detect\nproblems early and adjust.",{"type":38,"tag":707,"props":755,"children":757},{"id":756},"piped-commands",[758],{"type":51,"value":759},"Piped Commands",{"type":38,"tag":43,"props":761,"children":762},{},[763],{"type":51,"value":764},"Pipes work naturally. Send the full pipeline:",{"type":38,"tag":323,"props":766,"children":769},{"className":767,"code":768,"language":51},[326],"send: grep -r \"TODO\" src\u002F | wc -l\n",[770],{"type":38,"tag":84,"props":771,"children":772},{"__ignoreMap":331},[773],{"type":51,"value":768},{"type":38,"tag":707,"props":775,"children":777},{"id":776},"background-processes",[778],{"type":51,"value":779},"Background Processes",{"type":38,"tag":43,"props":781,"children":782},{},[783,785,791],{"type":51,"value":784},"If you start a background process (",{"type":38,"tag":84,"props":786,"children":788},{"className":787},[],[789],{"type":51,"value":790},"&",{"type":51,"value":792},"), it won't block the shell\nprompt. But its output may interleave with future commands.\nConsider redirecting output:",{"type":38,"tag":323,"props":794,"children":797},{"className":795,"code":796,"language":51},[326],"send: .\u002Flong-task.sh > \u002Ftmp\u002Ftask.log 2>&1 &\n",[798],{"type":38,"tag":84,"props":799,"children":800},{"__ignoreMap":331},[801],{"type":51,"value":796},{"type":38,"tag":43,"props":803,"children":804},{},[805],{"type":51,"value":806},"Then check on it later:",{"type":38,"tag":323,"props":808,"children":811},{"className":809,"code":810,"language":51},[326],"send: cat \u002Ftmp\u002Ftask.log\n",[812],{"type":38,"tag":84,"props":813,"children":814},{"__ignoreMap":331},[815],{"type":51,"value":810},{"type":38,"tag":707,"props":817,"children":819},{"id":818},"pagers",[820],{"type":51,"value":821},"Pagers",{"type":38,"tag":43,"props":823,"children":824},{},[825,827,833,834,840,842,848],{"type":51,"value":826},"Commands like ",{"type":38,"tag":84,"props":828,"children":830},{"className":829},[],[831],{"type":51,"value":832},"git log",{"type":51,"value":545},{"type":38,"tag":84,"props":835,"children":837},{"className":836},[],[838],{"type":51,"value":839},"man",{"type":51,"value":841},", or ",{"type":38,"tag":84,"props":843,"children":845},{"className":844},[],[846],{"type":51,"value":847},"less",{"type":51,"value":849}," enter a pager that\nwaits for keyboard navigation. If you just need the content,\nbypass the pager:",{"type":38,"tag":323,"props":851,"children":854},{"className":852,"code":853,"language":51},[326],"send: git log --no-pager\nsend: PAGER=cat man ls\n",[855],{"type":38,"tag":84,"props":856,"children":857},{"__ignoreMap":331},[858],{"type":51,"value":853},{"type":38,"tag":43,"props":860,"children":861},{},[862,864,870],{"type":51,"value":863},"If you're already stuck in a pager, press ",{"type":38,"tag":84,"props":865,"children":867},{"className":866},[],[868],{"type":51,"value":869},"q",{"type":51,"value":871}," to exit:",{"type":38,"tag":323,"props":873,"children":876},{"className":874,"code":875,"language":51},[326],"send: q\n",[877],{"type":38,"tag":84,"props":878,"children":879},{"__ignoreMap":331},[880],{"type":51,"value":875},{"type":38,"tag":707,"props":882,"children":884},{"id":883},"heredocs-and-multi-line-input",[885],{"type":51,"value":886},"Heredocs and Multi-Line Input",{"type":38,"tag":43,"props":888,"children":889},{},[890],{"type":51,"value":891},"To write multi-line content, use heredocs:",{"type":38,"tag":323,"props":893,"children":896},{"className":894,"code":895,"language":51},[326],"send: cat > \u002Ftmp\u002Fconfig.yaml \u003C\u003C 'EOF'\\n\nsend: key: value\\n\nsend: other: thing\\n\nsend: EOF\\n\n",[897],{"type":38,"tag":84,"props":898,"children":899},{"__ignoreMap":331},[900],{"type":51,"value":895},{"type":38,"tag":202,"props":902,"children":904},{"id":903},"pitfalls",[905],{"type":51,"value":906},"Pitfalls",{"type":38,"tag":707,"props":908,"children":910},{"id":909},"dont-skip-the-wait",[911],{"type":51,"value":912},"Don't skip the wait",{"type":38,"tag":43,"props":914,"children":915},{},[916],{"type":51,"value":917},"It's tempting to send input immediately after the previous\ncommand. Don't. If the shell hasn't finished processing, your\ninput may land in the wrong place — or be swallowed entirely.\nAlways wait for idle before sending the next input.",{"type":38,"tag":707,"props":919,"children":921},{"id":920},"dont-assume-the-screen-is-everything",[922],{"type":51,"value":923},"Don't assume the screen is everything",{"type":38,"tag":43,"props":925,"children":926},{},[927],{"type":51,"value":928},"The screen shows only the last N lines (typically 24 rows). A\ncommand that produced 500 lines of output will have 476 lines\nin scrollback. If you need full output, read scrollback.",{"type":38,"tag":707,"props":930,"children":932},{"id":931},"watch-for-prompts-you-didnt-expect",[933],{"type":51,"value":934},"Watch for prompts you didn't expect",{"type":38,"tag":43,"props":936,"children":937},{},[938],{"type":51,"value":939},"Installers, package managers, and system tools love to ask\nsurprise questions. If you read the screen and see no shell\nprompt but also no obvious output-in-progress, look for a\nprompt waiting for your response.",{"type":38,"tag":707,"props":941,"children":943},{"id":942},"destructive-commands",[944],{"type":51,"value":945},"Destructive commands",{"type":38,"tag":43,"props":947,"children":948},{},[949,951,957,958,964,965,971],{"type":51,"value":950},"You are operating a real terminal on a real machine. ",{"type":38,"tag":84,"props":952,"children":954},{"className":953},[],[955],{"type":51,"value":956},"rm",{"type":51,"value":101},{"type":38,"tag":84,"props":959,"children":961},{"className":960},[],[962],{"type":51,"value":963},"DROP TABLE",{"type":51,"value":545},{"type":38,"tag":84,"props":966,"children":968},{"className":967},[],[969],{"type":51,"value":970},"git push --force",{"type":51,"value":972}," — these do real damage.\nBefore running destructive commands:",{"type":38,"tag":237,"props":974,"children":975},{},[976,981,986],{"type":38,"tag":75,"props":977,"children":978},{},[979],{"type":51,"value":980},"Confirm with the human via overlay, panel, or input capture",{"type":38,"tag":75,"props":982,"children":983},{},[984],{"type":51,"value":985},"Double-check paths and arguments",{"type":38,"tag":75,"props":987,"children":988},{},[989],{"type":51,"value":990},"Prefer dry-run flags when available (--dry-run, --whatif, -n)",{"type":38,"tag":707,"props":992,"children":994},{"id":993},"knowing-when-to-give-up",[995],{"type":51,"value":996},"Knowing when to give up",{"type":38,"tag":43,"props":998,"children":999},{},[1000],{"type":51,"value":1001},"If a command is stuck and not responding to Ctrl+C, don't\nhammer it with more input. Strategies in order:",{"type":38,"tag":71,"props":1003,"children":1004},{},[1005,1010,1015,1025],{"type":38,"tag":75,"props":1006,"children":1007},{},[1008],{"type":51,"value":1009},"Send Ctrl+C",{"type":38,"tag":75,"props":1011,"children":1012},{},[1013],{"type":51,"value":1014},"Wait a moment, try Ctrl+C again",{"type":38,"tag":75,"props":1016,"children":1017},{},[1018,1020],{"type":51,"value":1019},"Send Ctrl+Z to suspend, then ",{"type":38,"tag":84,"props":1021,"children":1023},{"className":1022},[],[1024],{"type":51,"value":508},{"type":38,"tag":75,"props":1026,"children":1027},{},[1028],{"type":51,"value":1029},"Tell the human what's happening and ask for help",{"type":38,"tag":707,"props":1031,"children":1033},{"id":1032},"shell-state-persists",[1034],{"type":51,"value":1035},"Shell state persists",{"type":38,"tag":43,"props":1037,"children":1038},{},[1039,1041,1047],{"type":51,"value":1040},"You're in a real shell session. Environment variables you set,\ndirectories you ",{"type":38,"tag":84,"props":1042,"children":1044},{"className":1043},[],[1045],{"type":51,"value":1046},"cd",{"type":51,"value":1048}," into, background jobs you spawn — they\nall persist. Be mindful of the state you leave behind.",{"items":1050,"total":1130},[1051,1066,1078,1089,1101,1107,1119],{"slug":1052,"name":1052,"fn":1053,"description":1054,"org":1055,"tags":1056,"stars":22,"repoUrl":23,"updatedAt":1065},"agent-orchestration","orchestrate multiple AI agents","Use when you need to launch and drive other AI agents (Claude Code, Aider, Codex, etc.) through their terminal interfaces via wsh. Examples: \"run multiple Claude Code sessions in parallel on different tasks\", \"feed a task to an AI agent and handle its approval prompts\", \"coordinate several AI agents working on subtasks of a larger project\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1057,1060,1061,1062],{"name":1058,"slug":1059,"type":15},"Agents","agents",{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":1063,"slug":1064,"type":15},"Multi-Agent","multi-agent","2026-07-12T08:29:40.028618",{"slug":1067,"name":1067,"fn":1068,"description":1069,"org":1070,"tags":1071,"stars":22,"repoUrl":23,"updatedAt":1077},"cluster-orchestration","orchestrate sessions across federated clusters","Use when you need to manage sessions across multiple wsh servers in a federated cluster. Examples: \"distribute builds across several machines\", \"create sessions on a specific backend\", \"monitor health across a cluster of servers\", \"coordinate work across server boundaries\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1072,1075,1076],{"name":1073,"slug":1074,"type":15},"Architecture","architecture",{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},"2026-07-12T08:29:38.810244",{"slug":1079,"name":1079,"fn":1080,"description":1081,"org":1082,"tags":1083,"stars":22,"repoUrl":23,"updatedAt":1088},"core","authenticate and bootstrap wsh terminal operations","REQUIRED before any wsh terminal operation when you do NOT have wsh_* MCP tools. Contains the complete HTTP API reference with working curl examples, bootstrap sequence, and authentication guide. wsh has no CLI subcommands for programmatic use — do NOT run 'wsh \u003Cverb>' commands or guess endpoints. Load this skill first.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1084,1087],{"name":1085,"slug":1086,"type":15},"Authentication","authentication",{"name":17,"slug":18,"type":15},"2026-07-12T08:29:32.614733",{"slug":1090,"name":1090,"fn":1091,"description":1092,"org":1093,"tags":1094,"stars":22,"repoUrl":23,"updatedAt":1100},"core-mcp","bootstrap MCP terminal sessions","REQUIRED before any wsh terminal operation. Contains the complete MCP tool reference and bootstrap sequence for wsh_create_session, wsh_send_input, wsh_get_screen, wsh_send_and_read, wsh_send_keys, and all wsh_* tools. Do NOT guess wsh CLI commands or HTTP endpoints — use MCP tools or load this skill first.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1095,1096,1097],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":1098,"slug":1099,"type":15},"MCP","mcp","2026-07-12T08:29:45.869993",{"slug":4,"name":4,"fn":5,"description":6,"org":1102,"tags":1103,"stars":22,"repoUrl":23,"updatedAt":24},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1104,1105,1106],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},{"slug":1108,"name":1108,"fn":1109,"description":1110,"org":1111,"tags":1112,"stars":22,"repoUrl":23,"updatedAt":1118},"generative-ui","build interactive terminal user interfaces","Use when you need to build dynamic, interactive terminal experiences on the fly. Examples: \"create a live dashboard in the terminal\", \"build an interactive file browser\", \"generate a custom TUI for this workflow\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1113,1114,1115],{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},{"name":1116,"slug":1117,"type":15},"Frontend","frontend","2026-07-12T08:29:41.286933",{"slug":1120,"name":1120,"fn":1121,"description":1122,"org":1123,"tags":1124,"stars":22,"repoUrl":23,"updatedAt":1129},"infrastructure-ops","manage infrastructure across multiple servers","Use when you need to manage infrastructure across multiple servers interactively via wsh — deploying applications, configuring services, managing packages, performing rolling updates, and handling the prompts and judgment calls that declarative tools cannot. Examples: \"deploy this application across 10 servers with health checks between each\", \"upgrade packages across the fleet and handle diverse prompts\", \"inspect and modify configuration across servers\", \"roll back a failed deployment\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1125,1126],{"name":17,"slug":18,"type":15},{"name":1127,"slug":1128,"type":15},"Infrastructure","infrastructure","2026-07-12T08:29:57.659886",12,{"items":1132,"total":1287},[1133,1149,1163,1177,1189,1201,1213,1224,1240,1254,1264,1276],{"slug":1134,"name":1134,"fn":1135,"description":1136,"org":1137,"tags":1138,"stars":1146,"repoUrl":1147,"updatedAt":1148},"deepclaw-voice","configure phone calls with Deepgram Voice","Set up phone calling to OpenClaw using Deepgram Voice Agent API",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1139,1142,1143],{"name":1140,"slug":1141,"type":15},"API Development","api-development",{"name":9,"slug":8,"type":15},{"name":1144,"slug":1145,"type":15},"Voice","voice",78,"https:\u002F\u002Fgithub.com\u002Fdeepgram\u002Fdeepclaw","2026-07-12T08:29:25.371332",{"slug":1150,"name":1150,"fn":1151,"description":1152,"org":1153,"tags":1154,"stars":1160,"repoUrl":1161,"updatedAt":1162},"1password","manage secrets with 1Password CLI","Set up and use 1Password CLI (op). Use when installing the CLI, enabling desktop app integration, signing in (single or multi-account), or reading\u002Finjecting\u002Frunning secrets via op.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1155,1156,1157],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":1158,"slug":1159,"type":15},"Security","security",23,"https:\u002F\u002Fgithub.com\u002Fdeepgram\u002Fdglabs-deepclaw","2026-07-12T08:28:49.991939",{"slug":1164,"name":1164,"fn":1165,"description":1166,"org":1167,"tags":1168,"stars":1160,"repoUrl":1161,"updatedAt":1176},"apple-notes","manage Apple Notes on macOS","Manage Apple Notes via the `memo` CLI on macOS (create, view, edit, delete, search, move, and export notes). Use when a user asks OpenClaw to add a note, list notes, search notes, or manage note folders.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1169,1170,1173],{"name":17,"slug":18,"type":15},{"name":1171,"slug":1172,"type":15},"Knowledge Management","knowledge-management",{"name":1174,"slug":1175,"type":15},"macOS","macos","2026-07-12T08:29:01.538106",{"slug":1178,"name":1178,"fn":1179,"description":1180,"org":1181,"tags":1182,"stars":1160,"repoUrl":1161,"updatedAt":1188},"apple-reminders","manage Apple Reminders via CLI","Manage Apple Reminders via the `remindctl` CLI on macOS (list, add, edit, complete, delete). Supports lists, date filters, and JSON\u002Fplain output.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1183,1184,1185],{"name":17,"slug":18,"type":15},{"name":1174,"slug":1175,"type":15},{"name":1186,"slug":1187,"type":15},"Task Management","task-management","2026-07-12T08:29:14.035414",{"slug":1190,"name":1190,"fn":1191,"description":1192,"org":1193,"tags":1194,"stars":1160,"repoUrl":1161,"updatedAt":1200},"bear-notes","manage Bear notes via CLI","Create, search, and manage Bear notes via grizzly CLI.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1195,1196,1197],{"name":17,"slug":18,"type":15},{"name":1171,"slug":1172,"type":15},{"name":1198,"slug":1199,"type":15},"Notes","notes","2026-07-12T08:28:51.246011",{"slug":1202,"name":1202,"fn":1203,"description":1204,"org":1205,"tags":1206,"stars":1160,"repoUrl":1161,"updatedAt":1212},"blogwatcher","monitor blogs and RSS feeds","Monitor blogs and RSS\u002FAtom feeds for updates using the blogwatcher CLI.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1207,1208,1209],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":1210,"slug":1211,"type":15},"Monitoring","monitoring","2026-07-12T08:29:02.762321",{"slug":1214,"name":1214,"fn":1215,"description":1216,"org":1217,"tags":1218,"stars":1160,"repoUrl":1161,"updatedAt":1223},"blucli","control BluOS audio playback","BluOS CLI (blu) for discovery, playback, grouping, and volume.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1219,1222],{"name":1220,"slug":1221,"type":15},"Audio","audio",{"name":17,"slug":18,"type":15},"2026-07-12T08:28:21.009637",{"slug":1225,"name":1225,"fn":1226,"description":1227,"org":1228,"tags":1229,"stars":1160,"repoUrl":1161,"updatedAt":1239},"bluebubbles","send and manage iMessages","Use when you need to send or manage iMessages via BlueBubbles (recommended iMessage integration). Calls go through the generic message tool with channel=\"bluebubbles\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1230,1233,1236],{"name":1231,"slug":1232,"type":15},"Communications","communications",{"name":1234,"slug":1235,"type":15},"iMessage","imessage",{"name":1237,"slug":1238,"type":15},"Messaging","messaging","2026-07-12T08:28:57.517914",{"slug":1241,"name":1241,"fn":1242,"description":1243,"org":1244,"tags":1245,"stars":1160,"repoUrl":1161,"updatedAt":1253},"camsnap","capture frames and clips from cameras","Capture frames or clips from RTSP\u002FONVIF cameras.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1246,1247,1250],{"name":13,"slug":14,"type":15},{"name":1248,"slug":1249,"type":15},"Camera","camera",{"name":1251,"slug":1252,"type":15},"Media","media","2026-07-12T08:28:28.096134",{"slug":1255,"name":1255,"fn":1256,"description":1257,"org":1258,"tags":1259,"stars":1160,"repoUrl":1161,"updatedAt":1263},"clawhub","manage agent skills with ClawHub","Use the ClawHub CLI to search, install, update, and publish agent skills from clawhub.com. Use when you need to fetch new skills on the fly, sync installed skills to latest or a specific version, or publish new\u002Fupdated skill folders with the npm-installed clawhub CLI.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1260,1261,1262],{"name":1058,"slug":1059,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},"2026-07-12T08:28:30.589001",{"slug":1265,"name":1265,"fn":1266,"description":1267,"org":1268,"tags":1269,"stars":1160,"repoUrl":1161,"updatedAt":1275},"coding-agent","run coding agents for programmatic control","Run Codex CLI, Claude Code, OpenCode, or Pi Coding Agent via background process for programmatic control.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1270,1271,1272],{"name":1058,"slug":1059,"type":15},{"name":13,"slug":14,"type":15},{"name":1273,"slug":1274,"type":15},"Coding","coding","2026-07-12T08:29:08.6658",{"slug":1277,"name":1277,"fn":1278,"description":1279,"org":1280,"tags":1281,"stars":1160,"repoUrl":1161,"updatedAt":1286},"eightctl","control Eight Sleep pod settings","Control Eight Sleep pods (status, temperature, alarms, schedules).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1282,1283],{"name":13,"slug":14,"type":15},{"name":1284,"slug":1285,"type":15},"Hardware","hardware","2026-07-12T08:28:39.322181",73]