codebase-design
用于设计深模块的共享词汇体系。适用于用户希望设计或改进模块接口、寻找深化机会、决定 seam 的位置、提高代码的可测试性或 Agent 可导航性,或其他 Skill 需要使用深模块词汇时。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
用于设计深模块的共享词汇体系。适用于用户希望设计或改进模块接口、寻找深化机会、决定 seam 的位置、提高代码的可测试性或 Agent 可导航性,或其他 Skill 需要使用深模块词汇时。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
使用并行 sub-agents 为一个 module 生成多套差异显著的 interface 设计。适用于用户希望设计 API、探索 interface 选项、比较 module 形态,或提到“design it twice”的场景。
运行交互式 QA session:用户通过对话报告 bugs 或 issues,agent 随后创建 GitHub issues;同时在后台探索 codebase,获取上下文和 domain language。适用于用户希望报告 bugs、开展 QA、通过对话创建 issues,或提到“QA session”的场景。
通过用户访谈创建一份由微小 commits 组成的详细 refactor plan,并将其提交为 GitHub issue。适用于用户希望规划 refactor、创建 refactoring RFC,或将 refactor 拆分为安全的增量步骤。
从当前对话中提取一份 DDD 风格的 ubiquitous language glossary,标出歧义并提出规范术语,保存到 UBIQUITOUS_LANGUAGE.md。适用于用户希望定义 domain terms、建立 glossary、收紧术语、创建 ubiquitous language,或提到“domain model”或“DDD”的场景。
询问当前情境适合使用哪个 Skill 或工作流。本 Skill 是仓库内其他 Skills 的路由入口。
从用户指定的固定点(commit、branch、tag 或 merge-base)开始,从两个维度审查代码变更:Standards 检查代码是否遵守仓库记录的编码规范,Spec 检查实现是否符合原始 Issue、PRD 或规格。两个审查由并行子 Agent 分别完成,再并列汇报。适用于用户希望审查分支、PR、开发中的改动,或要求“审查自 X 以来的变更”时。
| name | codebase-design |
| description | 用于设计深模块的共享词汇体系。适用于用户希望设计或改进模块接口、寻找深化机会、决定 seam 的位置、提高代码的可测试性或 Agent 可导航性,或其他 Skill 需要使用深模块词汇时。 |
设计深模块:用很小的接口封装大量行为,把接口放在清晰的 seam 上,并通过该接口完成测试。凡是设计或重组代码,都应使用下列语言和原则。目标是让调用方获得杠杆,让维护者获得局部性,并让所有参与者都能自然地测试代码。
严格使用以下术语,不要替换成 “component”“service”“API” 或 “boundary”。保持语言一致,正是建立这套词汇的目的。
Module(模块)——任何同时拥有接口和实现的事物。该概念刻意不限定规模,可以是一段函数、一个类、一个 package,也可以是跨越多个层级的完整切片。应避免使用:unit、component、service。
Interface(接口)——调用方为了正确使用模块而必须了解的全部内容:既包括类型签名,也包括不变量、顺序限制、错误模式、必要配置和性能特征。应避免使用:API、signature。这两个词范围过窄,只能表达类型层面的表面结构。
Implementation(实现)——模块内部的代码主体。它与 Adapter 含义不同:一个事物可以是很小的 adapter,却拥有很大的实现,例如 Postgres repository;也可以是很大的 adapter,却只有很小的实现,例如内存 fake。讨论 seam 时使用 “adapter”,其他情况下使用 “implementation”。
Depth(深度)——接口提供的杠杆:调用方或测试每学习一单位接口,可以调动多少行为。大量行为隐藏在小接口后面时,模块是深的;接口复杂度几乎与实现相当时,模块是浅的。
Seam(Michael Feathers)——无需在该位置编辑代码,就能改变行为的地方;也就是模块接口所在的位置。把 seam 放在哪里是一项独立设计决策,与 seam 后面封装什么内容不同。应避免使用 boundary,因为它在 DDD 中常用于 bounded context,含义已经过载。
Adapter(适配器)——位于 seam 上、满足某个接口的具体事物。它描述的是角色,也就是填入哪个位置;不描述内部由什么构成。
Leverage(杠杆)——调用方从深度中获得的收益:每学习一单位接口,就能得到更多能力。一份实现可以同时服务 N 个调用点和 M 个测试。
Locality(局部性)——维护者从深度中获得的收益:变更、缺陷、知识和验证集中在一处,而不会散落到各调用方。修复一次,所有位置同时修复。
深模块 = 小接口 + 大量实现:
┌─────────────────────┐
│ 小接口 │ ← 方法少,参数简单
├─────────────────────┤
│ │
│ 深实现 │ ← 复杂逻辑隐藏在内部
│ │
└─────────────────────┘
浅模块 = 大接口 + 少量实现,应避免:
┌─────────────────────────────────┐
│ 大接口 │ ← 方法多,参数复杂
├─────────────────────────────────┤
│ 薄实现 │ ← 只负责透传
└─────────────────────────────────┘
设计接口时询问:
良好接口会让测试自然发生:
接收依赖,不要自行创建依赖。
// 易于测试
function processOrder(order, paymentGateway) {}
// 难以测试
function processOrder(order) {
const gateway = new StripeGateway();
}
返回结果,不要直接制造副作用。
// 易于测试
function calculateDiscount(cart): Discount {}
// 难以测试
function applyDiscount(cart): void {
cart.total -= discount;
}
保持很小的表面积。 方法越少,需要的测试越少;参数越少,测试准备越简单。
interface 关键字或类的 public methods:范围过窄。这里的接口包含调用方必须了解的每一项事实。