@symerian/symi 3.0.17 → 3.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/dist/{audio-preflight-CBDFctZN.js → audio-preflight-BfmZbg4Y.js} +4 -4
  2. package/dist/{audio-preflight-gsZSpG-6.js → audio-preflight-DcuC-liM.js} +4 -4
  3. package/dist/build-info.json +3 -3
  4. package/dist/bundled/boot-md/handler.js +8 -8
  5. package/dist/bundled/session-memory/handler.js +7 -7
  6. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  7. package/dist/{chrome-nPMY1XTJ.js → chrome-Bo7cbvFK.js} +5 -5
  8. package/dist/{chrome-BjVab8gM.js → chrome-DYp18Q0t.js} +5 -5
  9. package/dist/{deliver-D-QFqm31.js → deliver-ChSIbiMM.js} +1 -1
  10. package/dist/{deliver-B4-bcot9.js → deliver-DEgRQM4J.js} +1 -1
  11. package/dist/extensionAPI.js +7 -7
  12. package/dist/{image-CDwtQjmt.js → image-Bx-hvoNJ.js} +1 -1
  13. package/dist/{image-CcS-vzTA.js → image-CQl_mjWk.js} +1 -1
  14. package/dist/llm-slug-generator.js +7 -7
  15. package/dist/{manager-BnEdHzmO.js → manager-D_pn0urG.js} +1 -1
  16. package/dist/{manager-09r0qPze.js → manager-YQxK2t0C.js} +1 -1
  17. package/dist/{pi-embedded-CWsY69-4.js → pi-embedded-CLw_ZzEZ.js} +16 -16
  18. package/dist/{pi-embedded-helpers-BBMy-lqr.js → pi-embedded-helpers-B5I53aw6.js} +4 -4
  19. package/dist/{pi-embedded-helpers-ChEYbgVj.js → pi-embedded-helpers-sUAEIC9X.js} +4 -4
  20. package/dist/plugin-sdk/{accounts-BfyWsC_i.js → accounts-CWFytwbR.js} +3 -3
  21. package/dist/plugin-sdk/{active-listener-DcJW7xAT.js → active-listener-BkZ4jHrL.js} +2 -2
  22. package/dist/plugin-sdk/{agent-scope-ChbGV6of.js → agent-scope-C9gfY_Gk.js} +2 -2
  23. package/dist/plugin-sdk/{audio-preflight-D3GtNLqW.js → audio-preflight-HKbdzXLZ.js} +21 -21
  24. package/dist/plugin-sdk/{bindings-CN2Qmefj.js → bindings-BaKIqPPy.js} +2 -2
  25. package/dist/plugin-sdk/{channel-web-DTyqujjA.js → channel-web-D5nWiTH1.js} +18 -18
  26. package/dist/plugin-sdk/{chrome-BKzAKr3K.js → chrome-klTSnz-9.js} +3 -3
  27. package/dist/plugin-sdk/{chunk-DhDkBujV.js → chunk-BbrYSny_.js} +1 -1
  28. package/dist/plugin-sdk/{command-format-CVrYFyZS.js → command-format-BN6tyZt6.js} +1 -1
  29. package/dist/plugin-sdk/{commands-registry-17yfZkHZ.js → commands-registry-CTzKKtY6.js} +4 -4
  30. package/dist/plugin-sdk/{config-7wk65zKC.js → config-Crv2qEdJ.js} +9 -9
  31. package/dist/plugin-sdk/{consolidate-exbAW0ml.js → consolidate-DT1QH65Q.js} +2 -2
  32. package/dist/plugin-sdk/{deliver-TxAcw7J5.js → deliver-7rOvAlrc.js} +12 -12
  33. package/dist/plugin-sdk/{diagnostic-Debx4frd.js → diagnostic-0nsxhWp7.js} +1 -1
  34. package/dist/plugin-sdk/{fs-safe-wBYbAkJF.js → fs-safe-DfWYBeWF.js} +1 -1
  35. package/dist/plugin-sdk/{gemini-auth-7U2pm2Ky.js → gemini-auth-C0N0_u49.js} +1 -1
  36. package/dist/plugin-sdk/{image-BtDVmYA5.js → image-WOSl2apK.js} +4 -4
  37. package/dist/plugin-sdk/index.js +43 -43
  38. package/dist/plugin-sdk/{ir-CKMvRrGW.js → ir-9J84MTls.js} +4 -4
  39. package/dist/plugin-sdk/{local-roots-c_gaPs01.js → local-roots-OLRDbvyY.js} +3 -3
  40. package/dist/plugin-sdk/{login-DUym1Jy0.js → login-C7x4q0i2.js} +7 -7
  41. package/dist/plugin-sdk/{login-qr-B-WBdvrX.js → login-qr-Dv5_MoAW.js} +9 -9
  42. package/dist/plugin-sdk/{manager-B71SCzos.js → manager-C83tK17x.js} +8 -8
  43. package/dist/plugin-sdk/{manifest-registry-Dnic6Chh.js → manifest-registry-CJMV-PI7.js} +1 -1
  44. package/dist/plugin-sdk/{markdown-tables-Dur7OTlM.js → markdown-tables-DXNKz5y_.js} +1 -1
  45. package/dist/plugin-sdk/{message-channel-BrAhJJV_.js → message-channel-aGy1HbQQ.js} +1 -1
  46. package/dist/plugin-sdk/{model-selection-B9qaVQSJ.js → model-selection-C-3-tpe7.js} +4 -4
  47. package/dist/plugin-sdk/{outbound-DB1wDM8b.js → outbound-DquCeSy5.js} +6 -6
  48. package/dist/plugin-sdk/{pi-auth-json-ZO118hoy.js → pi-auth-json-D9PDCXGn.js} +1 -1
  49. package/dist/plugin-sdk/{pi-embedded-helpers-s_U0Un7j.js → pi-embedded-helpers-D3ygfH7l.js} +16 -16
  50. package/dist/plugin-sdk/{plugins-DF81oSaI.js → plugins-DOwnSg9D.js} +4 -4
  51. package/dist/plugin-sdk/{pw-ai-CTwP02uv.js → pw-ai-rlengLjb.js} +8 -8
  52. package/dist/plugin-sdk/{qmd-manager-CBaSGant.js → qmd-manager-BzxFjRFa.js} +4 -4
  53. package/dist/plugin-sdk/{registry-CZVURNhF.js → registry-5iFfixlB.js} +2 -2
  54. package/dist/plugin-sdk/{replies-hwRbkU3z.js → replies-BXOzO_H5.js} +7 -7
  55. package/dist/plugin-sdk/{reply-prefix-CaXmzZlx.js → reply-prefix-INAKTqCU.js} +1 -1
  56. package/dist/plugin-sdk/{resolve-outbound-target-fxVSOBmk.js → resolve-outbound-target-DvbxHtqp.js} +2 -2
  57. package/dist/plugin-sdk/{resolve-route-ClCyiOeu.js → resolve-route-URXlY3AK.js} +3 -3
  58. package/dist/plugin-sdk/{runner-Cq5jvwQ7.js → runner-Bv0_DWoH.js} +9 -9
  59. package/dist/plugin-sdk/{session-B_TkB65Y.js → session-C3r8l7ou.js} +4 -4
  60. package/dist/plugin-sdk/{skill-commands-0LF9HTGr.js → skill-commands-KjLUGIdZ.js} +5 -5
  61. package/dist/plugin-sdk/{skills-BIT_O7J0.js → skills-BrsD4L5c.js} +7 -7
  62. package/dist/plugin-sdk/{sqlite-Bx5Y5U5X.js → sqlite-CjW7ME1H.js} +1 -1
  63. package/dist/plugin-sdk/{subsystem-CXqYeDy-.js → subsystem-DcOg1xJr.js} +1 -1
  64. package/dist/plugin-sdk/{synthesis-DtsYAj1E.js → synthesis-CY7YAasV.js} +38 -38
  65. package/dist/plugin-sdk/{target-errors-B8mokOeH.js → target-errors-BVWJGWFq.js} +2 -2
  66. package/dist/plugin-sdk/{thinking-Ca0DhqzO.js → thinking-CtsTDPOi.js} +3 -3
  67. package/dist/plugin-sdk/{tokens-CvlONEqh.js → tokens-8lqOTZCB.js} +1 -1
  68. package/dist/plugin-sdk/{tool-images-DpBaWEHT.js → tool-images-Cl_rGIUZ.js} +2 -2
  69. package/dist/plugin-sdk/{tool-loop-detection-BOvUFa0f.js → tool-loop-detection-Da4WUT_P.js} +2 -2
  70. package/dist/plugin-sdk/{unified-runner-CnM7lyNd.js → unified-runner-nwMnsZyj.js} +60 -60
  71. package/dist/plugin-sdk/web-BlweOZDp.js +54 -0
  72. package/dist/plugin-sdk/{whatsapp-actions-CvnfsFJm.js → whatsapp-actions-DpfaGYs7.js} +21 -21
  73. package/dist/{pw-ai-BW8_KeDf.js → pw-ai-BqxJG-Wh.js} +1 -1
  74. package/dist/{pw-ai-j9IE1K0-.js → pw-ai-C-NSGye0.js} +1 -1
  75. package/dist/{runner-8ALr2UII.js → runner-COGFTeDw.js} +1 -1
  76. package/dist/{runner-C4-9kFdR.js → runner-DhCi2lT1.js} +1 -1
  77. package/dist/{synthesis-Cph3LhA1.js → synthesis-CXZu24Vx.js} +7 -7
  78. package/dist/{synthesis-Cus0A2dL.js → synthesis-DrPxcMlQ.js} +7 -7
  79. package/dist/{unified-runner-CX80YMTk.js → unified-runner-iByUazvW.js} +16 -16
  80. package/dist/{web-ChozvJ7I.js → web-EsMQBIYf.js} +7 -7
  81. package/dist/{web-DFlsbXmQ.js → web-PPg5y6xI.js} +7 -7
  82. package/package.json +1 -1
  83. package/dist/plugin-sdk/web-CIPJBHAU.js +0 -54
  84. package/skills/1password/SKILL.md +0 -71
  85. package/skills/1password/references/cli-examples.md +0 -29
  86. package/skills/1password/references/get-started.md +0 -17
  87. package/skills/apple-notes/SKILL.md +0 -78
  88. package/skills/apple-reminders/SKILL.md +0 -119
  89. package/skills/bear-notes/SKILL.md +0 -108
  90. package/skills/blogwatcher/SKILL.md +0 -70
  91. package/skills/blucli/SKILL.md +0 -48
  92. package/skills/bluebubbles/SKILL.md +0 -132
  93. package/skills/camsnap/SKILL.md +0 -46
  94. package/skills/canvas/SKILL.md +0 -204
  95. package/skills/connect-email/SKILL.md +0 -142
  96. package/skills/document-generation/SKILL.md +0 -83
  97. package/skills/eightctl/SKILL.md +0 -51
  98. package/skills/food-order/SKILL.md +0 -49
  99. package/skills/gemini/SKILL.md +0 -44
  100. package/skills/gh-issues/SKILL.md +0 -865
  101. package/skills/gifgrep/SKILL.md +0 -80
  102. package/skills/github/SKILL.md +0 -164
  103. package/skills/gog/SKILL.md +0 -117
  104. package/skills/goplaces/SKILL.md +0 -53
  105. package/skills/healthcheck/SKILL.md +0 -246
  106. package/skills/himalaya/SKILL.md +0 -258
  107. package/skills/himalaya/references/configuration.md +0 -184
  108. package/skills/himalaya/references/message-composition.md +0 -199
  109. package/skills/imsg/SKILL.md +0 -122
  110. package/skills/long-task/SKILL.md +0 -58
  111. package/skills/long-task/scripts/detach-task.sh +0 -187
  112. package/skills/nano-banana-pro/SKILL.md +0 -59
  113. package/skills/nano-banana-pro/scripts/generate_image.py +0 -184
  114. package/skills/nano-pdf/SKILL.md +0 -39
  115. package/skills/notion/SKILL.md +0 -173
  116. package/skills/obsidian/SKILL.md +0 -82
  117. package/skills/openai-image-gen/SKILL.md +0 -90
  118. package/skills/openai-image-gen/scripts/gen.py +0 -240
  119. package/skills/openai-whisper/SKILL.md +0 -39
  120. package/skills/openai-whisper-api/SKILL.md +0 -53
  121. package/skills/openai-whisper-api/scripts/transcribe.sh +0 -85
  122. package/skills/openhue/SKILL.md +0 -113
  123. package/skills/oracle/SKILL.md +0 -126
  124. package/skills/ordercli/SKILL.md +0 -79
  125. package/skills/peekaboo/SKILL.md +0 -191
  126. package/skills/reactions-extensive/SKILL.md +0 -30
  127. package/skills/reactions-minimal/SKILL.md +0 -31
  128. package/skills/safe-edit/SKILL.md +0 -51
  129. package/skills/sag/SKILL.md +0 -88
  130. package/skills/sherpa-onnx-tts/SKILL.md +0 -104
  131. package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +0 -178
  132. package/skills/songsee/SKILL.md +0 -50
  133. package/skills/sonoscli/SKILL.md +0 -66
  134. package/skills/spotify-player/SKILL.md +0 -65
  135. package/skills/symihub/SKILL.md +0 -78
  136. package/skills/things-mac/SKILL.md +0 -87
  137. package/skills/tmux/SKILL.md +0 -153
  138. package/skills/tmux/scripts/find-sessions.sh +0 -112
  139. package/skills/tmux/scripts/wait-for-text.sh +0 -83
  140. package/skills/trello/SKILL.md +0 -96
  141. package/skills/video-frames/SKILL.md +0 -47
  142. package/skills/video-frames/scripts/frame.sh +0 -81
  143. package/skills/voice-call/SKILL.md +0 -46
  144. package/skills/wacli/SKILL.md +0 -73
  145. package/skills/weather/SKILL.md +0 -113
  146. package/skills/xurl/SKILL.md +0 -462
@@ -1,73 +0,0 @@
1
- ---
2
- name: wacli
3
- description: Send WhatsApp messages to other people or search/sync WhatsApp history via the wacli CLI (not for normal user chats).
4
- homepage: https://wacli.sh
5
- metadata:
6
- {
7
- "symi":
8
- {
9
- "emoji": "📱",
10
- "requires": { "bins": ["wacli"] },
11
- "install":
12
- [
13
- {
14
- "id": "brew",
15
- "kind": "brew",
16
- "formula": "steipete/tap/wacli",
17
- "bins": ["wacli"],
18
- "label": "Install wacli (brew)",
19
- },
20
- {
21
- "id": "go",
22
- "kind": "go",
23
- "module": "github.com/steipete/wacli/cmd/wacli@latest",
24
- "bins": ["wacli"],
25
- "label": "Install wacli (go)",
26
- },
27
- ],
28
- },
29
- }
30
- triggers: [wacli]
31
- ---
32
-
33
- # wacli
34
-
35
- Use `wacli` only when the user explicitly asks you to message someone else on WhatsApp or when they ask to sync/search WhatsApp history.
36
- Do NOT use `wacli` for normal user chats; Symi routes WhatsApp conversations automatically.
37
- If the user is chatting with you on WhatsApp, you should not reach for this tool unless they ask you to contact a third party.
38
-
39
- Safety
40
-
41
- - Require explicit recipient + message text.
42
- - Confirm recipient + message before sending.
43
- - If anything is ambiguous, ask a clarifying question.
44
-
45
- Auth + sync
46
-
47
- - `wacli auth` (QR login + initial sync)
48
- - `wacli sync --follow` (continuous sync)
49
- - `wacli doctor`
50
-
51
- Find chats + messages
52
-
53
- - `wacli chats list --limit 20 --query "name or number"`
54
- - `wacli messages search "query" --limit 20 --chat <jid>`
55
- - `wacli messages search "invoice" --after 2025-01-01 --before 2025-12-31`
56
-
57
- History backfill
58
-
59
- - `wacli history backfill --chat <jid> --requests 2 --count 50`
60
-
61
- Send
62
-
63
- - Text: `wacli send text --to "+14155551212" --message "Hello! Are you free at 3pm?"`
64
- - Group: `wacli send text --to "1234567890-123456789@g.us" --message "Running 5 min late."`
65
- - File: `wacli send file --to "+14155551212" --file /path/agenda.pdf --caption "Agenda"`
66
-
67
- Notes
68
-
69
- - Store dir: `~/.wacli` (override with `--store`).
70
- - Use `--json` for machine-readable output when parsing.
71
- - Backfill requires your phone online; results are best-effort.
72
- - WhatsApp CLI is not needed for routine user chats; it’s for messaging other people.
73
- - JIDs: direct chats look like `<number>@s.whatsapp.net`; groups look like `<id>@g.us` (use `wacli chats list` to find).
@@ -1,113 +0,0 @@
1
- ---
2
- name: weather
3
- description: "Get current weather and forecasts via wttr.in or Open-Meteo. Use when: user asks about weather, temperature, or forecasts for any location. NOT for: historical weather data, severe weather alerts, or detailed meteorological analysis. No API key needed."
4
- homepage: https://wttr.in/:help
5
- metadata: { "symi": { "emoji": "🌤️", "requires": { "bins": ["curl"] } } }
6
- triggers: [weather]
7
- ---
8
-
9
- # Weather Skill
10
-
11
- Get current weather conditions and forecasts.
12
-
13
- ## When to Use
14
-
15
- ✅ **USE this skill when:**
16
-
17
- - "What's the weather?"
18
- - "Will it rain today/tomorrow?"
19
- - "Temperature in [city]"
20
- - "Weather forecast for the week"
21
- - Travel planning weather checks
22
-
23
- ## When NOT to Use
24
-
25
- ❌ **DON'T use this skill when:**
26
-
27
- - Historical weather data → use weather archives/APIs
28
- - Climate analysis or trends → use specialized data sources
29
- - Hyper-local microclimate data → use local sensors
30
- - Severe weather alerts → check official NWS sources
31
- - Aviation/marine weather → use specialized services (METAR, etc.)
32
-
33
- ## Location
34
-
35
- Always include a city, region, or airport code in weather queries.
36
-
37
- ## Commands
38
-
39
- ### Current Weather
40
-
41
- ```bash
42
- # One-line summary
43
- curl "wttr.in/London?format=3"
44
-
45
- # Detailed current conditions
46
- curl "wttr.in/London?0"
47
-
48
- # Specific city
49
- curl "wttr.in/New+York?format=3"
50
- ```
51
-
52
- ### Forecasts
53
-
54
- ```bash
55
- # 3-day forecast
56
- curl "wttr.in/London"
57
-
58
- # Week forecast
59
- curl "wttr.in/London?format=v2"
60
-
61
- # Specific day (0=today, 1=tomorrow, 2=day after)
62
- curl "wttr.in/London?1"
63
- ```
64
-
65
- ### Format Options
66
-
67
- ```bash
68
- # One-liner
69
- curl "wttr.in/London?format=%l:+%c+%t+%w"
70
-
71
- # JSON output
72
- curl "wttr.in/London?format=j1"
73
-
74
- # PNG image
75
- curl "wttr.in/London.png"
76
- ```
77
-
78
- ### Format Codes
79
-
80
- - `%c` — Weather condition emoji
81
- - `%t` — Temperature
82
- - `%f` — "Feels like"
83
- - `%w` — Wind
84
- - `%h` — Humidity
85
- - `%p` — Precipitation
86
- - `%l` — Location
87
-
88
- ## Quick Responses
89
-
90
- **"What's the weather?"**
91
-
92
- ```bash
93
- curl -s "wttr.in/London?format=%l:+%c+%t+(feels+like+%f),+%w+wind,+%h+humidity"
94
- ```
95
-
96
- **"Will it rain?"**
97
-
98
- ```bash
99
- curl -s "wttr.in/London?format=%l:+%c+%p"
100
- ```
101
-
102
- **"Weekend forecast"**
103
-
104
- ```bash
105
- curl "wttr.in/London?format=v2"
106
- ```
107
-
108
- ## Notes
109
-
110
- - No API key needed (uses wttr.in)
111
- - Rate limited; don't spam requests
112
- - Works for most global cities
113
- - Supports airport codes: `curl wttr.in/ORD`
@@ -1,462 +0,0 @@
1
- ---
2
- name: xurl
3
- description: A CLI tool for making authenticated requests to the X (Twitter) API. Use this skill when you need to post tweets, reply, quote, search, read posts, manage followers, send DMs, upload media, or interact with any X API v2 endpoint.
4
- metadata:
5
- {
6
- "symi":
7
- {
8
- "emoji": "𝕏",
9
- "requires": { "bins": ["xurl"] },
10
- "install":
11
- [
12
- {
13
- "id": "brew",
14
- "kind": "brew",
15
- "formula": "xdevplatform/tap/xurl",
16
- "bins": ["xurl"],
17
- "label": "Install xurl (brew)",
18
- },
19
- {
20
- "id": "npm",
21
- "kind": "npm",
22
- "package": "@xdevplatform/xurl",
23
- "bins": ["xurl"],
24
- "label": "Install xurl (npm)",
25
- },
26
- ],
27
- },
28
- }
29
- triggers: [xurl]
30
- ---
31
-
32
- # xurl — Agent Skill Reference
33
-
34
- `xurl` is a CLI tool for the X API. It supports both **shortcut commands** (human/agent‑friendly one‑liners) and **raw curl‑style** access to any v2 endpoint. All commands return JSON to stdout.
35
-
36
- ---
37
-
38
- ## Installation
39
-
40
- ### Homebrew (macOS)
41
-
42
- ```bash
43
- brew install --cask xdevplatform/tap/xurl
44
- ```
45
-
46
- ### npm
47
-
48
- ```bash
49
- npm install -g @xdevplatform/xurl
50
- ```
51
-
52
- ### Shell script
53
-
54
- ```bash
55
- curl -fsSL https://raw.githubusercontent.com/xdevplatform/xurl/main/install.sh | bash
56
- ```
57
-
58
- Installs to `~/.local/bin`. If it's not in your PATH, the script will tell you what to add.
59
-
60
- ### Go
61
-
62
- ```bash
63
- go install github.com/xdevplatform/xurl@latest
64
- ```
65
-
66
- ---
67
-
68
- ## Prerequisites
69
-
70
- This skill requires the `xurl` CLI utility: <https://github.com/xdevplatform/xurl>.
71
-
72
- Before using any command you must be authenticated. Run `xurl auth status` to check.
73
-
74
- ### Secret Safety (Mandatory)
75
-
76
- - Never read, print, parse, summarize, upload, or send `~/.xurl` (or copies of it) to the LLM context.
77
- - Never ask the user to paste credentials/tokens into chat.
78
- - The user must fill `~/.xurl` with required secrets manually on their own machine.
79
- - Do not recommend or execute auth commands with inline secrets in agent/LLM sessions.
80
- - Warn that using CLI secret options in agent sessions can leak credentials (prompt/context, logs, shell history).
81
- - Never use `--verbose` / `-v` in agent/LLM sessions; it can expose sensitive headers/tokens in output.
82
- - Sensitive flags that must never be used in agent commands: `--bearer-token`, `--consumer-key`, `--consumer-secret`, `--access-token`, `--token-secret`, `--client-id`, `--client-secret`.
83
- - To verify whether at least one app with credentials is already registered, run: `xurl auth status`.
84
-
85
- ### Register an app (recommended)
86
-
87
- App credential registration must be done manually by the user outside the agent/LLM session.
88
- After credentials are registered, authenticate with:
89
-
90
- ```bash
91
- xurl auth oauth2
92
- ```
93
-
94
- For multiple pre-configured apps, switch between them:
95
-
96
- ```bash
97
- xurl auth default prod-app # set default app
98
- xurl auth default prod-app alice # set default app + user
99
- xurl --app dev-app /2/users/me # one-off override
100
- ```
101
-
102
- ### Other auth methods
103
-
104
- Examples with inline secret flags are intentionally omitted. If OAuth1 or app-only auth is needed, the user must run those commands manually outside agent/LLM context.
105
-
106
- Tokens are persisted to `~/.xurl` in YAML format. Each app has its own isolated tokens. Do not read this file through the agent/LLM. Once authenticated, every command below will auto‑attach the right `Authorization` header.
107
-
108
- ---
109
-
110
- ## Quick Reference
111
-
112
- | Action | Command |
113
- | ------------------------- | ----------------------------------------------------- |
114
- | Post | `xurl post "Hello world!"` |
115
- | Reply | `xurl reply POST_ID "Nice post!"` |
116
- | Quote | `xurl quote POST_ID "My take"` |
117
- | Delete a post | `xurl delete POST_ID` |
118
- | Read a post | `xurl read POST_ID` |
119
- | Search posts | `xurl search "QUERY" -n 10` |
120
- | Who am I | `xurl whoami` |
121
- | Look up a user | `xurl user @handle` |
122
- | Home timeline | `xurl timeline -n 20` |
123
- | Mentions | `xurl mentions -n 10` |
124
- | Like | `xurl like POST_ID` |
125
- | Unlike | `xurl unlike POST_ID` |
126
- | Repost | `xurl repost POST_ID` |
127
- | Undo repost | `xurl unrepost POST_ID` |
128
- | Bookmark | `xurl bookmark POST_ID` |
129
- | Remove bookmark | `xurl unbookmark POST_ID` |
130
- | List bookmarks | `xurl bookmarks -n 10` |
131
- | List likes | `xurl likes -n 10` |
132
- | Follow | `xurl follow @handle` |
133
- | Unfollow | `xurl unfollow @handle` |
134
- | List following | `xurl following -n 20` |
135
- | List followers | `xurl followers -n 20` |
136
- | Block | `xurl block @handle` |
137
- | Unblock | `xurl unblock @handle` |
138
- | Mute | `xurl mute @handle` |
139
- | Unmute | `xurl unmute @handle` |
140
- | Send DM | `xurl dm @handle "message"` |
141
- | List DMs | `xurl dms -n 10` |
142
- | Upload media | `xurl media upload path/to/file.mp4` |
143
- | Media status | `xurl media status MEDIA_ID` |
144
- | **App Management** | |
145
- | Register app | Manual, outside agent (do not pass secrets via agent) |
146
- | List apps | `xurl auth apps list` |
147
- | Update app creds | Manual, outside agent (do not pass secrets via agent) |
148
- | Remove app | `xurl auth apps remove NAME` |
149
- | Set default (interactive) | `xurl auth default` |
150
- | Set default (command) | `xurl auth default APP_NAME [USERNAME]` |
151
- | Use app per-request | `xurl --app NAME /2/users/me` |
152
- | Auth status | `xurl auth status` |
153
-
154
- > **Post IDs vs URLs:** Anywhere `POST_ID` appears above you can also paste a full post URL (e.g. `https://x.com/user/status/1234567890`) — xurl extracts the ID automatically.
155
-
156
- > **Usernames:** Leading `@` is optional. `@elonmusk` and `elonmusk` both work.
157
-
158
- ---
159
-
160
- ## Command Details
161
-
162
- ### Posting
163
-
164
- ```bash
165
- # Simple post
166
- xurl post "Hello world!"
167
-
168
- # Post with media (upload first, then attach)
169
- xurl media upload photo.jpg # → note the media_id from response
170
- xurl post "Check this out" --media-id MEDIA_ID
171
-
172
- # Multiple media
173
- xurl post "Thread pics" --media-id 111 --media-id 222
174
-
175
- # Reply to a post (by ID or URL)
176
- xurl reply 1234567890 "Great point!"
177
- xurl reply https://x.com/user/status/1234567890 "Agreed!"
178
-
179
- # Reply with media
180
- xurl reply 1234567890 "Look at this" --media-id MEDIA_ID
181
-
182
- # Quote a post
183
- xurl quote 1234567890 "Adding my thoughts"
184
-
185
- # Delete your own post
186
- xurl delete 1234567890
187
- ```
188
-
189
- ### Reading
190
-
191
- ```bash
192
- # Read a single post (returns author, text, metrics, entities)
193
- xurl read 1234567890
194
- xurl read https://x.com/user/status/1234567890
195
-
196
- # Search recent posts (default 10 results)
197
- xurl search "golang"
198
- xurl search "from:elonmusk" -n 20
199
- xurl search "#buildinpublic lang:en" -n 15
200
- ```
201
-
202
- ### User Info
203
-
204
- ```bash
205
- # Your own profile
206
- xurl whoami
207
-
208
- # Look up any user
209
- xurl user elonmusk
210
- xurl user @XDevelopers
211
- ```
212
-
213
- ### Timelines & Mentions
214
-
215
- ```bash
216
- # Home timeline (reverse chronological)
217
- xurl timeline
218
- xurl timeline -n 25
219
-
220
- # Your mentions
221
- xurl mentions
222
- xurl mentions -n 20
223
- ```
224
-
225
- ### Engagement
226
-
227
- ```bash
228
- # Like / unlike
229
- xurl like 1234567890
230
- xurl unlike 1234567890
231
-
232
- # Repost / undo
233
- xurl repost 1234567890
234
- xurl unrepost 1234567890
235
-
236
- # Bookmark / remove
237
- xurl bookmark 1234567890
238
- xurl unbookmark 1234567890
239
-
240
- # List your bookmarks / likes
241
- xurl bookmarks -n 20
242
- xurl likes -n 20
243
- ```
244
-
245
- ### Social Graph
246
-
247
- ```bash
248
- # Follow / unfollow
249
- xurl follow @XDevelopers
250
- xurl unfollow @XDevelopers
251
-
252
- # List who you follow / your followers
253
- xurl following -n 50
254
- xurl followers -n 50
255
-
256
- # List another user's following/followers
257
- xurl following --of elonmusk -n 20
258
- xurl followers --of elonmusk -n 20
259
-
260
- # Block / unblock
261
- xurl block @spammer
262
- xurl unblock @spammer
263
-
264
- # Mute / unmute
265
- xurl mute @annoying
266
- xurl unmute @annoying
267
- ```
268
-
269
- ### Direct Messages
270
-
271
- ```bash
272
- # Send a DM
273
- xurl dm @someuser "Hey, saw your post!"
274
-
275
- # List recent DM events
276
- xurl dms
277
- xurl dms -n 25
278
- ```
279
-
280
- ### Media Upload
281
-
282
- ```bash
283
- # Upload a file (auto‑detects type for images/videos)
284
- xurl media upload photo.jpg
285
- xurl media upload video.mp4
286
-
287
- # Specify type and category explicitly
288
- xurl media upload --media-type image/jpeg --category tweet_image photo.jpg
289
-
290
- # Check processing status (videos need server‑side processing)
291
- xurl media status MEDIA_ID
292
- xurl media status --wait MEDIA_ID # poll until done
293
-
294
- # Full workflow: upload then post
295
- xurl media upload meme.png # response includes media id
296
- xurl post "lol" --media-id MEDIA_ID
297
- ```
298
-
299
- ---
300
-
301
- ## Global Flags
302
-
303
- These flags work on every command:
304
-
305
- | Flag | Short | Description |
306
- | ------------ | ----- | ------------------------------------------------------------------ |
307
- | `--app` | | Use a specific registered app for this request (overrides default) |
308
- | `--auth` | | Force auth type: `oauth1`, `oauth2`, or `app` |
309
- | `--username` | `-u` | Which OAuth2 account to use (if you have multiple) |
310
- | `--verbose` | `-v` | Forbidden in agent/LLM sessions (can leak auth headers/tokens) |
311
- | `--trace` | `-t` | Add `X-B3-Flags: 1` trace header |
312
-
313
- ---
314
-
315
- ## Raw API Access
316
-
317
- The shortcut commands cover the most common operations. For anything else, use xurl's raw curl‑style mode — it works with **any** X API v2 endpoint:
318
-
319
- ```bash
320
- # GET request (default)
321
- xurl /2/users/me
322
-
323
- # POST with JSON body
324
- xurl -X POST /2/tweets -d '{"text":"Hello world!"}'
325
-
326
- # PUT, PATCH, DELETE
327
- xurl -X DELETE /2/tweets/1234567890
328
-
329
- # Custom headers
330
- xurl -H "Content-Type: application/json" /2/some/endpoint
331
-
332
- # Force streaming mode
333
- xurl -s /2/tweets/search/stream
334
-
335
- # Full URLs also work
336
- xurl https://api.x.com/2/users/me
337
- ```
338
-
339
- ---
340
-
341
- ## Streaming
342
-
343
- Streaming endpoints are auto‑detected. Known streaming endpoints include:
344
-
345
- - `/2/tweets/search/stream`
346
- - `/2/tweets/sample/stream`
347
- - `/2/tweets/sample10/stream`
348
-
349
- You can force streaming on any endpoint with `-s`:
350
-
351
- ```bash
352
- xurl -s /2/some/endpoint
353
- ```
354
-
355
- ---
356
-
357
- ## Output Format
358
-
359
- All commands return **JSON** to stdout, pretty‑printed with syntax highlighting. The output structure matches the X API v2 response format. A typical response looks like:
360
-
361
- ```json
362
- {
363
- "data": {
364
- "id": "1234567890",
365
- "text": "Hello world!"
366
- }
367
- }
368
- ```
369
-
370
- Errors are also returned as JSON:
371
-
372
- ```json
373
- {
374
- "errors": [
375
- {
376
- "message": "Not authorized",
377
- "code": 403
378
- }
379
- ]
380
- }
381
- ```
382
-
383
- ---
384
-
385
- ## Common Workflows
386
-
387
- ### Post with an image
388
-
389
- ```bash
390
- # 1. Upload the image
391
- xurl media upload photo.jpg
392
- # 2. Copy the media_id from the response, then post
393
- xurl post "Check out this photo!" --media-id MEDIA_ID
394
- ```
395
-
396
- ### Reply to a conversation
397
-
398
- ```bash
399
- # 1. Read the post to understand context
400
- xurl read https://x.com/user/status/1234567890
401
- # 2. Reply
402
- xurl reply 1234567890 "Here are my thoughts..."
403
- ```
404
-
405
- ### Search and engage
406
-
407
- ```bash
408
- # 1. Search for relevant posts
409
- xurl search "topic of interest" -n 10
410
- # 2. Like an interesting one
411
- xurl like POST_ID_FROM_RESULTS
412
- # 3. Reply to it
413
- xurl reply POST_ID_FROM_RESULTS "Great point!"
414
- ```
415
-
416
- ### Check your activity
417
-
418
- ```bash
419
- # See who you are
420
- xurl whoami
421
- # Check your mentions
422
- xurl mentions -n 20
423
- # Check your timeline
424
- xurl timeline -n 20
425
- ```
426
-
427
- ### Set up multiple apps
428
-
429
- ```bash
430
- # App credentials must already be configured manually outside agent/LLM context.
431
- # Authenticate users on each pre-configured app
432
- xurl auth default prod
433
- xurl auth oauth2 # authenticates on prod app
434
-
435
- xurl auth default staging
436
- xurl auth oauth2 # authenticates on staging app
437
-
438
- # Switch between them
439
- xurl auth default prod alice # prod app, alice user
440
- xurl --app staging /2/users/me # one-off request against staging
441
- ```
442
-
443
- ---
444
-
445
- ## Error Handling
446
-
447
- - Non‑zero exit code on any error.
448
- - API errors are printed as JSON to stdout (so you can still parse them).
449
- - Auth errors suggest re‑running `xurl auth oauth2` or checking your tokens.
450
- - If a command requires your user ID (like, repost, bookmark, follow, etc.), xurl will automatically fetch it via `/2/users/me`. If that fails, you'll see an auth error.
451
-
452
- ---
453
-
454
- ## Notes
455
-
456
- - **Rate limits:** The X API enforces rate limits per endpoint. If you get a 429 error, wait and retry. Write endpoints (post, reply, like, repost) have stricter limits than read endpoints.
457
- - **Scopes:** OAuth 2.0 tokens are requested with broad scopes. If you get a 403 on a specific action, your token may lack the required scope — re‑run `xurl auth oauth2` to get a fresh token.
458
- - **Token refresh:** OAuth 2.0 tokens auto‑refresh when expired. No manual intervention needed.
459
- - **Multiple apps:** Each app has its own isolated credentials and tokens. Configure credentials manually outside agent/LLM context, then switch with `xurl auth default` or `--app`.
460
- - **Multiple accounts:** You can authenticate multiple OAuth 2.0 accounts per app and switch between them with `--username` / `-u` or set a default with `xurl auth default APP USER`.
461
- - **Default user:** When no `-u` flag is given, xurl uses the default user for the active app (set via `xurl auth default`). If no default user is set, it uses the first available token.
462
- - **Token storage:** `~/.xurl` is YAML. Each app stores its own credentials and tokens. Never read or send this file to LLM context.