superx-cli 0.5.1 → 0.5.2
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 +4 -0
- package/SKILL.md +3 -1
- package/dist/index.js +6 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.5.2 (2026-09-16)
|
|
4
|
+
|
|
5
|
+
- Lead search offer: `signals:search --offer "<one sentence on what you sell>"` (3-300 chars) tells the search what is being sold, and it plans up to 10 buyer-side query angles from that (workflows, pain, competitors, brand, adjacent) instead of running your keywords verbatim. `--keywords` are now 2-5 short seed angles of how the BUYER talks (a symptom, a tool they already pay for, their jargon), not the product's name and no search operators. Adding `--offer` is the single biggest lever on lead quality; `SKILL.md` carries the updated recipe
|
|
6
|
+
|
|
3
7
|
## 0.5.1 (2026-09-14)
|
|
4
8
|
|
|
5
9
|
- Lead search recency: `signals:search --max-age-days <n>` only counts posts from the last N days (1-90, default 30), so every lead comes from something written recently rather than a lifetime match. Older matches are skipped and counted in `freshness.stale_skipped`, each lead's `provenance.posted_at` / `provenance.post_age_days` says when the matched post was written, and leads come back freshest first within each score. Use `--max-age-days 7` to catch a pain point while it is fresh; an empty result with `stale_skipped` above 0 means people do post about this, just not lately. `SKILL.md` and `PLAYBOOKS.md` (lead hunt recipe) carry the flag
|
package/SKILL.md
CHANGED
|
@@ -369,7 +369,8 @@ superx signals:feedback 4821 --clear
|
|
|
369
369
|
```bash
|
|
370
370
|
# Find people on X right now (saves NOTHING: no agent, no stored leads)
|
|
371
371
|
superx signals:search \
|
|
372
|
-
--
|
|
372
|
+
--offer "ChurnRadar, retention analytics that flags accounts about to cancel" \
|
|
373
|
+
--keywords "cancelled today, mrr dropped, renewal call, churn rate" \
|
|
373
374
|
--icp "B2B SaaS founders worried about retention" \
|
|
374
375
|
--precision discovery --max 10 --max-age-days 7
|
|
375
376
|
|
|
@@ -387,6 +388,7 @@ superx datasets:rows <dataset-id> --limit 50 # read every drafted message
|
|
|
387
388
|
|
|
388
389
|
- **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
390
|
- `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.
|
|
391
|
+
- `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
392
|
- `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
393
|
- `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
394
|
- `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.
|
package/dist/index.js
CHANGED
|
@@ -1207,6 +1207,7 @@ async function signalsSearch(argv) {
|
|
|
1207
1207
|
keywords: argv.keywords,
|
|
1208
1208
|
icp_description: argv.icp
|
|
1209
1209
|
};
|
|
1210
|
+
if (argv.offer) body.offer = argv.offer;
|
|
1210
1211
|
if (argv.precision) body.precision = argv.precision;
|
|
1211
1212
|
if (argv.max !== void 0) body.max_leads = argv.max;
|
|
1212
1213
|
if (argv["max-age-days"] !== void 0) {
|
|
@@ -2837,13 +2838,16 @@ var advancedSettingsOptions = (y) => y.option("auto-retweet", {
|
|
|
2837
2838
|
"signals:search",
|
|
2838
2839
|
"Search X now for people matching an audience description (saves nothing)",
|
|
2839
2840
|
(y) => accountOption(y).option("keywords", {
|
|
2840
|
-
describe: "
|
|
2841
|
+
describe: "2-5 seed angles of how the BUYER talks, 2-3 words each, comma-separated: workflows, tools they already pay for, jargon, a symptom. Not the product's name, no search operators",
|
|
2841
2842
|
type: "string",
|
|
2842
2843
|
demandOption: true
|
|
2843
2844
|
}).option("icp", {
|
|
2844
2845
|
describe: "Who counts as a good lead, in 1-2 sentences: role, domain, and the intent that qualifies them",
|
|
2845
2846
|
type: "string",
|
|
2846
2847
|
demandOption: true
|
|
2848
|
+
}).option("offer", {
|
|
2849
|
+
describe: "What you are selling, one sentence (3-300 chars). The search plans its queries from this",
|
|
2850
|
+
type: "string"
|
|
2847
2851
|
}).option("precision", {
|
|
2848
2852
|
describe: "high = only confident matches; discovery (default) = broader adjacent matches",
|
|
2849
2853
|
type: "string",
|
|
@@ -2852,7 +2856,7 @@ var advancedSettingsOptions = (y) => y.option("auto-retweet", {
|
|
|
2852
2856
|
describe: "Only posts from the last N days count (1-90, default 30). Use 7 to catch a fresh pain point",
|
|
2853
2857
|
type: "number"
|
|
2854
2858
|
}).example(
|
|
2855
|
-
"$0 signals:search --keywords '
|
|
2859
|
+
"$0 signals:search --offer 'ChurnRadar, retention analytics for B2B SaaS' --keywords 'cancelled today, mrr dropped, renewal call' --icp 'B2B SaaS founders worried about retention'",
|
|
2856
2860
|
"Find people posting about churn right now"
|
|
2857
2861
|
).epilogue(
|
|
2858
2862
|
"This CREATES NOTHING: no signal agent, no saved leads. Use signals:create-agent for an audience that keeps filling up. Reading X live costs AI credits (at least 1) plus one of the plan's daily lead searches, and draws on a platform-wide fair-use ceiling shared by every account. Takes up to a minute."
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "superx-cli",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.2",
|
|
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": {
|