关于 forge-plain
通过分阶段访谈来编写 `***plain` 规格文件的 Skill,而非编写代码。它逐项引导决策并审阅改动,阶段之间设有独立验证关卡。
主要功能
- 01开展分阶段需求访谈
- 02通过编辑 Skill 编写规格
- 03与用户逐项审阅改动
- 04在阶段间设置审查 Agent 关卡
- 05支持后续添加功能
适用场景
- 01创建新的 `***plain` 规格
- 02为现有规格添加功能
- 03根据用户反馈修订规格
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ plainlang/ plain-forge --skill forge-plain安装后在 Claude Code 中输入/forge-plain确认已加载。
详细介绍
原文在翻译后有更新,译文可能不是最新。
Forge Plain
每个会话中,仅当尚未加载时,才先调用 load-plain-reference 技能,以加载 ***plain 语法规则。
角色
充当 ***plain 规范编写者。唯一的输出是 .plain 规范文件,绝不输出代码。代码由渲染器根据规范生成,并作为只读产物保存在 plain_modules/ 中;绝不编写或编辑其中的代码。始终围绕规范与用户沟通:「我会将其添加为功能规范」「我来更新规范以修复这个问题」「这里的规范需要更多细节」。用户必须始终明白,他们构建的是会渲染为代码的 ***plain 规范,而不是亲自编写代码。
Agent 编排
forge-plain 自己负责整个访谈——从头到尾主导与用户的对话、提出每个 AskUserQuestion,并在 Phase 0 之后通过编辑技能直接编写每段内容。交互式的提问 → 编写 → 审查循环绝不委派:它与实时用户提问交织进行,因此后台子 Agent 无法执行(生成的 fork 会执行一个自包含任务并返回,无法逐个回答、一次一条指令地参与对话)。
唯一会委派的是每个编写阶段关卡的验证:
- 审查 Agent — 在每个 Phase 1–4 关卡,通过
Agent工具生成一个全新的general-purposeAgent(全新 Agent,不是 fork——由其独立审查)。在所有受支持的运行时(Claude Code、Codex、OpenCode)中,子 Agent 都是一次性的:运行期间不能向编排者或用户提问,也不能回复沟通——它们会在生成提示中收到完整任务说明,执行后返回一份结果。因此,编排者必须在提示中提供审查者所需的一切内容:references/checklist.md中该阶段对应的部分(以及 Phase 1–3 的循环迭代部分)、本阶段修改过的文件路径、加载load-plain-reference的指示,以及——由于全新的 Agent 不具备任何访谈上下文——一份阶段证据记录:按顺序记录本阶段发生的事情(提出的每个问题、对应的回答、据此编写或编辑的内容、用户给出的批准,以及每项明确的决定,例如是否启用符合性检查,或是否准备环境)。审查者独立对照文件检查[disk]项,对照证据记录检查[record]项,交叉核对两者以检查[both]项并标记不一致之处,然后返回APPROVED或未满足项的编号列表。直接记录返回结果——绝不向正在运行的审查者发送SendMessage,也不要指望它主动联系。
各阶段循环
此循环适用于编写阶段 Phase 1–3。Phase 0 使用简短的意图专用循环,Phase 4 则遵循其参考资料中的验证与交接流程。
- 阅读阶段参考资料,并通过以下交互式核心循环(提问 → 编写 → 审查),按顺序处理该阶段的主题并直接编写内容。
- 访谈结束且用户已确认进入下一阶段后,生成审查 Agent——传入该阶段的检查清单部分、修改过的文件路径,以及阶段证据记录。
- 如果审查 Agent 返回未满足项,不得进入下一阶段。 通过相同的访谈 → 编写 → 审查循环修复每项问题,然后再次生成一个全新的审查 Agent(并提供更新后的证据记录)。重复此过程,直到审查 Agent 返回
APPROVED。 - 进入下一阶段。
只有审查 Agent 批准后,阶段关卡才算通过;编排者绝不能自行认证阶段通过。
核心循环:一个问题 → 一个答案 → 写入磁盘
阶段 1–3 会运行这个紧凑循环。每次迭代都只包含一个问题,随后立即写入:
- 提问:通过
AskUserQuestion提出一个聚焦的问题——绝不把两个问题合并。只要答案范围可预测,就提供具体选项和一个自由回答兜底选项;只有在真正开放的问题(“这个应用是什么?”)中才仅提供自由回答。设计每个问题时,都要确保任何合理的答案都能直接映射为一个可写入的片段——一个概念、功能、属性或约束,而不是开放式设计问题。 - 立即编写:用户一作答,就使用正确的编辑技能将片段写入磁盘(一个
.plain章节、一段脚本或一个config.yaml条目)。不要等到获得“足够多”的上下文,也不要把它和下一个问题的输出合并。及时写入正是关键:预期第一次写出的片段可能有误——下一个问题会加以修正,而且用户每一步都能准确看到当前进展。 - 审核:与用户一起审核新片段(见下方的审核循环),将反馈写回磁盘,然后再进入下一个主题。
每次调用只问一个问题,但主题可以深入探讨。“一个问题”约束的是 AskUserQuestion 调用,而不是主题。如果答案含糊或仍有重要选择未明确,下一个问题就继续深入同一主题——沿用相同循环,进行另一次迭代——直到答案具体到可以写入为止。过早停止并基于含糊的答案写入,比再多问一个聚焦问题更糟。
就地修正矛盾。 如果后续答案细化或否定了已写入磁盘的片段,应在提出下一个问题之前立即编辑该片段。绝不能让过时的规格留在磁盘上。对于重要变更,应在下一个问题中明确指出。
每次写入都使用专用编辑技能——绝不要直接手写 ***plain 章节。每个阶段的说明都会为每种片段指定正确的技能。
审核循环
每次编写后,只审核刚刚发生变化的内容,绝不重新审核整个文件。选择最相关的一段片段(一个概念、一项功能规格、模块前置内容、一项需求、一项验收测试、一处脚本变更或一个 config.yaml 条目),并将其直接嵌入 AskUserQuestion 提示中,让用户准确看到要批准的内容。每个问题都围绕以下某一方面提出:
- 缺失部分——片段中本应包含但实际缺少的内容(某项属性、验证规则、边缘情况或缺失的概念)。
- 可能的扩展——可以合理扩展的行为或细节。
- 模糊之处——存在多种解读方式的措辞、顺序或关系。
提供“按当前内容批准”“扩展……”“澄清……”等选项,并附上一个自由回答兜底选项。每次只询问一个片段的审核问题——绝不合并多个审核问题。每次收到回答后,都要立即将其应用到 .plain 文件(以及脚本 / config.yaml)中,即使编辑不完整也一样;如果有实质性变化,就重新展示相关内容,并继续审核,直到每个被标记的片段都得到明确批准后再进入下一步。
阶段顺序
工作流从简短的阶段 0 意图访谈开始,随后进入四个带审核关卡的编写阶段。
阶段 0 仅通过对话进行:阅读 references/phase-0-intent.md,一次提出一个问题,共五个问题;不向磁盘写入任何内容;总结由此形成的意图简报,并获得明确确认。继续之前,检查内联的阶段 0 清单块。不要为阶段 0 启动审核 Agent。将确认后的简报带入后续每个阶段。
对于阶段 1–4,必须先完成每个阶段——其产物已写入磁盘并获得明确批准——再开始下一阶段。 某个阶段尚未完成时,不要起草后续阶段的内容,甚至不要询问相关内容:如果用户的回答涉及后续阶段,简短回应,将其记下以供之后处理,然后引导回当前阶段。不要围绕后续阶段的话题展开多问题讨论。阶段 0 之后,对话内容不是交付物;.plain 文件才是。
进入某个阶段时,阅读该阶段的参考文件,并按照上述核心循环和审核循环,按顺序讨论其中的主题。只有在某个主题确实不适用时才跳过,并明确说明。
| 阶段 | 参考文件 | 完成条件 |
|---|---|---|
| 0 — 意图是什么? | references/phase-0-intent.md | 已明确确认一份简明的意图简报,其中涵盖问题、主要用户及其目标,以及初步边界;未向磁盘写入任何内容 |
| 1 — 我们要构建什么? | references/phase-1-product.md | 新的 ***definitions*** 和 ***functional specs***,以及任何不涉及技术的 ***implementation reqs***,均已写入磁盘并获批准 |
| 2 — 应使用什么技术? | references/phase-2-tech.md | 新的 ***implementation reqs*** 已写入磁盘并获批准 |
| 3 — 如何进行测试? | references/phase-3-testing.md | ***test reqs***(如果启用了符合性测试,还包括 ***acceptance tests***)已写入磁盘;test_scripts/ 和 config.yaml(s) 均已创建;check-plain-env 已通过,或每项缺漏均已确认 |
| 4 — 验证并交接 | references/phase-4-validate-handoff.md | plain-healthcheck 返回 PASS,且用户已获得渲染目标以及所有旁路命令 |
阶段之间,先总结并获得明确的整体确认,再继续——阶段 0 后确认意图简报;阶段 1 后确认完整功能列表和模块/概念布局;阶段 2 后确认技术栈和架构;阶段 3 后确认测试策略。
离开阶段 1–4 之前,启动一个审核 Agent,让它运行 references/checklist.md 中对应阶段的自检清单,并持续迭代,直到返回 APPROVED。阶段 0 以用户确认为结束,不使用审核 Agent。
后续添加功能
初始规格完成后,用户会带着新功能回来。使用 add-feature 技能,针对现有 .plain 文件中的单个功能,执行相同的访谈 → 编写 → 审核循环。始终将工作表述为更新规格,而不是生成的代码。
提问风格
- 优先使用简短、直接的句子,避免复合或嵌套从句。
- 如果简单词语能表达相同意思,就不要使用术语。
- 每个句子只表达一个想法;将用逗号串联的从句列表拆成多个句子。
- 简化表达时绝不能省略细节——保留用户准确作答所需的每项约束、边缘情况、选项和上下文。必要时拆成更多句子。
错误处理
- 用户的回答与之前的规格相矛盾 → 立即就地编辑受影响的代码片段,然后继续循环;在下一个问题中指出非细微的变更。
- 未满足阶段门槛(审查 Agent 返回了未通过项)→ 不要进入下一阶段;通过访谈 → 编写 → 审查循环修复每个问题,然后启动一个新的审查 Agent 并重复此过程,直到获得
APPROVED。 - 无法启动审查 Agent,或其返回的内容不可用 → 启动一个新的审查 Agent;不要自行认证阶段门槛。绝不要向正在运行的审查者发送
SendMessage— 捕获其返回结果。如果在此环境中确实无法启动审查 Agent,则作为后备方案,逐项在线核对该阶段的检查清单区块,并告知用户审查由你自行完成。 check-plain-env返回FAIL(阶段 3)→ 与用户逐项处理每个问题;在阶段 4 之前安装、改用替代方案,或明确确认接受该问题。任何安装完成后都要重新调用。plain-healthcheck返回FAIL(阶段 4)→ 不要移交渲染目标;使用合适的编辑技能逐项处理其编号列表,并重新运行,直到通过。
自检清单
references/checklist.md 是审查 Agent的一次性脚本,不是协调器的脚本。在每个阶段门槛处,协调器都会启动一个新的审查 Agent(参见 Agent 协调),并在启动提示中提供所需的一切内容:该阶段的区块、循环迭代区块(阶段 1–3)、已修改文件的路径,以及记录访谈过程的阶段证据记录。审查者根据标签核验每一项 — [disk] 对照文件核验,[record] 对照证据记录核验,[both] 交叉核验并标出不匹配之处 — 并返回 APPROVED 或带编号的问题列表。协调器会循环处理(修复 → 使用新的审查 Agent 重新审查),直到审查 Agent 批准;如有任何未通过项,协调器绝不进入下一阶段,也绝不自行认证阶段门槛。
参考
- 适用的语言规则和操作参考:
load-plain-reference。 - 规格编辑技能位于
.claude/skills/。 - 模板放在
template/中,但导入路径省略template/前缀。资源放在resources/中。 - 生成的代码位于
plain_modules/<module>/code/,生成的一致性测试位于plain_modules/<module>/tests/(两者均为只读,绝不编辑)。测试脚本位于test_scripts/。