superx-cli 0.5.1 → 0.6.0

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 (72) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +9 -5
  3. package/dist/index.js +255 -18
  4. package/package.json +5 -5
  5. package/skills/superx/SKILL.md +448 -0
  6. package/{SKILL.md → skills/superx/references/commands.md} +47 -429
  7. package/{PLAYBOOK.md → skills/superx/references/growth-strategy.md} +3 -3
  8. package/skills/superx/references/skills/README.md +31 -0
  9. package/skills/superx/references/skills/audience-export/card.json +20 -0
  10. package/skills/superx/references/skills/audience-export/recipe.md +13 -0
  11. package/skills/superx/references/skills/cadence-and-queue-audit/card.json +22 -0
  12. package/skills/superx/references/skills/cadence-and-queue-audit/recipe.md +17 -0
  13. package/skills/superx/references/skills/categories.json +41 -0
  14. package/skills/superx/references/skills/daily-post-ideas/card.json +22 -0
  15. package/skills/superx/references/skills/daily-post-ideas/recipe.md +17 -0
  16. package/skills/superx/references/skills/dm-ready-audience-builder/card.json +21 -0
  17. package/skills/superx/references/skills/dm-ready-audience-builder/recipe.md +16 -0
  18. package/skills/superx/references/skills/find-your-story/card.json +23 -0
  19. package/skills/superx/references/skills/find-your-story/recipe.md +17 -0
  20. package/skills/superx/references/skills/growth-plan-builder/card.json +21 -0
  21. package/skills/superx/references/skills/growth-plan-builder/recipe.md +17 -0
  22. package/skills/superx/references/skills/instant-lead-hunt/card.json +21 -0
  23. package/skills/superx/references/skills/instant-lead-hunt/recipe.md +14 -0
  24. package/skills/superx/references/skills/lead-review/card.json +20 -0
  25. package/skills/superx/references/skills/lead-review/recipe.md +16 -0
  26. package/skills/superx/references/skills/my-content-export/card.json +21 -0
  27. package/skills/superx/references/skills/my-content-export/recipe.md +15 -0
  28. package/skills/superx/references/skills/my-replies-report/card.json +20 -0
  29. package/skills/superx/references/skills/my-replies-report/recipe.md +13 -0
  30. package/skills/superx/references/skills/post-post-mortem/card.json +20 -0
  31. package/skills/superx/references/skills/post-post-mortem/recipe.md +16 -0
  32. package/skills/superx/references/skills/profile-research-briefs/card.json +21 -0
  33. package/skills/superx/references/skills/profile-research-briefs/recipe.md +15 -0
  34. package/skills/superx/references/skills/queue-reshuffle/card.json +21 -0
  35. package/skills/superx/references/skills/queue-reshuffle/recipe.md +15 -0
  36. package/skills/superx/references/skills/reply-sprint/card.json +20 -0
  37. package/skills/superx/references/skills/reply-sprint/recipe.md +12 -0
  38. package/skills/superx/references/skills/reply-to-any-post/card.json +20 -0
  39. package/skills/superx/references/skills/reply-to-any-post/recipe.md +15 -0
  40. package/skills/superx/references/skills/reply-to-dm-campaign/card.json +21 -0
  41. package/skills/superx/references/skills/reply-to-dm-campaign/recipe.md +18 -0
  42. package/skills/superx/references/skills/repurpose-a-winner/card.json +21 -0
  43. package/skills/superx/references/skills/repurpose-a-winner/recipe.md +16 -0
  44. package/skills/superx/references/skills/sentiment-slice/card.json +20 -0
  45. package/skills/superx/references/skills/sentiment-slice/recipe.md +15 -0
  46. package/skills/superx/references/skills/standing-lead-agent/card.json +21 -0
  47. package/skills/superx/references/skills/standing-lead-agent/recipe.md +17 -0
  48. package/skills/superx/references/skills/teach-superx-your-rules/card.json +21 -0
  49. package/skills/superx/references/skills/teach-superx-your-rules/recipe.md +15 -0
  50. package/skills/superx/references/skills/thread-builder/card.json +20 -0
  51. package/skills/superx/references/skills/thread-builder/recipe.md +14 -0
  52. package/skills/superx/references/skills/top-performers-breakdown/card.json +21 -0
  53. package/skills/superx/references/skills/top-performers-breakdown/recipe.md +13 -0
  54. package/skills/superx/references/skills/trending-now-scan/card.json +21 -0
  55. package/skills/superx/references/skills/trending-now-scan/recipe.md +14 -0
  56. package/skills/superx/references/skills/viral-format-remix/card.json +20 -0
  57. package/skills/superx/references/skills/viral-format-remix/recipe.md +15 -0
  58. package/skills/superx/references/skills/viral-score-iterate/card.json +22 -0
  59. package/skills/superx/references/skills/viral-score-iterate/recipe.md +15 -0
  60. package/skills/superx/references/skills/warm-outreach-pipeline/card.json +21 -0
  61. package/skills/superx/references/skills/warm-outreach-pipeline/recipe.md +19 -0
  62. package/skills/superx/references/skills/week-of-posts/card.json +19 -0
  63. package/skills/superx/references/skills/week-of-posts/recipe.md +18 -0
  64. package/skills/superx/references/skills/weekly-growth-recap/card.json +22 -0
  65. package/skills/superx/references/skills/weekly-growth-recap/recipe.md +17 -0
  66. package/skills/superx/references/skills/who-is-this-person/card.json +20 -0
  67. package/skills/superx/references/skills/who-is-this-person/recipe.md +16 -0
  68. package/skills/superx/references/skills/worker-output-review/card.json +20 -0
  69. package/skills/superx/references/skills/worker-output-review/recipe.md +18 -0
  70. package/skills/superx/references/skills/your-warmest-leads/card.json +21 -0
  71. package/skills/superx/references/skills/your-warmest-leads/recipe.md +14 -0
  72. package/PLAYBOOKS.md +0 -542
@@ -0,0 +1,448 @@
1
+ ---
2
+ name: superx
3
+ description: Grow a Twitter/X account with SuperX. Use when someone asks for a weekly growth recap or account analytics, wants to find leads or buyers on X, needs draft posts or threads written and scheduled, wants replies drafted or reply history reviewed, asks who engages with them most, wants inspiration from high-performing posts, or wants X Articles written and published. Also covers contact lists, signal agents (automated lead finders), Engage feeds, tagging, media attachments, AI cover images, and the Context settings (profile, interests, rules, reply settings, favorite creators, style guide, products) that steer SuperX writing. Everything runs through the superx CLI or the SuperX API; nothing is posted without a person saying so.
4
+ homepage: https://docs.superx.so
5
+ metadata: {"openclaw":{"emoji":"🚀","requires":{"bins":["superx"],"env":[]}}}
6
+ ---
7
+
8
+ ## Install SuperX CLI if it doesn't exist
9
+
10
+ ```bash
11
+ npm install -g superx-cli
12
+ ```
13
+
14
+ npm release: https://www.npmjs.com/package/superx-cli
15
+ superx-agent github: https://github.com/superx-so/superx-agent
16
+ API docs: https://docs.superx.so
17
+ official website: https://superx.so
18
+
19
+ ---
20
+
21
+ | Property | Value |
22
+ |----------|-------|
23
+ | **name** | superx |
24
+ | **description** | Twitter/X growth CLI: posts, analytics, contacts, contact lists, audience replies, signal agents and their leads, inspiration, tags, scheduling (with images), long-form Articles, and Context settings (AI writing background) via the SuperX API |
25
+ | **allowed-tools** | Bash(superx:*) |
26
+
27
+ ---
28
+
29
+ ## Three Hard Rules (Read First)
30
+
31
+ **Rule 1: Run `superx status` before anything else.** Every other command fails without valid credentials. If the `superx` binary is missing, install it with `npm install -g superx-cli`. If not authenticated, either run `superx login` (interactive) or set `export SUPERX_API_KEY=sxk_...` (CI and non-interactive sessions). Keys are created at https://app.superx.so/account?tab=api.
32
+
33
+ **Rule 2: Read `references/growth-strategy.md` before creating any content.** This skill ships a growth strategy guide (`references/growth-strategy.md`, also inside the installed npm package). It tells you WHAT to post, WHEN, and WHY: the action hierarchy, out-of-network discovery, the engagement loop, and the failure modes that kill reach. The CLI gives you data and actions; the strategy guide gives you judgment. Do not schedule content without it. For a goal-shaped task ("give me my weekly recap", "DM the people who replied to this post"), open the matching skill under `references/skills/`: the named SuperX skills, each with its exact command chain, MCP tool names and stopping point.
34
+
35
+ **Rule 3: Know the write constraints.** `scheduled:create` without `--at` creates a DRAFT (nothing publishes). With `--at` it schedules for that time. `scheduled:update` changes only the flags you pass, and a new `--at` alone never schedules a draft; add `--status scheduled` to promote. Writes work on your main account or any linked account (pass the same `--account` you used to read it); accounts shared with you by other people are read-only, and tags are workspace-wide. Images attach via `media:upload` then `--media` (JPG/PNG/WEBP up to 5MB, GIF up to 15MB; max 4 images or 1 GIF per post); video is not supported. Timestamps MUST be UTC ISO-8601 with an explicit `Z` or offset; naive timestamps are rejected with 400. `posts:publish` and `articles:publish` post to X IMMEDIATELY and irreversibly; treat them like hitting Publish in public and get human confirmation of the exact text unless the user already gave it. `posts:publish` also requires `--idempotency-key`, which you reuse verbatim on any retry. `posts:draft` writes post text in the user's voice and saves NOTHING: show the drafts, let the user pick and edit one, then pass the final text to `scheduled:create` yourself; it costs AI credits per draft, so ask for the count the user actually wants. `--voice mine` is the voice of the `--account` you pass (its own posts and style guide); shared accounts are refused.
36
+
37
+ ---
38
+
39
+ ## Output Contract
40
+
41
+ - **stdout is clean JSON** for every command except `docs` (markdown). Pipe anything into `jq` directly.
42
+ - Human/status lines go to **stderr**, never stdout.
43
+ - Exit code **0** on success, **1** on any error. Error details (including the API error code) are printed to stderr as `Error [code] (HTTP status): message`.
44
+
45
+ ```bash
46
+ POSTS=$(superx posts:list --sort likes --limit 5)
47
+ echo "$POSTS" | jq '.data[].text'
48
+ ```
49
+
50
+ ---
51
+
52
+ ## Core Workflow
53
+
54
+ 1. **Check auth**: `superx status` (verifies the key and shows plan, AI credit pool, and rate-limit state)
55
+ 2. **Discover accounts**: `superx accounts` (main account first; note ids for `--account`)
56
+ 3. **Read the data**: top posts, analytics, most engaged contacts
57
+ 4. **Read `references/growth-strategy.md`**, then draft content informed by what already works for this account
58
+ 5. **Create**: `superx scheduled:create` (draft first when unsure; add `--at` to schedule)
59
+ 6. **Verify**: `superx scheduled:list` shows the draft/queue state
60
+
61
+ ```bash
62
+ # 1. Auth
63
+ superx status
64
+
65
+ # 2. Accounts
66
+ superx accounts
67
+
68
+ # 3. Read data
69
+ superx posts:list --sort likes --limit 10
70
+ superx posts:analytics
71
+ superx contacts:list --sort engagement --limit 20
72
+
73
+ # 4. Read references/growth-strategy.md (in this skill's directory), then write content
74
+
75
+ # 5. Create (draft, review, then schedule)
76
+ superx scheduled:create --text "Post text"
77
+ superx scheduled:create --text "Post text" --at "2026-08-01T15:00:00Z"
78
+
79
+ # 6. Verify
80
+ superx scheduled:list --status draft,scheduled
81
+ ```
82
+
83
+ ---
84
+
85
+ ## Command reference
86
+
87
+ Every command family, with its flags and the caveats that matter, lives in
88
+ [references/commands.md](./references/commands.md). Open that file and jump to
89
+ the section you need instead of guessing flags; `superx <command> --help` is the
90
+ live check on any one command.
91
+
92
+ The families, in the order they appear there: authentication, identity and
93
+ accounts, posts and analytics, inspiration, live X lookups, inspiration media,
94
+ contacts, contact lists, audience, mentions, datasets, engage, signals, lead
95
+ search and outreach, writing helpers, workers, scheduling, publishing now, bulk
96
+ queue operations, editing drafts and scheduled posts, advanced post settings, DM
97
+ campaigns, tags, context settings, queue settings, articles, docs.
98
+
99
+ ---
100
+
101
+ ## Common Patterns
102
+
103
+ ### Pattern 1: Study what works before writing
104
+
105
+ ```bash
106
+ # Top posts by engagement, last 60 days
107
+ SINCE=$(date -u -v-60d +"%Y-%m-%dT00:00:00Z" 2>/dev/null || date -u -d "60 days ago" +"%Y-%m-%dT00:00:00Z")
108
+ superx posts:list --sort likes --since "$SINCE" --limit 10 | jq '[.data[] | {text, metrics}]'
109
+
110
+ # What does the trend look like?
111
+ superx posts:analytics --since "$SINCE" | jq '.data.totals, .data.followers'
112
+ ```
113
+
114
+ ### Pattern 2: Draft first, schedule after review
115
+
116
+ ```bash
117
+ DRAFT=$(superx scheduled:create --text "Candidate post text")
118
+ DRAFT_ID=$(echo "$DRAFT" | jq -r '.data.id')
119
+ # ... surface the draft for human review ...
120
+ # To publish it at a time, delete the draft and re-create with --at:
121
+ superx scheduled:delete "$DRAFT_ID"
122
+ superx scheduled:create --text "Final post text" --at "2026-08-01T15:00:00Z"
123
+ ```
124
+
125
+ ### Pattern 3: Find who to engage with today
126
+
127
+ ```bash
128
+ # The people already engaging with you (reply to them first)
129
+ superx contacts:list --sort engagement --limit 10 | jq '[.data[] | {id, username, name}]'
130
+
131
+ # What has this person said to you lately?
132
+ superx contacts:replies "$CONTACT_ID" --sort recent --limit 5 | jq '.data'
133
+ ```
134
+
135
+ ### Pattern 4: Retry with backoff on rate limits
136
+
137
+ ```bash
138
+ for attempt in 1 2 3; do
139
+ if OUT=$(superx scheduled:create --text "Post" --at "2026-08-01T15:00:00Z" \
140
+ --idempotency-key "job-17"); then
141
+ echo "$OUT" | jq -r '.data.id'
142
+ break
143
+ fi
144
+ # Exit 1: stderr had "Error [rate_limited] ..." and a Retry-After hint
145
+ sleep $((attempt * 30))
146
+ done
147
+ ```
148
+
149
+ Rate limits are per account owner and scale with the plan: reads, writes, enrichment and feed fetches each have their own per-minute and per-day windows, and media uploads are capped at 100 per key per day. Every authenticated response carries `X-RateLimit-*` headers; `superx status` shows the current window and the AI credit pool. On 429 the stderr message includes the retry delay. Current numbers: https://docs.superx.so/rate-limits
150
+
151
+ ### Pattern 5: Batch a week of content
152
+
153
+ ```bash
154
+ TIMES=("2026-08-03T15:00:00Z" "2026-08-04T15:00:00Z" "2026-08-05T15:00:00Z")
155
+ TEXTS=("Monday post" "Tuesday post" "Wednesday post")
156
+ for i in "${!TIMES[@]}"; do
157
+ superx scheduled:create --text "${TEXTS[$i]}" --at "${TIMES[$i]}" \
158
+ --idempotency-key "week32-$i" | jq -r '.data.id'
159
+ done
160
+ superx scheduled:list --status scheduled
161
+ ```
162
+
163
+ ---
164
+
165
+ ## Skills
166
+
167
+ A goal-shaped recipe for every SuperX skill, each with its CLI chain, its MCP
168
+ tool chain and the point where it hands back to a person. Pick one by goal
169
+ and open its `recipe.md`; the three rules every skill obeys and the `--account`
170
+ scoping are in [references/skills/README.md](./references/skills/README.md).
171
+
172
+ <!-- skills:index:start -->
173
+ ### Grow & Plan
174
+ - **Weekly Growth Recap**: Your week in review: wins, patterns, and next week's focus. -> references/skills/weekly-growth-recap/recipe.md
175
+ - **Growth Plan Builder**: A multi-week growth plan tied to your actual numbers. -> references/skills/growth-plan-builder/recipe.md
176
+ - **Cadence & Queue Audit**: Diagnose your posting rhythm and spot queue gaps and pile-ups. -> references/skills/cadence-and-queue-audit/recipe.md
177
+ - **Find Your Story**: Find the story people follow you for: stakes, struggle, and where it's heading. -> references/skills/find-your-story/recipe.md
178
+
179
+ ### Content & Posting
180
+ - **Daily Post Ideas**: What to post today, drafted and ready to schedule. -> references/skills/daily-post-ideas/recipe.md
181
+ - **Viral Format Remix**: Borrow proven hooks and structures from 50M+ real posts. -> references/skills/viral-format-remix/recipe.md
182
+ - **Trending Now Scan**: High-performing posts in your niche from the last 48 hours. -> references/skills/trending-now-scan/recipe.md
183
+ - **Thread Builder**: Turn an idea or rough notes into a thread ready to schedule. -> references/skills/thread-builder/recipe.md
184
+ - **Week of Posts**: A week of drafts, spread across the week, one approval each. -> references/skills/week-of-posts/recipe.md
185
+ - **Repurpose a Winner**: Your best post, reworked into fresh angles. -> references/skills/repurpose-a-winner/recipe.md
186
+ - **Queue Reshuffle**: Move and rewrite scheduled posts by just asking. -> references/skills/queue-reshuffle/recipe.md
187
+ - **Worker Output Review**: Triage the posts your Workers wrote while you were away. -> references/skills/worker-output-review/recipe.md
188
+ - **Viral Score Loop**: Score a draft against your own posts, then sharpen it until the score stops rising. -> references/skills/viral-score-iterate/recipe.md
189
+
190
+ ### Replies & Engagement
191
+ - **Reply Sprint**: The replies your posts got, each with a ready-to-send draft. -> references/skills/reply-sprint/recipe.md
192
+ - **Reply to Any Post**: Paste any post, get the context and a strong reply. -> references/skills/reply-to-any-post/recipe.md
193
+ - **My Replies Report**: Which of your replies actually earn attention. -> references/skills/my-replies-report/recipe.md
194
+ - **Who Is This Person?**: A fast read on any public account, plus your history with them. -> references/skills/who-is-this-person/recipe.md
195
+
196
+ ### Leads & Prospecting
197
+ - **Your Warmest Leads**: The people already engaging with you most, ready for a follow-up. -> references/skills/your-warmest-leads/recipe.md
198
+ - **Instant Lead Hunt**: Search X live for people matching the audience you describe, scored. -> references/skills/instant-lead-hunt/recipe.md
199
+ - **Standing Lead Agent**: A lead-finding agent that keeps searching while you sleep. -> references/skills/standing-lead-agent/recipe.md
200
+ - **Lead Review**: The leads your agents found, prioritized, with the top few activity-checked. -> references/skills/lead-review/recipe.md
201
+
202
+ ### Outreach & DMs
203
+ - **Warm Outreach Pipeline**: Research a list, get personalized DMs, approve every message before it queues. -> references/skills/warm-outreach-pipeline/recipe.md
204
+ - **Profile Research Briefs**: Structured briefs on any list of people, exportable as CSV. -> references/skills/profile-research-briefs/recipe.md
205
+ - **Reply-to-DM Campaign**: DM the people who replied to any of your posts. -> references/skills/reply-to-dm-campaign/recipe.md
206
+ - **DM-Ready Audience Builder**: Build a clean, DM-able audience from any post or public X list. -> references/skills/dm-ready-audience-builder/recipe.md
207
+
208
+ ### Audience & Data
209
+ - **Audience Export**: Everyone who engaged a post, as a spreadsheet, no filters. -> references/skills/audience-export/recipe.md
210
+ - **Sentiment Slice**: Keep only the people who said what you're looking for. -> references/skills/sentiment-slice/recipe.md
211
+ - **My Content Export**: Your own posts or replies, as a spreadsheet. -> references/skills/my-content-export/recipe.md
212
+
213
+ ### Analytics & Insights
214
+ - **Post Post-Mortem**: Why a post overperformed or flopped, in plain terms. -> references/skills/post-post-mortem/recipe.md
215
+ - **Top Performers Breakdown**: The pattern your best posts share, and the shape to write more of. -> references/skills/top-performers-breakdown/recipe.md
216
+
217
+ ### Rules & Setup
218
+ - **Teach SuperX Your Rules**: Set standing rules for your AI drafts. -> references/skills/teach-superx-your-rules/recipe.md
219
+ <!-- skills:index:end -->
220
+
221
+ ---
222
+
223
+ ## Common Gotchas
224
+
225
+ 1. **Naive timestamps are rejected (400)**. Always include `Z` or an offset: `2026-08-01T15:00:00Z`, not `2026-08-01T15:00:00`.
226
+ 2. **Schedule window**: `--at` must be at least 60 seconds in the future and within 18 months.
227
+ 3. **Read-only keys cannot write**: `scheduled:create`/`scheduled:delete` with a read-only key returns 403 `insufficient_scope`. Check `superx me` for the key's scopes.
228
+ 4. **Shared accounts are read-only for writes**: writes work on your main account or any linked account (pass the same `--account` you used to read it). Accounts shared with you by other people return 403 `writes_main_account_only` for post, article, signal and contact-list member writes, and for `posts:draft`. `context:*` and `queue:set` are per-account settings that do accept a shared account.
229
+ 5. **Images need an upload first**: `--media` takes `object_key`s from `media:upload`, never file paths or URLs. Unknown keys return 400 `invalid_media`; a presign whose bytes were never PUT returns 400 `media_not_uploaded`. Video is not supported.
230
+ 6. **Size caps**: max 25 thread parts, 25,000 characters total.
231
+ 7. **Rate limited (429)**: `rate_limited` on stderr with a retry delay. Back off; do not hammer.
232
+ 8. **Draft vs scheduled**: no `--at` means DRAFT. Drafts never publish on their own.
233
+ 9. **Idempotency-Key reuse with a DIFFERENT body** returns 409 `idempotency_key_reuse`. Same body replays the original result with `"replayed": true`.
234
+ 10. **`account_not_found` (404)**: the `--account` id is not one of the key owner's accounts. Run `superx accounts` for valid ids.
235
+ 11. **Subscription errors**: a lapsed SuperX subscription returns 403. The account owner needs to resubscribe in the app.
236
+ 12. **`scheduled:list --status draft --from ...` returns nothing**: drafts have no scheduled time, so time bounds exclude them. Query drafts without `--from/--to`.
237
+ 13. **`scheduled:update --at` alone never publishes a draft**: promotion needs an explicit `--status scheduled`. Setting `--status scheduled` without any future time returns 400.
238
+ 14. **`scheduled:update --tag` replaces the FULL tag set**: pass every tag the post should keep, or use `--clear-tags` to remove all.
239
+ 15. **Text replacement wipes media unless re-listed**: `scheduled:update --text` (or `--part`) without `--media` removes the post's images. Re-include the current `object_key`s to keep them.
240
+ 16. **`articles:publish` is irreversible and needs X Premium**: without it the publish fails with 403 `x_premium_required`. On a timeout, `articles:get` first; the publish may have completed.
241
+ 17. **Article schedule lead time is 2 minutes** (posts need only 60 seconds). 400 `invalid_parameter` under that.
242
+ 18. **`articles:cover` needs a title** (400 `article_title_required`) and is capped daily/monthly (429 with `remaining_day`/`remaining_month`). One generation at a time per article (409 `cover_gen_in_progress`).
243
+ 19. **Article markdown degrades, never fails, for unsupported constructs** (code fences, `---`); check `warnings` in the response. Non-http(s) image or link URLs DO fail with 400.
244
+ 20. **System lists are index-only**: `lists:members` on a system list returns 400 `system_list_not_supported`; add/remove returns 400 `system_list_read_only`. Work with lists the user created.
245
+ 21. **`lists:add-member` takes exactly one of `--handle` or `--x-user-id`**. An unknown handle returns 404 `user_not_found`.
246
+ 22. **An unknown signal agent id returns 404 `agent_not_found`** (on `signals:leads --agent`, `signals:pause-agent`, `signals:resume-agent`, and `signals:delete-agent`; a repeated delete too).
247
+ 23. **Signal agents find leads asynchronously**: `signals:create-agent` returns the created agent, not leads. Leads land over the following minutes and days; read them with `signals:leads`.
248
+ 24. **Plan caps on agents return 403 `cap_reached`**: the plan allows only so many agents (and keyword signals per agent). Pause/delete an existing agent or ask the account owner to upgrade.
249
+ 25. **Agent creation is composite**: with an auto-created list, a mid-failure can leave an empty `Leads: ...` contact list behind (visible in `lists:list`, deletable in the app). The agent itself is never left without signals.
250
+ 26. **`context:set` list flags REPLACE the stored list**: `--interests` and `--favorite-creators` overwrite what is there; include every value the user should keep. `""` on a string flag clears it (style-guide overrides then revert to the generated guide). These settings steer all future AI output; confirm with the user before changing them.
251
+ 27. **`queue:set --slots-json` REPLACES the whole schedule** and re-flows queued posts onto the new slots. Read the current slots with `queue:get` first and send the full set. `'[]'` clears every slot and leaves the queue all-custom. `reflow.bailed: true` means the settings saved but no post moved.
252
+ 28. **`editor_restricted` (403)**: the account is shared with the key owner with Editor permission. Editors can change queue settings but not context settings. Only the account owner can.
253
+ 29. **`lists:add-members` takes ids SuperX already knows**: it does no live lookup, so any id in the response's `not_found` was never added. Add those with `lists:add-member --handle <handle>` one at a time (that path resolves live and costs an enrichment unit).
254
+ 30. **`contacts:get` and `contacts:notes:add` are known-contacts only**: they resolve engagers, contact-list members and scored signal leads, and 404 `contact_not_found` on any other id, including ids SuperX has a profile for. Get ids from `contacts:list`, `lists:members` or `signals:leads`; there is no general profile lookup yet. `contacts:notes`, `contacts:notes:update` and `contacts:notes:delete` are NOT restricted: they work on any id you already have a note on, so notes stay reachable after someone drops out of your contacts.
255
+ 31. **Notes written through the API are attributed to the acting account**, not to a separate API identity: `created_by` on a note is the account named by `--account` (your main account when omitted). A note id from a different contact returns 404 `note_not_found`.
256
+ 32. **`context:products:replace` REPLACES the whole product list**: products whose url is missing from `--json` are removed. Read `context:products` first, or use `context:products:set` for a single-product edit.
257
+ 33. **`posts:publish` is irreversible and needs `--idempotency-key`**: it posts to X immediately. Confirm the exact text with the user first. Without the key the command exits 1; on a timeout retry with the SAME key (409 `idempotency_in_flight` means the first attempt is still running, so wait for the `Retry-After` delay and retry that same key again). `--at`, `--title` and `--scratchpad` are rejected.
258
+ 34. **The bulk commands only touch QUEUED posts**: `scheduled:bulk-retime`, `scheduled:bulk-auto-retweet` and `scheduled:bulk-delete` skip drafts, sent posts and error rows, and `bulk-auto-retweet` also skips posts that already have an auto retweet. They answer with counts, so compare against `scheduled:list` rather than assuming every id was applied.
259
+ 35. **`replies:list` page 1 can carry `metrics_pending` items**: replies sent from the SuperX app in the last 4 hours are merged in with zero metrics until X reports them, so page 1 can hold slightly more items than `--limit`. Later pages and `--since`/`--until` queries never include them.
260
+ 36. **`engage:posts --limit` is keyword-feeds only**: list feeds return one page of about 10 to 25 posts per fetch, so page them with `--exclude` (the ids you already have, at most 100 per call), not a bigger `--limit`. Each plan also has a daily feed-fetch allowance (separate from reads) and a list feed that rotates its members counts as 3 fetches, so fetch big pages a few times a day rather than polling. Posts a fetch returns count as seen and are demoted in later fetches, in the app as well as here.
261
+ 37. **A feed you create is not the feed the app has open**: `engage:feeds:create` saves the feed but never switches the person's view. Tell them where to find it. The cap is 8 feeds (409 `feed_limit_reached`), `engage:feeds:update` takes one source at a time, and deleting the open feed hands the slot to the first remaining one.
262
+ 38. **An X list feed or signal costs enrichment and needs a PUBLIC list**: `engage:feeds:create --x-list`, `engage:feeds:update --x-list` and `signals:add-signal --type list_watch` each spend one enrichment unit and 404 `x_list_not_found` on a private or deleted list. Keyword and contact-list sources cost none.
263
+ 39. **`signals:create-agent` is partial success**: entries that fail come back in `warnings` with a `code`, and the agent is still created from the ones that landed. Read `warnings` before telling the user what the agent watches; re-add fixed entries with `signals:add-signal`.
264
+ 40. **`signals:feedback` takes the numeric LEAD id from `signals:leads`, not an X user id**, and it trains the scorer. Ask the user for the verdict rather than inferring one. An id from another account returns 404 `lead_not_found`; a repeated `signals:remove-signal` returns 404 `signal_not_found`.
265
+ 41. **`articles:cover --style-id` and `--style` are mutually exclusive** (400 if both are sent). Style ids come from `articles:cover-styles`; an unknown one returns 404 `cover_style_not_found`.
266
+ 42. **A dataset has to be `ready` before you read its rows, export it or add it to a list.** Poll `datasets:get <id>` until `status` is `ready`; anything else returns 409 `dataset_not_ready`, and a `failed` dataset has to be rebuilt in the SuperX app. Datasets expire after 30 days, after which the id 404s.
267
+ 43. **`datasets:add-to-list` dedupes by person and skips rows without an X account id** (research rows sometimes have none), so `added + duplicates` can be lower than the dataset's `row_count`. `skipped_without_id` counts only the rows with no usable X account id or handle; repeat rows for the same person (a replier who replied twice) are deduped silently and are not counted anywhere. Re-running the same command is safe: people already in the list come back in `duplicates`.
268
+ 44. **The `x:*` lookups share a 300/day allowance with Ask SuperX in the app**, on top of the enrichment allowance (1 unit each, 3 for `x:replies`, 2 for `x:post --quotes` or a handle SuperX has never seen). Look up what the user actually asked about; do not sweep an account's network. `429 lookup_quota_exceeded` covers three cases and the body says which: your own allowance is used up (it carries `limit`), the SuperX-wide allowance is used up (no `limit`, not your budget), or the counter could not be verified and the call was refused rather than run unmetered (no `limit`, short `retry_after`). Honour `retry_after` rather than assuming midnight, and report it rather than retrying in a loop. Repeats within 15 minutes come from a server-side cache and do not touch the daily allowance.
269
+ 45. **`x:replies` is a sample, not every reply**: the best-liked direct replies from up to 3 relevance-ranked pages, not chronological, and it cannot page further. It also does NOT exclude the account owner's own replies, unlike the same view in the app. Use the audience collections (`datasets:list`) when someone needs everyone who replied. And a `post_not_found` on `x:post` can be a transient upstream failure rather than a deleted post, so retry once before saying it is gone.
270
+
271
+ 46. **`audience:list` pages by cursor, not by page number.** Pass `pagination.next_cursor` back as `--cursor`; there is no `--page` and no `total`. Quote `meta.synced_count` for the size of the list, but note it may exceed the rows a full walk returns (edges that were later removed are still counted). Check `meta.status`: anything but `complete` means SuperX is still syncing, and `meta.is_capped: true` on the follow lists means it is the most recent slice, not everyone. `meta.account_id` is the account id you pass to `--account`; the X user id is `meta.x_account_id`. Repliers and reposters only cover a rolling 90 days.
272
+ 47. **`engage:mentions` costs 3 feed fetches per call and shows more than the app.** It draws on the same daily feed allowance as `engage:posts`, so read one page and work from it rather than polling. It does NOT apply the skipped/blocked filtering the app's Mentions tab does (that lives with the app), and by default it leaves out mentions already replied to on X unless you pass `--include-replied true`.
273
+ 48. **`datasets:collect` can return before the collection is done.** `status: "collecting"` means zero rows so far and work still running: use `--wait`, or poll `datasets:get` until `ready`, and never state a row count from the create result. A collection whose size cannot be established up front also runs in the background. It costs one of 10 collections a day shared with Ask SuperX in the app, only one runs per account at a time (409 `collection_in_progress`), and an empty result creates no dataset at all (`data: null` plus a `note`) and gives the daily slot back.
274
+ 49. **Nothing in the outreach chain sends a DM.** `datasets:outreach-drafts` writes message TEXT onto a research dataset and stops there; a person reviews and sends them from the SuperX app. Never say messages were sent and never offer to send them. If the user explicitly asks, you may QUEUE them with `dm:campaign` (one recipient entry per person, each with its own `message`), which is still an enqueue: the app sends. Ask the user for the `--format`; never invent one. Re-running overwrites every draft, `generic` counts messages written with no personal claims (that brief had no usable hook), and `contaminated` counts drafts discarded for naming a different recipient - run it again to retry those rows.
275
+ 50. **`signals:search` saves nothing and `datasets:research` charges per profile.** A search creates no agent and no stored leads, so keep what the user needs from that response; use `signals:create-agent` when they want leads to keep arriving. Research is a flat 1 credit per profile ACTUALLY researched (handles that cannot be resolved, and people with no recent posts, come back in `skipped` and are refunded), and over 5 profiles it runs in the background: never state a brief count from a `collecting` result. `datasets:refine` also creates a dataset, so it spends one of the same 10 collections a day.
276
+ 51. **`ai_action_limited` has two scopes.** Read `error.scope` before telling the user anything: `"account"` is their plan's own daily cap for that action, `"platform"` is a fair-use ceiling on live-data actions shared by every SuperX account. On `"platform"` their own allowance is untouched, so wait for `reset_at` and retry rather than reporting them as out of quota.
277
+ 52. **The writing helpers draft, they never publish.** `engage:reply-draft`, `posts:remix`, `tools:inline-edit`, `tools:rephrase`, `tools:factcheck` and `posts:viral-score` all return TEXT or a score and stop there - nothing is posted, scheduled or sent. Unlike `posts:draft`, they also accept an account shared with you. Show the output, let the user edit it, and use `posts:draft`, `scheduled:create` or `posts:publish` when they say so. A `tools:factcheck` verdict is a model reading two search results: report it with its sources, never as settled fact.
278
+ 53. **The free helpers cost nothing but are not unlimited.** `context:regenerate-style-guide` is once an hour per account and does not override a manual style-guide setting; `context:scrape-product` and `signals:expand-icp --url` share 20 page reads a day with the SuperX app, and `--url` also inherits the app's limit of 10 prefills per 10 minutes (that one comes back as `rate_limited` and clears in about a minute, so retry rather than reporting a daily budget); `signals:suggest-keywords` and `signals:expand-icp --text` have no ceiling of their own, so do not loop them - each one is a model call. All five send `X-Credits-Remaining` but no `X-Credits-Charged`, because nothing was charged. All four commands still need a key with the write scope: they are POSTs, and every non-GET API route needs it.
279
+ 54. **A DM campaign is an ENQUEUE, not a send.** `dm:campaign` returns counts of what was QUEUED; the SuperX app's scheduler sends them later, within the account's daily and monthly DM limits, so never report messages as delivered from that response - `dm:campaign-status` and `dm:queue` show what actually went out. Confirm the recipient list and the exact text with the user first: they are responsible for these messages under X's automation rules. Cancel the unsent ones with `dm:cancel`; anything already sent cannot be recalled.
280
+
281
+ ---
282
+
283
+ ## Quick Reference
284
+
285
+ ```bash
286
+ # AUTHENTICATE FIRST
287
+ superx status # Check auth + rate limits
288
+ superx login # Guided key paste
289
+ superx login --key "sxk_..." # Non-interactive
290
+ superx logout # Remove credentials
291
+ export SUPERX_API_KEY=sxk_... # Env alternative (CI)
292
+
293
+ # Identity
294
+ superx me # Owner, plan, key scopes
295
+ superx accounts # Readable accounts + ids
296
+
297
+ # Reads
298
+ superx posts:list --type posts --sort likes --limit 10
299
+ superx posts:list --since "2026-06-01T00:00:00Z" --until "2026-07-01T00:00:00Z"
300
+ superx posts:analytics --since "2026-06-01T00:00:00Z"
301
+ superx replies:list --limit 20
302
+ superx inspiration:search "build in public" --sort outlier --limit 10
303
+ superx inspiration:media "founder morning routine" --limit 10 # cross-platform media index (--limit up to 120, no paging)
304
+ superx contacts:list --sort engagement --limit 20
305
+ superx contacts:replies <id> --sort most_liked
306
+ superx contacts:get <x-user-id>
307
+ superx contacts:notes <x-user-id>
308
+ superx replies:received --sort most_liked --limit 20
309
+ superx lists:list
310
+ superx lists:members <list-id> --q "founder"
311
+ superx audience:list followers --limit 100 # system lists: cursor paging, no --page
312
+ superx engage:mentions --sort top # live @-mentions (costs 3 feed fetches)
313
+ superx signals:search --keywords "..." --icp "..." # live lead search, saves nothing
314
+ superx signals:agents
315
+ superx signals:leads --agent 3 --deposited false
316
+ superx engage:feeds
317
+ superx engage:posts <feed-id> --limit 50
318
+ superx datasets:list
319
+ superx datasets:get <dataset-id>
320
+ superx datasets:rows <dataset-id> --limit 50
321
+ superx datasets:export <dataset-id> # CSV file here; --out - streams to stdout
322
+ superx datasets:collect --source repliers --target <post-url> --wait # build one, poll until ready
323
+ superx datasets:refine <dataset-id> --criterion "..." --wait # filter by what each person wrote
324
+ superx datasets:research --handles a,b,c --wait # briefs, 1 credit per profile
325
+ superx datasets:outreach-drafts <dataset-id> --format "..." # message TEXT only, nothing sent
326
+
327
+ # Live X lookups (enrichment units + a shared 300/day allowance)
328
+ superx x:post <id-or-url> # one public post, live (--quotes for quotes)
329
+ superx x:replies <id-or-url> --limit 20 # best-liked direct replies (a sample)
330
+ superx x:user <handle> # one public profile, live
331
+ superx x:user-posts <handle> --no-reposts # one live page of their latest posts
332
+
333
+ # Contact writes (main or linked account)
334
+ superx contacts:notes:add <x-user-id> --body "..." # Private note, never posted
335
+ superx contacts:notes:update <x-user-id> <note-id> --body "..."
336
+ superx contacts:notes:delete <x-user-id> <note-id>
337
+
338
+ # Contact list writes (main or linked account)
339
+ superx lists:add-member <list-id> --handle levelsio
340
+ superx lists:remove-member <list-id> <member-id>
341
+ superx lists:create --name "Founder prospects"
342
+ superx lists:rename <list-id> --name "Q4 prospects"
343
+ superx lists:delete <list-id> # List + membership; the people stay
344
+ superx lists:add-members <list-id> --x-user-ids 44196397,944883311 # <=500, ids SuperX knows
345
+ superx lists:remove-members <list-id> --member-ids m1abc,m2def # <=500
346
+ superx datasets:add-to-list <dataset-id> --list-id <list-id> # people from a ready dataset
347
+
348
+ # Engage feed writes (main or linked account)
349
+ superx engage:feeds:create --name "AI builders" --keyword "shipping with LLMs"
350
+ superx engage:feeds:create --name "Founders" --x-list https://x.com/i/lists/1234567890
351
+ superx engage:feeds:update <feed-id> --name "AI builders v2"
352
+ superx engage:feeds:delete <feed-id>
353
+
354
+ # Signal agent writes (main or linked account)
355
+ superx signals:create-agent --name "..." --icp "..." --keyword "..." # Lead finder
356
+ superx signals:create-agent --name "..." --icp "..." --signal "profile:@naval"
357
+ superx signals:update-agent <id> --icp "..." --list-id <contact-list-id>
358
+ superx signals:add-signal <id> --type follower_watch --handle naval
359
+ superx signals:remove-signal <id> <signal-id>
360
+ superx signals:feedback <lead-id> --fit # or --not-fit / --clear
361
+ superx signals:pause-agent <id>
362
+ superx signals:resume-agent <id>
363
+ superx signals:delete-agent <id>
364
+
365
+ # Writes (main or linked account via --account)
366
+ superx scheduled:create --text "Post" # Draft
367
+ superx scheduled:create --text "Post" --at "2026-08-01T15:00:00Z" # Scheduled
368
+ superx scheduled:create --part "1/" --part "2/" --at "..." # Thread
369
+ superx scheduled:create --text "Post" --at "..." --idempotency-key k1 # Safe retry
370
+ superx scheduled:create --text "Post" --title "Hook v2" --tag <id> # Organizer fields
371
+ superx media:upload ./chart.png # Image -> object_key
372
+ superx scheduled:create --text "Post" --media <object_key> --alt-text "..." # With image
373
+ superx scheduled:update <id> --title "Better hook" # Edit; only passed flags change
374
+ superx scheduled:update <id> --at "..." --status scheduled # Promote a draft
375
+ superx scheduled:list --status draft,scheduled
376
+ superx scheduled:list --tags <tag-id>
377
+ superx scheduled:delete <id>
378
+
379
+ # Publish NOW (irreversible; key required, reuse it on a retry)
380
+ superx posts:publish --text "Post" --idempotency-key k1
381
+
382
+ # Writing helpers (text in, text out; nothing is posted)
383
+ superx engage:reply-draft --post <id> --thoughts "..." --tone concise
384
+ superx posts:remix --text "..." --closeness 70
385
+ superx tools:inline-edit --text "..." --full "..." --type hook
386
+ superx tools:rephrase --type concise --text "..."
387
+ superx tools:factcheck --text "..."
388
+ superx posts:viral-score --text "..."
389
+
390
+ # DM campaigns (queued only; the SuperX app sends them)
391
+ superx dm:limits
392
+ superx dm:campaign --recipients people.json --message "Hey [first], ..."
393
+ superx dm:campaign-status <campaign-id>
394
+ superx dm:queue --status pending
395
+ superx dm:cancel <campaign-id>
396
+
397
+ # Free helpers (no AI credits)
398
+ superx context:regenerate-style-guide
399
+ superx context:scrape-product <product-id>
400
+ superx signals:suggest-keywords --icp "B2B SaaS founders worried about churn"
401
+ superx signals:expand-icp --text "Indie founders building SaaS in public"
402
+ superx signals:expand-icp --url superx.so
403
+
404
+ # Bulk queue operations (queued posts only; answers are counts)
405
+ superx scheduled:bulk-retime --moves-json '[{"id":"abc","scheduled_for":"2026-09-08T15:00:00Z"}]'
406
+ superx scheduled:bulk-auto-retweet --ids abc,def --auto-retweet 6
407
+ superx scheduled:bulk-delete --ids abc,def
408
+
409
+ # Tags
410
+ superx tags:list
411
+ superx tags:create "Launch week" --color amber
412
+ superx tags:update <id> --name "Launch"
413
+ superx tags:delete <id>
414
+
415
+ # Articles (markdown bodies; publish is live + irreversible)
416
+ superx articles:create --title "My article" --file draft.md
417
+ superx articles:list --status draft
418
+ superx articles:get <id>
419
+ superx articles:update <id> --file v2.md
420
+ superx articles:schedule <id> --at "2026-08-01T15:00:00Z"
421
+ superx articles:unschedule <id>
422
+ superx articles:publish <id>
423
+ superx articles:cover-styles
424
+ superx articles:cover <id> --style "minimal"
425
+ superx articles:cover <id> --style-id <style-id>
426
+ superx articles:delete <id>
427
+
428
+ # Context settings (AI writing background)
429
+ superx context:get
430
+ superx context:set --rules "Never use hashtags."
431
+ superx context:set --interests "indie hacking,SaaS" # replaces the list
432
+ superx context:products
433
+ superx context:products:set --url "https://superx.so" --name "SuperX"
434
+ superx context:products:delete <id>
435
+ superx context:products:replace --json '[{"url":"https://superx.so"}]' # FULL REPLACE
436
+
437
+ # Queue settings (posting schedule; 0 = Sunday)
438
+ superx queue:get
439
+ superx queue:set --slots-json '[{"time":"09:00","days":[1,3,5]}]' # replaces the slots
440
+ superx queue:set --timezone "Europe/London" # never moves posts
441
+
442
+ # Docs and help
443
+ superx docs # API quickstart (markdown)
444
+ superx --help # All commands
445
+ superx scheduled:create --help # Command help
446
+ ```
447
+
448
+ Strategy lives in [references/growth-strategy.md](./references/growth-strategy.md). Read it before creating content (Rule 2). Goal-shaped recipes live in [references/skills/](./references/skills/): open the one that matches what the user asked for.