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.
- package/CHANGELOG.md +16 -0
- package/README.md +9 -5
- package/dist/index.js +255 -18
- package/package.json +5 -5
- package/skills/superx/SKILL.md +448 -0
- package/{SKILL.md → skills/superx/references/commands.md} +47 -429
- package/{PLAYBOOK.md → skills/superx/references/growth-strategy.md} +3 -3
- package/skills/superx/references/skills/README.md +31 -0
- package/skills/superx/references/skills/audience-export/card.json +20 -0
- package/skills/superx/references/skills/audience-export/recipe.md +13 -0
- package/skills/superx/references/skills/cadence-and-queue-audit/card.json +22 -0
- package/skills/superx/references/skills/cadence-and-queue-audit/recipe.md +17 -0
- package/skills/superx/references/skills/categories.json +41 -0
- package/skills/superx/references/skills/daily-post-ideas/card.json +22 -0
- package/skills/superx/references/skills/daily-post-ideas/recipe.md +17 -0
- package/skills/superx/references/skills/dm-ready-audience-builder/card.json +21 -0
- package/skills/superx/references/skills/dm-ready-audience-builder/recipe.md +16 -0
- package/skills/superx/references/skills/find-your-story/card.json +23 -0
- package/skills/superx/references/skills/find-your-story/recipe.md +17 -0
- package/skills/superx/references/skills/growth-plan-builder/card.json +21 -0
- package/skills/superx/references/skills/growth-plan-builder/recipe.md +17 -0
- package/skills/superx/references/skills/instant-lead-hunt/card.json +21 -0
- package/skills/superx/references/skills/instant-lead-hunt/recipe.md +14 -0
- package/skills/superx/references/skills/lead-review/card.json +20 -0
- package/skills/superx/references/skills/lead-review/recipe.md +16 -0
- package/skills/superx/references/skills/my-content-export/card.json +21 -0
- package/skills/superx/references/skills/my-content-export/recipe.md +15 -0
- package/skills/superx/references/skills/my-replies-report/card.json +20 -0
- package/skills/superx/references/skills/my-replies-report/recipe.md +13 -0
- package/skills/superx/references/skills/post-post-mortem/card.json +20 -0
- package/skills/superx/references/skills/post-post-mortem/recipe.md +16 -0
- package/skills/superx/references/skills/profile-research-briefs/card.json +21 -0
- package/skills/superx/references/skills/profile-research-briefs/recipe.md +15 -0
- package/skills/superx/references/skills/queue-reshuffle/card.json +21 -0
- package/skills/superx/references/skills/queue-reshuffle/recipe.md +15 -0
- package/skills/superx/references/skills/reply-sprint/card.json +20 -0
- package/skills/superx/references/skills/reply-sprint/recipe.md +12 -0
- package/skills/superx/references/skills/reply-to-any-post/card.json +20 -0
- package/skills/superx/references/skills/reply-to-any-post/recipe.md +15 -0
- package/skills/superx/references/skills/reply-to-dm-campaign/card.json +21 -0
- package/skills/superx/references/skills/reply-to-dm-campaign/recipe.md +18 -0
- package/skills/superx/references/skills/repurpose-a-winner/card.json +21 -0
- package/skills/superx/references/skills/repurpose-a-winner/recipe.md +16 -0
- package/skills/superx/references/skills/sentiment-slice/card.json +20 -0
- package/skills/superx/references/skills/sentiment-slice/recipe.md +15 -0
- package/skills/superx/references/skills/standing-lead-agent/card.json +21 -0
- package/skills/superx/references/skills/standing-lead-agent/recipe.md +17 -0
- package/skills/superx/references/skills/teach-superx-your-rules/card.json +21 -0
- package/skills/superx/references/skills/teach-superx-your-rules/recipe.md +15 -0
- package/skills/superx/references/skills/thread-builder/card.json +20 -0
- package/skills/superx/references/skills/thread-builder/recipe.md +14 -0
- package/skills/superx/references/skills/top-performers-breakdown/card.json +21 -0
- package/skills/superx/references/skills/top-performers-breakdown/recipe.md +13 -0
- package/skills/superx/references/skills/trending-now-scan/card.json +21 -0
- package/skills/superx/references/skills/trending-now-scan/recipe.md +14 -0
- package/skills/superx/references/skills/viral-format-remix/card.json +20 -0
- package/skills/superx/references/skills/viral-format-remix/recipe.md +15 -0
- package/skills/superx/references/skills/viral-score-iterate/card.json +22 -0
- package/skills/superx/references/skills/viral-score-iterate/recipe.md +15 -0
- package/skills/superx/references/skills/warm-outreach-pipeline/card.json +21 -0
- package/skills/superx/references/skills/warm-outreach-pipeline/recipe.md +19 -0
- package/skills/superx/references/skills/week-of-posts/card.json +19 -0
- package/skills/superx/references/skills/week-of-posts/recipe.md +18 -0
- package/skills/superx/references/skills/weekly-growth-recap/card.json +22 -0
- package/skills/superx/references/skills/weekly-growth-recap/recipe.md +17 -0
- package/skills/superx/references/skills/who-is-this-person/card.json +20 -0
- package/skills/superx/references/skills/who-is-this-person/recipe.md +16 -0
- package/skills/superx/references/skills/worker-output-review/card.json +20 -0
- package/skills/superx/references/skills/worker-output-review/recipe.md +18 -0
- package/skills/superx/references/skills/your-warmest-leads/card.json +21 -0
- package/skills/superx/references/skills/your-warmest-leads/recipe.md +14 -0
- package/PLAYBOOKS.md +0 -542
|
@@ -1,89 +1,42 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
##
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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 PLAYBOOK.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 PLAYBOOK.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
|
-
```
|
|
1
|
+
# SuperX CLI command reference
|
|
2
|
+
|
|
3
|
+
Every `superx` command family with its flags and the caveats that matter, moved
|
|
4
|
+
here verbatim from the skill's command list. Open the section you need rather
|
|
5
|
+
than reading the file top to bottom. Hard rules, output contract and gotchas
|
|
6
|
+
stay in [SKILL.md](../SKILL.md).
|
|
7
|
+
|
|
8
|
+
## Contents
|
|
9
|
+
|
|
10
|
+
- [Authentication](#authentication)
|
|
11
|
+
- [Identity and accounts](#identity-and-accounts)
|
|
12
|
+
- [Posts and analytics](#posts-and-analytics)
|
|
13
|
+
- [Inspiration (viral post library)](#inspiration-viral-post-library)
|
|
14
|
+
- [Live X lookups](#live-x-lookups)
|
|
15
|
+
- [Inspiration media (cross-platform)](#inspiration-media-cross-platform)
|
|
16
|
+
- [Contacts (who engages with you)](#contacts-who-engages-with-you)
|
|
17
|
+
- [Contact lists](#contact-lists)
|
|
18
|
+
- [Audience (followers, following, repliers, reposters)](#audience-followers-following-repliers-reposters)
|
|
19
|
+
- [Mentions (who is talking to you right now)](#mentions-who-is-talking-to-you-right-now)
|
|
20
|
+
- [Datasets (Ask SuperX collections)](#datasets-ask-superx-collections)
|
|
21
|
+
- [Engage (feed posts to reply to)](#engage-feed-posts-to-reply-to)
|
|
22
|
+
- [Signals (automated lead finding)](#signals-automated-lead-finding)
|
|
23
|
+
- [Lead search and outreach (live search, briefs, drafts)](#lead-search-and-outreach-live-search-briefs-drafts)
|
|
24
|
+
- [Writing helpers (drafts, remix, edits, checks)](#writing-helpers-drafts-remix-edits-checks)
|
|
25
|
+
- [Workers (posts written for you on a schedule)](#workers-posts-written-for-you-on-a-schedule)
|
|
26
|
+
- [Scheduling](#scheduling)
|
|
27
|
+
- [Publishing now (irreversible)](#publishing-now-irreversible)
|
|
28
|
+
- [Bulk queue operations](#bulk-queue-operations)
|
|
29
|
+
- [Editing drafts and scheduled posts](#editing-drafts-and-scheduled-posts)
|
|
30
|
+
- [Advanced settings (auto retweet, auto delete, auto plug, auto DM, super followers)](#advanced-settings-auto-retweet-auto-delete-auto-plug-auto-dm-super-followers)
|
|
31
|
+
- [DM campaigns (queue only; the app sends)](#dm-campaigns-queue-only-the-app-sends)
|
|
32
|
+
- [Tags](#tags)
|
|
33
|
+
- [Context settings (AI writing background)](#context-settings-ai-writing-background)
|
|
34
|
+
- [Queue settings (posting schedule)](#queue-settings-posting-schedule)
|
|
35
|
+
- [Articles (long-form X posts)](#articles-long-form-x-posts)
|
|
36
|
+
- [Docs](#docs)
|
|
82
37
|
|
|
83
38
|
---
|
|
84
39
|
|
|
85
|
-
## Essential Commands
|
|
86
|
-
|
|
87
40
|
### Authentication
|
|
88
41
|
|
|
89
42
|
```bash
|
|
@@ -120,7 +73,7 @@ superx replies:received --limit 20 # Replies the audience has se
|
|
|
120
73
|
- `posts:list` flags: `--type posts|replies|all`, `--sort posted_at|likes|impressions`, `--since/--until`, `--limit` (max 100), `--page`.
|
|
121
74
|
- Post objects include `metrics` (likes, replies, reposts, quotes, bookmarks, impressions).
|
|
122
75
|
- `posts:analytics` range is capped at 366 days.
|
|
123
|
-
- `replies:received` shows who replied, what they said, likes, and the post they replied to. Flags: `--sort recent|most_liked`, `--since/--until`, `--limit` (max 100), `--page`. Use it to find replies worth answering (see
|
|
76
|
+
- `replies:received` shows who replied, what they said, likes, and the post they replied to. Flags: `--sort recent|most_liked`, `--since/--until`, `--limit` (max 100), `--page`. Use it to find replies worth answering (see `growth-strategy.md` on closing engagement loops).
|
|
124
77
|
|
|
125
78
|
### Inspiration (viral post library)
|
|
126
79
|
|
|
@@ -369,7 +322,8 @@ superx signals:feedback 4821 --clear
|
|
|
369
322
|
```bash
|
|
370
323
|
# Find people on X right now (saves NOTHING: no agent, no stored leads)
|
|
371
324
|
superx signals:search \
|
|
372
|
-
--
|
|
325
|
+
--offer "ChurnRadar, retention analytics that flags accounts about to cancel" \
|
|
326
|
+
--keywords "cancelled today, mrr dropped, renewal call, churn rate" \
|
|
373
327
|
--icp "B2B SaaS founders worried about retention" \
|
|
374
328
|
--precision discovery --max 10 --max-age-days 7
|
|
375
329
|
|
|
@@ -387,6 +341,7 @@ superx datasets:rows <dataset-id> --limit 50 # read every drafted message
|
|
|
387
341
|
|
|
388
342
|
- **Nothing in this chain sends a DM.** `datasets:outreach-drafts` writes message TEXT onto the dataset's `message` column and stops there. A person reviews and sends them from the SuperX app. Never tell the user their messages have gone out, and never imply the CLI can send them.
|
|
389
343
|
- `signals:suggest-keywords --icp "..."` and `signals:expand-icp (--text | --url)` stage what a new agent needs before you create one: keyword ideas, and the rubric the scorer reads the ICP as. Both are FREE and create nothing. Pass a suggestion to `signals:create-agent --keyword`; the rubric has nowhere to be saved (agents are created with `--icp`), so use it to sharpen that text. `--url` reads a website and also returns an `icp_description` to pass straight to `--icp`; it costs one of the account's 20 page reads a day, shared with the app, and takes up to a minute.
|
|
344
|
+
- `signals:search --offer` is the single biggest lever on result quality: one sentence on what is being sold. `--keywords` are seed ANGLES for the plan, not the query, so write 2-5 short phrases of how the BUYER talks (workflows, tools they already pay for, jargon, a symptom), never the product's own name. The search plans up to 10 queries from those and runs them all: `data.queries_used` says how many angles it covered, `data.query_plan` lists each query with its angle and what it found, and `data.partial` is true when a time budget cut it short.
|
|
390
345
|
- `signals:search` needs a key with the **write** scope (every non-GET API route does), even though it CREATES NOTHING. The leads exist only in that response, so save what you need. For an audience that keeps filling up on its own, use `signals:create-agent` instead. It takes up to a minute, and each lead comes from ONE matched post: `posts_count` is lifetime volume, not proof of current activity. That post is always recent: `--max-age-days` sets the window (1-90, default 30), older matches are skipped and counted in `freshness.stale_skipped`, and each lead's `provenance.posted_at` / `provenance.post_age_days` says when it was written. Use `--max-age-days 7` for a pain point worth catching while it is fresh; leads come back freshest first within each score, so keep that order. An empty result with a `stale_skipped` above 0 means people DO post about this, just not lately: broaden the keywords, or raise the window only if the user wants people active over a longer stretch.
|
|
391
346
|
- `datasets:research` needs exactly one of `--handles` (max 25), `--list`, `--agent` or `--dataset`, and `--max` is 1-25 (default 10). Every hook in a brief QUOTES one of the person's real posts; proposed quotes that failed the verbatim check are dropped server-side, so a brief with no hooks is honest, not broken. More than 5 profiles run in the background (`202 collecting`) - pass `--wait` or poll `datasets:get`.
|
|
392
347
|
- `datasets:outreach-drafts` needs a `--format` from the USER: their template or an example message. Never invent one. `[name]`, `[first]` and `[handle]` are kept intact for per-recipient fill-in at send time. A brief with no usable hook gets an honest generic message counted in `generic`, and a draft that names a DIFFERENT recipient is discarded and counted in `contaminated` (run it again to retry those rows). Re-running overwrites every draft.
|
|
@@ -411,9 +366,12 @@ superx tools:inline-edit --text "..." --instruction "make this one line, lowerca
|
|
|
411
366
|
# One preset rewrite of a whole post
|
|
412
367
|
superx tools:rephrase --type concise --text "$(cat post.txt)"
|
|
413
368
|
|
|
414
|
-
# Check a claim
|
|
369
|
+
# Check a claim
|
|
415
370
|
superx tools:factcheck --text "X has 600M daily active users"
|
|
416
|
-
|
|
371
|
+
|
|
372
|
+
# Score a draft against this account's own normal post, then improve it
|
|
373
|
+
superx posts:viral-score --text "$(cat draft.txt)"
|
|
374
|
+
superx posts:viral-score --text "$(cat draft-v2.txt)" --image
|
|
417
375
|
```
|
|
418
376
|
|
|
419
377
|
- **Every one of these returns TEXT and posts NOTHING.** `engage:reply-draft` writes a reply for a person to review and post; there is still no reply-sending command anywhere in the CLI. Show the draft, let the user edit it, and never say a reply went out.
|
|
@@ -421,7 +379,8 @@ superx tools:predict --a "$(cat v1.txt)" --b "$(cat v2.txt)"
|
|
|
421
379
|
- `posts:remix` needs `--closeness` 0-100: 0 keeps only the idea, 100 stays very close to the original wording. Use it on a proven post the user wants to say again in their own words, then save the result with `posts:draft` or `scheduled:create`.
|
|
422
380
|
- `tools:inline-edit` needs `--instruction`, `--type`, or both, and works best with `--full` so the edit blends into the post around it. `--type` presets: grammar, translate, hook, details, concise, engaging, humorous, creative, sarcastic, inspirational.
|
|
423
381
|
- `tools:rephrase` presets: improve, grammar, translate, hook, details, clarity, engaging, humorous, positive, creative, sarcastic, inspirational, concise. The style ones write in the user's voice; grammar, translate, clarity, details and concise stay mechanical.
|
|
424
|
-
- `tools:factcheck` reports `result` (true, false or unknown), a one-sentence `comment` and the `sources` it read. It is a model's reading of a couple of search results, NOT a guarantee: show the sources and never present the verdict as settled.
|
|
382
|
+
- `tools:factcheck` reports `result` (true, false or unknown), a one-sentence `comment` and the `sources` it read. It is a model's reading of a couple of search results, NOT a guarantee: show the sources and never present the verdict as settled.
|
|
383
|
+
- `posts:viral-score` scores ONE draft from 0 to 100 against the account's OWN recent posts, with `helped` / `hurt` in plain English and an expected multiple per counter (`reposts_and_quotes` and `views` come back `confidence: "low"`, so say so). It is not a reach prediction and it knows nothing about follower count. Rewrite what `hurt` names, score again, and stop when the score stops rising: three or four rounds is the useful range. NEVER chase the score with reply bait - anything in `warnings` (asking for replies, inviting people to connect, a borrowed template, sending readers off the platform) can only push a score DOWN, so a warning means change the post, not work around it. The baseline is the account's originals from the past 90 days, minus the last 3 days whose numbers are still settling; `baseline.kind: "population"` means fewer than 10 of those were usable and the draft was scored against the average training post instead.
|
|
425
384
|
- Costs are measured AI credits: typically 1 each, and 2 for a remix or a reply draft. None of them spends a live X request except `engage:reply-draft --post`.
|
|
426
385
|
|
|
427
386
|
### Workers (posts written for you on a schedule)
|
|
@@ -712,344 +671,3 @@ superx articles:cover <article-id> --style "dark, minimal, geometric" --no-attac
|
|
|
712
671
|
```bash
|
|
713
672
|
superx docs # Prints the API quickstart as markdown (works before login)
|
|
714
673
|
```
|
|
715
|
-
|
|
716
|
-
---
|
|
717
|
-
|
|
718
|
-
## Common Patterns
|
|
719
|
-
|
|
720
|
-
### Pattern 1: Study what works before writing
|
|
721
|
-
|
|
722
|
-
```bash
|
|
723
|
-
# Top posts by engagement, last 60 days
|
|
724
|
-
SINCE=$(date -u -v-60d +"%Y-%m-%dT00:00:00Z" 2>/dev/null || date -u -d "60 days ago" +"%Y-%m-%dT00:00:00Z")
|
|
725
|
-
superx posts:list --sort likes --since "$SINCE" --limit 10 | jq '[.data[] | {text, metrics}]'
|
|
726
|
-
|
|
727
|
-
# What does the trend look like?
|
|
728
|
-
superx posts:analytics --since "$SINCE" | jq '.data.totals, .data.followers'
|
|
729
|
-
```
|
|
730
|
-
|
|
731
|
-
### Pattern 2: Draft first, schedule after review
|
|
732
|
-
|
|
733
|
-
```bash
|
|
734
|
-
DRAFT=$(superx scheduled:create --text "Candidate post text")
|
|
735
|
-
DRAFT_ID=$(echo "$DRAFT" | jq -r '.data.id')
|
|
736
|
-
# ... surface the draft for human review ...
|
|
737
|
-
# To publish it at a time, delete the draft and re-create with --at:
|
|
738
|
-
superx scheduled:delete "$DRAFT_ID"
|
|
739
|
-
superx scheduled:create --text "Final post text" --at "2026-08-01T15:00:00Z"
|
|
740
|
-
```
|
|
741
|
-
|
|
742
|
-
### Pattern 3: Find who to engage with today
|
|
743
|
-
|
|
744
|
-
```bash
|
|
745
|
-
# The people already engaging with you (reply to them first)
|
|
746
|
-
superx contacts:list --sort engagement --limit 10 | jq '[.data[] | {id, username, name}]'
|
|
747
|
-
|
|
748
|
-
# What has this person said to you lately?
|
|
749
|
-
superx contacts:replies "$CONTACT_ID" --sort recent --limit 5 | jq '.data'
|
|
750
|
-
```
|
|
751
|
-
|
|
752
|
-
### Pattern 4: Retry with backoff on rate limits
|
|
753
|
-
|
|
754
|
-
```bash
|
|
755
|
-
for attempt in 1 2 3; do
|
|
756
|
-
if OUT=$(superx scheduled:create --text "Post" --at "2026-08-01T15:00:00Z" \
|
|
757
|
-
--idempotency-key "job-17"); then
|
|
758
|
-
echo "$OUT" | jq -r '.data.id'
|
|
759
|
-
break
|
|
760
|
-
fi
|
|
761
|
-
# Exit 1: stderr had "Error [rate_limited] ..." and a Retry-After hint
|
|
762
|
-
sleep $((attempt * 30))
|
|
763
|
-
done
|
|
764
|
-
```
|
|
765
|
-
|
|
766
|
-
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
|
|
767
|
-
|
|
768
|
-
### Pattern 5: Batch a week of content
|
|
769
|
-
|
|
770
|
-
```bash
|
|
771
|
-
TIMES=("2026-08-03T15:00:00Z" "2026-08-04T15:00:00Z" "2026-08-05T15:00:00Z")
|
|
772
|
-
TEXTS=("Monday post" "Tuesday post" "Wednesday post")
|
|
773
|
-
for i in "${!TIMES[@]}"; do
|
|
774
|
-
superx scheduled:create --text "${TEXTS[$i]}" --at "${TIMES[$i]}" \
|
|
775
|
-
--idempotency-key "week32-$i" | jq -r '.data.id'
|
|
776
|
-
done
|
|
777
|
-
superx scheduled:list --status scheduled
|
|
778
|
-
```
|
|
779
|
-
|
|
780
|
-
---
|
|
781
|
-
|
|
782
|
-
## Playbooks
|
|
783
|
-
|
|
784
|
-
Full recipes with flags and MCP tool chains: [PLAYBOOKS.md](./PLAYBOOKS.md). Pick by goal, then open that entry.
|
|
785
|
-
|
|
786
|
-
### Recaps and analytics
|
|
787
|
-
- **Weekly Growth Recap**: the week in review, one focus for next week. `posts:analytics` -> `posts:list` -> `signals:leads` -> `replies:received`
|
|
788
|
-
- **Growth Plan Builder**: multi-week plan tied to real numbers. `posts:analytics` -> `posts:list` -> `replies:list` -> `queue:get`
|
|
789
|
-
- **Post Post-Mortem**: why one post over- or underperformed. `posts:list` -> `posts:analytics` -> `x:user-posts`
|
|
790
|
-
- **Top Performers Breakdown**: the shape the best posts share. `posts:list` -> `posts:analytics`
|
|
791
|
-
- **My Replies Report**: which replies earned attention. `replies:list`
|
|
792
|
-
|
|
793
|
-
### Content
|
|
794
|
-
- **Daily Post Ideas**: two or three drafts for today. `scheduled:list` -> `posts:list` -> `posts:draft` -> `scheduled:create`
|
|
795
|
-
- **Week of Posts**: a week of drafts on the real slots. `posts:list` -> `queue:get` -> `posts:draft` -> `scheduled:create`
|
|
796
|
-
- **Thread Builder**: notes turned into a thread draft. `posts:draft` -> `scheduled:create`
|
|
797
|
-
- **Repurpose a Winner**: the best post, reworked. `posts:list` -> `posts:remix` -> `scheduled:create`
|
|
798
|
-
- **Viral Format Remix**: proven shapes in this account's voice. `inspiration:search` -> `posts:draft` -> `scheduled:create`
|
|
799
|
-
- **Trending Now Scan**: what is working in the niche now. `inspiration:search`
|
|
800
|
-
|
|
801
|
-
### Queue
|
|
802
|
-
- **Cadence & Queue Audit**: gaps, pile-ups, a cadence verdict. `queue:get` -> `scheduled:list` -> `posts:list` -> `scheduled:update`
|
|
803
|
-
- **Queue Reshuffle**: move and rewrite queued posts. `scheduled:list` -> `scheduled:bulk-retime` -> `scheduled:update`
|
|
804
|
-
|
|
805
|
-
### Replies (stop at a draft, by design)
|
|
806
|
-
- **Reply Sprint**: five audience replies, each with a draft. `replies:received` -> `engage:reply-draft`
|
|
807
|
-
- **Reply to Any Post**: context plus one strong reply draft. `x:post` -> `x:replies` -> `engage:reply-draft`
|
|
808
|
-
|
|
809
|
-
### Leads
|
|
810
|
-
- **Who Is This Person?**: a fast read plus your history. `x:user` -> `x:user-posts` -> `contacts:get` -> `contacts:replies`
|
|
811
|
-
- **Your Warmest Leads**: the people engaging most, ranked. `contacts:list` -> `contacts:replies`
|
|
812
|
-
- **Instant Lead Hunt**: live search for matching people now. `signals:suggest-keywords` -> `signals:search`
|
|
813
|
-
- **Standing Lead Agent**: an agent that keeps finding leads. `signals:expand-icp` -> `signals:create-agent` -> `signals:leads`
|
|
814
|
-
- **Lead Review**: found leads, prioritized and checked. `signals:agents` -> `signals:leads` -> `x:user-posts` -> `signals:feedback`
|
|
815
|
-
|
|
816
|
-
### Audiences, research and DMs
|
|
817
|
-
- **Profile Research Briefs**: structured briefs plus a CSV. `datasets:research` -> `datasets:rows` -> `datasets:export`
|
|
818
|
-
- **DM-Ready Audience Builder**: a clean DM-able audience. `datasets:collect` -> `datasets:get` -> `datasets:add-to-list`
|
|
819
|
-
- **Sentiment Slice**: keep only the people who said it. `datasets:list` -> `datasets:refine` -> `datasets:rows`
|
|
820
|
-
- **Audience Export**: everyone who engaged a post, as CSV. `datasets:collect` -> `datasets:export`
|
|
821
|
-
- **My Content Export**: your own posts or replies, as CSV. `datasets:collect` -> `datasets:export`
|
|
822
|
-
- **Warm Outreach Pipeline**: briefs, a message each, queued. `datasets:research` -> `datasets:outreach-drafts` -> `dm:campaign`
|
|
823
|
-
- **Reply-to-DM Campaign**: DM the people who replied. `datasets:collect` -> `datasets:refine` -> `dm:campaign`
|
|
824
|
-
|
|
825
|
-
### Settings
|
|
826
|
-
- **Teach SuperX Your Rules**: standing rules for AI drafts. `context:get` -> `context:set`
|
|
827
|
-
|
|
828
|
-
---
|
|
829
|
-
|
|
830
|
-
## Common Gotchas
|
|
831
|
-
|
|
832
|
-
1. **Naive timestamps are rejected (400)**. Always include `Z` or an offset: `2026-08-01T15:00:00Z`, not `2026-08-01T15:00:00`.
|
|
833
|
-
2. **Schedule window**: `--at` must be at least 60 seconds in the future and within 18 months.
|
|
834
|
-
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.
|
|
835
|
-
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.
|
|
836
|
-
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.
|
|
837
|
-
6. **Size caps**: max 25 thread parts, 25,000 characters total.
|
|
838
|
-
7. **Rate limited (429)**: `rate_limited` on stderr with a retry delay. Back off; do not hammer.
|
|
839
|
-
8. **Draft vs scheduled**: no `--at` means DRAFT. Drafts never publish on their own.
|
|
840
|
-
9. **Idempotency-Key reuse with a DIFFERENT body** returns 409 `idempotency_key_reuse`. Same body replays the original result with `"replayed": true`.
|
|
841
|
-
10. **`account_not_found` (404)**: the `--account` id is not one of the key owner's accounts. Run `superx accounts` for valid ids.
|
|
842
|
-
11. **Subscription errors**: a lapsed SuperX subscription returns 403. The account owner needs to resubscribe in the app.
|
|
843
|
-
12. **`scheduled:list --status draft --from ...` returns nothing**: drafts have no scheduled time, so time bounds exclude them. Query drafts without `--from/--to`.
|
|
844
|
-
13. **`scheduled:update --at` alone never publishes a draft**: promotion needs an explicit `--status scheduled`. Setting `--status scheduled` without any future time returns 400.
|
|
845
|
-
14. **`scheduled:update --tag` replaces the FULL tag set**: pass every tag the post should keep, or use `--clear-tags` to remove all.
|
|
846
|
-
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.
|
|
847
|
-
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.
|
|
848
|
-
17. **Article schedule lead time is 2 minutes** (posts need only 60 seconds). 400 `invalid_parameter` under that.
|
|
849
|
-
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`).
|
|
850
|
-
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.
|
|
851
|
-
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.
|
|
852
|
-
21. **`lists:add-member` takes exactly one of `--handle` or `--x-user-id`**. An unknown handle returns 404 `user_not_found`.
|
|
853
|
-
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).
|
|
854
|
-
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`.
|
|
855
|
-
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.
|
|
856
|
-
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.
|
|
857
|
-
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.
|
|
858
|
-
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.
|
|
859
|
-
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.
|
|
860
|
-
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).
|
|
861
|
-
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.
|
|
862
|
-
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`.
|
|
863
|
-
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.
|
|
864
|
-
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.
|
|
865
|
-
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.
|
|
866
|
-
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.
|
|
867
|
-
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.
|
|
868
|
-
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.
|
|
869
|
-
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.
|
|
870
|
-
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`.
|
|
871
|
-
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`.
|
|
872
|
-
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`.
|
|
873
|
-
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.
|
|
874
|
-
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`.
|
|
875
|
-
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.
|
|
876
|
-
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.
|
|
877
|
-
|
|
878
|
-
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.
|
|
879
|
-
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`.
|
|
880
|
-
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.
|
|
881
|
-
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.
|
|
882
|
-
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.
|
|
883
|
-
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.
|
|
884
|
-
52. **The writing helpers draft, they never publish.** `engage:reply-draft`, `posts:remix`, `tools:inline-edit`, `tools:rephrase`, `tools:factcheck` and `tools:predict` all return TEXT 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.
|
|
885
|
-
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.
|
|
886
|
-
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.
|
|
887
|
-
|
|
888
|
-
---
|
|
889
|
-
|
|
890
|
-
## Quick Reference
|
|
891
|
-
|
|
892
|
-
```bash
|
|
893
|
-
# AUTHENTICATE FIRST
|
|
894
|
-
superx status # Check auth + rate limits
|
|
895
|
-
superx login # Guided key paste
|
|
896
|
-
superx login --key "sxk_..." # Non-interactive
|
|
897
|
-
superx logout # Remove credentials
|
|
898
|
-
export SUPERX_API_KEY=sxk_... # Env alternative (CI)
|
|
899
|
-
|
|
900
|
-
# Identity
|
|
901
|
-
superx me # Owner, plan, key scopes
|
|
902
|
-
superx accounts # Readable accounts + ids
|
|
903
|
-
|
|
904
|
-
# Reads
|
|
905
|
-
superx posts:list --type posts --sort likes --limit 10
|
|
906
|
-
superx posts:list --since "2026-06-01T00:00:00Z" --until "2026-07-01T00:00:00Z"
|
|
907
|
-
superx posts:analytics --since "2026-06-01T00:00:00Z"
|
|
908
|
-
superx replies:list --limit 20
|
|
909
|
-
superx inspiration:search "build in public" --sort outlier --limit 10
|
|
910
|
-
superx inspiration:media "founder morning routine" --limit 10 # cross-platform media index (--limit up to 120, no paging)
|
|
911
|
-
superx contacts:list --sort engagement --limit 20
|
|
912
|
-
superx contacts:replies <id> --sort most_liked
|
|
913
|
-
superx contacts:get <x-user-id>
|
|
914
|
-
superx contacts:notes <x-user-id>
|
|
915
|
-
superx replies:received --sort most_liked --limit 20
|
|
916
|
-
superx lists:list
|
|
917
|
-
superx lists:members <list-id> --q "founder"
|
|
918
|
-
superx audience:list followers --limit 100 # system lists: cursor paging, no --page
|
|
919
|
-
superx engage:mentions --sort top # live @-mentions (costs 3 feed fetches)
|
|
920
|
-
superx signals:search --keywords "..." --icp "..." # live lead search, saves nothing
|
|
921
|
-
superx signals:agents
|
|
922
|
-
superx signals:leads --agent 3 --deposited false
|
|
923
|
-
superx engage:feeds
|
|
924
|
-
superx engage:posts <feed-id> --limit 50
|
|
925
|
-
superx datasets:list
|
|
926
|
-
superx datasets:get <dataset-id>
|
|
927
|
-
superx datasets:rows <dataset-id> --limit 50
|
|
928
|
-
superx datasets:export <dataset-id> # CSV file here; --out - streams to stdout
|
|
929
|
-
superx datasets:collect --source repliers --target <post-url> --wait # build one, poll until ready
|
|
930
|
-
superx datasets:refine <dataset-id> --criterion "..." --wait # filter by what each person wrote
|
|
931
|
-
superx datasets:research --handles a,b,c --wait # briefs, 1 credit per profile
|
|
932
|
-
superx datasets:outreach-drafts <dataset-id> --format "..." # message TEXT only, nothing sent
|
|
933
|
-
|
|
934
|
-
# Live X lookups (enrichment units + a shared 300/day allowance)
|
|
935
|
-
superx x:post <id-or-url> # one public post, live (--quotes for quotes)
|
|
936
|
-
superx x:replies <id-or-url> --limit 20 # best-liked direct replies (a sample)
|
|
937
|
-
superx x:user <handle> # one public profile, live
|
|
938
|
-
superx x:user-posts <handle> --no-reposts # one live page of their latest posts
|
|
939
|
-
|
|
940
|
-
# Contact writes (main or linked account)
|
|
941
|
-
superx contacts:notes:add <x-user-id> --body "..." # Private note, never posted
|
|
942
|
-
superx contacts:notes:update <x-user-id> <note-id> --body "..."
|
|
943
|
-
superx contacts:notes:delete <x-user-id> <note-id>
|
|
944
|
-
|
|
945
|
-
# Contact list writes (main or linked account)
|
|
946
|
-
superx lists:add-member <list-id> --handle levelsio
|
|
947
|
-
superx lists:remove-member <list-id> <member-id>
|
|
948
|
-
superx lists:create --name "Founder prospects"
|
|
949
|
-
superx lists:rename <list-id> --name "Q4 prospects"
|
|
950
|
-
superx lists:delete <list-id> # List + membership; the people stay
|
|
951
|
-
superx lists:add-members <list-id> --x-user-ids 44196397,944883311 # <=500, ids SuperX knows
|
|
952
|
-
superx lists:remove-members <list-id> --member-ids m1abc,m2def # <=500
|
|
953
|
-
superx datasets:add-to-list <dataset-id> --list-id <list-id> # people from a ready dataset
|
|
954
|
-
|
|
955
|
-
# Engage feed writes (main or linked account)
|
|
956
|
-
superx engage:feeds:create --name "AI builders" --keyword "shipping with LLMs"
|
|
957
|
-
superx engage:feeds:create --name "Founders" --x-list https://x.com/i/lists/1234567890
|
|
958
|
-
superx engage:feeds:update <feed-id> --name "AI builders v2"
|
|
959
|
-
superx engage:feeds:delete <feed-id>
|
|
960
|
-
|
|
961
|
-
# Signal agent writes (main or linked account)
|
|
962
|
-
superx signals:create-agent --name "..." --icp "..." --keyword "..." # Lead finder
|
|
963
|
-
superx signals:create-agent --name "..." --icp "..." --signal "profile:@naval"
|
|
964
|
-
superx signals:update-agent <id> --icp "..." --list-id <contact-list-id>
|
|
965
|
-
superx signals:add-signal <id> --type follower_watch --handle naval
|
|
966
|
-
superx signals:remove-signal <id> <signal-id>
|
|
967
|
-
superx signals:feedback <lead-id> --fit # or --not-fit / --clear
|
|
968
|
-
superx signals:pause-agent <id>
|
|
969
|
-
superx signals:resume-agent <id>
|
|
970
|
-
superx signals:delete-agent <id>
|
|
971
|
-
|
|
972
|
-
# Writes (main or linked account via --account)
|
|
973
|
-
superx scheduled:create --text "Post" # Draft
|
|
974
|
-
superx scheduled:create --text "Post" --at "2026-08-01T15:00:00Z" # Scheduled
|
|
975
|
-
superx scheduled:create --part "1/" --part "2/" --at "..." # Thread
|
|
976
|
-
superx scheduled:create --text "Post" --at "..." --idempotency-key k1 # Safe retry
|
|
977
|
-
superx scheduled:create --text "Post" --title "Hook v2" --tag <id> # Organizer fields
|
|
978
|
-
superx media:upload ./chart.png # Image -> object_key
|
|
979
|
-
superx scheduled:create --text "Post" --media <object_key> --alt-text "..." # With image
|
|
980
|
-
superx scheduled:update <id> --title "Better hook" # Edit; only passed flags change
|
|
981
|
-
superx scheduled:update <id> --at "..." --status scheduled # Promote a draft
|
|
982
|
-
superx scheduled:list --status draft,scheduled
|
|
983
|
-
superx scheduled:list --tags <tag-id>
|
|
984
|
-
superx scheduled:delete <id>
|
|
985
|
-
|
|
986
|
-
# Publish NOW (irreversible; key required, reuse it on a retry)
|
|
987
|
-
superx posts:publish --text "Post" --idempotency-key k1
|
|
988
|
-
|
|
989
|
-
# Writing helpers (text in, text out; nothing is posted)
|
|
990
|
-
superx engage:reply-draft --post <id> --thoughts "..." --tone concise
|
|
991
|
-
superx posts:remix --text "..." --closeness 70
|
|
992
|
-
superx tools:inline-edit --text "..." --full "..." --type hook
|
|
993
|
-
superx tools:rephrase --type concise --text "..."
|
|
994
|
-
superx tools:factcheck --text "..."
|
|
995
|
-
superx tools:predict --a "..." --b "..."
|
|
996
|
-
|
|
997
|
-
# DM campaigns (queued only; the SuperX app sends them)
|
|
998
|
-
superx dm:limits
|
|
999
|
-
superx dm:campaign --recipients people.json --message "Hey [first], ..."
|
|
1000
|
-
superx dm:campaign-status <campaign-id>
|
|
1001
|
-
superx dm:queue --status pending
|
|
1002
|
-
superx dm:cancel <campaign-id>
|
|
1003
|
-
|
|
1004
|
-
# Free helpers (no AI credits)
|
|
1005
|
-
superx context:regenerate-style-guide
|
|
1006
|
-
superx context:scrape-product <product-id>
|
|
1007
|
-
superx signals:suggest-keywords --icp "B2B SaaS founders worried about churn"
|
|
1008
|
-
superx signals:expand-icp --text "Indie founders building SaaS in public"
|
|
1009
|
-
superx signals:expand-icp --url superx.so
|
|
1010
|
-
|
|
1011
|
-
# Bulk queue operations (queued posts only; answers are counts)
|
|
1012
|
-
superx scheduled:bulk-retime --moves-json '[{"id":"abc","scheduled_for":"2026-09-08T15:00:00Z"}]'
|
|
1013
|
-
superx scheduled:bulk-auto-retweet --ids abc,def --auto-retweet 6
|
|
1014
|
-
superx scheduled:bulk-delete --ids abc,def
|
|
1015
|
-
|
|
1016
|
-
# Tags
|
|
1017
|
-
superx tags:list
|
|
1018
|
-
superx tags:create "Launch week" --color amber
|
|
1019
|
-
superx tags:update <id> --name "Launch"
|
|
1020
|
-
superx tags:delete <id>
|
|
1021
|
-
|
|
1022
|
-
# Articles (markdown bodies; publish is live + irreversible)
|
|
1023
|
-
superx articles:create --title "My article" --file draft.md
|
|
1024
|
-
superx articles:list --status draft
|
|
1025
|
-
superx articles:get <id>
|
|
1026
|
-
superx articles:update <id> --file v2.md
|
|
1027
|
-
superx articles:schedule <id> --at "2026-08-01T15:00:00Z"
|
|
1028
|
-
superx articles:unschedule <id>
|
|
1029
|
-
superx articles:publish <id>
|
|
1030
|
-
superx articles:cover-styles
|
|
1031
|
-
superx articles:cover <id> --style "minimal"
|
|
1032
|
-
superx articles:cover <id> --style-id <style-id>
|
|
1033
|
-
superx articles:delete <id>
|
|
1034
|
-
|
|
1035
|
-
# Context settings (AI writing background)
|
|
1036
|
-
superx context:get
|
|
1037
|
-
superx context:set --rules "Never use hashtags."
|
|
1038
|
-
superx context:set --interests "indie hacking,SaaS" # replaces the list
|
|
1039
|
-
superx context:products
|
|
1040
|
-
superx context:products:set --url "https://superx.so" --name "SuperX"
|
|
1041
|
-
superx context:products:delete <id>
|
|
1042
|
-
superx context:products:replace --json '[{"url":"https://superx.so"}]' # FULL REPLACE
|
|
1043
|
-
|
|
1044
|
-
# Queue settings (posting schedule; 0 = Sunday)
|
|
1045
|
-
superx queue:get
|
|
1046
|
-
superx queue:set --slots-json '[{"time":"09:00","days":[1,3,5]}]' # replaces the slots
|
|
1047
|
-
superx queue:set --timezone "Europe/London" # never moves posts
|
|
1048
|
-
|
|
1049
|
-
# Docs and help
|
|
1050
|
-
superx docs # API quickstart (markdown)
|
|
1051
|
-
superx --help # All commands
|
|
1052
|
-
superx scheduled:create --help # Command help
|
|
1053
|
-
```
|
|
1054
|
-
|
|
1055
|
-
Strategy lives in [PLAYBOOK.md](./PLAYBOOK.md). Read it before creating content (Rule 2). Goal-shaped recipes live in [PLAYBOOKS.md](./PLAYBOOKS.md): open the entry that matches what the user asked for.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# SuperX Growth
|
|
1
|
+
# SuperX Growth Strategy
|
|
2
2
|
|
|
3
3
|
Strategy reference for agents creating Twitter/X content with the `superx` CLI. Read this before drafting or scheduling anything. Each section notes which commands supply the data.
|
|
4
4
|
|
|
@@ -65,7 +65,7 @@ A sustainable weekly loop an agent can run:
|
|
|
65
65
|
2. Pull last week's winners (`posts:list --sort likes --since ...`) and note why each worked.
|
|
66
66
|
3. Plan roughly 7 posts for the week; draft them (`scheduled:create` without `--at`, with a `--title` naming the angle and a `--tag` for the week's cluster so the human can scan the batch), review, then promote the best 3 to peak times (`scheduled:update <id> --at ... --status scheduled`).
|
|
67
67
|
4. Include one format experiment per week (a thread via `--part`, a longer post, or a long-form X Article via `articles:create` when a topic deserves depth: draft it, add a cover with `articles:cover`, and let the human review before `articles:publish`) so format reach is never left untested.
|
|
68
|
-
For the week's strongest post, consider the advanced settings: `--auto-retweet 6` gives it a second push into a different timezone window, and `--auto-plug <template-id> --auto-plug-threshold 50` (ids from `plug-templates:list`) turns a winner into a lead-in for the account's offer. Posts inherit the account's Default Post Settings automatically when the flags are omitted; use `--no-auto-retweet`/`--no-auto-plug` on posts where the defaults do not fit (see SKILL.md for the full flag set).
|
|
68
|
+
For the week's strongest post, consider the advanced settings: `--auto-retweet 6` gives it a second push into a different timezone window, and `--auto-plug <template-id> --auto-plug-threshold 50` (ids from `plug-templates:list`) turns a winner into a lead-in for the account's offer. Posts inherit the account's Default Post Settings automatically when the flags are omitted; use `--no-auto-retweet`/`--no-auto-plug` on posts where the defaults do not fit (see `../SKILL.md` for the full flag set).
|
|
69
69
|
5. Refresh the 3-3-3 circle (`contacts:list`) and do the daily reply blocks.
|
|
70
70
|
6. End of week: `posts:analytics` for the trend, top 3 posts by meaningful actions, one failure mode to fix with a rule (for example "no link-drop posts", "never ghost early replies").
|
|
71
71
|
7. Repurpose one winner into two new assets for next week (tighter version, thread expansion, follow-up take).
|
|
@@ -86,5 +86,5 @@ Verify state with `superx scheduled:list --status draft,scheduled` after every p
|
|
|
86
86
|
|
|
87
87
|
- Drafts first when confidence is low; a human (or a later `scheduled:update --status scheduled`) can promote a draft after review. Use `--scratchpad` to leave the reasoning behind a draft where the human will see it.
|
|
88
88
|
- Never fabricate metrics, quotes, or claims in content. Use real data from the CLI or say nothing.
|
|
89
|
-
- Respect the write constraints: writes work on your main account or any linked account (pass the same `--account` you used to read it), accounts other people shared with you are read-only, images only via `media:upload` (no video), UTC timestamps with explicit offset (see SKILL.md Rule 3).
|
|
89
|
+
- Respect the write constraints: writes work on your main account or any linked account (pass the same `--account` you used to read it), accounts other people shared with you are read-only, images only via `media:upload` (no video), UTC timestamps with explicit offset (see `../SKILL.md` Rule 3).
|
|
90
90
|
- Quality over volume, always. One post a stranger would reply to beats five posts nobody finishes reading.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# SuperX Skills
|
|
2
|
+
|
|
3
|
+
A goal-shaped recipe for every SuperX skill. Each is the same job the
|
|
4
|
+
in-app skill of that name does, run from the CLI or from the hosted MCP server.
|
|
5
|
+
Pick by goal, run the chain in order, hand the result to the person.
|
|
6
|
+
|
|
7
|
+
Three rules hold in every skill, no exceptions:
|
|
8
|
+
|
|
9
|
+
1. **Drafts unless the person says otherwise.** `scheduled:create` without `--at` is a draft and nothing publishes.
|
|
10
|
+
2. **Nothing here sends a reply or a DM.** Reply drafts are text a person posts. `dm:campaign` enqueues; the SuperX app sends.
|
|
11
|
+
3. **`posts:publish` and `articles:publish` are immediate and irreversible.** Confirm the exact text with the person first, and note that `posts:publish` REQUIRES `--idempotency-key` so a retry cannot post twice.
|
|
12
|
+
|
|
13
|
+
`--account <account-id>` acts on a linked account (`superx accounts` lists the
|
|
14
|
+
ids). It is shown once, in Weekly Growth Recap, and applies the same way to the
|
|
15
|
+
**account-scoped** commands: the posts, scheduled, replies, contacts, lists,
|
|
16
|
+
engage, signals, dm, context, queue and articles families, plus the dataset
|
|
17
|
+
commands that WRITE for an account (`datasets:collect`, `datasets:refine`,
|
|
18
|
+
`datasets:research`, `datasets:outreach-drafts`, `datasets:add-to-list`).
|
|
19
|
+
|
|
20
|
+
Some commands are **owner-scoped** and the CLI is strict, so passing `--account`
|
|
21
|
+
to one is an error, not a no-op. Nothing about them is per-X-account: the live
|
|
22
|
+
lookups `x:post`, `x:replies`, `x:user` and `x:user-posts`, the inspiration
|
|
23
|
+
searches `inspiration:search` and `inspiration:media`, and the dataset reads
|
|
24
|
+
`datasets:list`, `datasets:get`, `datasets:rows` and `datasets:export`. A few
|
|
25
|
+
id-addressed subcommands inside the account families are owner-scoped for the
|
|
26
|
+
same reason (the id already names the account), among them `articles:publish`,
|
|
27
|
+
`scheduled:delete` and `lists:remove-member`. When a chain here does not show
|
|
28
|
+
`--account`, that is deliberate; `superx <command> --help` is the check.
|
|
29
|
+
|
|
30
|
+
Accounts other people shared with you are read-only. Ids in angle brackets are
|
|
31
|
+
placeholders you fill from the previous step's JSON.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Audience Export",
|
|
3
|
+
"category": "audience-data",
|
|
4
|
+
"order": 10,
|
|
5
|
+
"subtitle": "Everyone who engaged a post, as a spreadsheet, no filters.",
|
|
6
|
+
"summary": "Collects everyone who replied to, quoted, or reposted any public post into a dataset with handle, followers, bio, and whether their DMs are open, then hands you the CSV/XLSX. No filters, the raw full audience. Works on your posts or anyone's. Past 1000 people the scan stops there and says so.",
|
|
7
|
+
"howToAsk": [
|
|
8
|
+
"Export everyone who replied to [link]",
|
|
9
|
+
"Get me the quote tweeters of this post."
|
|
10
|
+
],
|
|
11
|
+
"provide": "the post link and which engagement type.",
|
|
12
|
+
"get": "a downloadable dataset up to 1000 rows with handle, followers, bio, and DMs open.",
|
|
13
|
+
"chips": [
|
|
14
|
+
"Up to 1000 rows",
|
|
15
|
+
"10 dataset ops per day",
|
|
16
|
+
"Background for big posts"
|
|
17
|
+
],
|
|
18
|
+
"launchPrompt": "Collect everyone who [replied to / quoted / reposted] this post into a dataset I can download: [paste link]",
|
|
19
|
+
"sampleKind": "dataset"
|
|
20
|
+
}
|