关于 add-functional-spec
add-functional-spec 用于在 .plain 模块中编写一条功能规格,并指导复杂度、冲突、清晰度、顺序及可选一致性测试检查。
主要功能
- 01起草并精简规格
- 02检查复杂度限制
- 03批量分析冲突
- 04明确外部接口
- 05添加一致性测试
适用场景
- 01添加一项功能需求
- 02检查规格与现有行为的冲突
- 03为规格准备测试场景
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ plainlang/ plain-forge --skill add-functional-spec安装后在 Claude Code 中输入/add-functional-spec确认已加载。
详细介绍
原文在翻译后有更新,译文可能不是最新。
添加功能规格
始终使用技能 load-plain-reference 获取纯文本语法规则——但仅在你尚未获取这些规则时使用。
工作流
- 确定目标
.plain文件。 如果无法确定,请询问用户。 - 通读整个文件,了解现有定义、实现要求和所有当前功能规格(包括
requires模块中的规格)。 - 起草功能规格,遵循以下规则,然后对草稿应用
concise-specs.md中的审查流程——在进行任何其他检查之前,将措辞精简到不遗漏任何事实的最简形式。 - 分析复杂度——使用
analyze-if-func-spec-too-complex技能,验证起草的规格意味着 ≤ 200 行代码。如果过于复杂,使用break-down-func-spec技能拆分,然后从第 3 步开始,对每个拆分后的规格重复流程。 - 检查冲突,涵盖所有现有功能规格——这一步至关重要。将新规格与所有现有规格(文件内及任何
requires链中的规格)作为一个批次,仅运行一次analyze-func-specs。批量分析器会在一次调用中返回所有冲突的规格对——不要逐对调用分析器。对于其报告的每个冲突对,运行resolve-spec-conflict处理该对;每次解决冲突后,对已处理的规格集重新运行analyze-func-specs,直到判定结果为COMPATIBLE。 - 将规格追加到
***functional specs***部分的末尾(规格按时间顺序排列;新规格放在最后)。 - 再次阅读文件,确认位置和语法正确。
规则
复杂度限制
每个功能规格意味着最多 200 行代码变更。如果需求过大,使用 break-down-func-spec 技能将其拆分为多个较小且相互独立的规格。不要在规格文本中包含代码行数估算。
时间顺序
规格按从上到下的顺序逐步渲染。渲染器不了解未来的规格——上下文中只有之前渲染的规格。这意味着:
- 新规格可以引用之前规格定义的行为。
- 新规格不能假设后续规格包含任何内容。
- 如果新规格必须位于某个未来规格之前,请将其放在正确的位置;否则追加到末尾。
语言无关性
描述行为、概念和领域逻辑,而非实现构造。避免使用特定语言的类型、泛型语法、框架注解或其他与特定语言或框架绑定的构造。通用技术术语(空值、JSON 类型、HTTP 状态码等)可以使用。特定语言的指导应放在 ***implementation reqs*** 中。
不得冲突
新规格不得与任何现有功能规格矛盾。冲突规格是代价最高的结果。添加前,请审查所有现有规格并确认新规格与之兼容。使用 analyze-func-specs 在一次批量调用中检查新规格与所有现有规格——它会列出所有冲突对,因此无需逐对调用分析器。如果存在歧义,请添加明确细节,消除任何相互冲突的解读。对于批量分析器报告的每个冲突对,使用 resolve-spec-conflict 技能诊断并修复,然后再继续。
消除歧义
每个功能规格都必须明确无歧义——渲染器只能有一种合理的解读。如果单行内容不足以完全明确行为,请使用嵌套子弹点补充细节。嵌套行用于阐明父规格,不会引入独立功能。即使有嵌套细节,规格仍须意味着 ≤ 200 行代码。
***functional specs***
- A :User: can send a :Message: to a :Conversation:.
- A :Message: must have non-empty content.
- The :Message: is appended to the end of the :Conversation:.
- All :Participant: members of the :Conversation: can see the new :Message:.
确定性接口
规格必须足够详细,让开发者无需阅读生成的代码即可使用构建完成的软件。所有外部接口都必须明确——REST 端点路径和 HTTP 方法、CLI 命令名称和参数、文件格式、消息架构等。绝不能将接口细节留给渲染器自行决定。
封装
功能必须在规范文本中自成一体。requires 模块只导入功能规范,因此不要依赖实现需求来传达行为,因为下游模块看不到这些内容。
验收测试
如果需要验证功能规范,请在插入规范后使用 add-acceptance-test 技能添加验收测试。
验证清单
- 规范预计导致的代码变更不超过 200 行
- 不与任何现有功能规范冲突
- 使用与语言无关的术语编写(不涉及特定语言或框架)
- 明确所有外部接口(端点路径、方法、CLI 参数、格式等)
- 所有引用的
:Concepts:均在***definitions***中定义 - 句子简短、清晰且明确
- 按
concise-specs.md的要求精简:不包含显而易见的内容、理由、无法验证的形容词或模棱两可的措辞,通篇使用简单词语 - 不与现有规范重复
- 放置在正确的时间顺序位置(通常在末尾)