SuperAPI AI Directory

wjs-promoting-skills

Agents & models

View repository

Updated 10-15 23:32

About this skill

wjs-promoting-skills

Runs automatically once every day at 4:00 AM: pick a wjs-* skill → generate today's promotion angle → post to X → draft a community post.X actually posts; community posts are only drafted into outbox/ for human review.

Core Principle

Claude is the brain, bash is the skeleton. All of this skill's judgments (which one to promote today, how to write it, what angle) are handed to claude -p to run as headless calls — bash is only responsible for scheduling, passing context, writing logs, and preventing duplicate posts. This way, adding new skills / adding new channels / changing style doesn't require code changes, only prompt template changes.

There is only one channel for actual posting: X. Reddit / HN / Discord all lack a reliable "auto-post as a user identity" API (either they require OAuth + anti-spam review, or they have no interface at all). So this skill onlydrafts community posts to outbox/<date>/, waiting for manual copy-paste.

Idempotent + throttled. At most 1 X post per day. The same skill is not promoted again within 7 days. If SKILL.md hasn't changed since the last promotion, and nothing has changed in the past 7 days, skip that day. This avoids becoming a noisy bot.

When This Skill Fires

  • The user says "help me promote these skills" / "set up daily automatic promotion" / "research how others promote skills"
  • The user uses /wjs-promoting-skills to explicitly invoke
  • The user asks "which skill are we promoting today" / "what's in the outbox"

If the user only wants to postonce(no cron), just use /publish-skill <name> — that's the single manual version. The value of this skill isautomatic daily。

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              # (可选)下次写公众号文章时的角度参考

Setup (one-time)

~/.claude/skills/wjs-promoting-skills/setup.sh

Will do three things:

  1. Check prerequisites:claude CLI、xurl(and xurl whoami can return the user),jq
  2. Run research-marketplaces.sh once to generate the initial state/research.md(this is the only time it actually goes online to research, next time it auto-refreshes once a month)
  3. Render com.jianshuo.wjs-promoting-skills.plist.template into a real plist and put it in ~/Library/LaunchAgents/, then launchctl bootstrap

After it runs, it triggers automatically every day at 04:00, no manual operation needed.

To stop:~/.claude/skills/wjs-promoting-skills/uninstall.sh

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

Every Sunday after daily runs, additionally:

  • research-marketplaces.sh refresh state/research.md(see how the writing of that week's hits on marketplaces has changed)

On the 1st of every month after daily runs, additionally:

  • For all skills whose plans are older than 30 days, rerun make-plan.sh(rotate angles)

Rotation Rules (pick-next-skill.sh)

Ordered by priority from high to low:

  1. Skills that have never been promoted — prioritize them so new skills get exposure early
  2. Skills not promoted in the last 7 days — among these, pick the ones whose SKILL.md was most recentlymodified(meaning the user just iterated on it)
  3. Others — among all skills, pick the one that has been the longest since its last promotion

If all skills have been promoted within 7 days → skip that day (to avoid becoming noise). If all skills have never been promoted → pick the first one alphabetically.

X Post Format (daily-post.md output)

Constraints:

  • ≤ 280 characters (X counts URLs as 23 characters, reserve 25)
  • First line: skill name + one-sentence value
  • Middle: 2–3 specific capabilities / differences in this update
  • Second-to-last line: repo URL on its own line (X automatically renders a preview card)
  • At most 1 hashtag (#ClaudeCode or #ClaudeSkills)
  • Not allowed: marketing speak, rocket emoji,AI-powered、game-changer, exaggerated words
  • Must: the user's tone (refer to the writing style of the wjs-* skills in README.md: practical, specific, no bragging)

Angle rotation (don't repeat when promoting the same skill multiple times):

  • Angle A:the specific problem it solves(details like "a 75-minute 4K multi-cam 60GB re-encode sync will double your disk usage")
  • Angle B:counterintuitive design decisions(like "sidecar over re-encode")
  • Angle C:chained workflows(what effect you get from running it together with other skills)
  • Angle D:the diff from the most recent update(if SKILL.md has changed since the last promotion, diff it and focus on what's new)

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)

Don't actually post. Land it in outbox/<date>/, and after manual review, copy-paste:

  • reddit-r-ClaudeAI.md: long-form format, a hook in the opening sentence, body covers the scenario + code snippets + links, ends with an open-ended question (Reddit likes discussion, not ads).Selfpost only, never post pure link posts
  • hn-show.md: Show HN format, title Show HN: <skill> – <one line value>, body < 600 words, note the open-source license + repo URL,don't sell things on HN
  • discord-anthropic.md: short post, 2–3 sentences + link, suitable for the #show-and-tell channel
  • wechat-followup.md(optional): if the skill is suitable for a detailed WeChat official account article, give a 200-word outline + a few angles, to be used directly next time the user writes an article

If the user is too busy to review that day, it won't repost — the post just stays in the outbox, and the next day a new one will be generated (for another skill).

Manual Override

For testing / debugging — any step can be run individually:

# 看看明天会推谁
~/.claude/skills/wjs-promoting-skills/pick-next-skill.sh

# 给某个 skill 强制生成 plan
~/.claude/skills/wjs-promoting-skills/make-plan.sh wjs-transcribing-audio

# 把今天的整个 flow 跑一遍但不发 X(dry-run)
DRY_RUN=1 ~/.claude/skills/wjs-promoting-skills/daily.sh

# 强制推某个 skill(绕过 rotation)
SKILL=wjs-segmenting-video ~/.claude/skills/wjs-promoting-skills/daily.sh

# 刷新 marketplace 研究
~/.claude/skills/wjs-promoting-skills/research-marketplaces.sh

# 看最近 7 天推过什么
tail -7 ~/.claude/skills/wjs-promoting-skills/state/history.jsonl | jq .

Prerequisites

  • claude CLI is at $PATH, and claude -p "hello" can run successfully (headless mode)
  • xurl is installed,xurl whoami returns jianshuo
  • jq is installed (brew install jq)
  • Public repos: every wjs-* skill has a GitHub repo,git config --get remote.origin.url can get the URL. This repo ~/code/claude-skills already satisfies this
  • macOS (use launchd for scheduling; the Linux equivalent is a systemd timer, but this skill doesn't implement it)

Anti-Patterns (absolutely never do)

Don't do Reason
Post multiple X posts a day 7000 followers don't need a timeline flood. 1 per day, quality > quantity
Auto-post to Reddit / HN Anti-spam review is extremely strict, auto-posting = risk of ban. Draft only
Use templates (emoji + exaggerated words) The user's tone is "practical, specific, no bragging". Template-speak is brand pollution
Promote the same skill repeatedly within 7 days Even with different angles, the wrong frequency will make followers unfollow
"Posting for the sake of posting" — SKILL.md hasn't changed in 7 days and you still post If there's nothing new, don't post. Silence is better than noise
When calling claude , don't set --bare We want deterministic output, not hooks / auto memory / CLAUDE.md interference
Push state/ to GitHub history.jsonl contains metadata for posting to X (tweet_id and such), not public content

What This Skill Is NOT

  • No"Let AI run your account for you" — every post is based on the SKILL.md you wrote, the AI just extracts it from a different angle
  • No"Cross-platform cross-poster" — only X is actually posted to, the rest are drafts
  • No"Fully autonomous" — you can stop it at any time with uninstall.sh, or DRY_RUN=1 to see what will be posted next
  • No"Replaces /publish-skill" — that one is a single manual version, this one is a daily automatic version, the two can coexist

Done When

  • setup.sh runs successfully,launchctl list | grep wjs-promoting-skills you can see
  • state/research.md exists and is > 1KB (indicating research has run)
  • DRY_RUN=1 daily.sh can run through completely once without posting to X
  • outbox/<today>/ has 4 markdown drafts
  • history.jsonl has a new record line on the actual posting day

Auto-publish: this skill is automatically synced by ~/.claude/skills-publish-hook.sh to github.com/jianshuo/claude-skills(auto commit + push after each edit).state/ and outbox/ are excluded together via this directory's .gitignore + subdirectory .gitignore , and will not be pushed along with SKILL.md.