关于 git-wiki
git-wiki 是用于维护本地项目 Wiki 的 Agent 技能,以 Git 中 HEAD 跟踪的文件为依据,面向读者组织内容。它支持独立的语言目录、增量更新、查询和 Wiki 导出。
主要功能
- 01在选定目录下维护 Wiki
- 02依据 Git HEAD 跟踪的源文件
- 03根据文件变更更新页面
- 04使用 frontmatter 和 Wiki 链接组织页面
- 05将 Wiki 页面导出为 Markdown 合集
适用场景
- 01创建便于理解代码库的指南
- 02在已提交的源文件变更后更新 Wiki
- 03将 Wiki 导出为 NotebookLM 来源文件
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ yysun/ awesome-agent-world --skill git-wiki安装后在 Claude Code 中输入/git-wiki确认已加载。
附带文件scripts/export-wiki-bundle.mjs
详细介绍
项目 Wiki
默认在 .wiki 下为代码项目维护本地 wiki,也可使用按语言划分的根目录,例如 .wiki-cn、.wiki-fr,或用户指定的确切 wiki 目录,例如 wiki-cn。
信息源始终是当前 HEAD 中由 Git 跟踪的仓库文件,包括 .docs/ 和 docs/ 中由 Git 跟踪的文档,而不是 wiki。
Wiki 文件本身可以未被跟踪;如果所选 wiki 根目录存在,请从工作树中读取并更新其中的当前内容。
规则
- 仅操作由 Git 跟踪的文件和 Git 历史
- 忽略已暂存和未暂存的未提交更改;内容摄取和查询验证仅使用
HEAD中已提交的内容 - 每个请求只选择一个 wiki 根目录。默认使用
.wiki;使用用户指定的根目录或语言,例如.wiki-cn、wiki-cn、.wiki-fr、“中文 wiki”或“法语 wiki” - 每个 wiki 根目录彼此独立。除非用户明确要求,否则不要在不同语言根目录之间同步、比较、翻译、合并或复制页面
- 从基于 Git 的源选择中排除所有 wiki 根目录:
.wiki/**、.wiki-*/**和wiki-*/** - 不要假定任何 wiki 根目录由 Git 跟踪;如果所选根目录中存在当前的
index.md检查点,请使用它 - 每个 wiki 页面都必须包含 YAML frontmatter
- 每次摄取时都必须更新所选根目录的
index.md - 摄取前不要询问用户
- 导出时读取所选 wiki 根目录下工作树中的当前文件,而不是
HEAD中由 Git 跟踪的仓库文件
Wiki 结构
必需:
<wiki-root>/index.md— 面向读者的入口和主目录(仅跟踪该根目录的最后一次摄取提交)
可选(按需创建):
<wiki-root>/overview/— 介绍项目、启动流程、存储和阅读路径的概览页面<wiki-root>/features/— 每项重要产品能力或实现领域对应一个页面<wiki-root>/bug-fixes/— 每项值得关注的错误修复或补丁对应一个页面<wiki-root>/concepts/— 涉及多个领域的理念和模式<wiki-root>/entities/— 数据模型、架构、类型<wiki-root>/flows/— 序列、管道、请求生命周期<wiki-root>/risks/— 不变量、兼容性约定、脆弱行为以及不可破坏的内容<wiki-root>/reference/— 当某个源路径需要重点说明时,创建与代码结构对应的参考页面<wiki-root>/notes/— 临时记录或待解决的问题
便于理解的结构
Wiki 的目的是帮助人理解代码库,而不是让仓库自我介绍。规划入口时,应优先回答读者的问题,而不是按代码目录组织。
<wiki-root>/index.md 必须按以下顺序回答这些问题:
- 这是什么?
- 快速入门
- 它为何存在?
- 运行它时会发生什么?
- 数据保存在哪里?
- 重要的组成部分有哪些?
- 有什么内容应避免破坏?
- 应该从哪里开始查找?
以这些问题作为主要导航。features/、entities/、flows/ 和 reference/ 是辅助证据,而不是构建认知模型的起点。
Get Started 部分用于帮助读者熟悉代码库,而不是重复 README。它应帮助有经验的新手了解前 10 分钟内需要知道的内容:
- 要运行的主要命令
- 必需的环境或服务
- 预期的成功输出
- 首先要阅读的文件
- 一个安全的首次修改
- 一个看似诱人但危险的修改
如果仓库已有 README.md 或 docs/ 中的设置说明,请链接到这些说明,并仅概述有助于读者理解代码的内容。
Wiki 根目录选择
- 默认 Wiki 根目录:
.wiki - 特定语言的根目录:创建新语言 Wiki 时,优先使用
.wiki-<language-code>,例如,中文使用.wiki-cn,法语使用.wiki-fr - 如果用户指定了确切目录,例如
wiki-cn,则使用该确切根目录,不要对其进行规范化 - 各语言根目录之间不继承检查点、页面、链接或过期状态
- 用户按语言名称要求创建语言 Wiki 时,页面正文使用该语言,并保持代码标识符、文件路径和 API 名称不变
页面约定
index.md 前置元数据
index.md 包含用于跟踪摄取状态的额外字段:
---
title: "Project Wiki"
type: "index"
status: "active"
language: "<language-code|default>"
last_commit: "<full-sha>"
updated_at: "YYYY-MM-DD"
---
last_commit 是所选 Wiki 根目录最近一次完整仓库摄取时的完整 Git 提交 SHA。无论该根目录是否受 Git 跟踪,此检查点都保存在所选根目录当前的 index.md 文件中。下次对同一根目录进行摄取时,优先使用此处保存的 last_commit,通过 git diff --name-status -M <last_commit> HEAD 查找已更改的文件。
如果 Git 元数据不可用,请勿回退到文件系统扫描。在 Git 访问恢复之前,摄取和 lint 均不可用。
其他页面
---
title: "Page Title"
type: "overview|feature|bug-fix|concept|entity|flow|risk|reference|note"
status: "draft|active|stale"
language: "<language-code|default>"
source_paths: []
updated_at: "YYYY-MM-DD"
---
对于 .wiki,将 language 设为 default;对于 .wiki-cn 或 wiki-cn,设为 cn;对于 .wiki-fr,设为 fr;其他特定语言根目录则使用相应的语言代码。
如果源文件自页面上次更新后发生了显著变化,或者页面描述的内容已不复存在,请使用 status: "stale"。摄取期间,应更新 source_paths 自 last_commit 以来发生变化的页面,或将其标记为过期。不要自动删除过期页面——请将其标记出来并注明差异,以便用户决定。
页面命名
- 使用小写、以连字符分隔的文件名:
auth-middleware.md、user-schema.md - 优先根据读者熟悉的概念为页面命名:
login-check.md、saved-data-shape.md、startup-flow.md - 仅对参考页面,或没有更清晰的面向读者的名称时,才使用源路径命名:
src/api/routes.ts→<wiki-root>/reference/src-api-routes.md - 为概念和流程使用描述性名称:
<wiki-root>/concepts/request-lifecycle.md
Wiki 链接
只要页面引用了另一页面所涵盖的内容,就在页面之间使用 [[page-slug]] 链接。目标应与目标文件名一致,但不包含 .md 扩展名。这样可以让 Wiki 便于导航,也能让 lint 确定性地解析链接。
导入
在以下情形触发:
ingestingest [file]ingest [folder]ingest wiki-cningest .wiki-frrefresh wikiupdate wikiupdate Chinese wiki
工作流:
- 根据请求选择 wiki 根目录。默认为
.wiki;如果指定了明确的根目录或特定语言的根目录,则使用该目录 - 如果
<wiki-root>/index.md存在,则从工作树中读取,即使 wiki 根目录尚未被跟踪 — 注意 frontmatter 中的last_commit- 缺少
<wiki-root>/index.md或缺少last_commit,表示该根目录没有先前的导入检查点
- 缺少
- 运行
git rev-parse HEAD获取当前 HEAD 提交 SHA - 检测变更文件:
- 如果已设置
last_commit:运行git diff --name-status -M <last_commit> HEAD,并排除所有 wiki 根目录(.wiki/**、.wiki-*/**、wiki-*/**) - 即使选定的 wiki 根目录尚未被跟踪,也要使用已保存的
last_commit;不要将未跟踪的 wiki 根目录视为从HEAD开始的新导入 - 更新 wiki 页面时,使用 git 状态码区分新增、修改、删除和重命名的路径
- 如果没有先前的导入,则从
git ls-files在HEAD处构建广泛的导入候选集,并排除所有 wiki 根目录(参见下文的导入优先级)
- 如果已设置
- 确定范围:
- 如果指定了文件或文件夹,则优先处理该范围 — 将已跟踪的候选集限制在该范围内
- 对于指定范围的导入,除非该导入也涵盖了自
last_commit以来变更的所有文件,否则不要推进<wiki-root>/index.md:last_commit - 否则,先导入变更文件,再补齐缺失的覆盖内容
- 阅读相关的已跟踪仓库文件 — 理解其作用
- 在选定的 wiki 根目录下更新或创建 wiki 页面
- 对于已删除源文件对应的页面,在选定的 wiki 根目录下将其标记为
status: "stale",并在页面正文中添加说明;根据 git 提供的重命名信息更新移动或重命名的页面 - 更新
<wiki-root>/index.md:- 始终将
updated_at设置为今天 - 只有在完整导入或处理完自上一个
last_commit以来的全部变更文件后,才将last_commit设置为当前 HEAD SHA - 如果广泛导入在覆盖不完整时提前停止,则保持
last_commit不变,并在index.md中注明初始覆盖仍不完整 - 绝不能仅仅因为选定的 wiki 根目录尚未被跟踪,就丢弃已有的
last_commit
- 始终将
导入会自动进行。不要向用户请求确认。
如果 git 命令失败,请说明在恢复 git 访问权限之前,wiki 技能无法执行导入。不要改为遍历目录。
导出
在以下情况下触发:
export wikibundle wikiarchive wikione-page wikiprepare wiki for notebooklmsend wiki to notebooklm
工作流:
- 根据请求选择 Wiki 根目录。默认为
.wiki;如果指定了根目录或特定语言的根目录,则使用指定目录 - 检查工作树中是否存在
<wiki-root>/index.md- 如果所选 Wiki 根目录缺失或明显不完整,先执行 ingest,无需询问
- 从工作树导出当前所选 Wiki,而不是从
HEAD导出 - 使用捆绑的零依赖 CLI:
node skills/git-wiki/scripts/export-wiki-bundle.mjs \
--input-dir <wiki-root>
- 默认输出路径为所选 Wiki 根目录下的
index-{simple-timestamp}.md - 如果用户需要其他目标路径,传入
--output-file <path> - 如果用户需要在导出文件头中使用自定义标签,传入
--root-name <name> - 导出文件必须包含:
- 带生成日期的仓库/Wiki 标题
- 涵盖所有捆绑页面的目录
- 每个 Wiki 文件对应一个章节,并保留选定的 frontmatter
- 明确的文件起始/结束标记,使捆绑文件可作为归档文件或 NotebookLM 来源
- 如果请求明确涉及 NotebookLM,先执行导出,然后将生成的捆绑文件作为来源文件交给
notebooklm技能
导出要求:
- 优先捆绑
<wiki-root>/**/*.md - 仅保留有用的 frontmatter 字段,例如
title、type、status、language、tags、description、source_paths、updated_at和last_commit - 将
[[wiki-links]]规范化为纯文本,使下游工具无需理解 Obsidian 语义 - 删除 Obsidian 图片嵌入,例如
![[image.png]] - 按相对路径对文件排序,使输出具有确定性
- 默认文件名使用简单时间戳,例如
.wiki-fr/index-20260510-143522.md - 不要将导出当作 ingest 的替代方案;导出只是打包当前 Wiki,不会重建 Wiki
Ingest 优先级
从 Git 跟踪的文件进行大范围 ingest 时,先构建面向用户的入口页面,再添加支撑代码页面。按以下顺序进行,并在覆盖充分时停止(中型项目通常为 10–20 个页面):
- 根目录 README 以及
.docs/和docs/下受跟踪的文档 - 包、构建和工作区配置(
package.json、pyproject.toml、Cargo.toml等),以确定项目的运行方式 - 入口点(
main.ts、index.ts、app.py、cmd/等),解释启动和运行时行为 - 存储、生成的输出、配置、机密信息、缓存、日志和持久化边界 →
<wiki-root>/overview/或<wiki-root>/entities/ - 核心用户/系统工作流 →
<wiki-root>/flows/ - 重要的活动部件、概念和子系统边界 →
<wiki-root>/concepts/或<wiki-root>/features/ - 读者应避免破坏的契约和脆弱部分 →
<wiki-root>/risks/ - API 定义、架构和持久化层 →
<wiki-root>/features/或<wiki-root>/entities/ - 作业、队列和后台工作进程 →
<wiki-root>/features/ - UI 结构(如有)→
<wiki-root>/features/ - 测试(总结行为预期和安全网,不要逐一记录每个测试文件)
- Git 历史中值得注意的错误修复 →
<wiki-root>/bug-fixes/
对于大型仓库(100 个以上文件),应注重深度而非广度:深入记录 10 个最重要的模块,而不是浅尝辄止地涉及 50 个模块。
查询
当用户询问项目问题时:
- 根据请求选择 wiki 根目录。默认使用
.wiki;如果指定了根目录或特定语言的根目录,则使用指定目录 - 如果
<wiki-root>/index.md存在,则读取该文件 - 如果所选根目录中存在相关 wiki 页面,则读取这些页面
- 如果所选 wiki 不存在、相关页面缺失或页面标记为过时,则直接根据 Git 跟踪的仓库源文件进行核实后再回答
- 如果相关,优先参考
.docs/和docs/中由 Git 跟踪的文档,然后在需要时通过代码或配置进行确认 - 如果答案涉及具体值(数量、名称、配置),则根据 Git 跟踪的仓库源文件进行核实
- 如果用户指定了语言根目录,则使用所选 wiki 的语言回答,并简明说明;存在相关 wiki 页面时,添加
[[wiki-link]]引用 - 如果你得出了所选 wiki 根目录中尚未记录的新理解,请提及这一点——用户可以让你将其保存
检查
触发条件:
lintlint wikicheck wikilint .wiki-frcheck Chinese wiki
检查内容:
- 页面之间是否存在矛盾(两个页面的说法相互冲突)
- 是否存在没有入站
[[links]]的孤立页面 - 是否有在多个页面中提及、但没有独立页面介绍的概念
- 可能已偏离当前源文件的过时页面(
status: "stale") - 主要变更模块的内容是否缺失(自
last_commit以来有文件变更,但没有对应的 wiki 页面) - 是否存在失效的
[[wiki-links]](目标页面不存在)
检查输出格式
## Wiki Lint Report — YYYY-MM-DD
### Errors
- [page] description of contradiction or broken link
### Warnings
- [page] description of potential issue
### Suggestions
- description of missing coverage or improvement
### Next Questions
- open questions worth investigating
除非用户明确要求,否则不要自动修复。
写作指南
- 面向聪明的新手,而不是维护者。先用通俗易懂的说法,再在有帮助时补充准确的代码术语:“登录检查”优先于“auth middleware”,“保存的数据结构”优先于“schema”,“后台任务”优先于“worker”
- 围绕读者的问题组织页面,再用文件内容支撑答案。除非页面明确作为参考资料,否则不要从目录介绍开始
- 在说明文件的实现细节之前,先解释它在产品或工作流中的作用
- 避免使用未解释的缩写、框架术语和内部简写。若必须使用技术术语,请在同一句中解释
- 总结即可;不要照搬大段代码块——可以给出几行示例代码,但应解释其模式,而不是粘贴实现
- 使用具体文件路径作为锚点(
src/api/routes.ts:42) - 区分事实(直接从源文件读取)和推断(你的解释)
- 使用
[[wiki-links]]链接相关页面 - 页面控制在约 500 词以内;需要更多内容时创建新页面,而不是不断扩展单个页面
- 优先覆盖实用内容,而非面面俱到——优秀的 wiki 应便于查找,而不是百科全书
质量标准
符合以下条件时,wiki 即为成功:
<wiki-root>/index.md能帮助新读者在 2 分钟内了解如何浏览项目- 新手能够回答项目是什么、为何存在、运行时会发生什么、数据保存在哪里、哪些内容很重要、哪些内容不能破坏,以及应该先查看哪里
- 答案可以从 wiki 页面入手,并在代码中得到核实
- Ingest 使用已保存的
last_commit自动检测变更文件 - 检查能在 wiki 产生误导之前发现内容偏离