Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -1670,6 +1670,23 @@
"security",
"compliance"
]
},
{
"name": "yaohe",
"source": "./plugins/yaohe",
"description": "吆喝 — Let your agent promote your open-source project across 20 CN & EN channels, rule-abiding and per-channel tailored.",
"version": "0.1.0",
"author": {
"name": "nmhjklnm"
},
"category": "Marketing Growth",
"homepage": "https://github.com/nmhjklnm/yaohe",
"keywords": [
"open-source",
"promotion",
"marketing",
"launch"
]
}
]
}
1 change: 1 addition & 0 deletions README-zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,7 @@
- [reddit-community-builder](./plugins/reddit-community-builder)
- [tiktok-strategist](./plugins/tiktok-strategist)
- [twitter-engager](./plugins/twitter-engager)
- [yaohe](./plugins/yaohe)

### 项目与产品管理
- [discuss](./plugins/discuss)
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,7 @@ Install or disable them dynamically with the `/plugin` command — enabling you
- [reddit-community-builder](./plugins/reddit-community-builder)
- [tiktok-strategist](./plugins/tiktok-strategist)
- [twitter-engager](./plugins/twitter-engager)
- [yaohe](./plugins/yaohe)

### Project & Product Management
- [discuss](./plugins/discuss)
Expand Down
6 changes: 6 additions & 0 deletions plugins/yaohe/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"name": "yaohe",
"version": "0.1.0",
"description": "吆喝 — 让 Agent 自动全网宣传你的开源项目。Rule-abiding, per-channel tailored promotion across 20 CN & EN channels",
"author": { "name": "nmhjklnm" }
}
21 changes: 21 additions & 0 deletions plugins/yaohe/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 nmhjklnm

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
40 changes: 40 additions & 0 deletions plugins/yaohe/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# 吆喝 yaohe

让 Agent 自动全网宣传你的开源项目 —— 一个 Claude Code skill。

![yaohe](https://raw.githubusercontent.com/nmhjklnm/yaohe/main/docs/assets/banner.png)

写完项目没人知道?宣传渠道很多(阮一峰周刊自荐、HelloGitHub、Show HN、V2EX…),但每个渠道格式不同、规则不同,还得一个个手动投。吆喝内置 20 个渠道的实证规格,把这件事变成一条命令,发新版本时顺手全网吆喝一嗓子:

```
/promote <repo 路径或 owner/repo>
```

它会:

1. **读你的 repo**,提炼项目定位和亮点
2. **按渠道定制文案** —— 阮一峰自荐格式、HelloGitHub 标准、Show HN 标题惯例,各写各的,不是一稿群发
3. **分级执行**:
- issue/PR 型渠道(阮一峰周刊等)→ `gh` CLI 确认后直接提交
- 表单型(Product Hunt 等)→ 稿件 + 逐字段指引
- 社区发帖型(Show HN、V2EX、Reddit)→ 只出稿不代发,附最佳发帖时间和社区红线
4. **记录投递日志**(`PROMO-LOG.md`),防止重复骚扰渠道

## 为什么"合规"是核心设计

社区发帖型渠道反感机器发帖:HN 封 voting ring 连坐域名,Reddit 有 self-promotion 比例规则。所以吆喝的边界是:**自动化提交只用于渠道方明确开放的自荐入口(issue/PR/表单),社区帖永远人工发**。这不是功能缺失,是产品原则。

## 安装

```
claude plugin marketplace add nmhjklnm/yaohe
claude plugin install yaohe
```

## 渠道覆盖

见 [skills/promote/channels/](skills/promote/channels/)。每个渠道一个文件,含实证过的提交方式、格式规格、真实样例。欢迎 PR 添加新渠道(按 [channels/_template.md](skills/promote/channels/_template.md))。

## License

MIT
68 changes: 68 additions & 0 deletions plugins/yaohe/skills/promote/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
---
name: promote
description: Promote an open-source project across CN & EN channels — reads the repo, generates per-channel tailored copy, auto-submits issue/PR-type channels via gh, assists the rest. Use when the user wants to 宣传/推广/publicize/launch/submit their open-source project, or asks "帮我把这个项目投到阮一峰周刊/HelloGitHub/Show HN".
---

# promote — 开源项目一键合规宣传

核心原则:**一键 ≠ 一键全发**。渠道分三级自动化,越权发帖 = spam = 毁项目声誉。

## 流程

### 1. 项目画像(必做,一切文案的源头)

**硬性前置闸门,任一不过就停下问用户,不进入后续步骤:**

- `gh repo view <owner>/<repo>` 必须成功(仓库公开可达)。本地路径则检查 `git remote -v` 有 GitHub remote 且已 push——**稿件里的每个链接都必须真实可达,绝不写入死链**
- LICENSE 文件真实存在才可声明协议;README 说 MIT 但没有 LICENSE 文件 → 提醒用户先补

然后读 README 全文、描述、topics、star 数、最近活跃度,提炼:一句话定位(它是什么+替代/优于什么)、目标人群、3 个差异化亮点、演示素材(截图/GIF/demo URL)。

README 薄的判定(缺任一项即问用户补齐,不要编):① 一句话说清它是什么 ② 安装/使用方法 ③ 至少一个具体使用场景或示例。

### 2. 渠道选择

读 `channels/` 下所有渠道文件的 frontmatter,按项目画像过滤:

- 语言匹配:投 EN 渠道的条件 = 有英文 README(或 README 本身是英文);不满足时该渠道仍可列出但标注「需先补英文文档」,用户坚持投则明示风险后照办
- 门槛匹配(如渠道要求 star 数 / 入门级 / dev-tool 类目)
- 检查 `PROMO-LOG.md`(项目根目录):**同一渠道 30 天内有任何记录(含 rejected)即跳过**,冷却期从最新一条记录的日期起算

用 AskUserQuestion 列出推荐渠道(含自动化等级标注)让用户勾选;用户明确说"全投"则投所有合规匹配渠道。

### 3. 逐渠道生成定制稿

对每个选中渠道,读其 `channels/<id>.md` 全文,**严格按其 format_spec 生成**:

- 禁止一稿多投:每渠道的标题风格、篇幅、语气、结构都不同(阮一峰自荐 ≠ Show HN 标题 ≠ V2EX 分享创造帖)
- 文案原则:说人话、给事实(能做什么、和现有方案差在哪),禁营销腔/AI 味(震惊体、emoji 堆砌、buzzword)
- **去 AI 味终审(必做)**:装了 deslop 类 skill 就调用它过一遍;没装则至少执行硬规则:禁破折号(——)、禁「不是…而是…」否定对比句、弯引号换直角引号「」、删段末总结句、删互联网黑话
- **配图(必做)**:几乎所有渠道带图命中率都更高。优先级:① 项目已有截图/GIF 直接用 ② 真实运行录屏/截图(终端工具录一段 demo)③ 用可用的图像生成能力(imagegen/codex 出图/自绘 SVG 转 PNG)设计一张说明产品原理的宣传图。图片提交到项目仓库(如 `docs/assets/`)用 raw.githubusercontent.com URL 引用,别用外部图床。渠道规格标注图片必备的(如 ruanyf-weekly),无图不投
- 全部稿件先写入 `promo-drafts/<channel-id>.md` 落盘;**文件首行固定为 `Title: <标题>`**(即使该渠道标题走 `gh --title` 参数不进 body),复盘时才对得上号

### 4. 分级执行

按渠道 frontmatter 的 `automatable` 字段:

- **full**(issue/PR 型):先 `gh auth status` 确认已登录(未登录 → 让用户 `gh auth login`,停在这里)→ 展示最终稿 → 用户确认一次 → `gh` CLI 提交 → 记录返回 URL。失败就报错停,不换渠道兜底。
- **assisted**(网页表单型):给出最终稿 + 提交 URL + 逐字段填写指引;有浏览器工具可代填但提交按钮由用户点。
- **manual-only**(社区发帖型):只交稿件 + 建议发帖时间(见渠道文件)+ 红线提醒。**任何情况下不代发**。

### 5. 记录与复盘

把本次投递写入目标项目根目录 `PROMO-LOG.md`,固定表格 schema(机器可读,下次运行先读它):

```markdown
| channel | date | draft | url | status |
|---|---|---|---|---|
| ruanyf-weekly | 2026-07-02 | promo-drafts/ruanyf-weekly.md | https://github.com/ruanyf/weekly/issues/NNN | submitted |
```

- `date` 用 ISO(YYYY-MM-DD);`status` ∈ draft / submitted / published / rejected
- 30 天冷却按该渠道最新一行的 date 计算,任何 status 都算

## 红线(任何渠道通用)

- 不伪造用户身份发言;不注册马甲;不安排互赞互顶(HN voting ring 会连坐封域名)
- 同一渠道 30 天内不重复投同一项目
- 渠道规则与本 skill 冲突时,以渠道最新规则为准(提交前 spot-check 渠道规则页是否变化)
25 changes: 25 additions & 0 deletions plugins/yaohe/skills/promote/channels/_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
---
id: <channel-id>
name: <渠道名>
lang: cn | en
automatable: full | assisted | manual-only
submission_method: github-issue-comment | github-issue | github-pr | web-form | community-post | post-article
target: <提交入口 URL 或 repo#issue,动态入口写发现方法>
audience: <这个渠道的读者是谁>
threshold: <收录门槛,无则写 none>
verified: <YYYY-MM-DD 实证日期>
---

# <渠道名>

## format_spec

(标题格式、正文结构、篇幅、语气。附 1-2 个真实优秀样例全文。)

## rules

(频率限制、内容红线、什么行为会被视为 spam。)

## submit

(automatable=full 时:具体 gh 命令模板。assisted:逐字段清单。manual-only:最佳发帖时间 + 发帖后注意事项。)
26 changes: 26 additions & 0 deletions plugins/yaohe/skills/promote/channels/appinn.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
---
id: appinn
name: 小众软件·发现频道
lang: cn
automatable: manual-only
submission_method: community-post
target: https://meta.appinn.net/c/faxian/10(需注册论坛账号)
audience: 发布后同步 appinn.com 首页、x.appinn.com、Twitter、Telegram 多渠道
threshold: none
verified: 2026-07-02(置顶版规原文在认证墙后,unverified)
---

# 小众软件自荐

## format_spec

标题惯例:`【开发者自荐】`或`【开源自荐】`+ 项目名;正文:简介 / 平台 / 功能特点 / 是否开源。发帖前先读频道置顶「内容提交规则」。

## rules

- **发布后不要删帖**:帖子同步到多个下游渠道,删帖会造成同步 404
- 具体审核/查重规则 unverified,以置顶帖为准

## submit

manual-only:出稿 → 用户注册论坛账号自发。
32 changes: 32 additions & 0 deletions plugins/yaohe/skills/promote/channels/awesome-claude-code.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
---
id: awesome-claude-code
name: Awesome Claude Code(47.8k★,Claude Code 生态最大列表)
lang: en
automatable: manual-only
submission_method: web-form
target: https://github.com/hesreallyhim/awesome-claude-code/issues/new?template=recommend-resource.yml
audience: Claude Code 用户的选型入口;收录后可挂 "Mentioned in Awesome Claude Code" 徽章
threshold: 精选制;机器人自动校验字段/URL/查重/license + 人工审核
verified: 2026-07-02
---

# Awesome Claude Code

**红线:禁止 PR、禁止 gh CLI 提交**。官方原话:"ALL RECOMMENDATIONS MUST BE MADE USING THE WEB UI ISSUE FORM TEMPLATE, OR YOU RISK BEING BANNED"。必须真人在网页 issue 表单填写;审核通过后机器人自动开 PR 合并。

## format_spec

表单字段:Display Name / Category(选 Tooling 或 Slash-Commands 等)/ Sub-Category / Primary Link / Author Name / Author Link / License / 1-2 句功能描述。

描述要求**证据导向**:给出可复现验证的具体用法(如实际 prompt/命令),别写「装上见证奇迹」式空话。若插件涉及非 Anthropic 服务器的网络请求 / 修改系统文件 / 遥测 / 需要 bypass-permissions,必须在描述中明确声明。

## rules

- 近期因 spam 有临时封禁先例,措辞谨慎、一次提交、不催审
- 仅 Claude Code 生态资源适用

## submit

manual-only:生成表单各字段的值 → 用户网页填写。

次选(专收 plugin 的列表,865★,标准 PR 制):`ccplugins/awesome-claude-code-plugins`——在 `plugins/<name>` 加目录 + README 对应分类加一行 `- [name](./plugins/name)`,有 README-zh.md 可同时提中文条目,此列表可走 `gh` PR(automatable: full)。
35 changes: 35 additions & 0 deletions plugins/yaohe/skills/promote/channels/awesome-list.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
---
id: awesome-list
name: Awesome List 收录(PR 到相关 awesome-* 仓库)
lang: en
automatable: full
submission_method: github-pr
target: 动态发现:`gh api -X GET search/repositories -f q='awesome <领域关键词> in:name' --jq '.items[:5][] | {full_name, stargazers_count}'`
audience: 长尾持续流量(awesome list 是开发者选型入口,SEO 价值高)
threshold: 项目需真实可用、维护中;各列表另有自己的 contributing 规则
verified: 2026-07-02
---

# Awesome List 收录

注意区分两件事:**向某个领域 awesome-\* 列表添加你的项目**(本渠道的主用途,门槛低)vs **向 sindresorhus/awesome 主仓提交一个新列表**(门槛高:列表满 30 天、CC0、awesome-lint、先评审 4 个他人 PR 等,一般用不到)。

## format_spec(条目 PR)

- 先读目标列表的 `contributing.md`(有就必须遵守)
- 条目格式(awesome 生态通例):`[Name](url) - Description.`——描述首字母大写、句号结尾、描述项目本身、禁营销话术
- 插入位置遵守列表的现有排序(字母序/分类)
- PR 标题:`Add <Name>`;PR 描述说明项目为什么属于这个列表
- **红线:禁止全 AI 生成的 PR**(sindresorhus 生态明文拒绝)——稿件须经用户过目确认后再提

## submit

```bash
# 1. 找目标列表(按项目领域关键词),人工确认相关性
# 2. fork + 单行改动 + PR
gh repo fork <owner>/<awesome-repo> --clone
# 编辑对应分类下插入条目
gh pr create -R <owner>/<awesome-repo> --title "Add <Name>" --body-file promo-drafts/awesome-list.md
```

一次只投最相关的 1-2 个列表,广撒网式 PR 会被生态圈拉黑。
22 changes: 22 additions & 0 deletions plugins/yaohe/skills/promote/channels/dev-newsletters.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
---
id: dev-newsletters
name: 开发者 Newsletter(Changelog News / console.dev)
lang: en
automatable: manual-only
submission_method: web-form
target: changelog.com/news/submit(需登录)· console.dev 走编辑联系 hello@console.dev
audience: Changelog(大型开发者播客/newsletter);console.dev(每周 dev tools 精选,3 万+ 订阅)
threshold: 编辑精选制,接受率低
verified: 2026-07-02
---

# 开发者 Newsletter

## rules

- **Changelog News 明确拒绝**:教程类、商业产品推广(那要走赞助)、体验差的网站。产品直投大概率被拒——必须包装成对开发者同行有新闻价值的技术性新闻角度,零营销语气
- console.dev 无自助提交,是编辑评测制,邮件联系争取被收录

## submit

manual-only:出「新闻角度」稿(发生了什么、为什么对开发者重要)→ 用户提交/发邮件。预期管理:这类渠道命中率低,投了别等。
35 changes: 35 additions & 0 deletions plugins/yaohe/skills/promote/channels/devto.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
---
id: devto
name: dev.to
lang: en
automatable: full
submission_method: post-article
target: Forem API v1 `POST https://dev.to/api/articles`(文档 https://developers.forem.com/api)
audience: 大型开发者博客社区,开源 showcase 是常见形式
threshold: 需用户在 dev.to 设置页生成 api-key
verified: 2026-07-02
---

# dev.to 发文

唯一有公开可编程发布 API 的社区渠道。

## format_spec

- 文章形态:showcase 长文(做了什么/为什么/怎么用/求反馈),markdown 正文
- tags:逗号分隔,建议 opensource + 领域 tag(如 claudecode/ai/productivity)

## rules

无官方 self-promo 书面限制,依赖社区礼仪:讲干货不发纯广告。

## submit

```bash
curl -s -X POST https://dev.to/api/articles \
-H "api-key: $DEVTO_API_KEY" -H "content-type: application/json" \
-H "accept: application/vnd.forem.api-v1+json" \
-d '{"article":{"title":"...","body_markdown":"...","published":false,"tags":["opensource"]}}'
```

先 `published: false` 存草稿给用户预览,用户确认后再置 true 发布。
19 changes: 19 additions & 0 deletions plugins/yaohe/skills/promote/channels/eleduck.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
---
id: eleduck
name: 电鸭社区·独立产品
lang: cn
automatable: manual-only
submission_method: community-post
target: https://eleduck.com/categories/15(需注册;先读规则帖 https://eleduck.com/posts/6GzfGe)
audience: 远程工作/独立开发者社区
threshold: none(发帖是否耗「电量」unverified)
verified: 2026-07-02(板块确认存在,帖子模板 unverified)
---

# 电鸭·独立产品

社区偏好真实开发故事而非硬广。出稿走「独立开发者叙事」:为什么做、怎么做的、目前状态、求反馈。

## submit

manual-only:出稿 → 用户注册自发,发帖前读社区规则帖。
Loading