| name | follow-amazon-daily |
| description | Generate a daily bilingual Amazon-seller intelligence digest from public official, industry, community, podcast, newsletter, and YouTube sources. Use when the user asks for Amazon seller daily news, Amazon marketplace intelligence, WeAreSellers/BDS/MyAmazonGuy/Serious Sellers monitoring, or a concise action-oriented seller digest. The script only fetches raw content; the agent remixes it into the digest. Never auto-publishes to social platforms. |
| version | 0.2.0 |
follow-amazon-daily
Generate a daily Amazon seller intelligence digest. Default language is Chinese.
This skill is split into two stages, like follow-builders:
scripts/prepare-digest.js fetches sources deterministically and prints a
single JSON blob (raw items + prompts + config). It does not write the
final digest.
- You, the agent, read that JSON and remix it into a real editorial digest
following
prompts/daily-digest.md and prompts/translate.md. You write
digest/<date>.md and optionally deliver it via scripts/deliver.js.
The point of the split: summaries and translation are written by you from the
raw excerpt/body, never by a hardcoded phrase dictionary. Every item gets
its own specific summary.
Hard Rules
- Public sources are the default. Authenticated WeAreSellers and Billion Dollar
Sellers content is optional and only enabled when
WEARESELLERS_COOKIE or
BDS_COOKIE is present.
- Never ask for or store account passwords. Only use cookie/session env vars or
a local logged-in browser workflow the user adds later.
- Authenticated full text is ephemeral. Use it to derive short insights only.
Never write raw HTML, raw article text, or full subscriber/community posts to
data/feed-amazon.json or digest/<date>.md. privateItems are stdout-only.
- WeAreSellers is a community pain-signal source, not policy authority. Confirm
policy claims with official sources.
- Billion Dollar Sellers is industry opinion unless confirmed elsewhere.
- No auto-publishing to social platforms (Notion, Xiaohongshu, LinkedIn, X,
Instagram). Delivery is limited to what the user explicitly configures in
config.delivery (stdout default, or their own Telegram / Email / Feishu).
Never ask the user to paste a secret in chat — write it to their env file.
- Follow
config.language exactly. See prompts/translate.md.
- Never fabricate or speculate. Every digest item must carry its original link;
no link → exclude it. See
prompts/daily-digest.md.
Outputs
data/feed-amazon.json # deterministic raw public feed (script-written)
digest/YYYY-MM-DD.md # editorial digest (agent-written, no private items)
stdout # full JSON blob from the script (for the agent)
state-feed.json # per-install cross-run dedup state — LOCAL ONLY
state-feed.json is gitignored runtime state. Never commit it and never ship
it: a populated state would pre-mark every item "seen" and make a fresh user's
first digest empty. A clean install has no state file, so the first run shows
everything (the welcome digest works).
First Run — Onboarding
Gate: if config/sources.json does not have onboardingComplete: true, run
this flow before anything else. Drive it conversationally — you edit the
config and env files for the user; never make them hand-edit JSON, and never
ask them to paste a secret into the chat.
Step 1 — Intro
One or two lines: this is a daily Amazon-seller intelligence digest covering
Official / Policy, Seller Ops, Community Pain Signals, Podcast / Video
Playbooks, and Newsletter / Analyst Signals. Read config/sources.json and tell
them the actual source names and count. One line on the two-stage model (a
script fetches raw content; you remix it into a real digest).
Step 2 — Language
Ask: Chinese (default), English, or bilingual → set config.language.
Step 3 — Frequency, time, timezone
Ask cadence: daily (default) or weekly; the local time (HH:MM); their IANA
timezone (e.g. America/Los_Angeles, Asia/Shanghai); and the weekday if
weekly. Set frequency, deliveryTime, timezone, weeklyDay.
Step 4 — Delivery method
Present four options. For every keyed option, the secret rule is absolute: the
user gets the secret from the provider, and you write it into their env file
(~/.follow-amazon-daily.env, which the cron sources) — they never paste it
into chat, and you never echo it back.
- In-chat / stdout (default) — just show the digest here. No keys.
- Telegram — guide: open @BotFather →
/newbot → copy the bot token; send
the new bot any message; then
curl -s "https://api.telegram.org/bot<TOKEN>/getUpdates" to read
chat.id. You put TELEGRAM_BOT_TOKEN in the env file and
delivery.chatId in config.
- Email — sign up at resend.com (free), create an API key. You put
RESEND_API_KEY in the env file and the recipient in delivery.email.
- Feishu (飞书 / Lark) — in the target Feishu group: 设置 → 群机器人 →
添加机器人 → 自定义机器人 → copy the Webhook URL. Optional: enable 签名校验
and copy the secret. You put
FEISHU_WEBHOOK (and FEISHU_WEBHOOK_SECRET if
signed) in the env file. The target is whichever group the bot is in — no
chatId needed. Set delivery.method: "feishu".
When writing the env file, create/append ~/.follow-amazon-daily.env with
export KEY=value lines and tell the user the file path only.
Step 5 — Save config
Write all choices into config/sources.json (language, frequency,
deliveryTime, timezone, weeklyDay, delivery.method + chatId/email
as needed) and set onboardingComplete: true. Show a short plain-language
summary of what you saved.
Step 6 — Schedule (system crontab)
Skip for stdout/on-demand. For telegram/email/feishu, install a crontab entry
that runs scripts/run-daily.sh (it does prepare → agent remix → deliver, with
a labelled raw fallback if the Claude CLI is unavailable on the cron run):
CRON_TZ=<their IANA tz>
<min> <hour> * * <*|weekday> /abs/path/to/skill/scripts/run-daily.sh
If CRON_TZ is unsupported on their cron, convert their local time to UTC for
the schedule instead. Then verify by running scripts/run-daily.sh once and
confirming the message actually arrived in their channel. Be honest about the
raw-fallback caveat (no agent in the cron environment = structured feed, clearly
labelled, not the full editorial digest).
Step 7 — Welcome digest
Immediately run the full pipeline once now (prepare-digest → you remix per the
prompts → deliver via their chosen method → node scripts/mark-seen.js so the
first scheduled run won't repeat today's items) so they see real output today.
Then ask for feedback — length, focus, tone — and apply it (edit the relevant
prompts/ file or config), and confirm what changed.
Step 8 — Reconfigure-by-chat reminder
Tell them everything is changeable by just asking: "switch to English / make it
weekly / change time to 8am ET / send it to Feishu instead / make summaries
shorter / show my settings". You edit config or prompts for them — and when the
time/timezone/frequency changes, you also update the crontab entry.
Daily Workflow
From the repo root:
node scripts/prepare-digest.js
Then:
- Parse the JSON blob (
config, items, privateItems, prompts, stats,
errors).
- If
stats.publicItems is 0, tell the user no public signal was captured and
stop.
- Remix into the digest following
blob.prompts.dailyDigest. Translate per
blob.prompts.translate and blob.config.language. Base each summary on the
item body first, then excerpt. Never reuse a sentence across items.
- Write the public digest to
digest/<date>.md (must contain no
privateItems content).
- Deliver: if
config.delivery.method is telegram / email / feishu,
pipe the digest to node scripts/deliver.js --file digest/<date>.md.
Otherwise (stdout) show it here.
- Only after the digest is written and delivered, run
node scripts/mark-seen.js so the next run excludes these items.
prepare-digest.js filters against dedup state read-only and never persists
it — if you skip this step (or the run fails) the items simply reappear next
time rather than being silently lost. Skip mark-seen if you ran with
--ignore-state.
For scheduled runs this whole flow (including mark-seen, only on delivery
success) is wrapped by scripts/run-daily.sh.
Useful options:
node scripts/prepare-digest.js --date 2026-05-16
node scripts/prepare-digest.js --language en
node scripts/prepare-digest.js --public-only
node scripts/prepare-digest.js --quiet
node scripts/prepare-digest.js --dry-run
node scripts/audit-sources.js --dry-run
Configuration Handling
When the user asks to change something, edit config/sources.json and confirm:
- "Switch to English / bilingual" →
language
- "Make it weekly" / "change time to 8am ET" →
frequency, deliveryTime,
timezone, weeklyDay — and update the crontab entry if one exists
- "Send it to Telegram / Email / Feishu instead" →
delivery.method (+ guide
the key/webhook setup, secret into the env file, never in chat);
"just show it here" → delivery.method: "stdout" (and remove the crontab)
- "Make summaries shorter / focus more on X / change tone" → edit the relevant
file in
prompts/ and tell them it applies next run
- "Show my settings / sources" → read and display
config/sources.json
Source Policy
- Official / Policy: Amazon and Walmart pages override community or media claims.
- Seller Ops: industry sources can suggest experiments, not policy conclusions.
- Community Pain Signals: WeAreSellers for repeated pain, confusion,
account-risk patterns, operational friction.
- Podcast / Video Playbooks: Serious Sellers Podcast and MyAmazonGuy for tactics.
- Newsletter / Analyst Signals: BDS for strategic opinion and trend hypotheses.
Authenticated Sources
Optional env vars:
export WEARESELLERS_COOKIE='name=value; other=value'
export BDS_COOKIE='name=value; other=value'
When present, the script attempts authenticated fetches for the top public links
from those sources and returns them as privateItems for in-memory, stdout-only
insight. The public feed and the public digest still exclude raw authenticated
content.
Before Trusting a Digest
npm test
node scripts/audit-sources.js --dry-run
If a source is flagged, treat the digest as partial and check errors in the
JSON blob / data/feed-amazon.json.