关于 fable-native-code
fable-native-code 是用于现有代码库的编码技能,帮助修改与文件及周边模块的既有习惯保持一致。它侧重精简差异,避免无必要的注释、防御性代码、日志和格式改动。
主要功能
- 01遵循命名与错误处理习惯
- 02仅为不明显的不变量添加注释
- 03避免多余验证和异常包装
- 04沿用代码库术语与导入风格
- 05检查并清理代码差异
适用场景
- 01在现有文件中添加代码
- 02修改代码前判断注释与类型标注风格
- 03审查差异中的防御性冗余
- 04确保改动符合项目惯例
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ immamdouhaboammar/ get-fable --skill fable-native-code安装后在 Claude Code 中输入/fable-native-code确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
skill.package.jsonagents/openai.yamlevals/scenarios.json详细介绍
Fable Native Code
你的差异应当像是由这份文件的长期维护者编写的。文件有自己的风格——命名、错误处理、注释密度和格式。请遵循这种风格。你个人的偏好并不代表改进,只是个人风格。
目的
遵循代码库的惯例,并抑制与项目风格不符的 AI 模式。消除防御性冗余、过多注释、不必要的 try/catch 块、未经请求的日志,以及对编码风格的对话式辩解。
适用场景
- 在现有仓库中编写或编辑代码时。
- 在文件本身没有文档字符串、注释、类型注解或验证逻辑时,准备添加这些内容之前。
- 选择命名约定、错误处理模式或导入结构时。
- 完成差异后、最终提交前进行检查时。
不适用场景
- 从零开始搭建全新项目,且没有既定惯例时(使用
fable-architecture或fable-execute)。 - 重构架构边界或解耦模块时(使用
fable-simplify)。 - 性能基准测试和算法优化时(使用
fable-review)。
输入
source_diff:拟议的代码修改。target_file:现有源文件、其周边惯例及相邻模块。
预期输出
idiomatic_code:整洁、精简且符合惯例的代码编辑,与周边风格自然融合。clean_diff:不包含外观性改动、无谓注释和防御性包装的差异。
流程
- 匹配文件风格:遵循命名、错误处理惯例、注释密度、格式和导入组织。如果文件 200 行里只有一条注释,那么你新增注释的可能性几乎为零。
- 只注释不变量:注释只说明代码本身无法表达的约束——不变量、易踩坑之处,以及不采用显而易见方案的原因。绝不描述下一行要做什么,绝不叙述你的修改(例如“现在可以正确处理 X”),也绝不为审阅者辩解。
- 抑制防御性冗余:不要给能正常运行的代码套上 try/catch;不要验证类型或调用方已经保证的不变量;不要添加没人要求的日志、配置或标志。
- 不要叙述克制之处:想要解释自己没有添加什么(“注意:我特意没有添加文档注释,因为……”)的冲动,和添加该内容的冲动如出一辙——只是转移到了回复里。直接交付代码;除非用户询问,否则不要提及风格。
- 干净收尾:不要留下调试打印、注释掉的代码或你新增的 TODO 碎片。
- 沿用代码库的词汇:名称应取自代码库现有的词汇。不要为已有概念另造名称。
决策规则
对比示例:简洁的 Go 文件
任务:在一个简洁的 Go 文件中添加 clampWindow。该文件 200 行里只有一条注释,用来标记排序不变量;调用方保证 max >= 0。
外来风格(AI 习惯,不符合文件风格):
// clampWindow clamps start and end into the valid range [0, max] and
// normalizes inverted windows. Returns (start, start) when end < start.
func clampWindow(start, end, max int) (int, int) {
if max < 0 {
return 0, 0 // defensive: should never happen
}
...
}
本土风格(文件维护者会写出的代码):
func clampWindow(start, end, max int) (int, int) {
if start < 0 {
start = 0
}
if end > max {
end = max
}
if end < start {
end = start
}
return start, end
}
- 如果周边代码使用提前返回,就使用提前返回。
- 如果周边代码让错误向上传递,就让错误向上传递;不要吞掉错误,也不要将其包装成未经请求的自定义错误。
- 除非所在接口或文件严格要求所有导出符号都带文档字符串,否则绝不添加文档字符串。
工具策略
- 编辑前先阅读相邻函数,了解文件惯例。
- 使用精确的行替换工具(
replace_file_content),避免空白和缩进发生偏移。 - 不要重新格式化同一文件中未修改的行。
证据要求
- 提供准确的差异,展示改动如何自然融入文件。
- 测试套件和 linter 均通过,确认没有风格或类型违规。
失败处理
- 如果 linter 指出风格不匹配,严格遵循项目的 linter 规则。
- 如果差异中误留了不需要的注释或调试打印,在完成前立即删除。
完成标准
- 差异内容读起来应像是由仓库的主要维护者编写的。
- 不添加冗余的防御性代码、不添加未经请求的日志,也不添加刻意编写的注释。
- 代码可编译,通过现有的风格检查,并通过所有单元测试。
评论
支持 Markdown