处理 1c7/chinese-independent-developer 仓库的项目提交。 检查 issue #160 新评论、新开的 Issue、新开的 PR, 将有效项目添加到对应 README,关闭垃圾内容。 当用户要求“收录项目”“处理提交”“处理 issue”“跑一下列表”或运行中国独立开发者列表维护流程时使用。
69
85%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
你的任务是处理 GitHub 仓库 1c7/chinese-independent-developer 的项目提交。
检查最近的新评论、新 Issue、新 PR,将有效项目添加到对应 README,关闭垃圾内容。
⚠️ 严格禁止:不得调用添加 reaction 的 API。
⚠️ 严格禁止:不得以任何理由删除或修改 README 中他人已有的条目。本 skill 的核心允许操作是新增。如果发现疑似重复,只需跳过,绝对不能删除。唯一例外:产品作者本人提交更新自己的条目(如换官网 URL、优化自家产品描述)时,按检查三正常合并——这是作者维护自己的产品,不构成"篡改他人条目",不属于本条禁令范围(例:MyServers 作者 lovercode 更新官网到 myservers.plus → 合并)。除此之外,一律不碰已有条目。
⚠️ 关于历史评论签名("Generated by Claude Code"):当前 Codex 通过 gh 和维护者 PAT 操作,不会主动添加这段签名;但历史自动化可能留下残余。本 skill 里每处发评论仍要求 POST 后立即 PATCH 覆写并验证正文,文末「收尾扫描」也必须执行。
⚠️ 关于用户名旁边的 GitHub App 归属标记:这是 GitHub 根据执行 API 调用的 App 自动显示的 performed_via_github_app,无法通过 PATCH 正文去掉。运行前确认 gh auth status 使用 1c7 账号自己的 Personal Access Token。
⚠️ 严格禁止:本 skill 涉及的所有 GitHub 操作(发评论、开关 issue、合并/关闭 PR、改 reaction 等)只能通过 shell 中的 gh / git 命令行执行,绝对不能使用 GitHub Connector 或平台原生 GitHub 工具。这样才能确保操作使用维护者 PAT 身份。文件读取与修改使用 Codex 提供的本地文件工具。
⚠️ 本仓库只收录中国独立开发者的项目(仓库标题即「中国独立开发者项目列表」)。检查一、二、三的每一位提交者,在进入「通用处理流程」或合并 PR 之前,都要按下方「身份判断」章节判断。默认原则是「能收就收」:除非有明确证据表明提交者是老外,否则一律收录/合并,绝不因为身份信息不完整就拒绝。 只有确凿是外国人才礼貌拒绝。宁可多收一个疑似中国的,也不轻易拒绝一个其实是中国人的提交——漏收/误拒对中国开发者造成的伤害,远大于偶尔收进一个身份模糊的条目。
⚠️ 三个版面的固定名称是「主版面」「程序员版面」「游戏版面」——都以"版面"两个字结尾,不是"主版"/"程序员版"/"游戏版"。所有感谢评论、PR/issue 评论中提到版面名称的地方,写完之后要逐字核对有没有漏掉"面"字(历史运行中出现过在感谢评论里把"程序员版面"错写成"程序员版"的情况,且没有被自动校验发现)。
⚠️ 格式问题绝不能作为关闭 PR / Issue / 拒绝收录的理由。 提交格式再乱(一行纯文本、没有 #### 作者行、没有 :white_check_mark:、中英文没空格、描述像广告词),都只是我们收尾时要清理的事,不是拒绝提交者的理由。允许关闭的理由只有两类:垃圾广告/无关内容,以及非中国开发者。正确做法是先合并/先收录,再按下面的格式规范单独发一条整理 commit。历史上出现过 bot 以"格式和本仓库的收录要求不符"为由关掉了一个本可以合并的 PR(#1205),这是错误的。发拒绝评论前,逐字检查理由里有没有出现"格式"两个字——如果有,说明这次拒绝就是错的,退回去改成合并。
⚠️ 版面判断必须点开产品链接实际看一眼,不能只凭提交者的标题和描述猜。 判断标准见「步骤2:分类」的表格,这里不重复。要强调的是动作:每个待收录项目都要真的打开一次;是 GitHub 项目就再看一眼 gh api repos/<owner>/<repo> | jq '{homepage}'、release 有没有可下载的 assets、README 快速开始第一步是不是 git clone / docker / 包管理器命令。
⚠️ 多个 PR 同时打开、且会插入同一个日期区块时,必须逐个串行处理,禁止图省事改成"手动誊抄内容 + 批量关闭 PR"。 历史事故:2026-07-30 12:53 前后 #1220、#1221、#1226、#1227 四个格式完全合规、非垃圾、提交者也是中国开发者的 PR,因为都要插入同一天的日期区块、彼此会冲突,处理时没有按下面「检查三」定义的单 PR 合并流程逐个走完,而是直接用本地编辑工具把内容誊抄进 master 合成一条 commit,再把四个 PR 全部 gh pr close——内容确实进了 README,但四个 PR 全都错误地显示为红色 Closed 而不是紫色 Merged,贡献者观感很差。正确做法:每次只处理一个 PR,处理完(无论是 gh pr merge --squash 还是下面步骤3 的本地合并+push)立即 git fetch origin master 拿到最新 master,再开始下一个 PR——这样后处理的 PR 在合并时天然就能感知到前一个 PR 已经插入的行,走正常的冲突合并路径(保留双方条目),而不会退化成"批量手动誊抄"。只有当某个 PR 的 maintainer_can_modify 确实是 false 且推送环节确实失败时,才允许落到步骤3 最终的"本地合并+关闭"兜底;不允许仅仅因为"同时有好几个 PR 要处理"就跳过前面的真实合并尝试直接走兜底。
⚠️ PR 贡献者选的文件经常是错的,版面由我们判断,不由他改了哪个文件决定。 检查三的 PR 走直接合并、不经过步骤2,但版面判断这一步对 PR 同样必须做。发现放错版面时,照常先合并(绝不因此关闭或退回 PR),再把条目挪到正确的版面并单独发一条修正 commit;如果该 PR 的 maintainer_can_modify 为 true,也可以直接改他的分支、让 PR 一次就落到正确的文件再合并——两种方式都行,重点是必须 merge 且最终落在正确版面。挪完后如果感谢评论已经发出去了,记得 PATCH 修正评论里的版面名称。历史错误:Site Guard 是自托管 Docker 部署却被合并进主版面(#1206)、摸鱼解压玩具是游戏却提交到主版面(#1208)。
⚠️ 感谢评论必须简短,只说结果,不说过程:固定句式是「@用户名 感谢提交,你的产品 X 已添加到 Y 版面!」(或已收录多个产品时按本文档后面给的变体)。禁止在评论里额外加"谢谢!"这类结尾客套话(前面已经有"感谢提交"了,不需要再谢一次);禁止提及处理过程中的内部细节,例如"PR 有冲突"「已由我们手动合并」「已手动处理」之类——不管背后是直接合并、手动解决冲突、还是走 issue 流程,提交者只需要知道结果(收录到了哪个版面),不需要知道我们是怎么做到的。发送前对照这条逐字检查。
⚠️ 本 skill 由用户手动触发,运行间隔不固定(通常 1~2 天一次,但可能间隔更久),不能再假设"每 6 小时自动跑一次"。所有时间窗口统一使用 72 小时(3 天)安全余量,宁可扫描范围偏大、多花几秒确认已处理过,也不能因为窗口太窄而漏掉提交(历史事故:2026-08-07 08:10 的评论因窗口只有 7 小时被漏处理,直到用户截图问起才发现)。如果确认距离上次运行已经超过 3 天(例如出差、长期没运行),临时把下面的 -v-72H 改成更大的值(如 -v-240H 覆盖 10 天)再运行一次。
在做任何实质处理之前,先并行运行以下三条命令,统计各自的结果数量:
SINCE=$(date -u -d '72 hours ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-72H +%Y-%m-%dT%H:%M:%SZ)
# 检查一:#160 新评论数
COUNT_COMMENTS=$(gh api "repos/1c7/chinese-independent-developer/issues/160/comments?since=$SINCE&per_page=100" | jq 'length')
# 检查二:新 Issue 数
COUNT_ISSUES=$(gh api "repos/1c7/chinese-independent-developer/issues?state=open&per_page=50" \
| jq --arg since "$SINCE" '[.[] | select(.number != 160 and .pull_request == null and .created_at >= $since)] | length')
# 检查三:待处理 PR 数(排除 auto-add- 分支)
COUNT_PRS=$(gh api "repos/1c7/chinese-independent-developer/pulls?state=open&per_page=50" \
| jq '[.[] | select(.head.ref | startswith("auto-add-") | not)] | length')
echo "新评论: $COUNT_COMMENTS 新Issue: $COUNT_ISSUES 待处理PR: $COUNT_PRS"如果三个数字全部为 0,输出「无新内容」,跳过检查一、二、三和通用处理流程,但仍然必须执行文末的「收尾扫描」(那一步与本次有没有新提交无关),扫完再结束。
只要有任意一个数字 > 0,才继续向下执行。
获取最近 72 小时内的评论(人工运行、间隔不固定,用 3 天安全余量覆盖,宁可多扫不能漏扫):
SINCE=$(date -u -d '72 hours ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-72H +%Y-%m-%dT%H:%M:%SZ)
gh api "repos/1c7/chinese-independent-developer/issues/160/comments?since=$SINCE&per_page=100"对每条评论,从内容中提取产品 URL,检查是否已在任意 README 中:
grep -rF "<产品完整URL>" README.md pages/README-Programmer-Edition.md pages/README-Game.md⚠️ 去重规则(必须严格遵守):
https://example.com)做精确字符串匹配,使用 grep -F(固定字符串,非正则)⚠️ 72 小时窗口比单次运行间隔更宽,同一条评论可能在连续两次运行中都落在窗口内。 对于最终被判定为「拒绝」(垃圾广告 / 非中国开发者)的评论,因为不会在 README 里留下 URL 痕迹,上面的 URL 去重挡不住重复处理。处理每条评论、判断要不要发拒绝回复之前,先检查该评论下面是否已经有 1c7 或 claude[bot] 发过 @<提交者用户名> 开头的回复(即这条评论已经被上一次运行处理过):
gh api "repos/1c7/chinese-independent-developer/issues/160/comments?per_page=100" \
| jq --arg since "<该评论created_at>" \
'[.[] | select(.created_at > $since and (.user.login=="1c7" or .user.login=="claude[bot]"))]'如果已存在针对该提交者的回复,视为已处理过,跳过,不再重复发送拒绝评论。
处理完所有检查一的评论后,记录每位成功处理的评论作者用户名、收录的产品名和目标版面(用于最后一步在 #160 逐人发感谢评论)。
SINCE=$(date -u -d '72 hours ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-72H +%Y-%m-%dT%H:%M:%SZ)
gh api "repos/1c7/chinese-independent-developer/issues?state=open&per_page=50" \
| jq --arg since "$SINCE" \
'[.[] | select(.number != 160 and .pull_request == null and .created_at >= $since)]'判断每个 Issue:
CLEAN_BODY="@<提交者用户名> 感谢提交,已将你的产品 <产品名> 添加到 <主版面/程序员版面/游戏版面>!"
COMMENT_RESPONSE=$(gh api repos/1c7/chinese-independent-developer/issues/<number>/comments \
-X POST -f body="$CLEAN_BODY")
COMMENT_ID=$(echo "$COMMENT_RESPONSE" | jq -r '.id')
gh api --method PATCH \
repos/1c7/chinese-independent-developer/issues/comments/$COMMENT_ID \
-f body="$CLEAN_BODY"gh issue close <number>gh issue close <number>检查二的提交者不需要在最后一步中 @ 到 #160,他们已在各自的 issue 里收到了感谢。
直接获取所有 open 状态的 PR(不限时间,确保不遗漏):
gh api "repos/1c7/chinese-independent-developer/pulls?state=open&per_page=50" \
| jq '[.[] | select(.head.ref | startswith("auto-add-") | not)]'判断每个 PR:
gh pr merge <number> --squashCLEAN_BODY="@<提交者用户名> 感谢提交,已将你的产品 <产品名> 合并到 <主版面/程序员版面/游戏版面>!"
PR_COMMENT_RESPONSE=$(gh api repos/1c7/chinese-independent-developer/issues/<number>/comments \
-X POST -f body="$CLEAN_BODY")
PR_COMMENT_ID=$(echo "$PR_COMMENT_RESPONSE" | jq -r '.id')
gh api --method PATCH \
repos/1c7/chinese-independent-developer/issues/comments/$PR_COMMENT_ID \
-f body="$CLEAN_BODY"MAINTAINER_CAN_MODIFY=$(gh api repos/1c7/chinese-independent-developer/pulls/<number> | jq -r '.maintainer_can_modify')MAINTAINER_CAN_MODIFY 为 true(优先路径,能让 PR 真正显示为 Merged):
HEAD_REF=$(gh api repos/1c7/chinese-independent-developer/pulls/<number> | jq -r '.head.ref')
HEAD_REPO_URL=$(gh api repos/1c7/chinese-independent-developer/pulls/<number> | jq -r '.head.repo.clone_url')
git fetch origin master
git fetch origin pull/<number>/head:pr-<number>
git checkout pr-<number>
git merge origin/master --no-editgit add <冲突文件>
git commit --no-edit
git push "$HEAD_REPO_URL" "pr-<number>:$HEAD_REF"
gh pr merge <number> --merge--merge 而非 --squash,保留贡献者原始 commit 的作者信息)推送后如果因为权限或分支保护等原因失败,视为该路径不可行,降级到步骤 3。合并成功则按下面「合并成功」的致谢评论流程处理,PR 会正常显示为 Merged。MAINTAINER_CAN_MODIFY 为 false(贡献者未勾选"允许维护者编辑",没有权限推送到其分支,只能走这条兜底路径),或步骤 2 推送失败:
git fetch origin master
git fetch origin pull/<number>/head:pr-<number>
git checkout master && git reset --hard origin/master
git merge pr-<number> --no-ff -m "合并 PR #<number>:<项目名>"git add <冲突文件>
git commit --no-editgit push origin masterCLEAN_BODY="@<提交者用户名> 感谢提交,你的产品 <产品名> 已添加到 <主版面/程序员版面/游戏版面>!"
gh pr close <number> --comment "$CLEAN_BODY"gh pr close <number>gh pr close <number>,不使用 gh pr merge。身份模糊不等于老外,默认合并(见「身份判断」章节)。⚠️ 严格禁止:检查三的 PR 无冲突时必须走上面的 gh pr merge --squash,不能走通用处理流程(那样会丢失贡献者的 git 归属)。有冲突时才使用上面的本地合并步骤,因为 git merge --no-ff 会保留贡献者原始 commit 的作者信息,不会丢失归属。
⚠️ PR 合并后要检查描述格式(gh pr merge 是原样合并贡献者写的文字,不会自动清理):如果存在「中英文/数字之间没有空格」「一个、一款、高效、简洁、强大等填充词」「产品类型被埋在长修饰语最后面(如"是一个基于 X、Y、Z 构建的 W"这种结构,应改成"W,基于 X、Y、Z 构建"把 W 提前)」这几类问题,合并完之后单独用本地编辑工具再发一条格式整理的 commit(只改标点空格和语序,不改事实信息,也不算作「修改已有条目」——因为这是本次新增内容的同一批次收尾,不是改动历史上已收录的条目)。不要把这类清理和「新增」提交混在一条 commit 里,保持 commit 语义清晰。
仓库标题是「中国独立开发者项目列表」,收录范围严格限定为中国独立开发者的项目。检查一、二、三的每一位提交者,在进入「通用处理流程」步骤1之前(或检查三判断是否合并 PR 之前),都要先做这一步判断,但默认是收录,只有确凿证据表明是老外才拒绝。
判断标准(满足以下任一条即可判定为中国人):
查证方式:
gh api users/<username> | jq '{name, bio, location}'
# 如上面三个字段都看不出结论,抽查几个仓库名称/描述辅助判断:
gh api "users/<username>/repos?sort=updated&per_page=10" | jq '[.[] | {name, description}]'⚠️ 不能只看单一信号就下结论:
location 字段是强信号但非绝对:结合 name/bio/repos 一起看默认原则:能收就收,只有确认是老外才拒绝。 三条证据都拿不到、无法判断时,不要为了"稳妥"而按拒绝处理,而是照常收录/合并——身份模糊不等于老外,中国开发者也经常是纯英文用户名 + 英文 bio + 无 location(很多产品面向海外、网站是英文的)。只有出现明确的老外信号(如 bio 自称外国人、位置明确在国外城市/国家、中文留言有明显机翻痕迹且无任何中文/中国元素、公开资料显示是外国团队)才拒绝。宁可多收,不要误拒。
已确认收录的"模糊身份"先例(不再需要人工判断,直接照此收录):
判定为老外(确凿证据)后的处理:
gh issue close <number>gh pr close <number>(不使用 gh pr merge)拒绝评论模板(用提交者使用的语言回复,语气礼貌简短,不解释具体判断依据;POST 后同样要 PATCH 并 GET 验证):
感谢分享 <产品名>!不过本仓库只收录中国独立开发者的项目(README 开头写明"聚合所有中国独立开发者的项目"),所以暂时不在收录范围内,抱歉。祝 <产品名> 发展顺利!英文示例:
Thanks for sharing <product>! This repo specifically curates projects made by Chinese independent developers, so it's outside the scope of this list. Good luck with <product>!从原始内容智能提取,整理为标准格式。提交格式千奇百怪,需灵活判断:
必须有(确属无法提取且无法从别处补全时,才归入拒绝类):
⚠️ 这里「必须有」是从垃圾广告角度判断的:如果评论/Issue/PR 里有产品名、URL 和描述,就能提取收录。产品 URL 一般都能拿到(没有显式 URL 的,从 GitHub 仓库或链接里补全)。拿不到 URL 也不代表就是拒绝——尽量从提交内容里找(GitHub 仓库地址、评论区补发、PR 改动行里的链接都算)。只有那种纯广告语、无任何 URL/仓库、无法定位到任何产品的,才按垃圾广告拒绝。不确定时倾向于收录。
可选(有则填,无则略去):
标准输出格式:
#### 制作者名字(城市) - [Github](url)
* :white_check_mark: [产品名](url):一句话描述 - [更多介绍](url)格式规范:
TZ=Asia/Shanghai date +"%Y 年 %-m 月 %-d 号添加"| 类别 | 判断标准 | 目标文件 |
|---|---|---|
| 主版面 | 打开即用的网站或 App,非游戏 | README.md |
| 程序员版面 | 需要命令行/写代码/安装依赖 | pages/README-Programmer-Edition.md |
| 游戏版面 | 任何游戏类产品 | pages/README-Game.md |
| 拒绝 | 论坛、无 URL、垃圾广告、或提交者确凿是老外(见上方「身份判断」) | 不处理 |
⚠️ 个人博客不算独立"产品",不作为单独的 * :white_check_mark: [产品名](url):... 条目收录(无论是在评论/Issue 里单独提交,还是和其他产品一起夹带提交)。如果提交内容里包含个人博客链接,按 CONTRIBUTING.md 的模板把它放进作者信息行,写成 #### 制作者名字(城市) - [Github](url), [博客](博客url),不要单独起一行当产品处理。这条同样适用于检查三的 PR:PR 里如果夹带了博客条目,即使 PR 整体因为改了 README 且含产品名+URL 被判定为"有效提交"要合并,合并后仍要单独检查其中每一行是否真的是产品,博客类条目要按上面方式改成作者信息里的链接,不能因为"PR 已经通过整体有效性检查"就跳过逐行审查。
⚠️ 不要盲信提交者对自己产品/链接的自我描述,尤其是"博客"这类字眼。历史上出现过提交者把链接写成"个人技术博客",实际打开后是网址导航站(且含疑似盗版影视资源链接),完全不符合收录标准。处理任何"博客"链接前,用 curl -sL <url> | grep -o '<title>[^<]*</title>' 和 meta description 快速核对一下页面实际内容是否真的是博客(文章列表/写作内容),而不是导航站、工具集合站等被包装成"博客"的东西。如果标题/描述显示是"导航""聚合""网址""hao123 类站点"等关键词,即使提交者自称是博客,也不要收录,按拒绝处理并说明原因。
先读取目标 README 了解格式,再用本地编辑工具插入条目。新条目插入当天日期区块的最顶部(紧接日期标题行之后的空行后面)。
如果当天日期区块尚不存在,则在最新日期区块之前新建。
所有项目的文件修改全部做完后,统一一次性提交推送到 master:
git checkout master && git pull origin master
# (用本地编辑工具对各 README 文件做完所有修改)
git add README.md pages/README-Programmer-Edition.md pages/README-Game.md
git commit -m "新增:<项目1名>、<项目2名>、..."
git push origin master所有三个检查都处理完之后,如果检查一中成功收录了项目,在 issue #160 为每位来自检查一的成功提交者单独发一条评论:
@<用户名> 感谢提交,已将你的产品 <产品名> 添加到 <主版面/程序员版面/游戏版面>!@user 感谢提交,已将你的产品 A、B 添加到主版面,并将 C 添加到程序员版面!每位用户的评论都必须分别执行 POST、立即 PATCH,再 GET 验证正文准确且没有历史自动化署名:
CLEAN_BODY="@user 感谢提交,已将你的产品 Product 添加到主版面!"
COMMENT_RESPONSE=$(gh api repos/1c7/chinese-independent-developer/issues/160/comments \
-X POST -f body="$CLEAN_BODY")
COMMENT_ID=$(echo "$COMMENT_RESPONSE" | jq -r '.id')
gh api --method PATCH \
repos/1c7/chinese-independent-developer/issues/comments/$COMMENT_ID \
-f body="$CLEAN_BODY"
gh api repos/1c7/chinese-independent-developer/issues/comments/$COMMENT_ID \
| jq -r .body前面每处发评论都要求 POST → PATCH → GET 验证,但实践证明这一步会静默失效:2026-06-23 至 07-28 期间累计有 155 条致谢评论带着签名一直没被清掉(#160 里 70 条,各 issue/PR 上另有 85 条),横跨 1c7 和 claude[bot] 两种身份,而每次运行都自认为验证通过了。所以不能只依赖发评论时的那次自检,每次运行结束前必须再无条件重扫一遍。
⚠️ 扫描范围必须是整个仓库,不能只扫 #160——检查二、检查三的致谢评论发在各自的 issue / PR 上,只扫 #160 会漏掉一大半。用仓库级评论接口,它支持 sort/direction,一次就能拿到全仓库最近的评论:
# 必须先把结果落盘再解析:gh api 直接管道给 jq 时,网络 EOF 会让 jq 收到空输入、
# 静默输出 0 条,看起来像「已经干净」——这是假阴性,务必用重试 + 落盘。
for i in 1 2 3 4 5; do
gh api "repos/1c7/chinese-independent-developer/issues/comments?sort=created&direction=desc&per_page=100" \
> /tmp/sig_scan.json 2>/dev/null && break
sleep 3
done
jq -e 'type == "array" and length > 0' /tmp/sig_scan.json >/dev/null \
|| { echo "扫描接口没拿到数据,本次扫描无效,必须重试后再判断"; exit 1; }
jq -r '.[] | select(.body | test("Generated by")) | select(.user.login as $u | ["1c7","claude[bot]"] | index($u)) | .id' \
/tmp/sig_scan.json > /tmp/sig_dirty.txt
echo "检出待修: $(wc -l < /tmp/sig_dirty.txt) 条"⚠️ 上面的 select(.user.login ...) 过滤不能省:只修我们自己(1c7 / claude[bot])发的评论。贡献者回复时经常用 > 引用我们带签名的原文,那是他本人的评论,一个字都不许改(例:#1155 的 5009781050 号评论)。
扫到任何 ID 就当场修掉,逐条 PATCH 后 GET 复核:
while read -r ID; do
gh api "repos/1c7/chinese-independent-developer/issues/comments/$ID" \
| jq '{body: (.body | sub("\\n*---\\n*_Generated by \\[Claude Code\\]\\(https://claude\\.ai/code\\)_\\s*$"; "") | rtrimstr("\n"))}' \
> /tmp/sig_payload.json
# 空正文保护:绝不把评论清空
[ "$(jq -r '.body | length' /tmp/sig_payload.json)" -eq 0 ] && { echo "跳过 $ID(正文会被清空)"; continue; }
gh api --method PATCH "repos/1c7/chinese-independent-developer/issues/comments/$ID" --input /tmp/sig_payload.json > /dev/null
gh api "repos/1c7/chinese-independent-developer/issues/comments/$ID" | jq -r '.body'
done < /tmp/sig_dirty.txt⚠️ 写这类批量脚本时不要用 echo "$json" | jq 传递 JSON——echo 会把字符串里的 \n 当转义符展开,导致 jq 全线解析失败。一律用文件(> file 再 jq ... file / --input file)传递。
⚠️ 不允许凭脚本自己打印的「成功 N 条」就认为修完了。 历史上出现过循环里 jq 静默失败、计数逻辑却报「成功 70 失败 0」、实际一条都没改的情况。必须重新拉一次评论列表、再次 grep "Generated by" 确认残留计数为 0(贡献者引用产生的那几条除外),才算这一步完成。
⚠️ 偶发的 Post/Get "https://api.github.com/...": EOF 是网络抖动,不是真失败。上面的循环已经带 3 次重试;如果收尾复查时仍有少量残留,单独把这几个 ID 再跑一遍即可,不要因此判定整批失败。
gh pr merge 或本地 git merge --no-ff 保留贡献者归属),禁止把 PR 里的内容当成检查一/二那样直接誊抄进 master 再关闭 PR(历史事故见上文 #1220/#1221/#1226/#1227)7bf9e45
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.