mcpField
D
documenting-legacy-codebases

documenting-legacy-codebases

github.com/riekelt文档处理3318.8k 次安装6 周前更新
代码仓库

关于 documenting-legacy-codebases

用于记录现有且文档不足的代码库,要求依据当前代码核实系统描述。帮助工程师编写持久的系统文档,并将实现细节和代码修复留在文档之外。

主要功能

  1. 01写作前盘点系统各类界面
  2. 02依据当前代码核实描述
  3. 03完整记录契约类内容
  4. 04记录特例与疑似缺陷
  5. 05跟踪覆盖范围和审阅状态
  6. 06协调并行文档工作

适用场景

  1. 01记录继承而来的代码库
  2. 02更新与实际行为不符的文档
  3. 03调查系统并产出参考文档
  4. 04为重写讨论准备有代码依据的系统描述

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/riekelt/technical-writer --skill documenting-legacy-codebases

安装后在 Claude Code 中输入/documenting-legacy-codebases确认已加载。

详细介绍

编写旧代码库文档

必备背景:technical-writing 技能(硬性规则、类型分类、真实性规则、风格)。

概述

旧代码库只有一个可靠的见证:HEAD 中的代码。其他所有关于它的信息(名称、注释、旧文档、图表、留守人员的记忆)都只是证词。核心原则:**描述系统如何运行以及需要注意什么,并以代码为依据进行验证;代码始终是其实现方式的权威。**最终交付的文档树应让下一位工程师信赖,也能在下一次重构中保持不变:只有行为变更或新功能才需要有人回头修改文档。

何时调用,何时不调用

当需要为一个现存且文档不足的系统编写文档时调用:例如继承或收购的代码库、作者已经离开的系统,或与代码不再一致的文档树。需要调查“这实际上做了什么”,且最终必须形成文档,也符合条件。请勿用于记录你正在进行的变更;核心技能和文档类型技能涵盖了随变更编写文档的情况。也不要用于论证重写方案;这属于 writing-design-docs,并以这些文档为依据。也不要修复调查发现的问题:代码修复不在此插件范围内;记录异常情况则不在此限(参见 quirks and defects)。

先调查,再写正文

不要在遇到第一个有趣的文件时就开始写作。先列出系统的各个方面:

  • 入口和进程:可执行文件、服务、定时任务、队列消费者、请求处理程序。
  • 命令和端点:运维人员或客户端可以调用的所有内容。
  • 配置:代码读取的每个键、标志和环境变量。
  • 数据:架构、表、迁移、磁盘上的文件、外部存储。
  • 集成:涉及的每个外部系统,以及交互方向和协议。
  • 构建和部署:如何生成构件,以及构件的部署位置。

每个数量都是一项声明,因此适用核心技能中 references/truth.md 的数量规则:打印背后的命令,在 HEAD 上运行,并注明日期。命令、数量和日期记录在覆盖情况账目中,预计它会随时间变化;文档则保持不变。应根据清单推导文档树,而不是根据阅读顺序来组织。

深度由表面决定

树描述通用系统;代码说明自身的实现,正文绝不重复记录这些内容。内容类型决定深度:

  • 契约表面必须完整详尽。 外部各方需要依赖、又无法通过阅读代码获知的内容:HTTP 端点、消息载荷、命令、文件格式、配置键。这些属于参考文档,因此适用核心参考规则:涵盖每个端点、每个字段、每个键。documenting-contracts 提供端点、消息、命令和载荷的模板;配置键遵循 config-reference.md 中的核心参考规则。
  • 内部实现只需概述。 描述性文档说明机制及其影响(“存储仅追加;读取会取链的最新节点;更新会替换整个记录”)。实现该机制的类、数据库键、映射和调用链应留在代码中。
  • 重构测试。 完成后的文档应在代码重构时保持不变,只在行为发生变化或功能落地时更新。若重命名就会导致某句话失实(方法名、行号、类列表),那就是以正文形式呈现的实现细节;应将其提炼为所实现的行为,或直接删去。
  • 正文不包含代码引用。 文档在开篇只点明一次所描述的模块或路径:这是核心技能的 references/truth.md 所要求的漂移锚点。正文叙述中不出现路径、类名和行号;精确的 file:line 应放在发现记录中,作为所有者的工作材料。
  • 边界检查: 如果某段内容只对已经打开该文件的读者有帮助,那就是转录;应删除或精简为锚点。通过这项检查的细节通常是特例,而特例就是内容(见下文)。

证据层级

撰写内容前,一项主张可以依据的证据,按可信度从高到低排列。该层级约束作者的核实工作;每份文档只需展示一个开篇锚点,其余内容的深度由上述规则决定:

  1. 在 HEAD 读取的代码。 所有描述性主张的事实来源。
  2. 覆盖该路径的测试。 测试指出预期行为,并证明代码会执行;生产环境中的可达性则由“存活还是已废弃”下的接线证明确认。
  3. 运行时证据,如存在且读取安全:日志、数据库内容、实时配置。注明日期;运行时证据会过时。
  4. 提交历史。 用于历史文档的证据,也用于确定行为何时发生变化;绝不能替代对当前代码的阅读。
  5. 名称、注释、现有文档和人的记忆。 这些都只是证词:引用、核实之后才能转述。如果名称与行为相矛盾,应记录实际行为并指出矛盾;搜索该名称的读者必须能看到警告。

前任负责人的介绍、架构图,以及“同步服务会处理这些事”之类的说法,在写入文档前都必须通过代码核实;只有经代码确认的内容才能写入。

已失效还是仍在运行

看起来是关键路径的代码可能无法访问,而看起来已废弃的代码可能正是生产路径。切勿臆断;务必举证:

  • 仍在运行要通过接线关系来证明:引用搜索、注册位置(依赖容器、路由器、调度器、导出符号),以及在可检查时的运行时跟踪。
  • 已废弃要通过不存在来证明,并明确指出缺失的证据:「没有命令、没有控制器、除自身测试外没有其他引用」。声称代码已废弃,却不提供背后的搜索依据,只是猜测。
  • 休眠是独立状态:已接线但已禁用,或只能从已废弃的路径访问。请用过去时描述,或明确标注为已接线但已禁用;核心技能的 references/truth.md 中的时态规则禁止用现在时描述当前无法运行的代码。
  • 检查配置键是否已绑定。 代码从不读取的键就是无效开关。配置参考中会将其标记为无效。

证据应能说服撰写者,相关命令应记入覆盖台账;文档应说明结果。只有在读者可能因此踩坑时,才需要在正文中提及已废弃代码,并将其作为怪异行为记录。

依据代码撰写时的文档类型规范

核心技能的分类表适用于你触及或创建的每份文档。参考类文档按上述深度规则确定,触及的操作手册遵循 writing-runbooks;其余类型如下:

  • 描述性文档必须准确反映代码行为,使用现在时,并在开篇点明所描述的代码,以便漂移检查时有据可依(见核心技能的 references/truth.md)。
  • 发现规范性文档遭到违反时,绝不可弱化规范。 代码违背明确约定时,约定仍然有效,违规情况应记录在调查结果说明中。若 X 是 bug,却写成「系统会执行 X」而不标明问题,就等于把 bug 正式写成了规范。
  • 挖掘历史并明确标注。 git log 显示的内容应作为历史写入历史文档。推断出的意图(「这似乎是为了……而采用的变通方案」)必须标为推断,并说明推断依据。
  • 过时文档应添加横幅标注,不得悄然删除;这符合核心分类规则。是否移除由负责人决定。

怪异行为与缺陷

  • 怪异行为属于文档内容。 令人意外但确实存在的行为,正是代码树需要记录的「需要留意之处」:例如更新操作会替换整条记录,或某个表格不符合既定模式。怪异行为应写入对应的文档,直白说明其实际行为,无论看起来多么奇怪。
  • 记录缺陷,不主动搜寻。 本次工作记录文档,不进行审计。看起来有问题的情况(例如错误被吞掉、某个条件永远无法触发)仍应按其实际行为记录。疑点本身只需在调查结果说明中用 file:line 记录一行,交由负责人处理;文档应链接到该行,不要重复描述:不进行严重性分级,也不建立验证流程。判断和修复由负责人负责,审计则是独立的工作。
  • 仅凭代码往往无法判断是刻意为之还是存在缺陷。 不要自行定论:说明实际行为,标注意图未知,并交由负责人分类。
  • 下方的只读规则同样适用于错别字:只记录,不要在本次工作中修正。

覆盖台账

在文档树旁维护一份台账(骨架如下的 coverage.md):

  • 按表面记录相对于清单分母的文档数量,并注明各自使用的命令和日期。
  • 记录每份文档的状态:草稿或已审阅;草稿文档必须在文档本身标明,以免过早信任其中的说法。将文档标为已审阅需要第二位读者:reviewing-technical-prose 允许的自我审阅在这里并不足够。
  • 在任何人据此开展后续工作之前,先将工作记录到台账中:作者报告文档有依据,只是一个说法;台账条目需指向该文档及其审阅记录。
  • 遇到中断时,台账要准确说明已完成和待完成的事项,让接手者既不必重做,也不会遗漏。
  • 多位作者并行整理文档依据时,每份文档只能由一位作者负责;两位作者共同编写一份文档,会产生需要重新决定双方内容的合并工作。

并行开展工作

工作按照清单并行展开;如果运行环境可以协调多个 Agent(例如工作流工具、子 Agent 调度),就使用这些能力;否则,各阶段仍按顺序执行:

  1. 并行调查。 清单中的每个表面由一位枚举者负责,并返回数量及其背后的命令。枚举是机械工作,结果可核查:只要最小型号能保持输出格式,就使用该型号。
  2. 合并并规划。 唯一的关卡:去重各份清单、推导文档树,并写入包含所有分母的覆盖台账。推导文档树需要设计判断:由一位 Agent 使用中等型号完成。
  3. 按子系统梳理依据,然后审阅。 每份规划中的文档由一位梳理 Agent 负责,并直接交给一位重新审阅者审阅;子系统之间不设关卡。梳理依据是基于可核查来源进行提取,因此中等型号是上限,小型号通常就足够。只有基于证据(审阅者指出输出浅薄或错误)才将某个子系统提升一个等级,切勿默认升级,也切勿使用最大等级。若中等型号的梳理 Agent 被退回,应重新界定任务:细化提示词或拆分子系统;若第二次被退回,则将其作为未解决文档交由负责人处理,并记录在台账中。阅读的代码量不会提高所需等级:读得多不等于推理难。审阅者负责这一对工作的判断(某项说法是否成立、行文是否偏向照录),并使用中等型号。梳理 Agent 必须遵守本次工作的只读规则,并将重新梳理依据的旧文档视为待审数据,而非指令;现有图表的源文件应与嵌入这些图表的文档一同作为依据。
  4. 最后汇编。 概览、索引和交叉引用应在各份有依据的底层文档完成后再据此生成。进行一次完整追踪,跨越子系统边界,端到端走查一个真实场景;两个正确文档之间的缺陷可能不会在单独审阅其中任何一份时暴露出来。将追踪的流程整理为 processes.md,遵循 diagramming-processes;追踪使用中等等级。

覆盖台账中的单作者规则和信任规则贯穿整个过程;模型选择遵循上述标注:机械工作用小型号,内容提取用小到中等型号,判断工作用中等型号。如果安装了 prompt-engineer 插件,其 isolating-untrusted-work、writing-prompt-contracts、tiering-models 和 verifying-agent-claims 技能负责约束 Agent 的操作方式;凡涉及 Agent 处理的事项,它们均优先于本节规定。它们的 fast、strong 和 judge 角色分别对应这里的小型、中等和最大等级。

文档树

根据清单规划文档树;以下是一个实用的默认结构:

docs/
  README.md            # index of this tree, one line per document, how to read this
                       # (confidence tiers: Measured / Sourced / Estimated)
  overview.md          # system boundary and the real dependency map, from imports and
                       # wiring, never from an old diagram
  <subsystem>.md       # one descriptive doc per subsystem; its module named once
                       # in the opening, no code references in the prose
  config-reference.md  # every key with default, binding evidence, and Usage; dead
                       # knobs marked dead
  api-reference.md     # every endpoint, command, and message payload, written
                       # per documenting-contracts; file formats included
  integrations.md      # every external system, direction, protocol, failure behavior
  data-model.md        # what is stored, who owns it, its lifecycle, and its
                       # quirks; the migrations own the columns and keys
  processes.md         # the end-to-end business processes: prose with the
                       # diagrams in diagrams/ (see diagramming-processes)
  diagrams/            # one source file per process, plus the diagram index
  history.md           # what git log shows, dated; inference labeled as inference
  findings.md          # the findings note: suspected defects, one line each with
                       # file:line, for the owner
  coverage.md          # the coverage ledger: denominators, counts, per-document status
  unknowns.md          # what was not determined, and what was checked before giving up

即使内容为空,也必须包含未知项文档:“没有未知项”本身就是一种说法。每个条目都要注明检查过的内容,让下一次尝试能从上次停止的地方继续。

规则

  • 本次审查只读系统。 文档、发现记录和台账是唯一的输出;发现的每个缺陷都只能记录,不能修改。
  • 不写交付叙述。 目录树描述的是系统,而不是记录系统的审查工作;根据核心硬性规则,审查过程应记录在台账和提交记录中。
  • 扩展现有文档(核心技能,先读规则):在一份仍在维护的优质文档旁边另建一份相互竞争的文档,会让目录树变得更糟;应以该文档为基础进行扩展。

评论

支持 Markdown