关于 codebase-architecture-governance
Codebase Architecture Governance 是一项面向维护者与架构师的技能,用于评估、规划或实施代码库结构调整。它依据代码引用、测试和配置等证据厘清模块职责与依赖方向,并默认不在评估模式下修改源码。
主要功能
- 01绘制当前模块与依赖关系
- 02明确模块职责和状态归属
- 03审查重复逻辑与边界问题
- 04制定分阶段迁移计划
- 05保护行为并优先小步可逆变更
- 06补充架构指导与架构测试
适用场景
- 01评估代码库模块化与依赖问题
- 02规划不改变产品行为的重构
- 03制定目录结构和模块边界规范
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mercatorproj/ codebase-architecture-governance --skill codebase-architecture-governance安装后在 Claude Code 中输入/codebase-architecture-governance确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEREADME.mdreferences/module-map-template.mdfile-audit-template.mdrefactor-plan-template.md详细介绍
代码库架构治理
使命
通过明确职责、所有权和依赖方向,让代码库更易于理解、修改、测试和扩展。减少意外复杂性,但不追求诸如文件最少、文件最短或最时髦的文件夹结构等过于简单的目标。
成功的结果应具备以下特点:
- 每条业务规则都有唯一的权威实现;
- 每个重要状态和领域概念都有明确的负责人;
- 模块边界易于理解且经过有意设计;
- 依赖沿着稳定的方向指向;
- 不存在过多不必要的包装器、兼容层、重复的架构,以及跨模块跳转;
- 测试能够保护重要行为和架构约束;
- 迁移计划可分批小规模实施和审查,并且易于回退。
何时使用此技能
在用户要求以下事项时使用此技能:
- 重新组织代码库或对其进行模块化;
- 减少代码蔓延、文件数量或架构复杂性;
- 决定文件应拆分、合并、移动、保留还是删除;
- 定义前端/后端模块边界;
- 建立目标文件夹结构或依赖规则;
- 审查重复的业务逻辑、兼容门面、透传层或循环依赖;
- 规划安全重构,且不改变产品行为;
- 创建仓库架构指南或架构测试。
操作模式
根据用户的指示确定所需模式。
- 评估模式(默认): 检查并报告;不要修改源文件。
- 计划模式: 准备分阶段迁移计划,列出文件级操作和验证命令。
- 实施模式: 仅在用户明确要求时进行更改。分批小规模处理,保持行为不变,运行可用的检查,并报告确切的变更路径。
- 仅限架构模式: 聚焦于边界和依赖方向;不要假定用户希望清理代码或删除文件。
如果无法访问仓库,不要假装已检查过。只有在需要基于实际源代码得出结论时,才提供通用目标模型或请求提供仓库/存档。明确区分基于源代码的事实、推断和建议。
核心规则
- 重构前先理解。 在建议结构调整前,先阅读仓库说明、架构文档、包清单、入口文件、测试设置、构建/打包配置和代表性代码。
- 以证据为依据。 关于文件的判断应基于导入、导出、调用位置、符号引用、测试、配置、运行时发现机制和打包方式。文件名、文件年代、文件大小或没有明显导入,都不足以作为证明。
- 区分事实与假设。 将发现标记为
confirmed、likely或needs investigation;条件允许时,注明路径和符号/行号。 - 默认保留行为。 结构重构不得悄然改变领域规则、持久化数据、公共 API、请求/响应契约、用户可见流程或错误语义。
- 避免过度拆分。 只有当模块确实包含不同职责、生命周期、所有者或测试接缝时,才进行拆分。不要仅为达到行数目标而创建文件。
- 避免过度合并。 不要只为减少目录或文件数量而合并不同领域。接口稳定的小文件也可能很有价值。
- 明确所有权。 每个领域实体、可变状态、验证规则、转换规则和业务操作都应有明确且唯一的权威所有者。
- 约束共享代码。 共享/通用/工具模块可以依赖稳定的底层原语,但不能依赖特定功能模块。不要把
shared当作所有权不明确内容的收容所。 - 分离策略与机制。 业务决策应属于领域/应用逻辑;HTTP、CLI、UI、存储、AI 提供商和特定平台的细节应置于适配器或基础设施边界之后。
- 追踪间接引用。 检查动态导入、延迟路由、反射、插件注册表、基于字符串的模块路径、依赖注入、生成代码、测试固件、CLI 入口、包导出和部署规则。
- 保护高风险区域。 并发、持久化、架构迁移、算法、流式处理、拖放、碰撞检测、撤销/重做和状态同步都需要测试,并应在重构前进行小幅改动。
- 仅在授权范围内更改。 请求提供建议并不意味着获准编辑。切勿盲目删除数据、迁移历史、锁文件、必需的生成代码或参考资料。
- 优先采用可逆的批次。 避免在同一步骤中同时进行目录移动、API 重新设计、行为更改和大规模重命名。
- 遵循仓库现状。 将本技能中的结构示例视为模式,而非必需目录。应复用现有且合理的边界,而不是为了形式统一而重命名。
术语
报告中应一致使用以下概念:
- 领域/模块: 职责明确且接口受控的内聚能力。
- 功能模块: 将 UI、本地状态、命令和特定功能类型归在一起的产品能力。
- 应用/用例层: 负责协调业务操作、事务和状态转换的编排层。
- 领域/核心层: 不应依赖交付机制的业务概念、规则和算法能力。
- 适配器/接口层: HTTP、CLI、桌面 IPC、MCP、消息队列或其他外部入口。
- 基础设施: 持久化、文件系统、网络客户端、提供商 SDK、时钟、日志记录及其他技术实现。
- 门面/兼容层: 为保留 API 或隐藏实现细节而维护的封装或重新导出。
- 规范路径/API: 迁移后预期使用的导入或调用路径。
- 状态所有者: 负责更改并验证特定可变状态的唯一模块。
工作流
阶段 1 — 建立仓库上下文
检查仓库根目录,并确定:
- 语言、框架、包/工作区边界和构建系统;
- 仓库指引,例如
AGENTS.md、CLAUDE.md、CONTRIBUTING.md和架构文档; - 运行时入口点、应用启动流程、公开导出内容和外部适配器;
- 核心数据模型、持久化格式、API、生成的资源和迁移;
- 测试、Lint/类型检查/构建命令及架构测试;
- 值得重点关注的高风险区域和应予保留的现有约定。
使用仓库清单和文档中的实际命令。不要自行编造命令。记录无法运行的测试/检查及其原因。
提交一份简短的基线摘要,并说明范围和证据局限。
阶段 2 — 梳理当前架构
在提出新架构之前,先绘制当前状态图。展示:
- 主要模块及其各自负责的内容;
- 入口点及其调用的应用服务;
- 核心数据模型,以及创建、更改、验证、持久化和序列化这些模型的模块;
- 共享依赖和横切工具;
- 有证据支持的循环依赖、依赖方向违规和重复路径。
当简单的 Mermaid 图能让关系更容易理解时,优先使用。针对不同关注点分别绘制图表,不要把所有内容塞进一张难以阅读的图中:
- 上下文/容器图或高层模块图;
- 重要模块的依赖关系图;
- 仅当关键运行时流程本身值得说明时,绘制其时序图/活动图。
不要为了装饰而绘图。每张图都应解答读者的一个具体问题。
阶段 3 — 定义模块职责和所有权
为每个主要模块撰写一句职责说明。然后明确:
- 它拥有什么;
- 它公开什么;
- 它可以依赖哪些模块;
- 哪些模块不得依赖它;
- 它不得重复维护哪些规则/状态;
- 如何测试它。
健康的边界通常具有较高的内部内聚性、精简稳定的接口,以及与无关模块的低耦合度。
优先按业务能力组织,再在每种能力内按职责组织文件。仅按技术文件类型(components/、utils/、types/、services/)组织,可能适合小型项目;但在大型产品中,这会把同一功能分散到许多互不相关的目录中。在能改善代码局部性的情况下,优先采用功能优先的组织方式,同时将真正共享的基础构件限制在受约束的共享层中。
阶段 4 — 选择合适的目标边界
根据观察到的技术栈灵活调整。不要将通用架构强加给所有项目。
通用后端模式
一种实用的逻辑依赖方向是:
接口/适配器 → 应用/用例 → 领域/核心
基础设施实现在有益时通过显式接口或注入的依赖进行调用。领域/核心不应导入 HTTP 框架、UI 代码、提供方 SDK 或文件系统细节。
可能的职责划分:
- **领域/核心:**实体、值对象、不变量、领域规则、确定性算法。
- **应用/用例:**协调领域操作、授权/确认策略、事务、验证顺序和结果处理。
- **基础设施:**持久化、文件、网络、模型/提供方客户端、时钟、日志记录。
- **接口/适配器:**HTTP/MCP/CLI/UI 桥接、输入/输出映射、传输专属错误处理。
如果抽象的 domain/ 或 application/ 层只是给现有代码换个名字,却没有建立有用的边界,就不要添加。边界清晰的现有核心可以保留其既有名称。
前端通用模式
分离以下内容:
- 应用框架和路由;
- 功能模块及其局部 UI/状态/命令/类型;
- 跨功能共享的应用级编排;
- 共享 UI 基元、传输客户端和稳定的跨功能契约。
大型前端可以采用如下结构:
src/
app/ # bootstrap, router, shell
features/
<capability>/ # UI, local model/state, commands, feature API
application/ # cross-feature workflows and orchestration
shared/
ui/ # generic UI primitives only
api/ # transport/client primitives
contracts/ # intentionally shared contracts
utils/ # pure, genuinely generic utilities
此结构仅供参考,并非必须达到的迁移目标。功能模块不得形成循环依赖。共享模块不得导入功能模块。只有在某个类型或辅助函数确实由多个模块共享,且其归属明确时,才将其移至 shared。
AI/Agent/工作流系统
如果系统中包含相关功能,应区分意图/输入解析、上下文或记忆、协调/决策支持、工作流编排和业务执行。Agent 可以提出建议或请求确认,但不得成为业务规则的第二套实现。保留有意义的工作流检查点,以支持确认、重试、可观测性和恢复。
可视化/编辑系统
对于复杂编辑器,应区分 UI 组合、领域/编辑器状态、渲染/场景生命周期、交互状态机、命令/历史记录,以及持久化/提交行为。不要仅按任意行数拆分有状态交互。明确选择、拖动状态、候选项放置、提交、撤销/重做和资源释放各自的唯一所有者。
算法或数据密集型系统
分离领域契约、输入规范化、算法实现、编排和序列化/适配器。保留确定性行为、约束、标识符、单位、旋转、排序规则和数值容差。不要让传输或文件格式相关问题渗入算法核心。
阶段 5 — 审核文件和模块
将每个候选项归为以下类别之一:
KEEP:职责和边界合理。SPLIT:一个模块混合了不同职责或生命周期。MERGE:相邻文件承担相同且内聚的职责,彼此之间存在过多的传递调用。MOVE:归属明确,但文件位于错误的模块中。MIGRATE-THEN-REMOVE:迁移调用方并检查公开用法后,可移除兼容性导出/门面。DELETE:证据表明其已过时或未使用;在相关情况下,也包括已检查非静态引用。INVESTIGATE:现有证据不足以安全确定处理方式。ADD-BOUNDARY:添加小型接口、所有者模块或测试边界,因为当前职责彼此纠缠。
对于每个非平凡候选项,记录:
- 路径或模块;
- 当前职责;
- 拟议操作和目标所有者;
- 证据(引用、符号、测试或观察到的重复);
- 置信度(
confirmed、likely、needs investigation); - 风险(
low、medium、high); - 前置条件和验证命令/测试;
- 适用时的回滚或兼容性说明。
绝不能仅根据文件大小、名称、时间戳或缺少明显的静态导入,就将文件归类为可删除。如果可能存在运行时发现机制,那么搜索结果为零只是证据,并非证明。
阶段 6 — 检查依赖和重复内容
对于高价值候选项,追踪:
- 双向导入和重新导出;
- 调用点和状态变更点;
- 重复的架构、类型、验证逻辑、转换逻辑和状态转换;
- 依赖循环和向上依赖;
- 公开导出、API 路由、插件/注册表发现、反射、延迟导入;
- 测试、测试夹具、脚本、构建、打包、部署和文档引用;
- 持久化数据及跨模块契约的所有权。
如有可用工具,优先使用支持语言感知的符号/引用工具或 AST 分析。先进行全仓库文本搜索,并说明搜索无法证明什么。
阶段 7 — 按价值和风险确定工作优先级
常见的高价值顺序(根据证据调整):
- 明确公共入口点和模块归属;
- 找出重复的业务规则、架构漂移和多个状态所有者;
- 删除已确认过时的产物和调试输出;
- 将兼容性导出和透传逐步收敛到规范 API;
- 合并分散的同一职责实现;
- 将模块移至其所属的功能或领域;
- 为确实承担多种职责的文件拆分模块,并在边界处添加测试;
- 处理循环依赖并添加架构检查;
- 更新图表和开发者文档。
大型文件是审查信号,并不意味着必须拆分。如果额外增加的文件能形成稳定接口、隔离生命周期、明确归属或提供实用的测试接缝,那么就值得增加。只有在删除小文件能消除实际的间接层且不削弱边界时,才值得删除。
阶段 8 — 制定渐进式迁移计划
分批进行,每批都明确一个不变量:
- 建立或记录基线;
- 针对要保留的行为,添加或完善聚焦测试;
- 选择一个模块或关注点;
- 将调用方迁移到一个规范 API;
- 整合或迁移实现;
- 仅在检查引用后才移除过时的间接层;
- 运行聚焦测试并检查差异;
- 在关键节点运行类型检查、lint、构建和更广泛的测试套件;
- 更新架构文档;
- 记录未解决事项和回滚步骤。
不要在一个批次中混合整个目录的重命名、公共 API 重新设计、业务规则更改和数据迁移。如果必须更改行为,请将其单独处理并明确记录。
阶段 9 — 添加架构护栏
在有价值的情况下,建议使用可强制执行的约束,例如:
- 功能模块之间不得相互导入,除非通过获批的公共 API;
shared不得从features导入;- domain/core 不得导入传输层或 UI 包;
- 接口/适配器应调用应用服务,而不是重复实现用例;
- 只有一个模块负责写入特定状态或持久化实体;
- 兼容性导入应标记为弃用,并明确移除路径;
- 在适当的层级测试关键不变量。
使用项目现有的测试、lint 和导入工具。当一个简单测试或 lint 规则就足够时,不要引入重量级框架。
风险指南
通常在验证后风险较低:
- 过时的屏幕截图、本地调试输出、废弃的分析器文件;
- 调用方已迁移的纯重新导出文件;
- 有等效测试覆盖的重复纯工具函数;
- 文档链接和文件夹标签。
通常风险中等:
- 移动功能本地模块;
- 合并验证/转换逻辑;
- 更改公共导入路径;
- 将表现层与编排逻辑拆分;
- 重构 Agent 工作流子领域。
通常风险较高:
- 持久化架构或文件格式;
- ID 和跨阶段关系;
- 身份验证/权限或确认行为;
- 并发/流式状态、重试、持久化、撤销/重做;
- 优化算法和数值约束;
- 拖放/碰撞/3D 交互状态机;
- 通过插件加载或动态发现的模块。
风险取决于实际引用和测试;不要认为某个类别总是安全的。
必需的输出格式
用于架构评估
- 执行摘要诊断: 复杂性的主要成因,而不只是表面症状。
- 现状图: 主要模块、入口点、核心数据/状态的所有者、依赖方向。
- 职责图: 每个主要模块的工作、公共接口和禁止依赖项。
- 建议的目标结构: 与现有技术栈和当前代码相符的示例目录树。
- 模块/文件决策表: 操作、依据、置信度、风险、建议目标位置、验证方式。
- 依赖规则: 明确允许和禁止的依赖方向。
- 分阶段迁移顺序: 规模小、可回退且具备前置条件的批次。
- 行为不变量: 不得改变的流程、契约和状态转换。
- 验证计划: 实际可用的测试/检查及成功标准。
- 未知项: 需要追踪源代码或由用户决策的未解决事项。
用于文件精简请求
使用第 5 阶段的文件分类,并提供引用追踪依据。明确区分“待检查候选项”和“可安全删除项”。
用于实现任务
如果改动较大,先概述范围,再分小批次进行。最后报告:
- 新增/移动/修改/删除的文件;
- 职责/所有权变更;
- 已运行的测试和命令及其结果;
- 无法运行的测试/检查;
- 有意改变的行为(如有);
- 剩余风险和回滚选项。
请结合实际代码仓库具体说明。避免脱离具体路径、符号、约束或已观察到的关系给出泛泛建议。
完成标准
满足以下条件即表示任务完成:
- 每个主要模块都有明确的职责和所有者;
- 重要数据/状态都有唯一权威所有者;
- 依赖方向和公共接口清晰易懂;
- 对重复实现和兼容路径都有明确决策;
- 删除操作有证据支持,而非凭猜测;
- 迁移拆分为便于审查的批次;
- 关键行为有测试覆盖,或明确标记为尚未验证;
- 如实报告验证结果和证据局限;
- 架构文档反映最终设计。
参考资料
准备交付内容时,请使用以下参考文件:
references/module-map-template.md— 当前/目标模块职责图。references/file-audit-template.md— 逐文件操作与依据矩阵。references/refactor-plan-template.md— 分阶段迁移检查清单。