superx-cli 0.2.0 → 0.3.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 CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.0 (2026-09-05)
4
+
5
+ - Engage feeds: `engage:feeds` lists the keyword and list feeds saved in the app (with `type`, `active`, and `fetch_units`), and `engage:posts <feedId>` fetches one feed's candidate posts for review (`--account`, `--limit` 1-50, `--mode top|latest`, `--fresh`, `--include-replied`, `--exclude` comma list of post ids to page with). Read-only by design: replies are written and sent by a person in the SuperX app, so there is no reply command. `--limit` applies to keyword feeds; list feeds return one page per fetch and are paged with `--exclude`. Feed fetches have their own per-plan daily allowance and a list feed that rotates its members counts as 3
6
+ - Inspiration search relevance: `inspiration:search` results are now relevance-ranked, strongest matches first and more loosely related posts after. BEHAVIOR CHANGE: results are no longer a fresh varied mix on every run, and weak and promotional matches are filtered out, so a page can return fewer posts than `--limit`; `has_more` no longer requires a full page, so keep paging with `--page` while it is true (pages run 1 to 7). `--sort relevant` is still the default and is the relevance-ranked order
7
+ - Docs: write commands now describe `--account` for linked accounts (server change shipped Sep 4 2026)
8
+
3
9
  ## 0.2.0 (2026-08-01)
4
10
 
5
11
  - Advanced post settings: `scheduled:create`/`scheduled:update` gain `--auto-retweet <h>` / `--auto-retweet-remove <h>` (1-12), `--auto-delete <h>` / `--auto-delete-threshold <views>`, `--auto-plug <templateId>` / `--auto-plug-threshold <likes>`, `--super-followers`, plus `--no-*` disable forms; new `plug-templates:list` command. BEHAVIOR CHANGE: posts created via the API now inherit the account's Default Post Settings (auto retweet, auto delete, auto plug, auto DM, Super Followers only) when the matching flags are omitted, exactly like posts composed in the app; previously API posts got no advanced settings at all. Auto DM stays inherit-only (no flag) and surfaces `auto_dm_skipped: true` when a plan limit strips it
package/PLAYBOOK.md CHANGED
@@ -45,7 +45,7 @@ Consistent, targeted interaction grows accounts faster than posting alone:
45
45
  - After a genuine back-and-forth, a soft pointer to related content on the profile is fine. Self-promo inside someone else's thread is not.
46
46
  - Budget: about 20 minutes outbound and 20 minutes inbound daily.
47
47
 
48
- Data: `superx contacts:list --sort engagement` identifies who already engages most (reply to them first); `superx contacts:replies <id>` shows the history with one person so replies can be specific. For the inbound block, `superx replies:received --sort recent` lists every reply the audience has sent across all posts, so nothing goes unanswered. Keep the 3-3-3 circle in a contact list (`superx lists:list`, `lists:add-member`) so the daily targets survive between sessions. If the account runs signal agents, `superx signals:leads` surfaces fresh people matching the ideal customer profile, with the post that revealed them; engage while the discovery is recent. No agent yet? `superx signals:create-agent --name ... --icp ...` sets one up from a plain-language customer description (keywords auto-suggested when omitted); leads accumulate over the following days, so create it early in the week and harvest with `signals:leads` later.
48
+ Data: `superx contacts:list --sort engagement` identifies who already engages most (reply to them first); `superx contacts:replies <id>` shows the history with one person so replies can be specific. For the inbound block, `superx replies:received --sort recent` lists every reply the audience has sent across all posts, so nothing goes unanswered. The Engage feeds saved in the app are another source: `superx engage:feeds` lists them and `superx engage:posts <feedId>` returns the posts one surfaces, ready to score before a person writes and sends the reply in the app. Keep the 3-3-3 circle in a contact list (`superx lists:list`, `lists:add-member`) so the daily targets survive between sessions. If the account runs signal agents, `superx signals:leads` surfaces fresh people matching the ideal customer profile, with the post that revealed them; engage while the discovery is recent. No agent yet? `superx signals:create-agent --name ... --icp ...` sets one up from a plain-language customer description (keywords auto-suggested when omitted); leads accumulate over the following days, so create it early in the week and harvest with `signals:leads` later.
49
49
 
50
50
  ## 5. The research system
51
51
 
package/README.md CHANGED
@@ -80,7 +80,7 @@ superx me # Key owner, plan tier, key name and scopes
80
80
  superx accounts # X accounts this key can read (main account first)
81
81
  ```
82
82
 
83
- Read commands accept `--account <id>` (an id from `superx accounts`) to select a linked or shared account. Omitting it means the main account.
83
+ Read commands accept `--account <id>` (an id from `superx accounts`) to select a linked or shared account. Write commands accept it too for your main or linked accounts; accounts shared with you by other people are read-only (403 `writes_main_account_only`). Omitting it means the main account.
84
84
 
85
85
  ### Posts
86
86
 
@@ -124,7 +124,7 @@ superx inspiration:search "indie hackers" --sort outlier --min-likes 500
124
124
  superx inspiration:search "AI tools" --min-followers 1000 --max-followers 50000
125
125
  ```
126
126
 
127
- Searches a library of 50M+ real high-performing posts by topic. Options: `--sort relevant|recent|likes|reposts|impressions|outlier`, `--min-likes/--min-reposts/--min-replies/--min-bookmarks/--min-impressions`, `--min-followers/--max-followers` (author size), `--since/--until` (UTC ISO-8601), `--lang` (default en), `--exclude-topics "crypto,politics"`, `--limit` (max 50), `--page` (1-7). Each result carries an `outlier_score`: how far the post outperformed the norm for its author's follower tier. Results are intentionally varied between runs; use them for structures and hooks to remix, never to copy.
127
+ Searches a library of 50M+ real high-performing posts by topic. Options: `--sort relevant|recent|likes|reposts|impressions|outlier`, `--min-likes/--min-reposts/--min-replies/--min-bookmarks/--min-impressions`, `--min-followers/--max-followers` (author size), `--since/--until` (UTC ISO-8601), `--lang` (default en), `--exclude-topics "crypto,politics"`, `--limit` (max 50), `--page` (1-7). Each result carries an `outlier_score`: how far the post outperformed the norm for its author's follower tier. Results are relevance-ranked, strongest matches first, with weak and promotional matches filtered out, so a page may return fewer than `--limit` posts. Use them for structures and hooks to remix, never to copy.
128
128
 
129
129
  ### Contacts (who engages with you)
130
130
 
@@ -142,7 +142,24 @@ superx lists:add-member <list-id> --handle levelsio # or --x-user-id 44196397
142
142
  superx lists:remove-member <list-id> <member-id>
143
143
  ```
144
144
 
145
- Lists are the saved people-collections from the SuperX app. System lists (Followers, Following, Repliers, Reposters) appear in `lists:list` but are read-only and their members are not available through the API (400 `system_list_not_supported`). Adding someone already in a list is harmless: the API returns the existing member with `"duplicate": true` and writes nothing. Member writes are main account only.
145
+ Lists are the saved people-collections from the SuperX app. System lists (Followers, Following, Repliers, Reposters) appear in `lists:list` but are read-only and their members are not available through the API (400 `system_list_not_supported`). Adding someone already in a list is harmless: the API returns the existing member with `"duplicate": true` and writes nothing. Member writes work on your main or linked accounts with `--account`; shared accounts are read-only.
146
+
147
+ ### Engage (feed posts to reply to)
148
+
149
+ ```bash
150
+ superx engage:feeds # the feeds saved in the app's Engage tab
151
+ superx engage:posts <feed-id> --limit 50 # one big page of candidate posts
152
+ superx engage:posts <feed-id> --mode latest --fresh true
153
+ superx engage:posts <feed-id> --exclude 1234567890,1234567891 # next batch, minus what you have
154
+ ```
155
+
156
+ Engage feeds are the keyword and list feeds set up in the SuperX app. `engage:feeds` returns each feed's `id`, `name`, `type` (`keywords`, `list`, or `x_list`), `active` flag, and `fetch_units` (what one fetch of it costs: 1 for a keyword feed, at most 3 for list feeds, and an imported X list charges 1 at fetch time). Feeds are created and edited in the app, not through the API.
157
+
158
+ `engage:posts <feed-id>` returns candidate posts with text, author (handle, bio, follower counts), engagement metrics, and post time, plus `has_more` and the `feed` it came from. Results are for review: replies are written and sent by a person in SuperX, so there is no reply command. Sending replies that read as inauthentic can get an X account suspended under X's inauthentic-behavior rules and a SuperX account terminated; AI output must be reviewed and meaningfully edited by a person before it is posted, and reply activity is logged and may be audited.
159
+
160
+ `--limit` (1-50, default 20) applies to keyword feeds. List feeds ignore it upstream and return one page per fetch, about 10 posts for a member list and 20 to 25 for an imported X list, with `--limit` only trimming that page; page those with `--exclude` instead. On a keyword feed a 50-post page costs the same as a 20-post page, so ask for 50 a few times a day and filter locally rather than polling. Feeds refresh over hours, so fetching more often than hourly returns the same posts. `--mode top|latest` defaults to `top`; `--fresh true` skips the cache; `--include-replied true` keeps posts already replied to, skipped, or blocked and flags them with `replied`. `--exclude` takes up to 100 post ids and is how you page.
161
+
162
+ Feed fetches have their own per-plan daily allowance (Trial 20, Pro 60, Advanced 120, Ultra 300 per day), separate from the read budget; per minute: trial 2, pro 5, advanced 10, ultra 15. A list feed that rotates its members counts as up to 3 fetches, every other feed as 1; `engage:feeds` never touches the allowance. Over the cap you get 429 `rate_limited`: the API returns `remaining_day`; the CLI prints the message and the retry delay. Fetches also run a few at a time across all API users, so a 429 with a retry delay can mean busy rather than out of allowance; wait and retry. Posts a fetch returns count as seen and are demoted in later fetches, in the app as well as the API. An unknown feed id returns 404 `feed_not_found`.
146
163
 
147
164
  ### Signals (automated lead finding)
148
165
 
@@ -152,7 +169,7 @@ superx signals:leads --limit 20 # newest leads across all a
152
169
  superx signals:leads --agent 3 --deposited false # new leads from one agent
153
170
  superx signals:leads --since "2026-07-01T00:00:00Z" # leads discovered since July
154
171
 
155
- # Create an agent (main account only, write scope)
172
+ # Create an agent (write scope; main or linked account via --account)
156
173
  superx signals:create-agent \
157
174
  --name "Build in public founders" \
158
175
  --icp "Indie founders building SaaS in public, sharing MRR and launches" \
@@ -218,7 +235,7 @@ superx scheduled:update <post-id> --clear-tags --clear-title --clear-scratchpad
218
235
 
219
236
  A new `--at` time alone never schedules a draft; pass `--status scheduled` explicitly. CAUTION: replacement text is a full replace, media included. `--text` without `--media` removes any images the post carried; re-list the current `object_key`s (visible in `scheduled:list`) to keep them. Title, scratchpad, tag, and time edits never touch media.
220
237
 
221
- Write constraints in the current API version: main account only; images via `media:upload` (no video); one of `--text`, `--part`, or `--parts-json`. Idempotent replays add `"replayed": true` to the output. Note that drafts have no scheduled time, so `--from/--to` filters exclude them.
238
+ Write constraints in the current API version: main or linked accounts via `--account` (shared accounts are read-only; tags are workspace-wide and main account only); images via `media:upload` (no video); one of `--text`, `--part`, or `--parts-json`. Idempotent replays add `"replayed": true` to the output. Note that drafts have no scheduled time, so `--from/--to` filters exclude them.
222
239
 
223
240
  ### Advanced settings
224
241
 
@@ -380,6 +397,8 @@ The CLI talks to these SuperX API endpoints (base `https://api.superx.so/v1`):
380
397
  | `/signals/agents/:id` | PATCH | `signals:pause-agent <id>` / `signals:resume-agent <id>` |
381
398
  | `/signals/agents/:id` | DELETE | `signals:delete-agent <id>` |
382
399
  | `/signals/leads` | GET | `signals:leads` |
400
+ | `/engage/feeds` | GET | `engage:feeds` |
401
+ | `/engage/feeds/:id/posts` | GET | `engage:posts <feedId>` |
383
402
  | `/media` | POST | `media:upload <file>` |
384
403
  | `/scheduled-posts` | GET | `scheduled:list` |
385
404
  | `/scheduled-posts` | POST | `scheduled:create` |
@@ -476,6 +495,7 @@ src/
476
495
  ├── contacts.ts # contacts:list / contacts:replies
477
496
  ├── lists.ts # lists:list / lists:members / lists:add-member / lists:remove-member
478
497
  ├── signals.ts # signals:agents / signals:leads / signals:create-agent / signals:pause-agent / signals:resume-agent / signals:delete-agent
498
+ ├── engage.ts # engage:feeds / engage:posts
479
499
  ├── media.ts # media:upload
480
500
  ├── scheduled.ts # scheduled:list / scheduled:create / scheduled:update / scheduled:delete
481
501
  ├── tags.ts # tags:list / tags:create / tags:update / tags:delete
@@ -513,18 +533,20 @@ superx lists:list
513
533
  superx lists:members <list-id> --q "founder"
514
534
  superx signals:agents
515
535
  superx signals:leads --agent 3 --deposited false
536
+ superx engage:feeds
537
+ superx engage:posts <feed-id> --limit 50
516
538
 
517
- # Contact list writes (main account)
539
+ # Contact list writes (main or linked account)
518
540
  superx lists:add-member <list-id> --handle levelsio
519
541
  superx lists:remove-member <list-id> <member-id>
520
542
 
521
- # Signal agent writes (main account)
543
+ # Signal agent writes (main or linked account)
522
544
  superx signals:create-agent --name "..." --icp "..." --keyword "..."
523
545
  superx signals:pause-agent <id>
524
546
  superx signals:resume-agent <id>
525
547
  superx signals:delete-agent <id>
526
548
 
527
- # Writes (main account)
549
+ # Writes (main or linked account via --account)
528
550
  superx scheduled:create --text "Post" # Draft
529
551
  superx scheduled:create --text "Post" --at "2026-08-01T15:00:00Z" # Scheduled
530
552
  superx scheduled:create --part "1/" --part "2/" --at "..." # Thread
package/SKILL.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: superx
3
- description: SuperX is a Twitter/X growth tool. Use it to read an account's published posts with engagement metrics, pull account analytics (impressions, likes, replies, follower change), find the people who engage with the account most, review reply history in both directions (sent and received), manage contact lists, create and manage signal agents (automated lead finders) and review the leads they discover, search a library of 50M+ high-performing posts for inspiration, create, edit, tag, or schedule draft posts and threads (with image attachments), write, schedule, publish, and generate AI covers for long-form X Articles, and read or update the account's Context settings (profile description, interests, SuperX rules, reply settings, favorite creators, style guide, products) that steer SuperX's AI writing, all through the SuperX API.
3
+ description: SuperX is a Twitter/X growth tool. Use it to read an account's published posts with engagement metrics, pull account analytics (impressions, likes, replies, follower change), find the people who engage with the account most, review reply history in both directions (sent and received), manage contact lists, create and manage signal agents (automated lead finders) and review the leads they discover, search a library of 50M+ high-performing posts for inspiration, read the Engage feed posts a saved feed surfaces for review, create, edit, tag, or schedule draft posts and threads (with image attachments), write, schedule, publish, and generate AI covers for long-form X Articles, and read or update the account's Context settings (profile description, interests, SuperX rules, reply settings, favorite creators, style guide, products) that steer SuperX's AI writing, all through the SuperX API.
4
4
  homepage: https://docs.superx.so
5
5
  metadata: {"openclaw":{"emoji":"🚀","requires":{"bins":["superx"],"env":[]}}}
6
6
  ---
@@ -32,7 +32,7 @@ official website: https://superx.so
32
32
 
33
33
  **Rule 2: Read PLAYBOOK.md before creating any content.** This repo ships a growth strategy guide (`PLAYBOOK.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 playbook gives you judgment. Do not schedule content without it.
34
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 the main account only. 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. `articles:publish` posts a long-form article to X IMMEDIATELY and irreversibly; treat it like hitting Publish in public and get human confirmation unless the user already gave it.
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. `articles:publish` posts a long-form article to X IMMEDIATELY and irreversibly; treat it like hitting Publish in public and get human confirmation unless the user already gave it.
36
36
 
37
37
  ---
38
38
 
@@ -133,7 +133,7 @@ superx inspiration:search "AI tools" --min-likes 500 --min-followers 1000 --max-
133
133
  - Searches a library of 50M+ real high-performing posts. Use results for structures, hooks, and angles to remix. Never copy them.
134
134
  - Flags: `--sort relevant|recent|likes|reposts|impressions|outlier`, `--min-likes/--min-reposts/--min-replies/--min-bookmarks/--min-impressions`, `--min-followers/--max-followers` (author size), `--since/--until`, `--lang` (default en), `--exclude-topics "crypto,politics"`, `--limit` (max 50), `--page` (1-7).
135
135
  - `outlier_score` on each result = how far the post outperformed the norm for its author's follower tier. Sorting by `outlier` surfaces content that won on substance, not audience size.
136
- - Results are intentionally varied between runs; re-running the same query returns a different mix.
136
+ - Results are relevance-ranked, strongest matches first. Weak and promotional matches are filtered out, so a page may return fewer than `--limit` posts.
137
137
 
138
138
  ### Contacts (who engages with you)
139
139
 
@@ -157,7 +157,25 @@ superx lists:remove-member <list-id> <member-id> # member-id from lists:memb
157
157
  - Lists are the saved people-collections from the SuperX app. Use them to track prospects, customers, or people worth engaging.
158
158
  - System lists (Followers, Following, Repliers, Reposters) appear in `lists:list` with `is_system: true` but are read-only and their members are NOT available through the API.
159
159
  - Adding someone already in a list is harmless: the existing member returns with `"duplicate": true` and nothing changes.
160
- - Member writes are main account only and need a key with the write scope.
160
+ - Member writes work on your main or linked accounts (`--account`) and need a key with the write scope; shared accounts are read-only.
161
+
162
+ ### Engage (feed posts to reply to)
163
+
164
+ ```bash
165
+ superx engage:feeds # feeds saved in the app, with type and fetch cost
166
+ superx engage:posts <feed-id> --limit 50 # one big page of candidate posts
167
+ superx engage:posts <feed-id> --mode latest --fresh true # newest, skipping the cache
168
+ superx engage:posts <feed-id> --exclude 1234567890,1234567891 # next batch, minus what you have
169
+ superx engage:posts <feed-id> --include-replied true # keep posts already replied to
170
+ ```
171
+
172
+ - Engage feeds are the keyword and list feeds the user set up in the app's Engage tab. `engage:feeds` gives each feed's `id`, `name`, `type` (`keywords`, `list`, `x_list`), `active`, and `fetch_units`. Feeds are created and edited in the app; the API only reads them.
173
+ - `engage:posts` returns candidate posts (text, author handle/bio/follower counts, engagement metrics, post time) plus `has_more` and the `feed`. Score and shortlist them for the user.
174
+ - READ-ONLY BY DESIGN: there is no reply command. Replies are written and sent by a person in SuperX. Sending replies that read as inauthentic can get an X account suspended and a SuperX account terminated; AI output must be reviewed and meaningfully edited by a person before it is posted. Surface candidates and draft suggestions for the user; never claim a reply was sent.
175
+ - `--limit` (1-50, default 20) applies to KEYWORD feeds. List feeds return one page per fetch (about 10 posts for a member list, 20 to 25 for an imported X list) and `--limit` only trims it. Page a list feed with `--exclude` (at most 100 ids per call; window the list to the most recent ids), not a bigger `--limit`.
176
+ - A 50-post page on a keyword feed costs the same as a 20-post page: ask for `--limit 50` a few times a day and filter locally. Feeds refresh over hours, so polling more often than hourly returns the same posts.
177
+ - Each plan has a daily feed-fetch allowance (Trial 20, Pro 60, Advanced 120, Ultra 300), separate from the read budget; per minute: trial 2, pro 5, advanced 10, ultra 15. A list feed that rotates its members counts as 3 fetches. `engage:feeds` never spends it. Over the cap you get 429 `rate_limited`: the API returns `remaining_day`; the CLI prints the message and the retry delay.
178
+ - Posts a fetch returns count as seen and get demoted in later fetches, in the app as well as here. An unknown feed id returns 404 `feed_not_found`.
161
179
 
162
180
  ### Signals (automated lead finding)
163
181
 
@@ -167,7 +185,7 @@ superx signals:leads --limit 20 # newest leads across all a
167
185
  superx signals:leads --agent 3 --deposited false # one agent's leads not yet in its list
168
186
  superx signals:leads --since "2026-07-01T00:00:00Z" # leads discovered since July
169
187
 
170
- # Create an agent (main account only, write scope)
188
+ # Create an agent (write scope; main or linked account via --account)
171
189
  superx signals:create-agent \
172
190
  --name "Build in public founders" \
173
191
  --icp "Indie founders building SaaS in public, sharing MRR and launches" \
@@ -471,6 +489,7 @@ superx scheduled:list --status scheduled
471
489
  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.
472
490
  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.
473
491
  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.
492
+ 29. **`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.
474
493
 
475
494
  ---
476
495
 
@@ -501,18 +520,20 @@ superx lists:list
501
520
  superx lists:members <list-id> --q "founder"
502
521
  superx signals:agents
503
522
  superx signals:leads --agent 3 --deposited false
523
+ superx engage:feeds
524
+ superx engage:posts <feed-id> --limit 50
504
525
 
505
- # Contact list writes (main account only)
526
+ # Contact list writes (main or linked account)
506
527
  superx lists:add-member <list-id> --handle levelsio
507
528
  superx lists:remove-member <list-id> <member-id>
508
529
 
509
- # Signal agent writes (main account only)
530
+ # Signal agent writes (main or linked account)
510
531
  superx signals:create-agent --name "..." --icp "..." --keyword "..." # Lead finder
511
532
  superx signals:pause-agent <id>
512
533
  superx signals:resume-agent <id>
513
534
  superx signals:delete-agent <id>
514
535
 
515
- # Writes (main account only)
536
+ # Writes (main or linked account via --account)
516
537
  superx scheduled:create --text "Post" # Draft
517
538
  superx scheduled:create --text "Post" --at "2026-08-01T15:00:00Z" # Scheduled
518
539
  superx scheduled:create --part "1/" --part "2/" --at "..." # Thread
package/dist/index.js CHANGED
@@ -184,6 +184,13 @@ var SuperXAPI = class {
184
184
  async deleteSignalAgent(id) {
185
185
  return (await this.request(`/signals/agents/${id}`, { method: "DELETE" })).json;
186
186
  }
187
+ // --- Engage ---
188
+ async listEngageFeeds(query = {}) {
189
+ return (await this.request("/engage/feeds", { query })).json;
190
+ }
191
+ async getEngageFeedPosts(feedId, query = {}) {
192
+ return (await this.request(`/engage/feeds/${encodeURIComponent(feedId)}/posts`, { query })).json;
193
+ }
187
194
  // --- Scheduled posts ---
188
195
  async listScheduled(query = {}) {
189
196
  return (await this.request("/scheduled-posts", { query })).json;
@@ -600,6 +607,26 @@ async function signalsDeleteAgent(argv) {
600
607
  printJson(await api.deleteSignalAgent(argv.id));
601
608
  }
602
609
 
610
+ // src/commands/engage.ts
611
+ async function engageFeeds(argv) {
612
+ const api = new SuperXAPI(getConfig());
613
+ printJson(await api.listEngageFeeds({ account_id: argv.account }));
614
+ }
615
+ async function engagePosts(argv) {
616
+ const api = new SuperXAPI(getConfig());
617
+ printJson(
618
+ await api.getEngageFeedPosts(argv.feedId, {
619
+ account_id: argv.account,
620
+ limit: argv.limit,
621
+ mode: argv.mode,
622
+ // yargs boolean: pass through only when the flag was given.
623
+ fresh: argv.fresh === void 0 ? void 0 : String(argv.fresh),
624
+ include_replied: argv.includeReplied === void 0 ? void 0 : String(argv.includeReplied),
625
+ exclude_post_ids: argv.exclude
626
+ })
627
+ );
628
+ }
629
+
603
630
  // src/commands/scheduled.ts
604
631
  async function scheduledList(argv) {
605
632
  const api = new SuperXAPI(getConfig());
@@ -1372,6 +1399,32 @@ var advancedSettingsOptions = (y) => y.option("auto-retweet", {
1372
1399
  "Delete a signal agent (its saved leads and contact list stay untouched)",
1373
1400
  (y) => y.positional("id", { describe: "Agent id (from signals:agents)", type: "number" }),
1374
1401
  run(signalsDeleteAgent)
1402
+ ).command(
1403
+ "engage:feeds",
1404
+ "List the Engage feeds set up in the app",
1405
+ (y) => accountOption(y).example("$0 engage:feeds", "Feed ids, types, and what one fetch costs").example("$0 engage:feeds --account <account-id>", "Feeds saved on a linked account"),
1406
+ run(engageFeeds)
1407
+ ).command(
1408
+ "engage:posts <feedId>",
1409
+ "Fetch the posts an Engage feed surfaces (for review; replies are sent by a person in the app)",
1410
+ (y) => accountOption(y).positional("feedId", { describe: "Feed id (from engage:feeds)", type: "string" }).option("limit", {
1411
+ describe: "Posts to return, 1-50 (default 20). Applies to keyword feeds; list feeds return one page (about 10 to 25 posts) and --limit only trims it",
1412
+ type: "number"
1413
+ }).option("mode", {
1414
+ describe: "top = highest-signal posts first (default); latest = newest first",
1415
+ type: "string",
1416
+ choices: ["top", "latest"]
1417
+ }).option("fresh", {
1418
+ describe: "true = skip the cache and fetch new posts; false = allow cached posts (default)",
1419
+ type: "boolean"
1420
+ }).option("include-replied", {
1421
+ describe: "true = keep posts already replied to, skipped, or blocked and flag them with `replied`; false = leave them out (default)",
1422
+ type: "boolean"
1423
+ }).option("exclude", {
1424
+ describe: "Comma list of post ids to leave out (max 100); this is how you page: pass the ids you already have to get the next batch",
1425
+ type: "string"
1426
+ }).example("$0 engage:posts <feed-id> --limit 50", "One big page from a keyword feed").example("$0 engage:posts <feed-id> --mode latest --fresh true", "Newest posts, skipping the cache").example("$0 engage:posts <feed-id> --exclude 1234567890,1234567891", "Next batch, minus the posts you have"),
1427
+ run(engagePosts)
1375
1428
  ).command(
1376
1429
  "scheduled:list",
1377
1430
  "List drafts and the scheduled queue",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "superx-cli",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "SuperX CLI - command line interface to the SuperX API for Twitter/X growth: read posts and analytics, find engaged contacts, and schedule posts and threads",
5
5
  "main": "dist/index.js",
6
6
  "bin": {