[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M70FC09GRRKSFR27FSQK8WWN":3,"skill-same:01M70FC09GRRKSFR27FSQK8WWN":77},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":28,"publishedAt":49,"linkOnly":50,"markdownContent":51,"markdownBody":52,"frontMatter":53,"refName":55,"commitSha":56,"skillDirectory":57,"forksCount":14,"repositoryHtmlUrl":58,"repositoryHomepageUrl":6,"ownerHtmlUrl":59,"ownerBlogUrl":60,"ownerDescription":61,"updatedAt":62,"install":63,"resources":76},"01M70FC09GRRKSFR27FSQK8WWN","agent-wormhole",null,"Pair with another Claude Code instance and communicate files and messages securely. Use to send\u002Freceive text, credentials, or files between AI agent sessions. First contact pairs identities from a single short code; afterwards, peers are addressable by name forever.","noncuro\u002Fagent-wormhole","noncuro","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F5695500?v=4","01M70FBVNTE47SYWMNJRW8XZ3Y","Daniel Cahn","01M70FBVPF742QT56AZ4R793HA",0,"MIT","https:\u002F\u002Fgithub.com\u002Fnoncuro\u002Fagent-wormhole\u002Fblob\u002Fmain\u002Fskill\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],"agent wormhole","wormhole","name","first","credentials","with","text","code","ai agent","connect","use","communicate","files","single","sessions","short","send","messages","for","by name","2026-11-10 10:12:30",false,"---\nname: agent-wormhole\ndescription: Pair with another Claude Code instance and communicate files and messages securely. Use to send\u002Freceive text, credentials, or files between AI agent sessions. First contact pairs identities from a single short code; afterwards, peers are addressable by name forever.\nargument-hint: \"[a pairing code like 7-foo-bar] | [connect \u002F pair] | (no args = listen for paired peers)\"\n---\n\n# Agent Wormhole\n\nagent-wormhole gives two Claude Code sessions a secure, encrypted channel — for messages, credentials, or files. Think Magic Wormhole, but for agents talking to each other: two machines, or two people collaborating through their respective agents.\n\n## The one rule that governs everything here\n\n**The CLI is yours, not the user's.** The user never sees or types a command, flag, pubkey, file path, or relay URL. They speak in plain language (\"connect me to my laptop\", \"send this to Dana\") and you run everything silently with Bash. The **only** technical token that ever crosses to the user is a short **pairing code** (looks like `7-foo-bar`) — you read one out, or they paste one in. Report outcomes in human terms (\"Paired with macbook-air. Listening.\" \u002F \"Sent.\"), never the mechanics. Only reveal commands if the user explicitly asks for the technical details.\n\n## Deciding what to do (first message)\n\nLook at what the user said and pick exactly one path:\n\n1. **They gave you a pairing code** — any token matching `\\b\\d+-[a-z]+(?:-[a-z]+)+\\b` (e.g. \"connect to `7-foo-bar`\", or just `7-foo-bar` pasted in) → **Join** (below). The code means the other side already started pairing; your job is to complete it. Do not start your own invite.\n2. **They want to connect\u002Fpair but gave no code** → **Invite** (below). You generate one code and read it to them.\n3. **Anything else** — no args, or they name a peer you've already paired with → **Listen** (below).\n\nIf it is genuinely ambiguous whether they are starting fresh or joining, ask in plain language: *\"Did the other side already give you a code to use? If so, paste it and I'll connect. Otherwise I'll start a new connection and give you a code to read across.\"*\n\n## Prerequisites\n\nCheck quietly; only surface a problem if one fails:\n\n```bash\nagent-wormhole --help        # CLI present\nwormhole --version           # magic-wormhole present (needed for pairing + files)\n```\n\nIf missing: `uv tool install agent-wormhole`, then `agent-wormhole setup` for skill wiring. This skill also needs the **Monitor** tool (built into Claude Code since v2.1.98); if it's absent, tell the user to run `claude update`.\n\n## Pairing — Invite (you generate the one code)\n\nFirst contact now takes a **single code, read one direction**. You ship this machine's identity over a wormhole code and stay subscribed for the reply; the other side completes it automatically.\n\nRun the inviter under Monitor so you catch each step as it streams:\n\n```\nMonitor(\n  command=\"agent-wormhole pair-invite\",\n  description=\"Pairing — waiting for the other side\",\n  persistent=False\n)\n```\n\nIt emits one JSON line per step:\n\n- `{\"type\":\"pairing-code\",\"code\":\"7-foo-bar\"}` → **immediately** tell the user: *\"Read this code to the other machine: `7-foo-bar`.\"*\n- `{\"type\":\"paired\",\"peer\":\"\u003Cname>\",\"peer_hostname\":\"\u003Chostname>\"}` → pairing succeeded. Tell the user: *\"Paired with `\u003Chostname>`.\"* Then fall through to **Listen**. (If the stored `peer` name differs from what the user calls the machine, mention it and offer to rename — see Trust management.)\n- `{\"type\":\"pairing-timeout\"}` → tell the user the other side didn't connect in time and offer to try again.\n\nIf the user wants the peer stored under a specific name, pass it: `agent-wormhole pair-invite --name \u003Cname>`.\n\n## Pairing — Join (the user gave you a code)\n\nThe other machine is inviting; you have its code. This is quick — receive, trust, reply:\n\n```bash\nagent-wormhole pair-join \u003Ccode>\n```\n\nIt prints `{\"type\":\"paired\",\"peer\":\"\u003Cname>\",\"peer_hostname\":\"\u003Chostname>\"}` on success, or `{\"type\":\"error\",\"error\":\"…\"}` on failure. On success tell the user *\"Paired with `\u003Chostname>`.\"* and fall through to **Listen**. Pass `--name \u003Cname>` if the user wants a specific local name.\n\nOnce `paired` appears on either side, **both** machines are mutually trusted from that one code. No second code, no reading anything back.\n\n## Listening (already paired)\n\nFor an existing peer, skip pairing. Start the listener under Monitor and stay silent until something arrives:\n\n```\nMonitor(\n  command=\"agent-wormhole listen\",\n  description=\"Inbound agent-wormhole messages\",\n  persistent=True\n)\n```\n\nThe listener is **quiet by default**: it keeps a durable seen-store (keyed on\nmessage id), so a message is surfaced exactly once — never re-flooded when relays\nreplay history on reconnect. On the very first run it silently baselines existing\nbacklog and emits a one-line summary instead of the firehose. So you won't drown\nin stale history; only genuinely new messages arrive.\n\nEach notification is one JSON line:\n\n- **Text**: `{\"type\":\"text\",\"from\":\"\u003Cpeer>\",\"content\":\"\u003Cmsg>\",…}` → show it plainly: **`\u003Cpeer> says:` `\u003Cmsg>`**.\n- **File** (auto-received from a trusted peer): `{\"type\":\"file\",\"from\":\"\u003Cpeer>\",\"name\":\"\u003Cfile>\",\"saved_to\":\"\u003Cpath>\",…}` → the file is already on disk. Mention you received it and offer to open or process it; use the Read tool on `saved_to`.\n- **Backlog** (cold-start summary, not a message): `{\"type\":\"backlog\",\"suppressed\":\u003CN>,\"through\":\u003Cts>}` → N old messages were marked-read without surfacing. **Don't act on it**; at most note \"cleared N old messages.\" Use `agent-wormhole listen --replay` only if you need to audit the suppressed history.\n\n### Quiet-by-default output policy\n\nEvery Monitor notification becomes a line in the user's transcript. Don't narrate setup, handshakes, or housekeeping. **Speak only when there's something actionable**: a code to read aloud, an inbound message, a received file, or an error.\n\n## Sending\n\nWhen the user asks to send something to a paired peer, do it silently and confirm in one word:\n\n- Text or a small secret → send it; then say **\"Sent.\"**\n- A file, or anything large or binary → send the file; then say **\"Delivered.\"** The recipient's listener auto-accepts; nothing is required on their end.\n\nDon't show the command or echo the payload back unless asked.\n\n## Trust management (plain-language)\n\nThe user may say things like \"who am I connected to?\", \"call that machine 'laptop'\", or \"forget that connection.\" Handle these silently and answer in plain language — list peer names, confirm a rename, confirm a removal. Never print pubkeys or relay URLs unless asked.\n\n## Security model\n\n- Identity is a persistent secp256k1 keypair stored locally (mode 0600). Losing it means re-pairing with every peer.\n- All messages are NIP-17 gift-wrapped DMs: relays see only an opaque wrapped event tagged to the recipient. Sender identity is hidden from relays.\n- Untrusted senders are silently dropped — you're never notified.\n- Pairing security: the invite travels over magic-wormhole's PAKE-protected channel and carries a one-time **nonce**. The reply comes back over Nostr and must echo that nonce, and the authenticated sender key must match the key claimed in the reply. Because the nonce is only ever exposed inside the wormhole channel, a third party who scrapes the inviter's public key from relay metadata cannot complete pairing for their own key.\n- File transfer uses magic-wormhole's PAKE handshake; only the code, delivered inside the encrypted DM, can complete the transfer.\n\n---\n\n## Internal reference (for the agent — never shown to the user)\n\nFull CLI surface. Use these directly; do not surface them.\n\n| Purpose | Command |\n|---|---|\n| Inviter side of pairing (emits `pairing-code`, then `paired`\u002F`pairing-timeout`) | `agent-wormhole pair-invite [--name \u003Cname>] [--timeout \u003Csec>]` |\n| Joiner side of pairing (emits `paired`\u002F`error`) | `agent-wormhole pair-join \u003Ccode> [--name \u003Cname>]` |\n| Listen for inbound messages (JSON lines; run under Monitor) | `agent-wormhole listen` |\n| Send text | `agent-wormhole send \u003Cpeer> \"\u003Cmsg>\"` |\n| Send a file | `agent-wormhole send-file \u003Cpeer> \u003Cpath>` |\n| List paired peers | `agent-wormhole peers` |\n| Rename a peer | `agent-wormhole rename \u003Cold> \u003Cnew>` |\n| This machine's pubkey + relays | `agent-wormhole whoami` |\n| Revoke a peer | `agent-wormhole untrust \u003Cpeer>` |\n\nNotes:\n- `pair-invite` blocks until the reply arrives or it times out — that's why it runs under Monitor, so you can surface the code mid-run.\n- Inbound files land under `\u002Ftmp\u002Fagent-wormhole\u002F\u003Cpeer>\u002Ffiles\u002F`.\n- `identity-envelope` and manual `trust \u003Cpubkey> \u003Cname> --relays …` still exist for out-of-band introductions, but single-code pairing replaces the old two-code dance.\n","# Agent Wormhole\n\nagent-wormhole gives two Claude Code sessions a secure, encrypted channel — for messages, credentials, or files. Think Magic Wormhole, but for agents talking to each other: two machines, or two people collaborating through their respective agents.\n\n## The one rule that governs everything here\n\n**The CLI is yours, not the user's.** The user never sees or types a command, flag, pubkey, file path, or relay URL. They speak in plain language (\"connect me to my laptop\", \"send this to Dana\") and you run everything silently with Bash. The **only** technical token that ever crosses to the user is a short **pairing code** (looks like `7-foo-bar`) — you read one out, or they paste one in. Report outcomes in human terms (\"Paired with macbook-air. Listening.\" \u002F \"Sent.\"), never the mechanics. Only reveal commands if the user explicitly asks for the technical details.\n\n## Deciding what to do (first message)\n\nLook at what the user said and pick exactly one path:\n\n1. **They gave you a pairing code** — any token matching `\\b\\d+-[a-z]+(?:-[a-z]+)+\\b` (e.g. \"connect to `7-foo-bar`\", or just `7-foo-bar` pasted in) → **Join** (below). The code means the other side already started pairing; your job is to complete it. Do not start your own invite.\n2. **They want to connect\u002Fpair but gave no code** → **Invite** (below). You generate one code and read it to them.\n3. **Anything else** — no args, or they name a peer you've already paired with → **Listen** (below).\n\nIf it is genuinely ambiguous whether they are starting fresh or joining, ask in plain language: *\"Did the other side already give you a code to use? If so, paste it and I'll connect. Otherwise I'll start a new connection and give you a code to read across.\"*\n\n## Prerequisites\n\nCheck quietly; only surface a problem if one fails:\n\n```bash\nagent-wormhole --help        # CLI present\nwormhole --version           # magic-wormhole present (needed for pairing + files)\n```\n\nIf missing: `uv tool install agent-wormhole`, then `agent-wormhole setup` for skill wiring. This skill also needs the **Monitor** tool (built into Claude Code since v2.1.98); if it's absent, tell the user to run `claude update`.\n\n## Pairing — Invite (you generate the one code)\n\nFirst contact now takes a **single code, read one direction**. You ship this machine's identity over a wormhole code and stay subscribed for the reply; the other side completes it automatically.\n\nRun the inviter under Monitor so you catch each step as it streams:\n\n```\nMonitor(\n  command=\"agent-wormhole pair-invite\",\n  description=\"Pairing — waiting for the other side\",\n  persistent=False\n)\n```\n\nIt emits one JSON line per step:\n\n- `{\"type\":\"pairing-code\",\"code\":\"7-foo-bar\"}` → **immediately** tell the user: *\"Read this code to the other machine: `7-foo-bar`.\"*\n- `{\"type\":\"paired\",\"peer\":\"\u003Cname>\",\"peer_hostname\":\"\u003Chostname>\"}` → pairing succeeded. Tell the user: *\"Paired with `\u003Chostname>`.\"* Then fall through to **Listen**. (If the stored `peer` name differs from what the user calls the machine, mention it and offer to rename — see Trust management.)\n- `{\"type\":\"pairing-timeout\"}` → tell the user the other side didn't connect in time and offer to try again.\n\nIf the user wants the peer stored under a specific name, pass it: `agent-wormhole pair-invite --name \u003Cname>`.\n\n## Pairing — Join (the user gave you a code)\n\nThe other machine is inviting; you have its code. This is quick — receive, trust, reply:\n\n```bash\nagent-wormhole pair-join \u003Ccode>\n```\n\nIt prints `{\"type\":\"paired\",\"peer\":\"\u003Cname>\",\"peer_hostname\":\"\u003Chostname>\"}` on success, or `{\"type\":\"error\",\"error\":\"…\"}` on failure. On success tell the user *\"Paired with `\u003Chostname>`.\"* and fall through to **Listen**. Pass `--name \u003Cname>` if the user wants a specific local name.\n\nOnce `paired` appears on either side, **both** machines are mutually trusted from that one code. No second code, no reading anything back.\n\n## Listening (already paired)\n\nFor an existing peer, skip pairing. Start the listener under Monitor and stay silent until something arrives:\n\n```\nMonitor(\n  command=\"agent-wormhole listen\",\n  description=\"Inbound agent-wormhole messages\",\n  persistent=True\n)\n```\n\nThe listener is **quiet by default**: it keeps a durable seen-store (keyed on\nmessage id), so a message is surfaced exactly once — never re-flooded when relays\nreplay history on reconnect. On the very first run it silently baselines existing\nbacklog and emits a one-line summary instead of the firehose. So you won't drown\nin stale history; only genuinely new messages arrive.\n\nEach notification is one JSON line:\n\n- **Text**: `{\"type\":\"text\",\"from\":\"\u003Cpeer>\",\"content\":\"\u003Cmsg>\",…}` → show it plainly: **`\u003Cpeer> says:` `\u003Cmsg>`**.\n- **File** (auto-received from a trusted peer): `{\"type\":\"file\",\"from\":\"\u003Cpeer>\",\"name\":\"\u003Cfile>\",\"saved_to\":\"\u003Cpath>\",…}` → the file is already on disk. Mention you received it and offer to open or process it; use the Read tool on `saved_to`.\n- **Backlog** (cold-start summary, not a message): `{\"type\":\"backlog\",\"suppressed\":\u003CN>,\"through\":\u003Cts>}` → N old messages were marked-read without surfacing. **Don't act on it**; at most note \"cleared N old messages.\" Use `agent-wormhole listen --replay` only if you need to audit the suppressed history.\n\n### Quiet-by-default output policy\n\nEvery Monitor notification becomes a line in the user's transcript. Don't narrate setup, handshakes, or housekeeping. **Speak only when there's something actionable**: a code to read aloud, an inbound message, a received file, or an error.\n\n## Sending\n\nWhen the user asks to send something to a paired peer, do it silently and confirm in one word:\n\n- Text or a small secret → send it; then say **\"Sent.\"**\n- A file, or anything large or binary → send the file; then say **\"Delivered.\"** The recipient's listener auto-accepts; nothing is required on their end.\n\nDon't show the command or echo the payload back unless asked.\n\n## Trust management (plain-language)\n\nThe user may say things like \"who am I connected to?\", \"call that machine 'laptop'\", or \"forget that connection.\" Handle these silently and answer in plain language — list peer names, confirm a rename, confirm a removal. Never print pubkeys or relay URLs unless asked.\n\n## Security model\n\n- Identity is a persistent secp256k1 keypair stored locally (mode 0600). Losing it means re-pairing with every peer.\n- All messages are NIP-17 gift-wrapped DMs: relays see only an opaque wrapped event tagged to the recipient. Sender identity is hidden from relays.\n- Untrusted senders are silently dropped — you're never notified.\n- Pairing security: the invite travels over magic-wormhole's PAKE-protected channel and carries a one-time **nonce**. The reply comes back over Nostr and must echo that nonce, and the authenticated sender key must match the key claimed in the reply. Because the nonce is only ever exposed inside the wormhole channel, a third party who scrapes the inviter's public key from relay metadata cannot complete pairing for their own key.\n- File transfer uses magic-wormhole's PAKE handshake; only the code, delivered inside the encrypted DM, can complete the transfer.\n\n---\n\n## Internal reference (for the agent — never shown to the user)\n\nFull CLI surface. Use these directly; do not surface them.\n\n| Purpose | Command |\n|---|---|\n| Inviter side of pairing (emits `pairing-code`, then `paired`\u002F`pairing-timeout`) | `agent-wormhole pair-invite [--name \u003Cname>] [--timeout \u003Csec>]` |\n| Joiner side of pairing (emits `paired`\u002F`error`) | `agent-wormhole pair-join \u003Ccode> [--name \u003Cname>]` |\n| Listen for inbound messages (JSON lines; run under Monitor) | `agent-wormhole listen` |\n| Send text | `agent-wormhole send \u003Cpeer> \"\u003Cmsg>\"` |\n| Send a file | `agent-wormhole send-file \u003Cpeer> \u003Cpath>` |\n| List paired peers | `agent-wormhole peers` |\n| Rename a peer | `agent-wormhole rename \u003Cold> \u003Cnew>` |\n| This machine's pubkey + relays | `agent-wormhole whoami` |\n| Revoke a peer | `agent-wormhole untrust \u003Cpeer>` |\n\nNotes:\n- `pair-invite` blocks until the reply arrives or it times out — that's why it runs under Monitor, so you can surface the code mid-run.\n- Inbound files land under `\u002Ftmp\u002Fagent-wormhole\u002F\u003Cpeer>\u002Ffiles\u002F`.\n- `identity-envelope` and manual `trust \u003Cpubkey> \u003Cname> --relays …` still exist for out-of-band introductions, but single-code pairing replaces the old two-code dance.\n",{"name":5,"description":7,"argument-hint":54},"[a pairing code like 7-foo-bar] | [connect \u002F pair] | (no args = listen for paired peers)","main","73806fa6873b7a75aaceb5ba6dedd5253a13b6a3","skill","https:\u002F\u002Fgithub.com\u002Fnoncuro\u002Fagent-wormhole","https:\u002F\u002Fgithub.com\u002Fnoncuro","slingshot.xyz","Founder & CEO @ Slingshot AI","2026-07-05 04:05:54",{"source":8,"skillName":5,"commands":64,"prompt":74,"zipAvailable":75},[65,68,71],{"tool":66,"command":67},"npx","npx skills add noncuro\u002Fagent-wormhole --skill agent-wormhole",{"tool":69,"command":70},"bunx","bunx skills add noncuro\u002Fagent-wormhole --skill agent-wormhole",{"tool":72,"command":73},"pnpm","pnpm dlx skills add noncuro\u002Fagent-wormhole --skill agent-wormhole","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fnoncuro\u002Fagent-wormhole\u002Fblob\u002Fmain\u002Fskill\u002FSKILL.md",true,[],[78],{"skillNo":79,"name":80,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":84,"publishedAt":49},"01M70FC3XA08ZYEC4S2Z452ZNP","agent_wormhole","https:\u002F\u002Fgithub.com\u002Fnoncuro\u002Fagent-wormhole\u002Fblob\u002Fmain\u002Fsrc\u002Fagent_wormhole\u002FSKILL.md",[83],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[29,30]]