[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CB5NKER0933FFFEA7WTM44":3,"skill-same:01M6CB5NKER0933FFFEA7WTM44":76},{"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":23,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":55,"commitSha":56,"skillDirectory":57,"forksCount":58,"repositoryHtmlUrl":59,"repositoryHomepageUrl":6,"ownerHtmlUrl":60,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":61,"install":62,"resources":75},"01M6CB5NKER0933FFFEA7WTM44","xurl",null,"X\u002FTwitter via xurl CLI: raw post search, posting, DM, media.","adnichols\u002Fai-configs","adnichols","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F493746?v=4","01M6C33VRY9WF6XWYPT1AFA7JJ","Aaron Nichols","01M6C33VWTNKGRM92E9G643V4W",5,"MIT","https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs\u002Fblob\u002Fmain\u002F_hermes\u002Fdefault\u002Fskills\u002Fsocial-media\u002Fxurl\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[5,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"openclaw","macos","cli","github","linux","official","search","https","social-media","api","Media","hermes","hermes agent","twitter","2026-11-10 10:12:30",false,"---\nname: xurl\ndescription: \"X\u002FTwitter via xurl CLI: raw post search, posting, DM, media.\"\nversion: 1.1.3\nauthor: xdevplatform + openclaw + Hermes Agent\nlicense: MIT\nplatforms: [linux, macos]\nprerequisites:\n  commands: [xurl]\nmetadata:\n  hermes:\n    tags: [twitter, x, social-media, xurl, official-api]\n    homepage: https:\u002F\u002Fgithub.com\u002Fxdevplatform\u002Fxurl\n    upstream_skill: https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Fxurl\u002FSKILL.md\n---\n\n# xurl — X (Twitter) API via the Official CLI\n\n`xurl` is the X developer platform's official CLI for the X API. It supports shortcut commands for common actions AND raw curl-style access to any v2 endpoint. All commands return JSON to stdout.\n\nUse this skill for:\n- posting, replying, quoting, deleting posts\n- searching for raw posts (actual post JSON with IDs you can engage with) and reading timelines\u002Fmentions\n- liking, reposting, bookmarking\n- following, unfollowing, blocking, muting\n- direct messages\n- media uploads (images and video)\n- raw access to any X API v2 endpoint\n- multi-app \u002F multi-account workflows\n\nThis skill replaces the older `xitter` skill (which wrapped a third-party Python CLI). `xurl` is maintained by the X developer platform team, supports OAuth 2.0 PKCE with auto-refresh, and covers a substantially larger API surface.\n\n---\n\n## Secret Safety (MANDATORY)\n\nCritical rules when operating inside an agent\u002FLLM session:\n\n- **Never** read, print, parse, summarize, upload, or send `~\u002F.xurl` to LLM context.\n- **Never** ask the user to paste credentials\u002Ftokens into chat.\n- The user must fill `~\u002F.xurl` with secrets manually on their own machine. In Docker, this must be the `~` seen by Hermes tool subprocesses; see the Docker note below.\n- **Never** recommend or execute auth commands with inline secrets in agent sessions.\n- **Never** use `--verbose` \u002F `-v` in agent sessions — it can expose auth headers\u002Ftokens.\n- To verify credentials exist, only use: `xurl auth status`.\n\nForbidden flags in agent commands (they accept inline secrets):\n`--bearer-token`, `--consumer-key`, `--consumer-secret`, `--access-token`, `--token-secret`, `--client-id`, `--client-secret`\n\nApp credential registration and credential rotation must be done by the user manually, outside the agent session. After credentials are registered, the user authenticates with `xurl auth oauth2` — also outside the agent session. Tokens persist to `~\u002F.xurl` in YAML. Each app has isolated tokens. OAuth 2.0 tokens auto-refresh.\n\n---\n\n## Installation\n\nPick ONE method. On Linux, the shell script or `go install` are the easiest.\n\n```bash\n# Shell script (installs to ~\u002F.local\u002Fbin, no sudo, works on Linux + macOS)\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fxdevplatform\u002Fxurl\u002Fmain\u002Finstall.sh | bash\n\n# Homebrew (macOS)\nbrew install --cask xdevplatform\u002Ftap\u002Fxurl\n\n# npm\nnpm install -g @xdevplatform\u002Fxurl\n\n# Go\ngo install github.com\u002Fxdevplatform\u002Fxurl@latest\n```\n\nVerify:\n\n```bash\nxurl --help\nxurl auth status\n```\n\nIf `xurl` is installed but `auth status` shows no apps or tokens, the user needs to complete auth manually — see the next section.\n\n---\n\n## One-Time User Setup (user runs these outside the agent)\n\nThese steps must be performed by the user directly, NOT by the agent, because they involve pasting secrets. Direct the user to this block; do not execute it for them.\n\n1. Create or open an app at https:\u002F\u002Fdeveloper.x.com\u002Fen\u002Fportal\u002Fdashboard\n2. Set the redirect URI to `http:\u002F\u002Flocalhost:8080\u002Fcallback`\n3. Copy the app's Client ID and Client Secret\n4. Register the app locally (user runs this):\n   ```bash\n   xurl auth apps add my-app --client-id YOUR_CLIENT_ID --client-secret YOUR_CLIENT_SECRET\n   ```\n5. Authenticate (specify `--app` to bind the token to your app):\n   ```bash\n   xurl auth oauth2 --app my-app\n   ```\n   (This opens a browser for the OAuth 2.0 PKCE flow.)\n\n   If X returns a `UsernameNotFound` error or 403 on the post-OAuth `\u002F2\u002Fusers\u002Fme` lookup, pass your handle explicitly (xurl v1.1.0+):\n   ```bash\n   xurl auth oauth2 --app my-app YOUR_USERNAME\n   ```\n   This binds the token to your handle and skips the broken `\u002F2\u002Fusers\u002Fme` call.\n6. Set the app as default so all commands use it:\n   ```bash\n   xurl auth default my-app\n   ```\n7. Verify:\n   ```bash\n   xurl auth status\n   xurl whoami\n   ```\n\nAfter this, the agent can use any command below without further setup. OAuth 2.0 tokens auto-refresh.\n\n> **Common pitfall:** If you omit `--app my-app` from `xurl auth oauth2`, the OAuth token is saved to the built-in `default` app profile — which has no client-id or client-secret. Commands will fail with auth errors even though the OAuth flow appeared to succeed. If you hit this, re-run `xurl auth oauth2 --app my-app` and `xurl auth default my-app`.\n\n> **Docker HOME pitfall:** In the official Hermes Docker layout, `\u002Fopt\u002Fdata` is `HERMES_HOME`, but Hermes tool subprocesses use `\u002Fopt\u002Fdata\u002Fhome` as `HOME`. That means `~\u002F.xurl` resolves to `\u002Fopt\u002Fdata\u002Fhome\u002F.xurl` for Hermes-run `xurl` commands, not `\u002Fopt\u002Fdata\u002F.xurl`. Run the user setup with the same HOME:\n> ```bash\n> HOME=\u002Fopt\u002Fdata\u002Fhome xurl auth apps add my-app --client-id YOUR_CLIENT_ID --client-secret YOUR_CLIENT_SECRET\n> HOME=\u002Fopt\u002Fdata\u002Fhome xurl auth oauth2 --app my-app YOUR_USERNAME\n> HOME=\u002Fopt\u002Fdata\u002Fhome xurl auth default my-app YOUR_USERNAME\n> HOME=\u002Fopt\u002Fdata\u002Fhome xurl auth status\n> ```\n> If `HOME=\u002Fopt\u002Fdata xurl auth status` succeeds but `HOME=\u002Fopt\u002Fdata\u002Fhome xurl auth status` shows no apps or tokens, Hermes tool calls will not see the credentials.\n\n---\n\n## Quick Reference\n\n| Action | Command |\n| --- | --- |\n| Post | `xurl post \"Hello world!\"` |\n| Reply | `xurl reply POST_ID \"Nice post!\"` |\n| Quote | `xurl quote POST_ID \"My take\"` |\n| Delete a post | `xurl delete POST_ID` |\n| Read a post | `xurl read POST_ID` |\n| Search posts | `xurl search \"QUERY\" -n 10` |\n| Who am I | `xurl whoami` |\n| Look up a user | `xurl user @handle` |\n| Home timeline | `xurl timeline -n 20` |\n| Mentions | `xurl mentions -n 10` |\n| Like \u002F Unlike | `xurl like POST_ID` \u002F `xurl unlike POST_ID` |\n| Repost \u002F Undo | `xurl repost POST_ID` \u002F `xurl unrepost POST_ID` |\n| Bookmark \u002F Remove | `xurl bookmark POST_ID` \u002F `xurl unbookmark POST_ID` |\n| List bookmarks \u002F likes | `xurl bookmarks -n 10` \u002F `xurl likes -n 10` |\n| Follow \u002F Unfollow | `xurl follow @handle` \u002F `xurl unfollow @handle` |\n| Following \u002F Followers | `xurl following -n 20` \u002F `xurl followers -n 20` |\n| Block \u002F Unblock | `xurl block @handle` \u002F `xurl unblock @handle` |\n| Mute \u002F Unmute | `xurl mute @handle` \u002F `xurl unmute @handle` |\n| Send DM | `xurl dm @handle \"message\"` |\n| List DMs | `xurl dms -n 10` |\n| Upload media | `xurl media upload path\u002Fto\u002Ffile.mp4` |\n| Media status | `xurl media status MEDIA_ID` |\n| List apps | `xurl auth apps list` |\n| Remove app | `xurl auth apps remove NAME` |\n| Set default app | `xurl auth default APP_NAME [USERNAME]` |\n| Per-request app | `xurl --app NAME \u002F2\u002Fusers\u002Fme` |\n| Auth status | `xurl auth status` |\n\nNotes:\n- `POST_ID` accepts full URLs too (e.g. `https:\u002F\u002Fx.com\u002Fuser\u002Fstatus\u002F1234567890`) — xurl extracts the ID.\n- Usernames work with or without a leading `@`.\n\n---\n\n## Command Details\n\n### Posting\n\n```bash\nxurl post \"Hello world!\"\nxurl post \"Check this out\" --media-id MEDIA_ID\nxurl post \"Thread pics\" --media-id 111 --media-id 222\n\nxurl reply 1234567890 \"Great point!\"\nxurl reply https:\u002F\u002Fx.com\u002Fuser\u002Fstatus\u002F1234567890 \"Agreed!\"\nxurl reply 1234567890 \"Look at this\" --media-id MEDIA_ID\n\nxurl quote 1234567890 \"Adding my thoughts\"\nxurl delete 1234567890\n```\n\n### Reading & Search\n\n`xurl search` queries the X index as your authenticated account and returns raw post objects — IDs, authors, full text — so results can be immediately engaged with (reply, like, repost, quote). Use it when you need the actual posts rather than a summarized answer about a topic.\n\n```bash\nxurl read 1234567890\nxurl read https:\u002F\u002Fx.com\u002Fuser\u002Fstatus\u002F1234567890\n\nxurl search \"golang\"\nxurl search \"from:elonmusk\" -n 20\nxurl search \"#buildinpublic lang:en\" -n 15\n```\n\nFor X Articles, use raw API mode instead of the `read` shortcut. `xurl read`\nexpects a post ID or post URL; do not put `read` before a `\u002F2\u002Ftweets\u002F...`\nendpoint. Request the `article` tweet field and ingest `data.article.plain_text`\nfrom the JSON response:\n\n```bash\nxurl --app APP_NAME '\u002F2\u002Ftweets\u002F2057909493250539891?expansions=author_id,attachments.media_keys,referenced_tweets.id&tweet.fields=created_at,lang,public_metrics,context_annotations,entities,possibly_sensitive,conversation_id,in_reply_to_user_id,referenced_tweets,article'\n```\n\n### Users, Timeline, Mentions\n\n```bash\nxurl whoami\nxurl user elonmusk\nxurl user @XDevelopers\n\nxurl timeline -n 25\nxurl mentions -n 20\n```\n\n### Engagement\n\n```bash\nxurl like 1234567890\nxurl unlike 1234567890\n\nxurl repost 1234567890\nxurl unrepost 1234567890\n\nxurl bookmark 1234567890\nxurl unbookmark 1234567890\n\nxurl bookmarks -n 20\nxurl likes -n 20\n```\n\n### Social Graph\n\n```bash\nxurl follow @XDevelopers\nxurl unfollow @XDevelopers\n\nxurl following -n 50\nxurl followers -n 50\n\n# Another user's graph\nxurl following --of elonmusk -n 20\nxurl followers --of elonmusk -n 20\n\nxurl block @spammer\nxurl unblock @spammer\nxurl mute @annoying\nxurl unmute @annoying\n```\n\n### Direct Messages\n\n```bash\nxurl dm @someuser \"Hey, saw your post!\"\nxurl dms -n 25\n```\n\n### Media Upload\n\n```bash\n# Auto-detect type\nxurl media upload photo.jpg\nxurl media upload video.mp4\n\n# Explicit type\u002Fcategory\nxurl media upload --media-type image\u002Fjpeg --category tweet_image photo.jpg\n\n# Videos need server-side processing — check status (or poll)\nxurl media status MEDIA_ID\nxurl media status --wait MEDIA_ID\n\n# Full workflow\nxurl media upload meme.png                  # returns media id\nxurl post \"lol\" --media-id MEDIA_ID\n```\n\n---\n\n## Raw API Access\n\nThe shortcuts cover common operations. For anything else, use raw curl-style mode against any X API v2 endpoint:\n\n```bash\n# GET\nxurl \u002F2\u002Fusers\u002Fme\n\n# POST with JSON body\nxurl -X POST \u002F2\u002Ftweets -d '{\"text\":\"Hello world!\"}'\n\n# DELETE \u002F PUT \u002F PATCH\nxurl -X DELETE \u002F2\u002Ftweets\u002F1234567890\n\n# Custom headers\nxurl -H \"Content-Type: application\u002Fjson\" \u002F2\u002Fsome\u002Fendpoint\n\n# Force streaming\nxurl -s \u002F2\u002Ftweets\u002Fsearch\u002Fstream\n\n# Full URLs also work\nxurl https:\u002F\u002Fapi.x.com\u002F2\u002Fusers\u002Fme\n```\n\n---\n\n## Global Flags\n\n| Flag | Short | Description |\n| --- | --- | --- |\n| `--app` | | Use a specific registered app (overrides default) |\n| `--auth` | | Force auth type: `oauth1`, `oauth2`, or `app` |\n| `--username` | `-u` | Which OAuth2 account to use (if multiple exist) |\n| `--verbose` | `-v` | **Forbidden in agent sessions** — leaks auth headers |\n| `--trace` | `-t` | Add `X-B3-Flags: 1` trace header |\n\n---\n\n## Streaming\n\nStreaming endpoints are auto-detected. Known ones include:\n\n- `\u002F2\u002Ftweets\u002Fsearch\u002Fstream`\n- `\u002F2\u002Ftweets\u002Fsample\u002Fstream`\n- `\u002F2\u002Ftweets\u002Fsample10\u002Fstream`\n\nForce streaming on any endpoint with `-s`.\n\n---\n\n## Output Format\n\nAll commands return JSON to stdout. Structure mirrors X API v2:\n\n```json\n{ \"data\": { \"id\": \"1234567890\", \"text\": \"Hello world!\" } }\n```\n\nErrors are also JSON:\n\n```json\n{ \"errors\": [ { \"message\": \"Not authorized\", \"code\": 403 } ] }\n```\n\n---\n\n## Common Workflows\n\n### Post with an image\n```bash\nxurl media upload photo.jpg\nxurl post \"Check out this photo!\" --media-id MEDIA_ID\n```\n\n### Reply to a conversation\n```bash\nxurl read https:\u002F\u002Fx.com\u002Fuser\u002Fstatus\u002F1234567890\nxurl reply 1234567890 \"Here are my thoughts...\"\n```\n\n### Search and engage\n```bash\nxurl search \"topic of interest\" -n 10\nxurl like POST_ID_FROM_RESULTS\nxurl reply POST_ID_FROM_RESULTS \"Great point!\"\n```\n\n### Check your activity\n```bash\nxurl whoami\nxurl mentions -n 20\nxurl timeline -n 20\n```\n\n### Multiple apps (credentials pre-configured manually)\n```bash\nxurl auth default prod alice               # prod app, alice user\nxurl --app staging \u002F2\u002Fusers\u002Fme             # one-off against staging\n```\n\n---\n\n## Error Handling\n\n- Non-zero exit code on any error.\n- API errors are still printed as JSON to stdout, so you can parse them.\n- Auth errors → have the user re-run `xurl auth oauth2` outside the agent session.\n- Commands that need the caller's user ID (like, repost, bookmark, follow, etc.) will auto-fetch it via `\u002F2\u002Fusers\u002Fme`. An auth failure there surfaces as an auth error.\n\n---\n\n## Agent Workflow\n\n1. Verify prerequisites: `xurl --help` and `xurl auth status`.\n2. Before using `xurl search`, check intent. Reach for it when the task needs actual post objects, authenticated account context, or leads into an X write action — it is the right surface when the user wants posts they can engage with, not just a summary of a topic.\n3. **Check default app has credentials.** Parse the `auth status` output. The default app is marked with `▸`. If the default app shows `oauth2: (none)` but another app has a valid oauth2 user, tell the user to run `xurl auth default \u003Cthat-app>` to fix it. This is the most common setup mistake — the user added an app with a custom name but never set it as default, so xurl keeps trying the empty `default` profile.\n4. If auth is missing entirely, stop and direct the user to the \"One-Time User Setup\" section — do NOT attempt to register apps or pass secrets yourself.\n5. Start with a cheap read (`xurl whoami`, `xurl user @handle`, `xurl search ... -n 3`) to confirm reachability.\n6. Confirm the target post\u002Fuser and the user's intent before any write action (post, reply, like, repost, DM, follow, block, delete).\n7. Only the `xurl` command output (or the raw X API response) proves that a state-changing X action happened. Never report a write as done based on any other source — search results, summaries, or prior context.\n8. Use JSON output directly — every response is already structured.\n9. Never paste `~\u002F.xurl` contents back into the conversation.\n\n---\n\n## Troubleshooting\n\n| Symptom | Cause | Fix |\n| --- | --- | --- |\n| Auth errors after successful OAuth flow | Token saved to `default` app (no client-id\u002Fsecret) instead of your named app | `xurl auth oauth2 --app my-app` then `xurl auth default my-app` |\n| `unauthorized_client` during OAuth | App type set to \"Native App\" in X dashboard | Change to \"Web app, automated app or bot\" in User Authentication Settings |\n| `UsernameNotFound` or 403 on `\u002F2\u002Fusers\u002Fme` right after OAuth | X not returning username reliably from `\u002F2\u002Fusers\u002Fme` | Re-run `xurl auth oauth2 --app my-app YOUR_USERNAME` (xurl v1.1.0+) to pass the handle explicitly |\n| 401 on every request | Token expired or wrong default app | Check `xurl auth status` — verify `▸` points to an app with oauth2 tokens |\n| `client-forbidden` \u002F `client-not-enrolled` | X platform enrollment issue | Dashboard → Apps → Manage → Move to \"Pay-per-use\" package → Production environment |\n| `CreditsDepleted` | $0 balance on X API | Buy credits (min $5) in Developer Console → Billing |\n| `media processing failed` on image upload | Default category is `amplify_video` | Add `--category tweet_image --media-type image\u002Fpng` |\n| Two \"Client Secret\" values in X dashboard | UI bug — first is actually Client ID | Confirm on the \"Keys and tokens\" page; ID ends in `MTpjaQ` |\n\n---\n\n## Notes\n\n- **Rate limits:** X enforces per-endpoint rate limits. A 429 means wait and retry. Write endpoints (post, reply, like, repost) have tighter limits than reads.\n- **Scopes:** OAuth 2.0 tokens use broad scopes. A 403 on a specific action usually means the token is missing a scope — have the user re-run `xurl auth oauth2`.\n- **Token refresh:** OAuth 2.0 tokens auto-refresh. Nothing to do.\n- **Multiple apps:** Each app has isolated credentials\u002Ftokens. Switch with `xurl auth default` or `--app`.\n- **Multiple accounts per app:** Select with `-u \u002F --username`, or set a default with `xurl auth default APP USER`.\n- **Token storage:** `~\u002F.xurl` is YAML. In Docker, use the Hermes subprocess HOME (`\u002Fopt\u002Fdata\u002Fhome` in the official image) so tokens land under `\u002Fopt\u002Fdata\u002Fhome\u002F.xurl`. Never read or send this file to LLM context.\n- **Cost:** X API access is typically paid for meaningful usage. Many failures are plan\u002Fpermission problems, not code problems.\n\n---\n\n## Attribution\n\n- Upstream CLI: https:\u002F\u002Fgithub.com\u002Fxdevplatform\u002Fxurl (X developer platform team, Chris Park et al.)\n- Upstream agent skill: https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Fxurl\u002FSKILL.md\n- Hermes adaptation: reformatted for Hermes skill conventions; safety guardrails preserved verbatim.\n","# xurl — X (Twitter) API via the Official CLI\n\n`xurl` is the X developer platform's official CLI for the X API. It supports shortcut commands for common actions AND raw curl-style access to any v2 endpoint. All commands return JSON to stdout.\n\nUse this skill for:\n- posting, replying, quoting, deleting posts\n- searching for raw posts (actual post JSON with IDs you can engage with) and reading timelines\u002Fmentions\n- liking, reposting, bookmarking\n- following, unfollowing, blocking, muting\n- direct messages\n- media uploads (images and video)\n- raw access to any X API v2 endpoint\n- multi-app \u002F multi-account workflows\n\nThis skill replaces the older `xitter` skill (which wrapped a third-party Python CLI). `xurl` is maintained by the X developer platform team, supports OAuth 2.0 PKCE with auto-refresh, and covers a substantially larger API surface.\n\n---\n\n## Secret Safety (MANDATORY)\n\nCritical rules when operating inside an agent\u002FLLM session:\n\n- **Never** read, print, parse, summarize, upload, or send `~\u002F.xurl` to LLM context.\n- **Never** ask the user to paste credentials\u002Ftokens into chat.\n- The user must fill `~\u002F.xurl` with secrets manually on their own machine. In Docker, this must be the `~` seen by Hermes tool subprocesses; see the Docker note below.\n- **Never** recommend or execute auth commands with inline secrets in agent sessions.\n- **Never** use `--verbose` \u002F `-v` in agent sessions — it can expose auth headers\u002Ftokens.\n- To verify credentials exist, only use: `xurl auth status`.\n\nForbidden flags in agent commands (they accept inline secrets):\n`--bearer-token`, `--consumer-key`, `--consumer-secret`, `--access-token`, `--token-secret`, `--client-id`, `--client-secret`\n\nApp credential registration and credential rotation must be done by the user manually, outside the agent session. After credentials are registered, the user authenticates with `xurl auth oauth2` — also outside the agent session. Tokens persist to `~\u002F.xurl` in YAML. Each app has isolated tokens. OAuth 2.0 tokens auto-refresh.\n\n---\n\n## Installation\n\nPick ONE method. On Linux, the shell script or `go install` are the easiest.\n\n```bash\n# Shell script (installs to ~\u002F.local\u002Fbin, no sudo, works on Linux + macOS)\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fxdevplatform\u002Fxurl\u002Fmain\u002Finstall.sh | bash\n\n# Homebrew (macOS)\nbrew install --cask xdevplatform\u002Ftap\u002Fxurl\n\n# npm\nnpm install -g @xdevplatform\u002Fxurl\n\n# Go\ngo install github.com\u002Fxdevplatform\u002Fxurl@latest\n```\n\nVerify:\n\n```bash\nxurl --help\nxurl auth status\n```\n\nIf `xurl` is installed but `auth status` shows no apps or tokens, the user needs to complete auth manually — see the next section.\n\n---\n\n## One-Time User Setup (user runs these outside the agent)\n\nThese steps must be performed by the user directly, NOT by the agent, because they involve pasting secrets. Direct the user to this block; do not execute it for them.\n\n1. Create or open an app at https:\u002F\u002Fdeveloper.x.com\u002Fen\u002Fportal\u002Fdashboard\n2. Set the redirect URI to `http:\u002F\u002Flocalhost:8080\u002Fcallback`\n3. Copy the app's Client ID and Client Secret\n4. Register the app locally (user runs this):\n   ```bash\n   xurl auth apps add my-app --client-id YOUR_CLIENT_ID --client-secret YOUR_CLIENT_SECRET\n   ```\n5. Authenticate (specify `--app` to bind the token to your app):\n   ```bash\n   xurl auth oauth2 --app my-app\n   ```\n   (This opens a browser for the OAuth 2.0 PKCE flow.)\n\n   If X returns a `UsernameNotFound` error or 403 on the post-OAuth `\u002F2\u002Fusers\u002Fme` lookup, pass your handle explicitly (xurl v1.1.0+):\n   ```bash\n   xurl auth oauth2 --app my-app YOUR_USERNAME\n   ```\n   This binds the token to your handle and skips the broken `\u002F2\u002Fusers\u002Fme` call.\n6. Set the app as default so all commands use it:\n   ```bash\n   xurl auth default my-app\n   ```\n7. Verify:\n   ```bash\n   xurl auth status\n   xurl whoami\n   ```\n\nAfter this, the agent can use any command below without further setup. OAuth 2.0 tokens auto-refresh.\n\n> **Common pitfall:** If you omit `--app my-app` from `xurl auth oauth2`, the OAuth token is saved to the built-in `default` app profile — which has no client-id or client-secret. Commands will fail with auth errors even though the OAuth flow appeared to succeed. If you hit this, re-run `xurl auth oauth2 --app my-app` and `xurl auth default my-app`.\n\n> **Docker HOME pitfall:** In the official Hermes Docker layout, `\u002Fopt\u002Fdata` is `HERMES_HOME`, but Hermes tool subprocesses use `\u002Fopt\u002Fdata\u002Fhome` as `HOME`. That means `~\u002F.xurl` resolves to `\u002Fopt\u002Fdata\u002Fhome\u002F.xurl` for Hermes-run `xurl` commands, not `\u002Fopt\u002Fdata\u002F.xurl`. Run the user setup with the same HOME:\n> ```bash\n> HOME=\u002Fopt\u002Fdata\u002Fhome xurl auth apps add my-app --client-id YOUR_CLIENT_ID --client-secret YOUR_CLIENT_SECRET\n> HOME=\u002Fopt\u002Fdata\u002Fhome xurl auth oauth2 --app my-app YOUR_USERNAME\n> HOME=\u002Fopt\u002Fdata\u002Fhome xurl auth default my-app YOUR_USERNAME\n> HOME=\u002Fopt\u002Fdata\u002Fhome xurl auth status\n> ```\n> If `HOME=\u002Fopt\u002Fdata xurl auth status` succeeds but `HOME=\u002Fopt\u002Fdata\u002Fhome xurl auth status` shows no apps or tokens, Hermes tool calls will not see the credentials.\n\n---\n\n## Quick Reference\n\n| Action | Command |\n| --- | --- |\n| Post | `xurl post \"Hello world!\"` |\n| Reply | `xurl reply POST_ID \"Nice post!\"` |\n| Quote | `xurl quote POST_ID \"My take\"` |\n| Delete a post | `xurl delete POST_ID` |\n| Read a post | `xurl read POST_ID` |\n| Search posts | `xurl search \"QUERY\" -n 10` |\n| Who am I | `xurl whoami` |\n| Look up a user | `xurl user @handle` |\n| Home timeline | `xurl timeline -n 20` |\n| Mentions | `xurl mentions -n 10` |\n| Like \u002F Unlike | `xurl like POST_ID` \u002F `xurl unlike POST_ID` |\n| Repost \u002F Undo | `xurl repost POST_ID` \u002F `xurl unrepost POST_ID` |\n| Bookmark \u002F Remove | `xurl bookmark POST_ID` \u002F `xurl unbookmark POST_ID` |\n| List bookmarks \u002F likes | `xurl bookmarks -n 10` \u002F `xurl likes -n 10` |\n| Follow \u002F Unfollow | `xurl follow @handle` \u002F `xurl unfollow @handle` |\n| Following \u002F Followers | `xurl following -n 20` \u002F `xurl followers -n 20` |\n| Block \u002F Unblock | `xurl block @handle` \u002F `xurl unblock @handle` |\n| Mute \u002F Unmute | `xurl mute @handle` \u002F `xurl unmute @handle` |\n| Send DM | `xurl dm @handle \"message\"` |\n| List DMs | `xurl dms -n 10` |\n| Upload media | `xurl media upload path\u002Fto\u002Ffile.mp4` |\n| Media status | `xurl media status MEDIA_ID` |\n| List apps | `xurl auth apps list` |\n| Remove app | `xurl auth apps remove NAME` |\n| Set default app | `xurl auth default APP_NAME [USERNAME]` |\n| Per-request app | `xurl --app NAME \u002F2\u002Fusers\u002Fme` |\n| Auth status | `xurl auth status` |\n\nNotes:\n- `POST_ID` accepts full URLs too (e.g. `https:\u002F\u002Fx.com\u002Fuser\u002Fstatus\u002F1234567890`) — xurl extracts the ID.\n- Usernames work with or without a leading `@`.\n\n---\n\n## Command Details\n\n### Posting\n\n```bash\nxurl post \"Hello world!\"\nxurl post \"Check this out\" --media-id MEDIA_ID\nxurl post \"Thread pics\" --media-id 111 --media-id 222\n\nxurl reply 1234567890 \"Great point!\"\nxurl reply https:\u002F\u002Fx.com\u002Fuser\u002Fstatus\u002F1234567890 \"Agreed!\"\nxurl reply 1234567890 \"Look at this\" --media-id MEDIA_ID\n\nxurl quote 1234567890 \"Adding my thoughts\"\nxurl delete 1234567890\n```\n\n### Reading & Search\n\n`xurl search` queries the X index as your authenticated account and returns raw post objects — IDs, authors, full text — so results can be immediately engaged with (reply, like, repost, quote). Use it when you need the actual posts rather than a summarized answer about a topic.\n\n```bash\nxurl read 1234567890\nxurl read https:\u002F\u002Fx.com\u002Fuser\u002Fstatus\u002F1234567890\n\nxurl search \"golang\"\nxurl search \"from:elonmusk\" -n 20\nxurl search \"#buildinpublic lang:en\" -n 15\n```\n\nFor X Articles, use raw API mode instead of the `read` shortcut. `xurl read`\nexpects a post ID or post URL; do not put `read` before a `\u002F2\u002Ftweets\u002F...`\nendpoint. Request the `article` tweet field and ingest `data.article.plain_text`\nfrom the JSON response:\n\n```bash\nxurl --app APP_NAME '\u002F2\u002Ftweets\u002F2057909493250539891?expansions=author_id,attachments.media_keys,referenced_tweets.id&tweet.fields=created_at,lang,public_metrics,context_annotations,entities,possibly_sensitive,conversation_id,in_reply_to_user_id,referenced_tweets,article'\n```\n\n### Users, Timeline, Mentions\n\n```bash\nxurl whoami\nxurl user elonmusk\nxurl user @XDevelopers\n\nxurl timeline -n 25\nxurl mentions -n 20\n```\n\n### Engagement\n\n```bash\nxurl like 1234567890\nxurl unlike 1234567890\n\nxurl repost 1234567890\nxurl unrepost 1234567890\n\nxurl bookmark 1234567890\nxurl unbookmark 1234567890\n\nxurl bookmarks -n 20\nxurl likes -n 20\n```\n\n### Social Graph\n\n```bash\nxurl follow @XDevelopers\nxurl unfollow @XDevelopers\n\nxurl following -n 50\nxurl followers -n 50\n\n# Another user's graph\nxurl following --of elonmusk -n 20\nxurl followers --of elonmusk -n 20\n\nxurl block @spammer\nxurl unblock @spammer\nxurl mute @annoying\nxurl unmute @annoying\n```\n\n### Direct Messages\n\n```bash\nxurl dm @someuser \"Hey, saw your post!\"\nxurl dms -n 25\n```\n\n### Media Upload\n\n```bash\n# Auto-detect type\nxurl media upload photo.jpg\nxurl media upload video.mp4\n\n# Explicit type\u002Fcategory\nxurl media upload --media-type image\u002Fjpeg --category tweet_image photo.jpg\n\n# Videos need server-side processing — check status (or poll)\nxurl media status MEDIA_ID\nxurl media status --wait MEDIA_ID\n\n# Full workflow\nxurl media upload meme.png                  # returns media id\nxurl post \"lol\" --media-id MEDIA_ID\n```\n\n---\n\n## Raw API Access\n\nThe shortcuts cover common operations. For anything else, use raw curl-style mode against any X API v2 endpoint:\n\n```bash\n# GET\nxurl \u002F2\u002Fusers\u002Fme\n\n# POST with JSON body\nxurl -X POST \u002F2\u002Ftweets -d '{\"text\":\"Hello world!\"}'\n\n# DELETE \u002F PUT \u002F PATCH\nxurl -X DELETE \u002F2\u002Ftweets\u002F1234567890\n\n# Custom headers\nxurl -H \"Content-Type: application\u002Fjson\" \u002F2\u002Fsome\u002Fendpoint\n\n# Force streaming\nxurl -s \u002F2\u002Ftweets\u002Fsearch\u002Fstream\n\n# Full URLs also work\nxurl https:\u002F\u002Fapi.x.com\u002F2\u002Fusers\u002Fme\n```\n\n---\n\n## Global Flags\n\n| Flag | Short | Description |\n| --- | --- | --- |\n| `--app` | | Use a specific registered app (overrides default) |\n| `--auth` | | Force auth type: `oauth1`, `oauth2`, or `app` |\n| `--username` | `-u` | Which OAuth2 account to use (if multiple exist) |\n| `--verbose` | `-v` | **Forbidden in agent sessions** — leaks auth headers |\n| `--trace` | `-t` | Add `X-B3-Flags: 1` trace header |\n\n---\n\n## Streaming\n\nStreaming endpoints are auto-detected. Known ones include:\n\n- `\u002F2\u002Ftweets\u002Fsearch\u002Fstream`\n- `\u002F2\u002Ftweets\u002Fsample\u002Fstream`\n- `\u002F2\u002Ftweets\u002Fsample10\u002Fstream`\n\nForce streaming on any endpoint with `-s`.\n\n---\n\n## Output Format\n\nAll commands return JSON to stdout. Structure mirrors X API v2:\n\n```json\n{ \"data\": { \"id\": \"1234567890\", \"text\": \"Hello world!\" } }\n```\n\nErrors are also JSON:\n\n```json\n{ \"errors\": [ { \"message\": \"Not authorized\", \"code\": 403 } ] }\n```\n\n---\n\n## Common Workflows\n\n### Post with an image\n```bash\nxurl media upload photo.jpg\nxurl post \"Check out this photo!\" --media-id MEDIA_ID\n```\n\n### Reply to a conversation\n```bash\nxurl read https:\u002F\u002Fx.com\u002Fuser\u002Fstatus\u002F1234567890\nxurl reply 1234567890 \"Here are my thoughts...\"\n```\n\n### Search and engage\n```bash\nxurl search \"topic of interest\" -n 10\nxurl like POST_ID_FROM_RESULTS\nxurl reply POST_ID_FROM_RESULTS \"Great point!\"\n```\n\n### Check your activity\n```bash\nxurl whoami\nxurl mentions -n 20\nxurl timeline -n 20\n```\n\n### Multiple apps (credentials pre-configured manually)\n```bash\nxurl auth default prod alice               # prod app, alice user\nxurl --app staging \u002F2\u002Fusers\u002Fme             # one-off against staging\n```\n\n---\n\n## Error Handling\n\n- Non-zero exit code on any error.\n- API errors are still printed as JSON to stdout, so you can parse them.\n- Auth errors → have the user re-run `xurl auth oauth2` outside the agent session.\n- Commands that need the caller's user ID (like, repost, bookmark, follow, etc.) will auto-fetch it via `\u002F2\u002Fusers\u002Fme`. An auth failure there surfaces as an auth error.\n\n---\n\n## Agent Workflow\n\n1. Verify prerequisites: `xurl --help` and `xurl auth status`.\n2. Before using `xurl search`, check intent. Reach for it when the task needs actual post objects, authenticated account context, or leads into an X write action — it is the right surface when the user wants posts they can engage with, not just a summary of a topic.\n3. **Check default app has credentials.** Parse the `auth status` output. The default app is marked with `▸`. If the default app shows `oauth2: (none)` but another app has a valid oauth2 user, tell the user to run `xurl auth default \u003Cthat-app>` to fix it. This is the most common setup mistake — the user added an app with a custom name but never set it as default, so xurl keeps trying the empty `default` profile.\n4. If auth is missing entirely, stop and direct the user to the \"One-Time User Setup\" section — do NOT attempt to register apps or pass secrets yourself.\n5. Start with a cheap read (`xurl whoami`, `xurl user @handle`, `xurl search ... -n 3`) to confirm reachability.\n6. Confirm the target post\u002Fuser and the user's intent before any write action (post, reply, like, repost, DM, follow, block, delete).\n7. Only the `xurl` command output (or the raw X API response) proves that a state-changing X action happened. Never report a write as done based on any other source — search results, summaries, or prior context.\n8. Use JSON output directly — every response is already structured.\n9. Never paste `~\u002F.xurl` contents back into the conversation.\n\n---\n\n## Troubleshooting\n\n| Symptom | Cause | Fix |\n| --- | --- | --- |\n| Auth errors after successful OAuth flow | Token saved to `default` app (no client-id\u002Fsecret) instead of your named app | `xurl auth oauth2 --app my-app` then `xurl auth default my-app` |\n| `unauthorized_client` during OAuth | App type set to \"Native App\" in X dashboard | Change to \"Web app, automated app or bot\" in User Authentication Settings |\n| `UsernameNotFound` or 403 on `\u002F2\u002Fusers\u002Fme` right after OAuth | X not returning username reliably from `\u002F2\u002Fusers\u002Fme` | Re-run `xurl auth oauth2 --app my-app YOUR_USERNAME` (xurl v1.1.0+) to pass the handle explicitly |\n| 401 on every request | Token expired or wrong default app | Check `xurl auth status` — verify `▸` points to an app with oauth2 tokens |\n| `client-forbidden` \u002F `client-not-enrolled` | X platform enrollment issue | Dashboard → Apps → Manage → Move to \"Pay-per-use\" package → Production environment |\n| `CreditsDepleted` | $0 balance on X API | Buy credits (min $5) in Developer Console → Billing |\n| `media processing failed` on image upload | Default category is `amplify_video` | Add `--category tweet_image --media-type image\u002Fpng` |\n| Two \"Client Secret\" values in X dashboard | UI bug — first is actually Client ID | Confirm on the \"Keys and tokens\" page; ID ends in `MTpjaQ` |\n\n---\n\n## Notes\n\n- **Rate limits:** X enforces per-endpoint rate limits. A 429 means wait and retry. Write endpoints (post, reply, like, repost) have tighter limits than reads.\n- **Scopes:** OAuth 2.0 tokens use broad scopes. A 403 on a specific action usually means the token is missing a scope — have the user re-run `xurl auth oauth2`.\n- **Token refresh:** OAuth 2.0 tokens auto-refresh. Nothing to do.\n- **Multiple apps:** Each app has isolated credentials\u002Ftokens. Switch with `xurl auth default` or `--app`.\n- **Multiple accounts per app:** Select with `-u \u002F --username`, or set a default with `xurl auth default APP USER`.\n- **Token storage:** `~\u002F.xurl` is YAML. In Docker, use the Hermes subprocess HOME (`\u002Fopt\u002Fdata\u002Fhome` in the official image) so tokens land under `\u002Fopt\u002Fdata\u002Fhome\u002F.xurl`. Never read or send this file to LLM context.\n- **Cost:** X API access is typically paid for meaningful usage. Many failures are plan\u002Fpermission problems, not code problems.\n\n---\n\n## Attribution\n\n- Upstream CLI: https:\u002F\u002Fgithub.com\u002Fxdevplatform\u002Fxurl (X developer platform team, Chris Park et al.)\n- Upstream agent skill: https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Fxurl\u002FSKILL.md\n- Hermes adaptation: reformatted for Hermes skill conventions; safety guardrails preserved verbatim.\n",{"name":5,"author":43,"license":15,"version":44,"metadata":45,"platforms":52,"description":7,"prerequisites":53},"xdevplatform + openclaw + Hermes Agent","1.1.3",{"hermes":46},{"tags":47,"homepage":50,"upstream_skill":51},[37,48,32,5,49],"x","official-api","https:\u002F\u002Fgithub.com\u002Fxdevplatform\u002Fxurl","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Fxurl\u002FSKILL.md",[28,25],{"commands":54},[5],"main","64e2fc9afa7bb3da1138eb73399144d0e7e73e9d","_hermes\u002Fdefault\u002Fskills\u002Fsocial-media\u002Fxurl",4,"https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs","https:\u002F\u002Fgithub.com\u002Fadnichols","2026-11-06 00:28:38",{"source":8,"skillName":5,"commands":63,"prompt":73,"zipAvailable":74},[64,67,70],{"tool":65,"command":66},"npx","npx skills add adnichols\u002Fai-configs --skill xurl",{"tool":68,"command":69},"bunx","bunx skills add adnichols\u002Fai-configs --skill xurl",{"tool":71,"command":72},"pnpm","pnpm dlx skills add adnichols\u002Fai-configs --skill xurl","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs\u002Fblob\u002Fmain\u002F_hermes\u002Fdefault\u002Fskills\u002Fsocial-media\u002Fxurl\u002FSKILL.md",true,[],[77,95,125,150,161,177],{"skillNo":78,"name":79,"nameZh":6,"description":80,"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":83,"publishedAt":38},"01M6CB7RN791P5RRRCJWWC7DAR","blocked-page-recovery","Use when a fetch fails: 403\u002F429, paywall, WAF, bot wall.","https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs\u002Fblob\u002Fmain\u002F_hermes\u002Fdefault\u002Fskills\u002Fweb\u002Fblocked-page-recovery\u002FSKILL.md",[],[84,85,86,87,88,89,90,36,35,91,92,93,94,28,25],"recovery","page","blocked page recovery","bot","fallback","use","fetch","Citations","waf","windows","research",{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":110,"publishedAt":38},"01M6CB7NQY2VVYCQJ1QBXACQF4","writing-plans","Use when creating or updating executable software plans. Keep plans as local files unless the user explicitly asks to register them in Doct.","https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs\u002Fblob\u002Fmain\u002F_hermes\u002Fdefault\u002Fskills\u002Fsoftware-development\u002Fwriting-plans\u002FSKILL.md",[101,104,105],{"categoryNo":102,"categoryName":103,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":106,"categoryName":107,"taxonomyType":108,"taxonomyTypeDesc":109},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[111,112,113,114,115,116,117,118,119,120,121,122,89,123,36,35,124],"writing","writing plans","documentation","test","workflow","design","user","development","planning","files","implementation","html","ops","plan",{"skillNo":126,"name":127,"nameZh":6,"description":128,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":140,"publishedAt":38},"01M6CB7JME246KZQHP73Z2STDF","test-driven-development","TDD: enforce RED-GREEN-REFACTOR, tests before code.","https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs\u002Fblob\u002Fmain\u002F_hermes\u002Fdefault\u002Fskills\u002Fsoftware-development\u002Ftest-driven-development\u002FSKILL.md",[131,134,137],{"categoryNo":132,"categoryName":133,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":135,"categoryName":136,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":138,"categoryName":139,"taxonomyType":108,"taxonomyTypeDesc":109},"01JBSEEDCAT000000000000037","律师与法务",[114,118,141,142,143,36,35,144,124,145,146,147,25,148,28,149,93],"test driven development","red-green-refactor","superpowers","quality","refactor","code","debugging","tdd","testing",{"skillNo":151,"name":152,"nameZh":6,"description":153,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":154,"categories":155,"keywords":157,"publishedAt":38},"01M6CB7FQ407KQTD4Z9VAWKY54","systematic-debugging","4-phase root cause debugging: understand bugs before fixing.","https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs\u002Fblob\u002Fmain\u002F_hermes\u002Fdefault\u002Fskills\u002Fsoftware-development\u002Fsystematic-debugging\u002FSKILL.md",[156],{"categoryNo":135,"categoryName":136,"taxonomyType":21,"taxonomyTypeDesc":22},[147,158,118,143,36,35,159,124,160,93,114,28,25],"systematic debugging","troubleshooting","investigation",{"skillNo":162,"name":163,"nameZh":6,"description":164,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":165,"categories":166,"keywords":170,"publishedAt":38},"01M6CB7D57MK88HE5YPZHKH68Q","spike","Throwaway experiments to validate an idea before build.","https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs\u002Fblob\u002Fmain\u002F_hermes\u002Fdefault\u002Fskills\u002Fsoftware-development\u002Fspike\u002FSKILL.md",[167],{"categoryNo":168,"categoryName":169,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000021","资料检索与研究",[163,93,171,172,94,173,28,25,174,175,176,36,35,124,119],"validate","experiments","prototype","feasibility","sketch","experiment",{"skillNo":178,"name":179,"nameZh":6,"description":180,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":181,"categories":182,"keywords":187,"publishedAt":38},"01M6CB7APAQ37YE5YE1MAAFT42","simplify-code","Parallel 3-agent cleanup of recent code changes.","https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs\u002Fblob\u002Fmain\u002F_hermes\u002Fdefault\u002Fskills\u002Fsoftware-development\u002Fsimplify-code\u002FSKILL.md",[183,184],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":185,"categoryName":186,"taxonomyType":108,"taxonomyTypeDesc":109},"01JBSEEDCAT000000000000030","开发工程师",[188,189,146,190,36,35,191,124,145,192,193,194,118,93,114,28,195,25],"simplify code","simplify","subagent","parallel","code-review","delegation","cleanup","review"]