Speccanvas 是做什么的?
使用本技能生成和维护 Spec Canvas 制品,形式为可移植的 YAML 规范,或通过配置好的 SpecCanvas MCP 服务器进行持久化。
将规范视为结构和意图的唯一真实来源。偏好简洁、可复用的规范,这些规范可以直接粘贴到 Spec Canvas、IDE、终端代理或代码仓库中,无需额外解释。
使用本技能中的格式描述 YAML 文件作为编写指南。使用本技能中捆绑的 JSON Schema 副本以及本地验证逻辑作为事后检查。
核心理念
Spec Canvas 规范是产品意图和实现之间的紧凑桥梁。它们应帮助代理和人类在代码变更前就产品形态达成一致,但不应成为每次 CSS、布局或组件调整的运行日志。
- UI 规范描述意图和结构。 捕获屏幕、主要区块、导航、关键用户任务、重要状态以及有意义的响应式结构。
- 数据规范描述逻辑领域。 捕获实体、字段、枚举、关系以及领域约束;避免物理数据库或框架细节。
- 规范优先适用于语义变更。 在请求改变产品含义、用户旅程或领域结构时,先更新规范再实现。
- 实现微调可跳过规范。 如果请求是外观、布局或对用户不可见的,直接修改实现,无需触碰规范。
- 紧凑的规范是更好的规范。 优先使用简短的目的陈述,解释屏幕/区块存在的原因,而非关于如何构建的实现性描述。
粒度门
在编辑 UI 规范之前,判断所请求的变更是否具有足够的语义意义应包含在规范中。
当请求变更涉及以下内容时,更新 UI 规范:
- 屏幕、屏幕组或主要区块;
- 用户旅程、导航、入口点或可用操作;
- 重要的面向用户状态、模式、权限或空/错误/恢复流程;
- 主要组件的用途或行为;
- 有意义的响应式结构,例如不同的桌面/移动体验;
- 产品术语或标签的含义变化;
- 公共、管理、编辑、播放、引导等产品区域之间的边界。
对于实现微调,不 更新 UI 规范:
- 间距:内边距、外边距、间距、行高;
- 精确尺寸:像素值、字体大小、宽度/高度(除非表达高层布局意图);
- CSS 类、Tailwind 类、组件名、文件名或框架特定结构;
- 精确颜色、渐变、阴影、边框半径、图标或装饰性样式;
- 已描述区块内的局部对齐、排序、换行或外观性重新排列;
- 动画时序、防抖时间、淡入淡出秒数、吐司位置、加载旋转器机制;
- 浏览器/平台实现细节,除非是核心面向用户能力;
- 不改变含义的本地文案编辑;
- 对用户不可见的重构。
如果用户请求外观或布局微调,直接进行代码更改,明确避免触及 UI 规范。
默认文件放置
除非用户明确指定其他位置,否则在项目根目录下的 spec/ 目录中创建和更新 Spec Canvas 文件。
- UI 规范路径:
spec/ui-spec.yaml - 数据规范路径:
spec/data-spec.yaml
如果 spec/ 目录不存在,则创建它。当仅请求一个制品时,仅创建相关文件。
MCP 模式
当用户要求与实时 SpecCanvas 项目、文档、修订、实现、存档交互,或环境中明显存在 MCP 工具时,使用名为 speccanvas 的配置好的 MCP 服务器。
- 如果 MCP 可用,在创建或更新实时 SpecCanvas 数据之前读取 references/mcp-workflow.md。
- 如果任务创建或更新 UI 规范,还需读取 references/ui-spec-workflow.md。
- 如果任务创建屏幕实现,还需读取 references/implementation-workflow.md。
- 如果 MCP 不可用,不要虚构连接细节。使用可移植的 YAML 文件,或要求用户配置
speccanvasMCP 服务器。 - 不要将 MCP URL、Bearer Token、暂存主机或本地密钥存储在本技能中。这些应属于代理的 MCP 配置和环境变量。
MCP 模型身份规则
当通过 MCP 保存代理撰写的屏幕实现时,始终提供稳定的模型身份作为 { identityKey, provider, model, version }。
- 在调用
add_implementation之前,从全局代理规则、环境变量或当前会话解析活动模型。 - 对于
add_implementation,直接传递modelIdentity。不要将其替换为agentName。 agentName仅是手动/遗留的备用选项。仅当实现由人类上传或模型身份故意不可用时,以modelIdentity: null使用它。- 如果活动模型未知、不明确或未注册,停止并要求澄清,而不是默默使用
agentName保存。
工作流程
-
识别制品边界。 确定任务需要:
- 仅 UI 规范
- 仅数据规范
- 两个规范
- 对现有规范的解释、审查、清理或验证
- 无需规范变更(因为请求是实现微调)
- 实时的 MCP 持久化(项目、规范、修订、实现或存档)
-
应用粒度门。 对于 UI 工作,判断请求是否改变产品意图/结构,还是仅改变实现细节。如果仅是微调,保持规范不变。
-
收集源材料。 仅使用定义结构的输入:
- 产品想法或功能请求
- 现有截图或 UI 描述
- 代码库结构
- 当前 YAML 规范
- 实体列表、API 笔记或领域规则
-
读取所需工作流程和格式参考。
- 对于 UI 规范创建或修订,读取 references/ui-spec-workflow.md。
- 对于屏幕实现创建,读取 references/implementation-workflow.md。
- 对于实时 MCP 持久化,读取 references/mcp-workflow.md。
- 对于 UI 规范编写,读取 references/ui-spec-format-0-0-3.yaml。
- 对于数据规范编写,读取 references/data-spec-format-0-0-1.yaml。
- 对于本地验证行为和审查启发式方法,根据需要读取 references/workflow.md、references/validation-rules-ui.md 和 references/validation-rules-data.md。
- 当前捆绑的模式位于 schemas/ui-spec.schema.json 和 schemas/data-spec.schema.json。
-
起草或修订规范。 保持文档为有效的 YAML,并保持在格式字段内。除非格式明确允许,否则不要发明自定义顶级部分。进行最小的语义更新以保留意图;不要用像素级实现笔记扩展规范。
-
验证结果。 如果 scripts/validate-spec.mjs 可用,在返回结果前针对最终 YAML 运行它。在返回规范前修复验证错误。
-
返回结果。 返回验证后的 YAML,或者对于审查任务,先返回问题,然后返回修正后的代码片段或文件。
核心规则
使用格式文件作为编写来源
格式描述 YAML 文件是本技能的主要编写参考。首先遵循其结构、字段命名、示例和指导。对于 UI 规范,references/ui-spec-format-0-0-3.yaml 是当前的本地真值来源,并预期与捆绑的模式和验证器保持一致。
使用模式验证作为事后检查
模式验证不是编写指南。它是最终的验证步骤。
- 从格式文件编写规范。
- 使用
scripts/validate-spec.mjs验证编写的规范。 - 在返回最终 YAML 之前修复模式和验证规则失败。
schemas/ 中捆绑的模式应与 Spec Canvas 实现以及本技能中的格式描述参考保持同步。如果它们似乎不同,请将其视为技能错误,并明确指出,而不是默默发明折衷方案。
保持 UI 和数据对齐
当两个规范都存在时:
- 匹配屏幕、实体和操作之间的命名
- 确保 UI 操作暗示真实的实体或工作流程
- 确保数据规范关系支持 UI 结构
- 标记差距,而不是默默发明后端概念
保持格式可移植
生成可存放在仓库中并由任何代理重用的纯 YAML 文件。不要使规范依赖于 Spec Canvas UI 状态、隐藏元数据或仅聊天的假设。
保持 UI 规范高于实现细节
不要将 UI 规范用作 CSS、组件文档或变更日志的替代品。良好的 purpose 从用户角度解释屏幕或区块的用途。不应列举精确的间距、类名、像素大小、瞬态实现机制或每个小控件(如果这些细节不改变产品含义)。
任务模式
创建新的 UI 规范
- 从
docType、format_version和metadata开始。 - 在 UI 规范中,
metadata.description是必需的,应承载顶级产品意图。 - 一旦知道主要应用形状,立即添加
screens。 - 当用户希望看到可见结构时添加
blocks;在探索阶段可以省略blocks。 - 仅当它们有实质性帮助时,才添加
templates、navigation或响应式字段。 - 当前本地格式支持的 UI 响应式编写包括
metadata.breakpoints、自适应screen.template、自适应block.columns和block.visible。 - 保留原始格式文件的约定,包括 UI 格式文件中的引号指导。
- 在可用时使用
scripts/validate-spec.mjs验证完成后的文件。
创建新的数据规范
- 描述逻辑领域模型,而非物理数据库。
- 仅在共享受控词汇表重要时添加
enums。 - 使用具有业务意义的
fields定义entities。 - 使用
relations进行逻辑跨实体结构。 - 避免泄露仅与实现相关的问题,如索引、迁移或 ORM 特定语法,除非用户明确在规范之外请求它们。
- 在可用时使用
scripts/validate-spec.mjs验证完成后的文件。
审查或修复现有规范
检查:
- 无效或不支持的字段
- 缺少必需部分
- 损坏的屏幕、模板或导航引用
- 数据规范中的枚举、外键或关系错误
- 本地验证规则暴露的自定义验证失败
- 原始格式文件与当前本地实现之间的模式-格式不匹配
- 描述实现机制而非产品意图的过于详细的 UI
purpose文本
修复时,保留原始产品意图,并进行最小的修正以恢复清晰性。
压缩过度详细的 UI 规范
- 保持现有屏幕、模板、区域和区块 ID 稳定,除非产品结构确实变化。
- 将长的
purpose段落替换为面向用户意图的单句摘要。 - 保留屏幕、主要区块、导航、重要状态和有意义的模式。
- 移除 CSS/布局微观细节、平台怪癖、精确时序、日志行为和组件内部机制。
- 避免整个文件的 YAML 重新格式化;使用有针对性的编辑,使差异保持可审查。
- 编辑后验证。
从现有应用重建规范
- 从可见工作流程推断屏幕
- 从重复区域和用户任务推断区块
- 从领域名词和状态变化推断实体
- 区分观察到的和猜测的
- 当源材料不完整时,明确指出不确定性
验证
在可用时使用 scripts/validate-spec.mjs。
- 输入:YAML 规范文件的路径
- 从
docType检测文档类型 - 针对本技能捆绑的 JSON Schema 进行验证
- 运行相关的自定义验证规则
- 将警告视为建议
- 错误视为最终输出的阻塞项(当返回修正后的规范时)
如果由于缺少本地 Spec Canvas 依赖项而无法运行脚本,简要说明并回退到使用格式文件和验证规则引用进行手动审查。
输出期望
当返回规范时:
- 提供有效的 YAML
- 在格式期望的地方保持 ID 为 snake_case
- 保持字段名称与格式文件定义的完全一致
- 当假设对结构产生实质性影响时提及
- 提及是否运行了验证
当返回审查而非重写的文件时:
- 首先列出结构性问题
- 然后给出具体修复方案
- 如果有用,提供修正后的代码片段或完整规范