wjs-promoting-skills

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

wjs-promoting-skills

wjs-promoting-skills

每天早上 4:00 自动跑一遍:挑一个
wjs-*
skill → 生成今日推广角度 → 发到 X → 起草社区帖。X 真发,社区只起草到 outbox/ 让人工 review。
Runs automatically every day at 4:00 AM: select a
wjs-*
skill → generate today's promotion angle → post to X → draft community posts. X posts are published directly, while community posts are only drafted to outbox/ for manual review.

Core Principle

Core Principle

Claude 是大脑,bash 是骨架。 这个 skill 的所有判断(今天推哪个、怎么写、什么角度)都交给
claude -p
跑 headless 调用 —— bash 只负责定时、传 context、写日志、防重发。这样新增 skill / 新增渠道 / 改风格不需要改代码,只改 prompt 模板。
真发只有一个渠道:X。 Reddit / HN / Discord 都没有可靠的「按用户身份自动发帖」API(要么需要 OAuth + 反垃圾审查,要么完全没接口)。所以这个 skill 把社区帖只起草到
outbox/<date>/
,等人工 copy-paste。
Idempotent + 节流。 每天最多 1 条 X 帖。同一 skill 不在 7 天内重复推。如果 SKILL.md 自上次推广后没改、且过去 7 天没变化,跳过当天。这避免变成一个吵闹的机器人。
Claude is the brain, bash is the skeleton. All decisions of this skill (which skill to promote today, how to write the copy, what angle to use) are handled via headless calls to
claude -p
— bash only takes care of scheduling, passing context, logging, and preventing duplicate posts. This means you don't need to modify code when adding new skills, new channels, or changing styles; you only need to adjust prompt templates.
Only one channel supports direct publishing: X. Reddit / HN / Discord don't have reliable APIs for "automatic posting as a user" (either requiring OAuth + anti-spam review, or no API at all). So this skill only drafts community posts to
outbox/<date>/
, waiting for manual copy-paste.
Idempotent + Throttling. Post at most 1 X tweet per day. The same skill won't be promoted again within 7 days. If SKILL.md hasn't changed since the last promotion and there have been no updates in the past 7 days, skip the day. This prevents the bot from being overly noisy.

When This Skill Fires

When This Skill Fires

  • 用户说「帮我推广这些 skills」/「设置每天自动发推广」/「研究一下别人怎么推广 skill 的」
  • 用户用
    /wjs-promoting-skills
    显式调用
  • 用户问「今天准备推哪个 skill」/「outbox 里有什么」
如果用户只想发一次(不要 cron),直接用
/publish-skill <name>
—— 那是单条手动版。本 skill 的价值是每天自动
  • User says "帮我推广这些 skills" / "设置每天自动发推广" / "研究一下别人怎么推广 skill 的"
  • User explicitly calls
    /wjs-promoting-skills
  • User asks "今天准备推哪个 skill" / "outbox 里有什么"
If the user only wants to post once (without cron), use
/publish-skill <name>
directly — that's the manual single-post version. The value of this skill is daily automation.

File Layout

File Layout

~/.claude/skills/wjs-promoting-skills/
├── SKILL.md                                # 本文件
├── setup.sh                                # 一次性:装 launchd plist,启动 4 AM 定时
├── uninstall.sh                            # 一次性:卸 launchd plist
├── daily.sh                                # ★ 4 AM 入口:跑一遍完整流程
├── list-skills.sh                          # 列出当前所有 wjs-* skill
├── pick-next-skill.sh                      # 按轮换规则挑今日 skill
├── research-marketplaces.sh                # 研究 openclaw / clawhub / SkillsMP 的爆款怎么写文案(每月跑一次)
├── make-plan.sh                            # 给一个 skill 生成 marketing plan(30 天 angle rotation)
├── com.jianshuo.wjs-promoting-skills.plist.template
├── prompts/
│   ├── research-marketplaces.md            # 研究 prompt
│   ├── make-plan.md                        # marketing plan prompt
│   ├── daily-post.md                       # 今日 X 帖 prompt
│   └── community-drafts.md                 # Reddit / HN / Discord 草稿 prompt
├── state/                                  # 状态目录(.gitignored,不会被 publish hook 推到 GitHub)
│   ├── .gitignore
│   ├── README.md
│   ├── research.md                         # 最近一次 marketplace 研究的产物
│   ├── plans/<skill>.md                    # 每个 skill 的 30 天 angle rotation 计划
│   └── history.jsonl                       # 每次跑完追加一行:date / skill / tweet_id / status
└── outbox/                                 # 社区帖草稿(人工 review 后 copy-paste 出去)
    └── YYYY-MM-DD/
        ├── x-posted.txt                    # 实际发出去的 X 帖文本(archive)
        ├── reddit-r-ClaudeAI.md
        ├── hn-show.md
        ├── discord-anthropic.md
        └── wechat-followup.md              # (可选)下次写公众号文章时的角度参考
~/.claude/skills/wjs-promoting-skills/
├── SKILL.md                                # This file
├── setup.sh                                # One-time: install launchd plist, start 4 AM schedule
├── uninstall.sh                            # One-time: uninstall launchd plist
├── daily.sh                                # ★ 4 AM entry point: run the full workflow
├── list-skills.sh                          # List all current wjs-* skills
├── pick-next-skill.sh                      # Select today's skill according to rotation rules
├── research-marketplaces.sh                # Research how top skills on openclaw / clawhub / SkillsMP write copy (run once a month)
├── make-plan.sh                            # Generate a marketing plan for a skill (30-day angle rotation)
├── com.jianshuo.wjs-promoting-skills.plist.template
├── prompts/
│   ├── research-marketplaces.md            # Research prompt
│   ├── make-plan.md                        # Marketing plan prompt
│   ├── daily-post.md                       # Today's X post prompt
│   └── community-drafts.md                 # Reddit / HN / Discord draft prompt
├── state/                                  # State directory (.gitignored, won't be pushed to GitHub by publish hook)
│   ├── .gitignore
│   ├── README.md
│   ├── research.md                         # Output of the latest marketplace research
│   ├── plans/<skill>.md                    # 30-day angle rotation plan for each skill
│   └── history.jsonl                       # Append one line after each run: date / skill / tweet_id / status
└── outbox/                                 # Community post drafts (copy-paste after manual review)
    └── YYYY-MM-DD/
        ├── x-posted.txt                    # Archived text of the actually posted X tweet
        ├── reddit-r-ClaudeAI.md
        ├── hn-show.md
        ├── discord-anthropic.md
        └── wechat-followup.md              # (Optional) Angle reference for future WeChat official account articles

Setup (one-time)

Setup (one-time)

bash
~/.claude/skills/wjs-promoting-skills/setup.sh
会做三件事:
  1. 检查前置依赖:
    claude
    CLI、
    xurl
    (且
    xurl whoami
    能返回用户)、
    jq
  2. 跑一次
    research-marketplaces.sh
    生成初始
    state/research.md
    只此一次会真上网调研,下次每月自动刷新一次)
  3. com.jianshuo.wjs-promoting-skills.plist.template
    渲染成真正的 plist 放到
    ~/Library/LaunchAgents/
    ,然后
    launchctl bootstrap
跑完之后每天 04:00 自动触发,不需要任何手动操作。
要停止:
~/.claude/skills/wjs-promoting-skills/uninstall.sh
bash
~/.claude/skills/wjs-promoting-skills/setup.sh
It will do three things:
  1. Check prerequisites:
    claude
    CLI,
    xurl
    (and
    xurl whoami
    returns the user),
    jq
  2. Run
    research-marketplaces.sh
    once to generate initial
    state/research.md
    (this is the only time it will actually research online, it will auto-refresh once a month next time)
  3. Render
    com.jianshuo.wjs-promoting-skills.plist.template
    into a real plist and place it in
    ~/Library/LaunchAgents/
    , then run
    launchctl bootstrap
After completion, it will trigger automatically at 04:00 every day without any manual operation.
To stop it:
~/.claude/skills/wjs-promoting-skills/uninstall.sh

Daily Flow (4 AM — what
daily.sh
does)

Daily Flow (4 AM — what
daily.sh
does)

04:00 →
  Step 1: list-skills.sh        → 当前所有 wjs-* skill 的清单 + 各自上次推广时间
  Step 2: pick-next-skill.sh    → 按规则挑出今天的 skill(见 §Rotation Rules)
  Step 3: 检查跳过条件             → 7 天内推过 / SKILL.md 没动 / outbox 已有今日 → 直接 exit 0
  Step 4: make-plan.sh <skill>  → 如果该 skill 没有 plan 或 plan 老于 30 天,重新生成
  Step 5: claude -p 跑 daily-post.md
            └── 输入: SKILL.md + plan + research.md + history.jsonl 最近 30 天
            └── 输出: 一条 ≤ 280 char 的 X 文本(包含 repo URL)
  Step 6: xurl -X POST -d '{"text": "..."}' /2/tweets   ← 真发
  Step 7: claude -p 跑 community-drafts.md
            └── 输出: outbox/<date>/reddit-r-ClaudeAI.md / hn-show.md / discord-anthropic.md
  Step 8: 追加一行到 history.jsonl,并把发出去的 X 帖归档到 outbox/<date>/x-posted.txt
每周日跑完 daily 之后额外:
  • research-marketplaces.sh
    刷新一遍
    state/research.md
    (看看 marketplaces 上当周爆款的写法变化)
每月 1 号跑完 daily 之后额外:
  • 对所有 plan 老于 30 天的 skill 重跑
    make-plan.sh
    (rotate angles)
04:00 →
  Step 1: list-skills.sh        → List of all current wjs-* skills + their last promotion time
  Step 2: pick-next-skill.sh    → Select today's skill according to rules (see §Rotation Rules)
  Step 3: Check skip conditions → Promoted within 7 days / SKILL.md unchanged / Today's content already in outbox → exit 0 directly
  Step 4: make-plan.sh <skill>  → If the skill has no plan or the plan is older than 30 days, regenerate it
  Step 5: Run daily-post.md via claude -p
            └── Input: SKILL.md + plan + research.md + last 30 days of history.jsonl
            └── Output: An X text ≤ 280 characters (including repo URL)
  Step 6: xurl -X POST -d '{"text": "..."}' /2/tweets   ← Publish directly
  Step 7: Run community-drafts.md via claude -p
            └── Output: outbox/<date>/reddit-r-ClaudeAI.md / hn-show.md / discord-anthropic.md
  Step 8: Append one line to history.jsonl, and archive the posted X tweet to outbox/<date>/x-posted.txt
After running daily flow every Sunday, additionally:
  • research-marketplaces.sh
    refreshes
    state/research.md
    (check changes in copywriting of top skills on marketplaces that week)
After running daily flow on the 1st of every month, additionally:
  • Re-run
    make-plan.sh
    for all skills with plans older than 30 days (rotate angles)

Rotation Rules (pick-next-skill.sh)

Rotation Rules (pick-next-skill.sh)

按优先级从高到低排:
  1. 从没推过的 skill —— 优先推,让新 skill 早点曝光
  2. 最近 7 天内没推过的 skill —— 在这些里挑 SKILL.md 最近有修改的(说明用户刚迭代过)
  3. 其它 —— 在所有 skill 里挑「距离上次推广最久」的那个
如果所有 skill 都在 7 天内推过 → 当天跳过(避免变成噪音)。 如果所有 skill 都从没推过 → 按字母序挑第一个。
Sorted by priority from highest to lowest:
  1. Skills never promoted before — Prioritize these to get new skills exposure early
  2. Skills not promoted in the last 7 days — Among these, select those with recently modified SKILL.md (indicating the user just iterated on it)
  3. Others — Select the skill that was promoted the longest ago among all skills
If all skills have been promoted within 7 days → Skip the day (avoid noise). If all skills have never been promoted → Select the first one in alphabetical order.

X Post Format (daily-post.md output)

X Post Format (daily-post.md output)

Constraints:
  • ≤ 280 字符(X 算 URL 为 23 字符,预留 25)
  • 第一行:skill name + 一句话价值
  • 中间:2–3 个具体能力 / 此次更新的差异点
  • 倒数第二行单独一行放 repo URL(X 自动 render preview card)
  • 最多 1 个 hashtag(
    #ClaudeCode
    #ClaudeSkills
  • 不许:营销腔、火箭 emoji、
    AI-powered
    game-changer
    、夸张词
  • 必须:用户的语气(参考 README.md 里 wjs-* skill 的文风:实用、具体、不吹牛)
Angle rotation(同一个 skill 多次推时不重复):
  • 角度 A:它解决的具体问题("75 分钟 4K 多机位 60GB 重编码同步会让磁盘翻倍" 这种细节)
  • 角度 B:反直觉的设计决策("sidecar over re-encode" 这种)
  • 角度 C:串联工作流(和其他 skill 一起跑出什么效果)
  • 角度 D:最近一次更新的差异(如果 SKILL.md 自上次推广有改动,diff 出来重点讲新东西)
make-plan.sh
会把这四种角度排成 30 天的 rotation,每条都预写一个 hook 句。
Constraints:
  • ≤ 280 characters (X counts URLs as 23 characters, reserve 25)
  • First line: skill name + one-sentence value proposition
  • Middle: 2–3 specific capabilities / differences from the latest update
  • Second-to-last line: repo URL on a separate line (X will automatically render a preview card)
  • At most 1 hashtag (
    #ClaudeCode
    or
    #ClaudeSkills
    )
  • Prohibited: Marketing jargon, rocket emojis,
    AI-powered
    ,
    game-changer
    , exaggerated words
  • Required: Match the user's tone (refer to the style of wjs-* skills in README.md: practical, specific, no hype)
Angle rotation (no repetition when promoting the same skill multiple times):
  • Angle A: Specific problem it solves (details like "75-minute 4K multi-camera 60GB re-encoding sync doubles disk usage")
  • Angle B: Counterintuitive design decisions (like "sidecar over re-encode")
  • Angle C: Workflow integration (what results can be achieved with other skills)
  • Angle D: Differences from the latest update (if SKILL.md has changed since last promotion, focus on new features from the diff)
make-plan.sh
will arrange these four angles into a 30-day rotation, with a pre-written hook sentence for each.

Community Drafts (community-drafts.md output)

Community Drafts (community-drafts.md output)

不真发。落到
outbox/<date>/
,人工 review 后 copy-paste:
  • reddit-r-ClaudeAI.md
    :长文格式,开头一句钩子,正文讲场景 + 代码片段 + 链接,结尾问一个开放性问题(Reddit 喜欢 discussion 不喜欢 ad)。Selfpost only,绝不放纯链接帖
  • hn-show.md
    :Show HN 格式,标题
    Show HN: <skill> – <one line value>
    ,正文 < 600 字,注明开源协议 + repo URL,不要在 HN 卖东西
  • discord-anthropic.md
    :短贴,2–3 句话 + 链接,适合 #show-and-tell 频道
  • wechat-followup.md
    (可选):如果该 skill 适合写一篇公众号文章详细讲,给个 200 字大纲 + 几个 angle,下次用户写文章时直接用
如果用户当天太忙没 review,不会重发 —— 帖子就停留在 outbox 里,第二天会再生成新的(针对另一个 skill)。
Not published directly. Saved to
outbox/<date>/
, copy-paste after manual review:
  • reddit-r-ClaudeAI.md
    : Long-form format, start with a hook, body covers scenarios + code snippets + links, end with an open question (Reddit prefers discussions over ads). Selfpost only, never post pure links
  • hn-show.md
    : Show HN format, title
    Show HN: <skill> – <one line value>
    , body < 600 words, note open source license + repo URL, don't sell on HN
  • discord-anthropic.md
    : Short post, 2–3 sentences + link, suitable for #show-and-tell channels
  • wechat-followup.md
    (Optional): If the skill is suitable for a detailed WeChat official account article, provide a 200-word outline + several angles for direct use when the user writes the article later
If the user is too busy to review on the day, it won't repost — the posts will stay in the outbox, and new drafts (for another skill) will be generated the next day.

Manual Override

Manual Override

测试 / 调试用 —— 任何一步都能单独跑:
bash
undefined
For testing / debugging — any step can be run individually:
bash
undefined

看看明天会推谁

See who will be promoted tomorrow

~/.claude/skills/wjs-promoting-skills/pick-next-skill.sh
~/.claude/skills/wjs-promoting-skills/pick-next-skill.sh

给某个 skill 强制生成 plan

Force generate a plan for a specific skill

~/.claude/skills/wjs-promoting-skills/make-plan.sh wjs-transcribing-audio
~/.claude/skills/wjs-promoting-skills/make-plan.sh wjs-transcribing-audio

把今天的整个 flow 跑一遍但不发 X(dry-run)

Run the entire today's flow without posting to X (dry-run)

DRY_RUN=1 ~/.claude/skills/wjs-promoting-skills/daily.sh
DRY_RUN=1 ~/.claude/skills/wjs-promoting-skills/daily.sh

强制推某个 skill(绕过 rotation)

Force promote a specific skill (bypass rotation)

SKILL=wjs-segmenting-video ~/.claude/skills/wjs-promoting-skills/daily.sh
SKILL=wjs-segmenting-video ~/.claude/skills/wjs-promoting-skills/daily.sh

刷新 marketplace 研究

Refresh marketplace research

~/.claude/skills/wjs-promoting-skills/research-marketplaces.sh
~/.claude/skills/wjs-promoting-skills/research-marketplaces.sh

看最近 7 天推过什么

See what's been promoted in the last 7 days

tail -7 ~/.claude/skills/wjs-promoting-skills/state/history.jsonl | jq .
undefined
tail -7 ~/.claude/skills/wjs-promoting-skills/state/history.jsonl | jq .
undefined

Prerequisites

Prerequisites

  • claude
    CLI 在
    $PATH
    ,且
    claude -p "hello"
    能跑通(headless 模式)
  • xurl
    已装,
    xurl whoami
    返回
    jianshuo
  • jq
    已装(
    brew install jq
  • 公开仓库:每个
    wjs-*
    skill 都有 GitHub repo,
    git config --get remote.origin.url
    能拿到 URL。本仓库
    ~/code/claude-skills
    已经满足
  • macOS(用
    launchd
    调度;Linux 等价方案是 systemd timer,但本 skill 没实现)
  • claude
    CLI is in
    $PATH
    , and
    claude -p "hello"
    runs successfully (headless mode)
  • xurl
    is installed,
    xurl whoami
    returns
    jianshuo
  • jq
    is installed (
    brew install jq
    )
  • Public repositories: Each
    wjs-*
    skill has a GitHub repo, and
    git config --get remote.origin.url
    can retrieve the URL. This repository
    ~/code/claude-skills
    already meets this requirement
  • macOS (uses
    launchd
    for scheduling; the Linux equivalent is systemd timer, but this skill doesn't implement it)

Anti-Patterns (绝对不做)

Anti-Patterns (Absolutely Not Do)

不做原因
一天发多条 X7000 followers 不需要 timeline 刷屏。每天 1 条,质量 > 数量
Reddit / HN 自动发帖反垃圾审查极严,自动发 = 封号风险。Draft only
套模板(emoji + 夸张词)用户的语气是「实用、具体、不吹牛」。模板腔是品牌污染
同一个 skill 7 天内重复推即使角度不同,频率不对也会让 follower 取关
「为了发而发」—— SKILL.md 没动 7 天还要发没新东西就不发。沉默比噪音好
调用
claude
时不设
--bare
我们要的是确定性输出,不要 hooks / 自动 memory / CLAUDE.md 干扰
把 state/ 推到 GitHubhistory.jsonl 包含发 X 的元数据(tweet_id 这些),不是公开内容
Not DoReason
Post multiple X tweets a day7000 followers don't need a cluttered timeline. 1 post per day, quality > quantity
Auto-post to Reddit / HNAnti-spam reviews are extremely strict, auto-posting = account ban risk. Draft only
Use templates (emojis + exaggerated words)The user's tone is "practical, specific, no hype". Template-style copy pollutes the brand
Promote the same skill within 7 daysEven with different angles, wrong frequency will cause followers to unfollow
"Post for the sake of posting" — post even if SKILL.md hasn't changed in 7 daysDon't post if there's nothing new. Silence is better than noise
Call
claude
without
--bare
We need deterministic output, no hooks / auto-memory / CLAUDE.md interference
Push state/ to GitHubhistory.jsonl contains metadata of X posts (like tweet_id), which is not public content

What This Skill Is NOT

What This Skill Is NOT

  • 不是「让 AI 替你运营账号」—— 每个帖子都基于你写过的 SKILL.md,AI 只是换角度提炼
  • 不是「跨平台 cross-poster」—— 只有 X 是真发,其它是 draft
  • 不是「fully autonomous」—— 你随时可以 uninstall.sh 停掉,或者
    DRY_RUN=1
    看下一次会发什么
  • 不是「替代
    /publish-skill
    」—— 那个是单次手动版,这个是每日自动版,两者可以并存
  • Not "let AI run your account for you" — every post is based on your written SKILL.md, AI only reframes it from different angles
  • Not a "cross-platform cross-poster" — only X supports direct publishing, others are drafts
  • Not "fully autonomous" — you can stop it anytime with uninstall.sh, or use
    DRY_RUN=1
    to see what will be posted next time
  • Not a replacement for
    /publish-skill
    — that's the manual single-post version, this is the daily automated version, they can coexist

Done When

Done When

  • setup.sh
    跑成功,
    launchctl list | grep wjs-promoting-skills
    能看到
  • state/research.md
    存在且 > 1KB(说明研究跑过)
  • DRY_RUN=1 daily.sh
    能完整跑通一遍且不发 X
  • outbox/<today>/
    里有 4 个 markdown draft
  • history.jsonl
    在真发当天有一行新记录
Auto-publish: 本 skill 由
~/.claude/skills-publish-hook.sh
自动同步到 github.com/jianshuo/claude-skills(每次编辑后自动 commit + push)。
state/
outbox/
通过本目录的
.gitignore
+ 子目录
.gitignore
一起被排除,不会跟 SKILL.md 一起推送。
  • setup.sh
    runs successfully,
    launchctl list | grep wjs-promoting-skills
    shows it
  • state/research.md
    exists and is > 1KB (indicates research has run)
  • DRY_RUN=1 daily.sh
    runs completely without posting to X
  • 4 markdown drafts exist in
    outbox/<today>/
  • A new line is added to
    history.jsonl
    on the day of actual posting
Auto-publish: This skill is automatically synced to github.com/jianshuo/claude-skills via
~/.claude/skills-publish-hook.sh
(auto commit + push after each edit).
state/
and
outbox/
are excluded via the directory's
.gitignore
+ subdirectory
.gitignore
, and won't be pushed along with SKILL.md.