refactorkit
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
Chineserefactorkit
Refactorkit
The survey you run on a codebase you already have. refactorkit reads the repo, meaning its churn, its module shapes, and its tests, finds where the structure is costing you, ranks the candidates against two gates, crowns exactly one, and writes it up as a proposal somebody can argue with.
It is a single procedure, optionally scoped to a subtree (). There are no modes: everything it does, it does the same way on every run.
/refactorkit src/payments这是针对你已有的代码库开展的评估工具。Refactorkit会读取代码仓库信息,包括代码变更频率、模块形态和测试情况,找出结构层面导致成本损耗的问题,通过两道筛选门槛对候选项进行排名,最终选出唯一最优项,并撰写一份可供讨论的提案。
它是一个单一流程,可选择性地限定在子目录范围内执行(如)。该工具无模式区分:每次运行时的执行逻辑完全一致。
/refactorkit src/paymentsIt proposes, it never edits
仅提建议,绝不编辑
refactorkit writes exactly one Markdown file and touches no source code. No moves, no renames, no extractions, no "small tidy-up while I'm in here." The name says refactor; the skill only ever says where and why, and the doing belongs to whoever picks the proposal up. That boundary is the whole reason the report can be trusted, because a survey that also edits has already decided, and you're reading a rationalization rather than a recommendation.
EditWriteRefactorkit仅生成一个Markdown文件,不会改动任何源代码。 不会移动、重命名、提取代码,也不会“顺便做些小整理”。虽然名称包含“refactor(重构)”,但该工具只会说明重构的位置和原因,实际执行重构的工作由采纳提案的人员完成。这种边界划分正是报告具备可信度的核心原因——如果一个评估工具同时还会修改代码,那它实际上已经提前做出了决策,你看到的只是合理化解释而非客观建议。
该工具刻意未包含“编辑”功能。它创建的唯一文件是新文件,因此仅需使用“写入”操作即可完成。
When this fires
触发场景
"Where should I refactor this", "what's wrong with this codebase's structure", "find refactoring opportunities", "this code is hard to change", "improve our architecture", "audit the module boundaries", "the seams here are a mess", "/refactorkit".
Four boundaries, one line each:
- Not a code review. A review reads a diff for defects in work someone just did. refactorkit reads the tree for structure that predates the diff. A "review my changes" request is not this skill.
- Not documentation. Describing the architecture as it stands is a different job; refactorkit only ever describes an architecture that doesn't exist yet.
- Not visual design. Nothing here concerns UI, styling, or a design system, despite what "design" suggests when it sits next to "refactor."
- Not a decision record. refactorkit produces a proposal, not a ratified decision. When the proposal supersedes an existing architecture decision, it says so and routes to whatever records decisions in this repo.
当用户提出以下请求时触发:“我应该在哪里重构这个代码”“这个代码库的结构有什么问题”“寻找重构机会”“这段代码难以修改”“改进我们的架构”“审计模块边界”“这里的衔接部分一团糟”“/refactorkit”。
需明确四个边界,每条一句话说明:
- 不是代码评审。代码评审是检查他人刚完成的工作中的差异缺陷。Refactorkit则是读取代码树,评估早于差异存在的结构问题。“评审我的变更”请求不属于该工具的处理范围。
- 不是文档编写。描述现有架构是另一项工作;Refactorkit仅描述尚未存在的架构方案。
- 不是视觉设计。此处内容与UI、样式或设计系统无关,尽管“设计”一词与“重构”并列时可能引发误解。
- 不是决策记录。Refactorkit生成的是提案,而非已批准的决策。当提案取代现有架构决策时,需明确说明并指向仓库中用于记录决策的相关文件。
The vocabulary
术语定义
Use these terms precisely; they're what keeps the findings from collapsing into generic smell-listing.
- Module. Anything with an inside and an outside: a file, a class, a package, a service. Not a language construct, a boundary.
- Interface. Everything a caller must know to use the module correctly. Not just the signature: also the ordering constraints, the required config, the side effects, the error contract, and the invariants nobody wrote down. Interfaces are almost always bigger than they look.
- Depth. How much behaviour a module hides, relative to how much interface it makes you learn. A deep module buys a lot of hidden work for a small interface. A shallow one charges nearly the same either way.
- Seam. The place a system can be split without tearing: where one side can be replaced, faked, or tested without the other.
- Adapter. A module whose entire job is reshaping data between two others. Adapters aren't wrong; a cluster of them is a symptom that two sides disagree about a shape.
- Locality. How much of one conceptual change lands in one place. Good locality means a feature change touches few files; poor locality means it fans out.
- Leverage. How much future change a fix makes cheaper. It's what breaks ties between candidates that are otherwise equally sound.
Use the project's own domain terms throughout. If the codebase says ledger, tenant, shipment, the proposal says those words. Falling back on generic "component," "service," "API," or "layer" is the single clearest sign a finding was pattern-matched rather than read, and it's what makes architecture advice sound plausible while saying nothing.
请精准使用以下术语,它们能确保评估结果不会沦为泛泛的“代码异味”清单。
- Module(模块):任何具有内部和外部边界的单元:文件、类、包、服务。它不是语言构造,而是一种边界。
- Interface(接口):调用者正确使用模块所需了解的全部信息。不仅包含签名,还包括顺序约束、所需配置、副作用、错误契约以及未书面记录的不变量。接口的范围几乎总是比看起来更广。
- Depth(深度):模块隐藏的行为量与调用者需学习的接口量的相对比例。深度大的模块能用少量接口实现大量隐藏功能;深度浅的模块则在接口学习成本和功能实现成本上相差无几。
- Seam(衔接点):系统可拆分而不破坏整体的位置:一侧可被替换、模拟或测试,而无需影响另一侧。
- Adapter(适配器):专门用于在两个模块之间转换数据形态的模块。适配器本身并无问题,但大量适配器聚集则表明两侧模块在数据形态上存在分歧。
- Locality(局部性):一项概念性变更涉及的代码集中程度。良好的局部性意味着功能变更只需改动少量文件;局部性差则意味着变更会波及大量文件。
- Leverage(影响力):修复措施能降低未来变更成本的程度。当候选项在其他方面不相上下时,该指标用于打破平局。
全程使用项目自身的领域术语。 如果代码库中使用ledger(分类账)、tenant(租户)、*shipment(货运)*等术语,提案中也应使用这些词汇。退而使用通用的“component(组件)”“service(服务)”“API”或“layer(层)”是评估结果仅为模式匹配而非实际读取代码的明确信号,这会让架构建议听起来合理却空洞无物。
The four friction patterns
四类摩擦模式
A closed set. These four are what refactorkit looks for, and it looks for nothing else. The closure is load-bearing: an open-ended hunt for "problems" produces the same generic list on every codebase, which is exactly the output this skill exists to replace. All four reduce to depth, since each one is a different way an interface costs more than the behaviour behind it.
| Pattern | What it is | The shape to look for | Who finds it |
|---|---|---|---|
| Shallow interface | the interface costs about as much to learn as the implementation costs to read | a unit whose members each forward to exactly one member of exactly one other unit | subagent |
| Adapter prevalence | modules that exist only to reshape data between two others, where the finding is that two sides disagree on a shape, never "delete the adapters" | a cluster of translation-only units sitting on one boundary, translating in both directions | subagent |
| Untested coupling | behaviour you can only test by standing up its collaborators | tests that construct more collaborators than they make assertions, or an untested unit whose neighbours are all tested | subagent |
| Poor locality | one conceptual change fans out across many files | files that repeatedly change in the same commits while living in different parts of the tree | main session |
Signals are shapes, never names. Do not hunt for , , , , or any other suffix. Those conventions belong to one or two language communities and mean nothing in a Go, Rust, Elixir, or PHP repo, and a named example is precisely what an agent pattern-matches on instead of reading. Derive the repo's own conventions first (the guardrails read below usually hands them to you), then look for the structure described above under whatever names this codebase happens to use.
*Mapper*Adapter*DTO*Service这是一个封闭集合。Refactorkit仅查找以下四类问题,不会寻找其他问题。这种封闭性至关重要:开放式的“问题排查”会在每个代码库中产生相同的泛化清单,而这正是该工具想要替代的输出。四类问题本质上都可归结为深度问题,因为每一类都是接口成本高于背后行为成本的不同表现形式。
| 模式 | 定义 | 识别特征 | 排查主体 |
|---|---|---|---|
| Shallow interface(浅层接口) | 学习接口的成本与阅读实现的成本大致相当 | 一个单元的每个成员都直接转发至另一个单元的单个成员 | 子代理(subagent) |
| Adapter prevalence(适配器泛滥) | 仅用于在两个模块间转换数据形态的模块,排查重点是两侧模块在数据形态上的分歧,而非“删除适配器” | 大量仅负责转换的单元聚集在同一边界,且双向进行转换 | 子代理(subagent) |
| Untested coupling(未测试耦合) | 只能通过启动协作单元才能测试的行为 | 测试中构造的协作单元数量多于断言数量,或未测试的单元其相邻单元均已测试 | 子代理(subagent) |
| Poor locality(局部性差) | 一项概念性变更波及大量文件 | 不同目录下的文件在同一提交中频繁同时变更 | 主会话 |
识别依据是结构形态,而非命名。 不要刻意寻找带有、、、等后缀的文件。这些命名约定仅属于个别语言社区,在Go、Rust、Elixir或PHP代码库中毫无意义,且基于命名的示例正是代理进行模式匹配而非实际读取代码的典型表现。应先推导代码库自身的约定(下文提到的“防护规则读取”通常会提供这些信息),再根据上述描述的结构形态进行排查,无论代码库使用何种命名。
*Mapper*Adapter*DTO*ServiceThe two gates
两道筛选门槛
Every candidate clears both before it is listed at all. A candidate that fails either one is discarded silently: it does not appear as a weaker finding, and it does not appear with a caveat.
The deletion test. If this module vanished and its callers absorbed what it did, would complexity concentrate where it belongs, or merely relocate? Concentration is the win. Relocation is churn wearing a refactor's clothes, and printing it is how a report gets long and stops being read. State the verdict with one sentence of evidence: which callers absorb what, and why that is or isn't a better home.
Interface as test surface. After the proposed change, can the behaviour be tested through the new interface alone, without reaching inside? If not, the seam is in the wrong place: the candidate is unfinished, not ready. This gate is what stops a proposal that merely moves the boundary from passing as a proposal that improves it.
Both verdicts are mandatory on every listed candidate, in the terminal output and in the file. A candidate whose gate verdicts aren't stated is not a weaker candidate; it's an unevidenced one.
每个候选项必须同时通过两道门槛才会被列入清单。未通过任意一道门槛的候选项会被静默丢弃:不会作为较弱的评估结果出现,也不会附带说明。
删除测试门槛。如果该模块消失,其调用者接管它的功能,复杂度是集中到合理位置,还是仅仅转移位置?集中才是收益。转移只是披着重构外衣的无意义变更,会导致报告冗长且无人阅读。需用一句话说明判定依据:哪些调用者接管哪些功能,以及为何这是(或不是)更好的归属。
接口作为测试面门槛。变更完成后,能否仅通过新接口测试行为,而无需深入内部?如果不能,说明衔接点位置错误:候选项未完成,不具备入选资格。该门槛用于阻止仅移动边界而非优化边界的提案通过。
所有列入清单的候选项必须在终端输出和文件中明确说明两项门槛的判定结果。未说明门槛判定结果的候选项不是较弱的候选项,而是缺乏依据的候选项。
The strength scale
强度等级
Rate each surviving candidate against this table rather than by feel, because an undefined badge is a vibe wearing a label, and strength is the one column a reader trusts without checking.
| Strength | What it takes | How it ranks |
|---|---|---|
| both gates pass, the files sit in the churn top slice, and the blast radius is named in actual files | crownable |
| both gates pass, but the code is cold or the blast radius is wide | crownable only when nothing is |
| gates pass, but the win is stylistic, and nothing changes about what a caller must know | listed, never crowned |
请根据下表对通过筛选的候选项进行评级,而非凭感觉判断,因为模糊的评级只是主观感受的标签,而强度是读者无需验证即可信任的指标。
| 强度 | 判定标准 | 排名规则 |
|---|---|---|
| 通过两道门槛,文件位于高频变更区间,且影响范围明确到具体文件 | 可被选为最优项 |
| 通过两道门槛,但代码变更频率低或影响范围广 | 仅当无 |
| 通过两道门槛,但收益仅为风格层面,调用者所需了解的信息无任何变化 | 可列入清单,绝不能被选为最优项 |
Procedure
执行流程
1. Read the guardrails first
1. 先读取防护规则
Before looking at any code, read what the repo has already decided:
- a repo-root context or glossary file (commonly ) for the ubiquitous language, which is where the project's own domain terms come from, and where its naming conventions usually surface;
CONTEXT.md - (or wherever this repo keeps architecture decision records) for decisions already made.
docs/adr/
A proposal that reverses an accepted decision record must say so by its number and route to a superseding record rather than quietly re-suggesting a design that was already rejected. Reversing a decision is legitimate; doing it without noticing is not.
Neither file existing is normal. Degrade silently, with no warning and no commentary.
在查看任何代码之前,先读取仓库已有的决策文件:
- 仓库根目录的上下文或术语表文件(通常为),其中包含通用语言(项目自身领域术语的来源),通常也会体现命名约定;
CONTEXT.md - (或仓库存储架构决策记录的其他位置),其中包含已做出的决策。
docs/adr/
如果提案与已接受的决策记录相悖,必须明确记录编号并指向替代记录,而非悄悄重新建议已被否决的设计。推翻决策是合理的,但未察觉决策已存在则不可接受。
上述文件不存在是正常情况。无需警告或说明,直接降级处理。
2. Rank by churn, then cluster
2. 按变更频率排序,再聚类
git log --format= --name-only --since=<a year or so>Rank files by change count, then group the hot ones into 3–5 coherent areas, by directory, by feature, by whatever seam the repo actually has. Honour the scope argument when the user gave one: scope narrows the tree, it doesn't change the method.
No git history, meaning a shallow clone or not a repo at all, means no ranking. Scan by structure instead and say plainly that the prioritisation was skipped, so nobody reads the coverage line as more than it is.
git log --format= --name-only --since=<约一年前>按文件变更次数排序,然后将高频变更文件分为3–5个连贯区域,可按目录、功能或仓库实际存在的衔接点划分。如果用户指定了范围参数,需遵守该范围:范围仅缩小代码树范围,不改变方法。
无git历史(如浅克隆或非仓库环境)则无法进行排名。此时需改为按结构扫描,并明确说明跳过了优先级排序,避免读者过度解读覆盖范围。
3. Fan out, one agent per cluster
3. 扩展排查,每个区域分配一个代理
Dispatch one subagent per area. Each applies the three read-the-code patterns from The four friction patterns to its own slice, runs both gates itself, and returns a list of candidate records, or an explicit empty result, which is a perfectly good answer.
Give every agent the same fixed return shape, because the main session has to rank findings it never gathered. Freeform prose can't be ranked without re-reading everything the agent read, which throws away the entire reason to fan out:
| Field | Content |
|---|---|
| one of the three read-the-code patterns |
| the paths involved |
| the proposed structure, one line |
| verdict plus one sentence of evidence |
| verdict plus one sentence of evidence |
| files touched, callers changed |
| per The strength scale |
Poor locality stays in the main session. It's derived from the co-change pairs already in hand, it costs no file reads, and a per-area agent structurally cannot see files that change together while living in different areas. Handing it to an area agent guarantees it is never found.
No subagent tool available → scan the top churn slice inline instead, applying the same patterns and the same gates, and say which path the run took. For a public skill this fallback is a large share of runs rather than an edge case, so it is a real mode with a real coverage claim, not a degraded apology.
为每个区域分配一个子代理。每个子代理对各自负责的区域应用四类摩擦模式中的三类代码读取模式,自行运行两道筛选门槛,并返回候选记录列表或明确的空结果(空结果也是合理答案)。
需为所有代理指定统一的返回格式,因为主会话需要对未亲自收集的评估结果进行排名。自由格式的文本无法进行排名,除非重新读取代理读取的所有代码,这会完全失去扩展排查的意义:
| 字段 | 内容 |
|---|---|
| 三类代码读取模式中的一种 |
| 涉及的文件路径 |
| 建议的结构,一句话描述 |
| 判定结果加一句话依据 |
| 判定结果加一句话依据 |
| 涉及的文件、受影响的调用者 |
| 符合强度等级的评级 |
局部性差问题由主会话负责排查。该问题基于已获取的联动变更对,无需读取文件,而按区域分配的代理在结构上无法发现不同区域中频繁同时变更的文件。将该问题交给区域代理会导致永远无法排查到。
无子代理工具可用 → 改为内联扫描高频变更文件,应用相同的模式和门槛,并说明本次运行采用的路径。对于公共工具而言,这种回退模式是常见场景而非边缘情况,因此是具备实际覆盖能力的正式模式,而非降级处理的致歉。
4. Synthesize, gate, rank, crown
4. 综合、筛选、排名、选出最优项
- Drop any record missing a gate verdict. Dropped, not repaired, because an unevidenced gate is exactly what the deletion test exists to catch, and repairing it in the main session means asserting a verdict on code you didn't read.
- Dedupe across areas; the same seam often surfaces from both sides of it.
- Rank on strength, then leverage, then lowest blast radius.
- Crown exactly one. Never a candidate, whatever else is on the list. The rest become runners-up, in order.
weak
Crowning one is the work. A list of five equal-looking options is the state you were already in before running this.
- 丢弃任何未说明门槛判定结果的记录。直接丢弃,不修复,因为未提供依据的门槛判定正是删除测试门槛要排查的问题,主会话修复该问题意味着对未读取的代码做出判定。
- 去重跨区域的记录;同一衔接点通常会从两侧被发现。
- 排名:先按强度,再按影响力,最后按影响范围从小到大排序。
- 选出唯一最优项。绝不能选候选项,无论清单中还有其他什么项。其余候选项按顺序列为备选。
weak
选出最优项是核心工作。提供五个看似同等的选项只是你运行工具前的状态。
5. Report, then write the artifact
5. 生成报告,然后写入产物
Print a compact table first (candidate, pattern, strength, blast radius), then the crowned move with its reasoning, then the runners-up.
Every report carries a coverage line, in the terminal and in the file: "ranked 1,240 files by churn, read the top 40 across 4 areas." A cap nobody can see is a lie about completeness, and it's the difference between "there's nothing structurally wrong here" and "I looked at 3% of it."
The artifact goes to , built from a lowercase type prefix, a short lowercase kebab-case subject slug, and the ISO creation date at the end. Keep that creation date stable when the file is edited; a re-run on the same subject updates the same file in place rather than spawning a dated copy. When the repo already has an established home or naming scheme for proposal documents, that convention wins.
docs/refactor/refactor-<slug>-YYYY-MM-DD.mdIt contains the coverage line, the ranked table, then one section per candidate covering the problem, the proposed shape, why it is deeper, both gate verdicts, and the blast radius, with a Mermaid before/after diagram for the crowned candidate at minimum. GitHub and most editors render Mermaid natively, which is what makes a generated HTML report unnecessary.
This file is durable and committable, since it's a proposal meant to be reviewed in a PR, not scratch. refactorkit still never commits it.
No writable filesystem (a browser-based agent) → print the artifact as a codeblock under its canonical path and skip the write.
先打印一个简洁的表格(候选项、模式、强度、影响范围),然后是最优项及其理由,最后是备选项。
每份报告必须包含覆盖范围说明,在终端和文件中均需体现:“按变更频率对1240个文件进行排名,读取了4个区域中的前40个文件。” 不可见的上限是对完整性的虚假陈述,这正是“此处无结构问题”和“我仅查看了3%的代码”的区别。
产物保存至,由小写类型前缀、简短的小写短横线命名主题标识(slug)和末尾的ISO创建日期组成。编辑文件时需保持创建日期稳定;同一主题的重新运行应更新现有文件,而非生成新的带日期的副本。如果仓库已有提案文档的既定存储位置或命名规范,需遵循该规范。
docs/refactor/refactor-<slug>-YYYY-MM-DD.md产物包含覆盖范围说明、排名表格,然后是每个候选项的章节,涵盖问题、建议的结构、为何深度更优、两道门槛的判定结果以及影响范围,其中最优项至少需包含Mermaid格式的前后对比图。GitHub和大多数编辑器原生支持Mermaid渲染,因此无需生成HTML报告。
该文件持久且可提交,因为它是用于PR评审的提案,而非临时草稿。但Refactorkit仍不会提交它。
无可写文件系统(如基于浏览器的代理)→ 将产物作为代码块打印在其标准路径下,跳过写入操作。
6. Hand off
6. 交接
Write this section in the procedural register: one instruction per sentence, active voice, present tense, no metaphor.
What changed. Report the file written, and explicitly that no source file was touched. Where it landed. Give the path. Next. Take the crowned candidate to a grilling: the write-up is already plan-shaped, and what it lacks is interrogation rather than drafting. Name grillkit when it's installed; otherwise say plainly that the move is to interrogate the proposal yourself, covering the assumptions, the failure paths, and the blast radius, before anybody builds it.
Runners-up: route to a decision-record skill (domainkit when installed) when the proposal supersedes an existing record, and to a build skill (implementkit when installed, otherwise just building it) once the shape is settled.
On an empty result, say there is no next move. See below.
请以流程化语气撰写本节:每句一个指令,主动语态,现在时态,无比喻。
变更内容。报告已写入的文件,并明确说明未改动任何源代码。存储位置。提供文件路径。下一步。将最优项提交审核:撰写的内容已具备计划形态,缺少的是质疑而非起草。如果已安装grillkit,请提及该工具;否则明确说明需自行审核提案,涵盖假设、失败路径和影响范围,再进行构建。
备选项:当提案取代现有记录时,转至决策记录工具(已安装domainkit时提及);当结构确定后,转至构建工具(已安装implementkit时提及,否则直接说明进行构建)。
如果结果为空,说明无下一步操作。详见下文。
When nothing clears the gates
无候选项通过门槛
A clean result is a real outcome, and refactorkit reports it as one: name the coverage, say nothing cleared the gates, and write no file.
This matters more than it looks. A survey obliged to produce findings will manufacture them, and manufactured architecture advice reads exactly like the real thing: same vocabulary, same confidence, same shape. The deletion test is only a genuine gate if "nothing here" is a legal answer.
The terminal line has to carry the coverage, as in "scanned 38 files across ; nothing cleared the deletion test", or an empty result is indistinguishable from a scan that never ran.
src/干净的结果是真实的输出,Refactorkit会如实报告:说明覆盖范围,指出无候选项通过门槛,且不写入任何文件。
这比看起来更重要。如果评估工具必须生成结果,就会捏造结果,而捏造的架构建议与真实建议看起来完全一致:相同的术语、相同的自信、相同的格式。只有当“此处无问题”是合法答案时,删除测试门槛才是真正有效的筛选机制。
终端输出必须包含覆盖范围说明,例如*“扫描了下的38个文件;无候选项通过删除测试门槛”*,否则空结果会与未执行扫描的情况无法区分。
src/Notes
注意事项
- Zero source mutation, always. One new Markdown file is the entire write surface. Anything else, whether a rename, an extraction, or a "quick fix", is out of bounds even when it's obviously correct.
- Read-only shell only. git history, file reads, greps. Never install or run an analysis tool to generate evidence: probing for one and parsing its output couples this skill to a format that changes on a minor release. If the repo already has such an artifact on disk, like a dependency graph or a coverage report, read it. Never generate one.
- Route, don't launch. Name the next kit and its one-line invocation; don't invoke it. Whether to act on a proposal is the reader's call, and a survey that chains itself into the build has taken that call away.
- Route, don't require. Every recommendation degrades to a plain action when the named kit isn't installed. refactorkit is useful in a bare repo with nothing but git.
- Follow the repo over these defaults. An established artifact location, a documented convention, or a stated policy in the repo's agent-guide file (or an equivalent) wins, so say that you followed it.
CLAUDE.md
- 始终零源代码变更。仅写入一个新的Markdown文件。任何其他操作,无论是重命名、提取还是“快速修复”,即使明显正确也在禁止范围内。
- 仅使用只读Shell。可使用git历史、文件读取、grep命令。绝不要安装或运行分析工具生成证据:探测工具并解析其输出会将该工具与易随小版本变更的格式绑定。如果仓库磁盘上已有此类产物(如依赖图或覆盖率报告),可读取它。但绝不要生成新的产物。
- 引导,不启动。指明下一步工具及其单行调用指令;不要直接调用。是否采纳提案是读者的决策,而将自身与构建流程绑定的评估工具相当于剥夺了读者的决策权。
- 引导,不强制。当指定工具未安装时,所有建议均降级为普通操作。Refactorkit在仅含git的裸仓库中也能发挥作用。
- 仓库规范优先于默认规则。仓库中既定的产物存储位置、文档规范或代理指南文件(如或等效文件)中规定的策略优先,需说明遵循了该规范。
CLAUDE.md