一张 CSV 表如何驱动整份 README 的自动生成
【免费下载链接】awesome-claude-codeA hand-picked collection of the finest of resources for the most awesome of agents, Claude Code, the undisputed champion of coding companions, from the unstoppable team at Anthropic PBC. A delectable showcase of top tier skills, ambidextrous agents, scintillating status lines, top notch developer tooling, and also we have plugins项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-claude-code
维护一份 150+ 条目的资源清单,过去意味着手动重排目录、逐个核对链接、在多个文件间同步格式。在 awesome-claude-code 里,这些工作收敛成一条链路:数据落在一张 CSV 表,README、目录和提交表单都由脚本从这张表渲染出来,改一处,全篇对齐。
📊 一张 CSV 表承载整份资源清单
整份清单的"户口本"是仓库根目录的 THE_RESOURCES_TABLE_NEW.csv——158 行,每行一个资源。Makefile 的注释把它称作 single source of truth(唯一数据源,指其他一切文件都从它派生):README、目录、提交表单里的分类下拉框,全部来自这张表或它的伴生配置。
每个字段对应一个明确的用途
| 字段 | 用途 |
|---|---|
| ID | 入库时自动铸造的 8 位十六进制标识(如 docs-1444912b),后续更新、移动条目都靠它定位 |
| Display Name | 条目名,同类条目按它做不区分大小写的字母排序 |
| Category / Sub-Category | 分类与子分类,取值必须先在 config.yaml 中声明 |
| Link / Author Link | 资源主链接与作者主页,查重以 Link 为准 |
| Active | 只有为 TRUE 的行才会被渲染进 README |
| Stale / Last Checked | 标记条目是否过期,记录上次核验时间 |
为什么选 CSV 而不是数据库
一张平铺的文本表没有运行时,却把三件事都占了:git diff 直接可读,评审者一眼看出哪行改了什么;没有 schema 迁移,加一列就是加一列;Python 标准库的 csv 模块就能读,不引入 ORM。数据库在这个规模下提供的查询与约束能力,被"失败即中止"的校验脚本替代了。代价同样明确:并发编辑交给合并 PR 解决,分组逻辑写在生成脚本里,而不是存在表结构里。
config.yaml 只负责一件事:排顺序
分类的先后顺序、子分类的嵌套、每个分类下的一句话简介,都定义在 config.yaml,而且这是顺序被定义的唯一位置。列表内部条目固定按 Display Name 字母序,不做成可配置项——把可调的旋钮收窄到一个,布局引擎就永远长不出来。
⚙️ CSV 到 README 的渲染管线
模板里只有四个占位符
templates/README.template.md 是 README 的骨架,其中只有四个动态位置:{{TABLE_OF_CONTENTS}} 放目录,{{THE_LIST}} 放分类列表,另两个占位符分别放仓库 ticker 轮播和"最近新增"轮播。generate_readme.py 读 CSV、读 config.yaml,把分组、排序好的条目填进占位符。目录锚点还复刻了 GitHub 的标题锚点算法,比如 "Design & UI/UX" 会生成 design--uiux,连"不合并连续连字符"这种细节都对齐,点击目录才能准确落位。
幂等生成与失败即中止
生成被设计成纯函数:输出只由模板、CSV、config.yaml 三者决定,重跑一次得到的 README.md 与上一次逐字节一致(幂等,即同样输入永远得到同样输出)。反过来,校验不过就拒绝落盘——只要某个 Active 条目的 Category 没在 config.yaml 里声明,脚本以非零码退出,列出所有问题条目的 ID,一个字节都不写。为什么这么苛刻?因为半截 README 落进仓库比生成失败更贵:读者会看到空分类,而失败在本地就被拦住了。
表单下拉框与审核流程怎么保持同步
用脚本重写下拉框,禁止手改
提交表单里"选哪个分类"的下拉框是另一个派生物。scripts/sync_issue_form.py 按 config.yaml 中每个 submittable 分类的顺序重写这段选项,挂在 pre-commit(git 提交前自动执行的钩子)上;加 --check 参数则只比对不写入,给 CI 当门禁。手改下拉框这条路被直接堵死:改了也会被下次提交还原。
人工审核留在流程里
维护者可以用 make submit-resource 走完整提交路径:脚本拼好表单正文,通过 gh 开一个带 resource-submission 和 validation-pending 标签的 issue,自动校验随即触发,维护者批准后由系统创建 PR。机器负责可计算的部分,人负责判断——"这个资源值不值得上"。CSV 因此只经由评审过的合并被修改,而不是被脚本直写。
本地跑通最小闭环的四条命令
git clone https://gitcode.com/GitHub_Trending/aw/awesome-claude-code cd awesome-claude-code make venv deps # 从 CSV + config.yaml 重新渲染 README(幂等,字节级一致) make readme # 加一条资源:自动铸 ID、按链接查重、追加后重新生成 make add-resource DISPLAY_NAME="cctop" CATEGORY="Status Lines" \ LINK="https://example.com/cctop" # 跑测试套件确认没改坏 make test跑完可以核对两件事:README.md 被重写,目录条目与 CSV 中 Active 为 TRUE 的行一一对应;make add-resource 之后 CSV 末尾多出一行,新 ID 已铸好。再跑一次 make readme,diff 为空——这就是幂等在日常的样子。
设计决策与取舍
- 派生物一律不手改。README、目录、SVG 轮播、表单下拉框全是生成物,仓库里没有手改它们的入口。发现某个派生物被人编辑过,就说明管线漏了它——这比逐次代码审查更便宜。
- 幂等当契约用。字节级一致让 CI 可以拿 diff 当断言,也让自动更新 ticker 数据的那类 [skip ci] 提交不污染 README 的变更历史。
- 校验失败即中止,而不是打补丁。宁可生成失败,也不产出"缺了一个分类"的 README;报错直接指向要在 config.yaml 补声明的那一行,修复成本是一行配置。
- 人工环节只留在判断点上。自动 PR 必须由人合并,表单提交必须过标签触发的校验。自动化覆盖重复劳动,审核权没有下放给脚本。
下次手里也有一份要反复更新的清单,先建那张 CSV,再写一条 make 命令,管线就能照这个仓库的样子搭起来。从 THE_RESOURCES_TABLE_NEW.csv 的表头读起,是最快的切入点。
【免费下载链接】awesome-claude-codeA hand-picked collection of the finest of resources for the most awesome of agents, Claude Code, the undisputed champion of coding companions, from the unstoppable team at Anthropic PBC. A delectable showcase of top tier skills, ambidextrous agents, scintillating status lines, top notch developer tooling, and also we have plugins项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-claude-code
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考