figma-cache-toolchain 2.0.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -0
- package/cursor-bootstrap/AGENT-SETUP-PROMPT.md +11 -1
- package/cursor-bootstrap/examples/ui-1to1-preflight.template.md +80 -0
- package/cursor-bootstrap/rules/00-output-token-budget.mdc +16 -13
- package/cursor-bootstrap/rules/01-figma-cache-core.mdc +39 -112
- package/cursor-bootstrap/rules/03-figma-ui-implementation-hard-constraints.mdc +91 -0
- package/cursor-bootstrap/rules/04-ui-baseline-governance.mdc +86 -0
- package/cursor-bootstrap/skills/figma-mcp-local-cache/SKILL.md +23 -175
- package/cursor-bootstrap/skills/figma-ui-dual-mode-execution/SKILL.md +50 -0
- package/cursor-bootstrap/skills/ui-baseline-governance/SKILL.md +51 -0
- package/figma-cache/js/cursor-bootstrap-cli.js +16 -0
- package/package.json +5 -3
package/README.md
CHANGED
|
@@ -70,6 +70,20 @@ npm run figma:cache:validate
|
|
|
70
70
|
|
|
71
71
|
---
|
|
72
72
|
|
|
73
|
+
## Cursor 模板固定流程(强制建议)
|
|
74
|
+
|
|
75
|
+
- 单一真源:仅手工维护 `cursor-bootstrap/` 下的 rules/skills。
|
|
76
|
+
- 镜像目录:`.cursor/` 视为生成产物,不手工编辑。
|
|
77
|
+
- 日常步骤:
|
|
78
|
+
1) 修改 `cursor-bootstrap/*`
|
|
79
|
+
2) 运行 `npm run cursor:shadow:sync`
|
|
80
|
+
3) 运行 `npm run cursor:shadow:check`
|
|
81
|
+
- 守护机制:
|
|
82
|
+
- CI 会执行 `cursor:shadow:check`,若 `.cursor` 与 `cursor-bootstrap` 不一致将直接失败。
|
|
83
|
+
- `npm test` 与 `prepack` 也已包含该检查,避免本地漏同步。
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
73
87
|
## 默认 completeness 与 token 开销
|
|
74
88
|
|
|
75
89
|
默认 completeness:`layout,text,tokens,interactions,states,accessibility`(默认不含 `flow/assets`)。
|
|
@@ -3,9 +3,12 @@
|
|
|
3
3
|
> **给 Cursor Agent 的指令**:你正在操作的是**用户业务项目**的根目录。以下文件应已存在(由 `npx figma-cache cursor init` 从 npm 包 **`{{NPM_PACKAGE_NAME}}`** 复制到当前仓库根):
|
|
4
4
|
> - `.cursor/rules/01-figma-cache-core.mdc`
|
|
5
5
|
> - `.cursor/rules/00-output-token-budget.mdc`(通用低 token 输出基线)
|
|
6
|
+
> - `.cursor/rules/04-ui-baseline-governance.mdc`(UI 全局基线治理:新项目/老项目双轨 + 生成约束)
|
|
6
7
|
> - `.cursor/rules/02-figma-stack-adapter.mdc`(**占位**,任务完成后需删除)
|
|
7
8
|
> - `.cursor/rules/figma-local-cache-first.mdc`(可选保留)
|
|
8
9
|
> - `.cursor/skills/figma-mcp-local-cache/SKILL.md`
|
|
10
|
+
> - `.cursor/skills/ui-baseline-governance/SKILL.md`(执行清单:基线判定与落地步骤)
|
|
11
|
+
> - `.cursor/skills/figma-ui-dual-mode-execution/SKILL.md`(仅给 nodeId/链接即可触发端到端 UI 实现)
|
|
9
12
|
> - `figma-cache.config.js`(示例 `postEnsure`:目录级 adapter hint + 可选 `docs/figma-flow-readme.md`)
|
|
10
13
|
> - (兼容旧项目)`figma-cache.config.example.js` 可能存在;仅当内容被用户自定义且无法安全迁移时保留
|
|
11
14
|
|
|
@@ -35,9 +38,16 @@
|
|
|
35
38
|
- 用简短列表向用户汇报:新建/修改/删除了哪些路径。
|
|
36
39
|
- 若项目根**尚无** `figma-cache/index.json`,提示用户执行:`npm run figma:cache:init`(若已加 script)或 `npx figma-cache init`(与 `cursor init` 不同,用于创建空索引与缓存目录)。
|
|
37
40
|
- 提示用户在本项目根执行:`npm run figma:cache:validate`(若已加 script)或 `npx figma-cache validate`。
|
|
38
|
-
- 说明:后续 Figma 相关对话将主要由 **01 Core + 新 Adapter + Skill**
|
|
41
|
+
- 说明:后续 Figma 相关对话将主要由 **01 Core + 新 Adapter + figma-mcp-local-cache Skill** 驱动;涉及全局样式与组件生成稳定性时叠加 **04-ui-baseline-governance + ui-baseline-governance Skill**。
|
|
39
42
|
- **可选**:若项目已通过 `cursor init` 同步 `figma-cache/docs/colleague-guide-zh.md`,提示团队默认只使用 **§5.1「最推荐主提示词」**,只有特殊诉求再追加 **§5.2** 的一句附加要求。
|
|
40
43
|
|
|
44
|
+
8. **UI 全局基线治理(强烈推荐,与 UI 实现任务绑定)**
|
|
45
|
+
- 确认 `.cursor/rules/04-ui-baseline-governance.mdc` 与 `.cursor/skills/ui-baseline-governance/SKILL.md` 已存在于项目根(随 `cursor init` 同步);若缺失,从 npm 包内 **`cursor-bootstrap/rules/`** 与 **`cursor-bootstrap/skills/`** 补拷到当前仓库 `.cursor/`,并提示团队升级 **`{{NPM_PACKAGE_NAME}}`** 版本以便后续 init 自带。
|
|
46
|
+
- 读取 **`04-ui-baseline-governance.mdc` §1.0**:按机械启发式判定「新项目 / 老项目」,在汇报中写明**结论 + 命中证据**(文件路径、计数、依赖名)。
|
|
47
|
+
- 按判定结果执行:新项目可规划一次性全局基线;老项目仅允许分层/分批/可回滚方案,禁止首轮全量全局 reset 叠加大规模业务重构。
|
|
48
|
+
- 在 Cursor 中建议团队对「写业务 UI / 调全局样式」类任务 **@** 引用:`04-ui-baseline-governance.mdc` 或 `ui-baseline-governance` Skill,以统一生成行为(`border-box` 假设、flex 溢出、弹层锚定、图标策略等)。
|
|
49
|
+
- 降噪策略:默认使用短流程;仅在老项目、高风险任务或冲突场景升级严格流程。`ui-1to1-preflight.template.md` 仅在严格流程下强制填写,短流程可只输出精简事实清单。
|
|
50
|
+
|
|
41
51
|
## 输出与 token 约束(强制)
|
|
42
52
|
- 默认“只要结果”:不输出思考过程,不粘贴 MCP 长回包。
|
|
43
53
|
- 执行 Figma MCP 后,用户可见回复只保留:缓存状态、调用次数、产物路径、校验结论、失败修复动作。
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# UI 1:1 实现前预检模板
|
|
2
|
+
|
|
3
|
+
> 用途:在“开始写组件前”完成事实快照、状态对照与预检,降低返工。
|
|
4
|
+
> 适用:Figma 缓存驱动实现(任意 nodeId)。
|
|
5
|
+
|
|
6
|
+
## 0. 基本信息
|
|
7
|
+
|
|
8
|
+
- fileKey:
|
|
9
|
+
- nodeId:
|
|
10
|
+
- cachePath:
|
|
11
|
+
- 实现目标页面/组件路径:
|
|
12
|
+
- 执行模式(短流程 / 严格流程):
|
|
13
|
+
|
|
14
|
+
## 1. 设计值快照(Design Facts)
|
|
15
|
+
|
|
16
|
+
### 1.1 结构与尺寸
|
|
17
|
+
|
|
18
|
+
- 根容器(宽/高/圆角/边框/背景):
|
|
19
|
+
- 关键子容器尺寸:
|
|
20
|
+
- 宽度策略(固定 / 自适应,仅可选一):
|
|
21
|
+
- 对齐策略(左/右/居中):
|
|
22
|
+
|
|
23
|
+
### 1.2 文案
|
|
24
|
+
|
|
25
|
+
- 标签文本:
|
|
26
|
+
- 值文本:
|
|
27
|
+
- 选项文本:
|
|
28
|
+
|
|
29
|
+
### 1.3 Token
|
|
30
|
+
|
|
31
|
+
- 字体(size/line-height/weight/letter-spacing):
|
|
32
|
+
- 主文本色:
|
|
33
|
+
- 次文本色:
|
|
34
|
+
- 背景色:
|
|
35
|
+
- 边框色:
|
|
36
|
+
- 状态色(hover/focus/selected):
|
|
37
|
+
|
|
38
|
+
### 1.4 交互与语义
|
|
39
|
+
|
|
40
|
+
- 交互触发(click/esc/outside/keyboard):
|
|
41
|
+
- 语义角色(combobox/listbox/option 等):
|
|
42
|
+
- 禁止项(本任务):
|
|
43
|
+
|
|
44
|
+
## 2. 状态对照表(必须填写)
|
|
45
|
+
|
|
46
|
+
| 状态 | 背景 | 边框 | 文本 | 图标 | 数据状态 | 是否实现 |
|
|
47
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
48
|
+
| default | | | | | | [ ] |
|
|
49
|
+
| hover | | | | | | [ ] |
|
|
50
|
+
| focus | | | | | | [ ] |
|
|
51
|
+
| active | | | | | | [ ] |
|
|
52
|
+
| expanded | | | | | | [ ] |
|
|
53
|
+
| selected | | | | | | [ ] |
|
|
54
|
+
| unselected | | | | | | [ ] |
|
|
55
|
+
| disabled(若存在) | | | | | | [ ] |
|
|
56
|
+
|
|
57
|
+
## 3. 1:1 预检清单(实现前)
|
|
58
|
+
|
|
59
|
+
- [ ] 已读取 `spec.md` / `raw.json` / `state-map.md` / `mcp-raw-get-design-context.txt`
|
|
60
|
+
- [ ] 冲突裁决规则确认:`mcp-raw-get-design-context.txt` 优先
|
|
61
|
+
- [ ] 全组件盒模型策略一致(建议 `box-border`)
|
|
62
|
+
- [ ] 文本溢出策略明确(`min-w-0` + `truncate` 或等效)
|
|
63
|
+
- [ ] 弹层锚定触发器(非页面硬编码定位)
|
|
64
|
+
- [ ] 图标策略确认(项目图标库优先;兜底 `inline svg`)
|
|
65
|
+
- [ ] 禁止使用 Figma 临时远程资产 URL 作为运行时图标
|
|
66
|
+
- [ ] 禁止无意义标签嵌套
|
|
67
|
+
- [ ] 默认无横向滚动
|
|
68
|
+
|
|
69
|
+
## 4. 实现后验收(最小)
|
|
70
|
+
|
|
71
|
+
- [ ] 改动文件 lint 通过
|
|
72
|
+
- [ ] 关键状态可见且可切换(至少 default/expanded/selected/unselected)
|
|
73
|
+
- [ ] 关键视觉项(尺寸/对齐/图标居中)通过
|
|
74
|
+
- [ ] 输出“设计值 -> 代码映射”
|
|
75
|
+
|
|
76
|
+
## 5. 失败反馈(固定三段)
|
|
77
|
+
|
|
78
|
+
1. 失败原因
|
|
79
|
+
2. 定位信息(文件/字段/样式项)
|
|
80
|
+
3. 修复动作
|
|
@@ -5,22 +5,25 @@ alwaysApply: true
|
|
|
5
5
|
|
|
6
6
|
# Output Token Budget(通用)
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
适用于所有任务。默认只输出“可执行结果”,避免过程噪音与长回包。
|
|
9
9
|
|
|
10
|
-
##
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
10
|
+
## 默认策略(强制)
|
|
11
|
+
- 结果优先:只给结论、关键变更、验证结果、下一步。
|
|
12
|
+
- 原文最小化:不贴 MCP/终端长日志;仅在用户明确要求时展示。
|
|
13
|
+
- 文件优先:大内容落盘,回复只给路径与摘要。
|
|
14
|
+
- 进度最小化:默认不发中间过程;仅在阻塞/失败时反馈。
|
|
15
15
|
|
|
16
16
|
## 任务分级(强制)
|
|
17
|
-
- UI
|
|
18
|
-
-
|
|
17
|
+
- UI/组件实现:读取完整设计证据,回复仅给最终差异与验证。
|
|
18
|
+
- 逻辑/流程/校验:优先 `raw.json` / `spec.md` / `manifest`,避免读无关大文件。
|
|
19
19
|
|
|
20
|
-
##
|
|
21
|
-
-
|
|
22
|
-
- 中间进度最多 1 条(长任务可 2 条),其余一次性收敛到最终结果。
|
|
23
|
-
- 失败反馈固定三段:失败原因、定位信息、修复动作。
|
|
20
|
+
## 失败反馈格式(强制)
|
|
21
|
+
- 固定三段:失败原因 / 定位信息 / 修复动作。
|
|
24
22
|
|
|
25
23
|
## 例外
|
|
26
|
-
-
|
|
24
|
+
- 用户明确要求“完整输出/日志/原文”时可放宽上述限制。
|
|
25
|
+
|
|
26
|
+
## 模板维护约定(强制)
|
|
27
|
+
- `cursor-bootstrap` 是规则/技能模板唯一手写来源。
|
|
28
|
+
- 仓库内 `.cursor/*` 视为镜像产物,不作为手工编辑入口。
|
|
29
|
+
- 模板变更后执行 `npm run cursor:shadow:sync`,再提交。
|
|
@@ -5,116 +5,43 @@ alwaysApply: true
|
|
|
5
5
|
|
|
6
6
|
# Figma Cache Core(数据层)
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
##
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
- 同轮或断续出现多个 Figma 链接,且存在明确先后或串联意图(如 A->B)
|
|
48
|
-
- 单链接且无关系意图、仅视觉微调、仅资产导出时,禁止自动追加 `flow`
|
|
49
|
-
9. **两阶段拉取**:先按最小必要工具取数并检查字段缺口;仅在缺口存在时进入第二阶段补调工具。
|
|
50
|
-
10. **写入一致性门禁(强制)**:当 `source=figma-mcp` 或输出来源标注 MCP 时,节点目录必须存在 `mcp-raw/` 与对应原始文件;若缺失则视为未完成,必须停止并报告,不得宣称“更新成功”。
|
|
51
|
-
11. **严格证据门禁(强制)**:当 `source=figma-mcp` 且未显式传入 `--allow-skeleton-with-figma-mcp` 时,`upsert/ensure` 必须在写入前校验 `mcp-raw` 证据:
|
|
52
|
-
- `layout` 至少命中 `get_metadata` 或 `get_design_context`
|
|
53
|
-
- `text/interactions/states/accessibility/flow/assets` 必须命中 `get_design_context`
|
|
54
|
-
- `tokens` 必须命中 `get_variable_defs`
|
|
55
|
-
任一维度缺证据即失败退出,不得写入成功状态。
|
|
56
|
-
12. **严格 validate(强制)**:`validate` 不仅校验索引字段,还校验证据完整性:
|
|
57
|
-
- `completeness` 声明的维度必须在 `raw.json.coverageSummary.evidence` 中提供非空证据
|
|
58
|
-
- 对 `source=figma-mcp` 且声明 `interactions/states/accessibility` 的节点,禁止保留 TODO 占位内容
|
|
59
|
-
13. **大文件读取策略(强制)**:
|
|
60
|
-
- **UI 还原/像素对齐/组件实现任务**:默认必须读取 `mcp-raw-get-design-context.txt` 全文,不反复讨论是否需要读取。
|
|
61
|
-
- **非 UI 任务**(命中检查、预算统计、校验、流程维护):默认仅读取 `raw.json` / `spec.md` / `mcp-raw-manifest.json`。
|
|
62
|
-
14. **闭环校验(强制)**:每次 **`npm run figma:cache:upsert`** 或 **`npm run figma:cache:ensure`** 成功结束后,**自动静默**执行 `npm run figma:cache:validate`。
|
|
63
|
-
15. validate 失败 → **自行修复并重复 validate 直至通过**,不得宣称缓存已就绪。
|
|
64
|
-
16. **不写前端**:本阶段禁止输出业务组件实现;若用户要求写 UI,在缓存就绪后转由 **栈专属 Adapter 规则**(如 `02-figma-stack-adapter.mdc` 占位,或项目内 `02-figma-<栈>-adapter.mdc`)接管。
|
|
65
|
-
|
|
66
|
-
## Agent 最终输出格式(强制)
|
|
67
|
-
凡触发 `<Trigger Conditions>` 且本轮涉及缓存读写的回复,**正文第一段**必须为单行 Blockquote:
|
|
68
|
-
|
|
69
|
-
`> 🔄 Figma 缓存状态: [命中|缺失|更新] | 来源: [Local|MCP] | 节点: {nodeId}`
|
|
70
|
-
|
|
71
|
-
(语义与 `index.json` 中 `nodeId` / `__FILE__` 约定同前;Blockquote 后再写结论。)
|
|
72
|
-
|
|
73
|
-
- 若本轮自动追加了 `flow`,必须在回复中显式写明触发原因:`关键词命中` 或 `多链接串联意图`(二选一或同时命中)。
|
|
74
|
-
|
|
75
|
-
## 低 Token 输出模式(强制)
|
|
76
|
-
- 默认采用“结果优先”输出:仅保留最终结论与必要审计字段,不输出思考过程。
|
|
77
|
-
- MCP 工具回包(尤其 `get_design_context`)禁止在用户可见回复中粘贴全文或大段复述;仅报告调用计数、来源、文件路径与校验结果。
|
|
78
|
-
- 除非用户明确要求查看原文,`mcp-raw` 内容仅落盘到文件,不在 chat 回显。
|
|
79
|
-
- 进度反馈最小化:缓存任务默认 0-1 条简短进度更新;完成后一次性给出结果。
|
|
80
|
-
- 失败场景也保持精简:仅输出失败原因、定位文件、下一步修复动作。
|
|
81
|
-
|
|
82
|
-
## 配置与钩子
|
|
83
|
-
- `npm run figma:cache:config` 可查看是否加载 `hooks.postEnsure`。
|
|
84
|
-
- `ensure` 在写入通用骨架后会调用 `hooks.postEnsure`;钩子异常**不得**阻断 ensure 成功退出(由 Core 捕获)。
|
|
85
|
-
- `ensure` 不是 MCP 拉取入口;若命令声明 `source=figma-mcp`,应先完成 MCP 工具调用并落盘 `mcp-raw/`,再进行 upsert/ensure。
|
|
86
|
-
|
|
87
|
-
## 其余约定
|
|
88
|
-
- 缓存目录、环境变量、`flows`、陈旧策略、提交前校验等与原「Local Cache First」一致,参见 `figma-cache/` 内文档及 `npm run figma:cache:*`。
|
|
89
|
-
- 对同一节点写缓存时,优先复用本轮已拿到的 MCP 响应做落盘,避免“仅为生成原始文件而重复调同一工具”。
|
|
90
|
-
- 若保存原始数据,统一写入节点目录下 `mcp-raw/` 子目录(如 `mcp-raw/mcp-raw-get-design-context.txt`),与加工缓存文件分层。
|
|
91
|
-
- `mcp-raw` 原始文件**禁止**写入任何摘要/截断标记(如 `omitted for brevity`、`...response omitted...`、`省略`、`截断`);必须直存完整 MCP 回包。
|
|
92
|
-
- `mcp-raw/mcp-raw-manifest.json` 必须记录每个工具原始文件的 `fileHashes`(sha256)与 `fileSizes`(utf8 字节数);`validate` 会逐项比对,不一致即失败。
|
|
93
|
-
- **落盘后即时反精简检查(强制)**:每次写入 `mcp-raw` 后,必须立刻检查是否出现摘要/截断标记与 hash/size 不一致;检查结果必须在用户回复中显式输出为 `mcp-raw anti-truncation: pass|fail`(失败时附修复动作)。
|
|
94
|
-
- 默认不写 `whoami` 原始文件;仅在鉴权排障或用户显式要求账号态审计时才写入。
|
|
95
|
-
- 单节点 MCP 调用预算默认不超过 3 次;超过时必须在输出中说明缺口字段与补调原因。
|
|
96
|
-
- 仅对超时/5xx做指数退避重试;对参数错误/权限错误不重试,直接报告并等待用户指令。
|
|
97
|
-
- 不在未校验时假定 Figma 为最新;用户显式要求实时读取时须遵守。
|
|
98
|
-
## Encoding, Shell 兼容与安全写入(强制)
|
|
99
|
-
- 仓库内 README / mdc / SKILL / json / js 等文本文件默认使用 **UTF-8 无 BOM**。
|
|
100
|
-
- Node 写文件必须显式指定 utf8(如 writeFileSync(path, text, "utf8"))。
|
|
101
|
-
- 在 Windows PowerShell 下,**禁止**把 Set-Content / Out-File -Encoding utf8 作为 js/mdc/md/json 的默认写入方式(可能写出 BOM)。
|
|
102
|
-
- 若必须用 PowerShell 写文本文件,使用无 BOM 写法:
|
|
103
|
-
- `$enc = New-Object System.Text.UTF8Encoding($false)`
|
|
104
|
-
- `[System.IO.File]::WriteAllText($path, $text, $enc)`
|
|
105
|
-
|
|
106
|
-
## Shell 语法兼容(PowerShell 强制)
|
|
107
|
-
- 当前终端为 PowerShell 时,**禁止**使用 bash heredoc(如 `<<'EOF'`、`<<'PY'`)。
|
|
108
|
-
- 当前终端为 PowerShell 时,命令串联默认使用 `;`(或拆成多次调用),**禁止**使用 `&&`。
|
|
109
|
-
- 多行文本注入优先使用 PowerShell here-string(`@' ... '@` 或 `@" ... "@`)。
|
|
110
|
-
- 文本替换时,禁止把字面量 `\n` / `` `n `` 当作真实换行依赖;必须写入真实换行并回读确认。
|
|
111
|
-
|
|
112
|
-
## 写后必检(强制)
|
|
113
|
-
- 每次脚本化写入后,必须立刻回读目标文件,确认无字面量 `\n`、`` `n ``、乱码、截断。
|
|
114
|
-
- 对 shebang 文件(如 `#!/usr/bin/env node`),必须确认文件首字节无 BOM。
|
|
115
|
-
- 修改 README / rules / skills 后,必须执行 `npm run docs:encoding:check`(或等价编码检查)并确认通过。
|
|
116
|
-
|
|
117
|
-
## 故障恢复(强制)
|
|
118
|
-
- 一旦出现 BOM、乱码、PowerShell 语法不兼容、转义换行误写,立即停止增量替换。
|
|
119
|
-
- 先回读定位受影响文件,再用 UTF-8 无 BOM 方式整段重写,最后重新执行验证命令。
|
|
8
|
+
边界:仅处理 Figma -> 本地缓存数据(标准化、索引、MCP、校验);本阶段禁止写业务 UI。
|
|
9
|
+
|
|
10
|
+
## 触发条件(任一命中即执行)
|
|
11
|
+
- 消息包含可解析 Figma 链接、`fileKey+nodeId`、或明确“figma-cache/本地缓存/刷新”语义。
|
|
12
|
+
- 非触发:纯概念讨论且无可解析链接/节点线索。
|
|
13
|
+
|
|
14
|
+
## 标准流程(强制)
|
|
15
|
+
1. 标准化链接并读取 `figma-cache/index.json`。
|
|
16
|
+
2. 命中且字段足够:只读本地,不调 MCP。
|
|
17
|
+
3. 未命中或字段不足:调用 MCP 最小集并落盘:
|
|
18
|
+
- `get_design_context`(默认 `excludeScreenshot=true`)
|
|
19
|
+
- `get_metadata`
|
|
20
|
+
- `get_variable_defs`
|
|
21
|
+
4. 同参数工具不得重复调用;`get_screenshot` 仅在显式要求截图或结构仍有歧义时调用;`whoami` 仅鉴权报错时调用。
|
|
22
|
+
5. `source=figma-mcp` 时必须先有 `mcp-raw/*` 证据与 `mcp-raw-manifest.json`(含 `files/fileHashes/fileSizes/toolCalls`)。
|
|
23
|
+
6. 每次写完 `mcp-raw` 立即做反精简检查(截断标记 + hash/size 一致性)。
|
|
24
|
+
7. 执行 `upsert/ensure` 后必须自动执行 `validate`;失败需自修复并循环直到通过。
|
|
25
|
+
|
|
26
|
+
## completeness 规则(强制)
|
|
27
|
+
- 默认基线:`layout,text,tokens,interactions,states,accessibility`。
|
|
28
|
+
- 映射:
|
|
29
|
+
- `layout` -> `get_metadata`(不足再补 `get_design_context`)
|
|
30
|
+
- `text/interactions/states/accessibility` -> `get_design_context`
|
|
31
|
+
- `tokens` -> `get_variable_defs`
|
|
32
|
+
- `flow` 仅在白名单触发时追加:
|
|
33
|
+
- 关系关键词命中(关联/流程/跳转/前后页/上一步/下一步/分支/链路/路径/from/to/next/branch)
|
|
34
|
+
- 或多链接且有明确串联意图
|
|
35
|
+
- `assets` 按需开启,非默认维度。
|
|
36
|
+
|
|
37
|
+
## 输出格式(强制)
|
|
38
|
+
- 命中触发且涉及缓存读写时,首行必须:
|
|
39
|
+
- `> 🔄 Figma 缓存状态: [命中|缺失|更新] | 来源: [Local|MCP] | 节点: {nodeId}`
|
|
40
|
+
- 仅输出:`mcp-raw anti-truncation`、MCP 调用统计、completeness、产物路径、validate 结果。
|
|
41
|
+
- 自动追加 `flow` 时必须标注触发原因(关键词命中/多链接串联意图)。
|
|
42
|
+
|
|
43
|
+
## 低 token 与编码(强制)
|
|
44
|
+
- 用户可见回复禁止粘贴 MCP 长原文;除非用户明确要求。
|
|
45
|
+
- 进度默认 0-1 条;仅阻塞或失败时补充。
|
|
46
|
+
- 文档与脚本写入统一 UTF-8(无 BOM);PowerShell 禁用 bash heredoc,写后回读并执行必要校验(如 `npm run docs:encoding:check`)。
|
|
120
47
|
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Figma 缓存驱动的 UI 实现硬约束(严格 1:1)
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Figma UI 实现硬约束(Hard Mode)
|
|
7
|
+
|
|
8
|
+
边界:本规则仅约束业务 UI 实现阶段(已具备可读缓存数据后),不负责 MCP 拉取与缓存写入。
|
|
9
|
+
|
|
10
|
+
## 0. 目标(强制)
|
|
11
|
+
|
|
12
|
+
- 首版必须 1:1 还原缓存事实。
|
|
13
|
+
- 禁止“贴近”“近似”“经验值补全”。
|
|
14
|
+
- 若信息冲突或不足,先停下澄清,不得猜测实现。
|
|
15
|
+
|
|
16
|
+
## 1. 首版必读数据源(强制)
|
|
17
|
+
|
|
18
|
+
实现前必须读取并建立事实对齐清单,缺一不可:
|
|
19
|
+
|
|
20
|
+
1. `spec.md`
|
|
21
|
+
2. `raw.json`
|
|
22
|
+
3. `state-map.md`
|
|
23
|
+
4. `mcp-raw-get-design-context.txt`(首版强制必读)
|
|
24
|
+
|
|
25
|
+
补充说明:
|
|
26
|
+
|
|
27
|
+
- `mcp-raw-manifest.json` 用于确认证据完整性与来源一致性。
|
|
28
|
+
- `mcp-raw-get-variable-defs.txt` 用于 token 变量补充。
|
|
29
|
+
|
|
30
|
+
## 2. 数据职责与裁决顺序(强制)
|
|
31
|
+
|
|
32
|
+
- `spec.md`:结构化布局/文案/token 概览。
|
|
33
|
+
- `raw.json`:覆盖度与完整性约束。
|
|
34
|
+
- `state-map.md`:状态与交互映射。
|
|
35
|
+
- `mcp-raw-get-design-context.txt`:首版视觉与结构落地的一手细节依据。
|
|
36
|
+
|
|
37
|
+
当 `spec.md` / `raw.json` / `state-map.md` 信息抽象、缺失、或相互冲突时:
|
|
38
|
+
|
|
39
|
+
- 必须回到 `mcp-raw-get-design-context.txt` 裁决。
|
|
40
|
+
- 仍无法裁决时,必须停止实现并向用户确认。
|
|
41
|
+
- 禁止凭经验补齐。
|
|
42
|
+
|
|
43
|
+
## 3. 视觉 1:1 规则(强制)
|
|
44
|
+
|
|
45
|
+
- 颜色:必须使用缓存 token 或明确值,禁止近似替换。
|
|
46
|
+
- 文本:字号/字重/行高/字距逐项对齐,禁止“近似 class”替代。
|
|
47
|
+
- 几何:圆角/边框/背景/间距逐项对齐,不做推测。
|
|
48
|
+
- 盒模型:统一 `box-border`(或等效策略)并保持全组件一致。
|
|
49
|
+
- 状态切换不得引发布局占位变化(避免抖动/超宽/变窄)。
|
|
50
|
+
|
|
51
|
+
## 4. 标签与语义规则(强制)
|
|
52
|
+
|
|
53
|
+
- 布局与展示优先使用安全标签:`div` / `span` / `p` / `img`。
|
|
54
|
+
- 不禁用功能标签(如 `button` / `input` / `select` / `ul` / `li`),但使用时必须:
|
|
55
|
+
- 明确其语义必要性,或来自本地封装组件复用。
|
|
56
|
+
- 完整接管默认样式(基础态 + hover/focus/active/selected)。
|
|
57
|
+
- 保证视觉结果与设计事实 1:1,不受浏览器默认样式干扰。
|
|
58
|
+
- 禁止“为了方便”滥用功能标签。
|
|
59
|
+
|
|
60
|
+
## 5. 结构与尺寸一致性(强制)
|
|
61
|
+
|
|
62
|
+
- 首版必须先确定单一宽度策略(固定值或自适应),同组件内不得混用。
|
|
63
|
+
- 左右对齐策略必须统一;同类块(如双下拉)必须同构实现。
|
|
64
|
+
- 默认禁止横向滚动;非设计明确要求不得出现横向滚动条。
|
|
65
|
+
- 文本溢出必须显式处理(如 `min-w-0` + `truncate`)。
|
|
66
|
+
|
|
67
|
+
## 6. 状态与交互还原(强制)
|
|
68
|
+
|
|
69
|
+
- 必须覆盖缓存声明状态:`default / expanded / selected / unselected`(若存在)。
|
|
70
|
+
- 每个状态必须映射背景/边框/文本/图标样式。
|
|
71
|
+
- 交互行为(展开、收起、选择、Esc、outside click)按缓存或用户要求实现。
|
|
72
|
+
- 禁止新增未请求交互;禁止删除已声明交互。
|
|
73
|
+
|
|
74
|
+
## 7. 执行节奏(强制)
|
|
75
|
+
|
|
76
|
+
- 每轮只允许改一个维度:结构 / 颜色 / 尺寸 / 交互。
|
|
77
|
+
- 禁止“顺手”捆绑多维改动,除非用户明确要求整包改。
|
|
78
|
+
- 变更后必须做改动文件 lint 校验。
|
|
79
|
+
|
|
80
|
+
## 8. 失败判定(任一命中即失败)
|
|
81
|
+
|
|
82
|
+
- 未读取 `mcp-raw-get-design-context.txt` 就开始实现。
|
|
83
|
+
- 使用“近似值”替代缓存明确值。
|
|
84
|
+
- 状态样式未完整覆盖或与缓存定义不一致。
|
|
85
|
+
- 出现横向滚动、尺寸漂移、对齐不一致且无设计依据。
|
|
86
|
+
|
|
87
|
+
## 9. 失败反馈格式(固定)
|
|
88
|
+
|
|
89
|
+
1. 失败原因(违反哪条硬约束)
|
|
90
|
+
2. 定位信息(文件 + 样式/结构项)
|
|
91
|
+
3. 修复动作(如何回到 1:1)
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: UI 全局基线治理(新项目与老项目双轨),并约束组件生成行为
|
|
3
|
+
alwaysApply: false
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# UI Baseline Governance(生成约束)
|
|
7
|
+
|
|
8
|
+
边界:本规则只约束“全局样式基线与组件生成策略”,不替代 `01-figma-cache-core.mdc` 与具体栈 Adapter。
|
|
9
|
+
|
|
10
|
+
## 0. 目标(强制)
|
|
11
|
+
|
|
12
|
+
- 在不破坏现有页面的前提下,建立可复用的 UI 默认基线。
|
|
13
|
+
- 将“新项目一次性定标”与“老项目渐进治理”统一到同一执行模型。
|
|
14
|
+
- 将基线策略约束到 Agent 的组件生成行为,降低返工。
|
|
15
|
+
|
|
16
|
+
## 1. 双轨策略(强制)
|
|
17
|
+
|
|
18
|
+
### 1.0 项目类型判定(机械启发式,强制先判再改)
|
|
19
|
+
|
|
20
|
+
> 目的:减少主观判断;**拿不准时一律按老项目**(安全默认)。
|
|
21
|
+
|
|
22
|
+
在动手改全局样式前,Agent 必须完成一次快速扫描并输出「判定结论 + 命中证据(路径或计数)」。
|
|
23
|
+
|
|
24
|
+
**老项目(走 §1.2 分层分批)**,满足**任一**即判定为老项目:
|
|
25
|
+
|
|
26
|
+
- **存量页面信号**:`src/`(无 `src` 则看项目约定的主源码根)下 `*.vue` / `*.tsx` / `*.jsx` 文件数 **≥ 40**。
|
|
27
|
+
- **已有全局 reset / normalize**:入口或样式目录存在或引入命中以下之一(文件名或 import 字符串):`normalize`、`reset`、`preflight`、`@unocss/reset`、`sanitize`。
|
|
28
|
+
- **已接入成熟 UI 框架**:`package.json` 的 `dependencies` 命中其一:`element-plus`、`ant-design-vue`、`vuetify`、`naive-ui`、`@mui/material`、`@chakra-ui/react` 等。
|
|
29
|
+
- **全局样式覆盖风险**:根样式或全局入口中存在通配选择器(如 `* {`、`html, body` 大包)、或抽样可见大量 `!important` 与深度选择器混用(仅作辅助信号,命中则偏老项目)。
|
|
30
|
+
|
|
31
|
+
**新项目(可走 §1.1 一次性全局基线)**,需**同时**满足:
|
|
32
|
+
|
|
33
|
+
- 上述「老项目」四条**均未**命中。
|
|
34
|
+
- 且 `*.vue` / `*.tsx` / `*.jsx` 计数 **< 15**(或主业务目录下可数的页面级组件极少)。
|
|
35
|
+
|
|
36
|
+
**不确定**:凡计数落在 **15~39** 之间、或仅有弱信号时,**按老项目处理**,仅允许局部基线或单模块试点,禁止首轮全量全局 reset。
|
|
37
|
+
|
|
38
|
+
### 1.1 新项目(无历史负担)
|
|
39
|
+
|
|
40
|
+
- 可一次性启用全局基线(推荐)。
|
|
41
|
+
- 首版建议最小集合:
|
|
42
|
+
- `box-sizing: border-box`(含 `*::before/*::after`)
|
|
43
|
+
- 常见标签 margin/padding reset
|
|
44
|
+
- 媒体元素 `display:block` 与 `max-width:100%`
|
|
45
|
+
- 统一字体基线(family/size/line-height)
|
|
46
|
+
- 焦点可见策略(`focus-visible`)
|
|
47
|
+
|
|
48
|
+
### 1.2 老项目(已有线上页面)
|
|
49
|
+
|
|
50
|
+
- 禁止直接全量覆盖全局 reset。
|
|
51
|
+
- 采用“分层 + 分阶段 + 可回滚”:
|
|
52
|
+
1. 新增 `baseline layer`(仅声明基线,不改业务样式)。
|
|
53
|
+
2. 先对“新页面/新组件”生效(范围隔离或入口分批)。
|
|
54
|
+
3. 用视觉回归与缺陷工单推进存量页迁移。
|
|
55
|
+
4. 每轮迁移可独立回滚。
|
|
56
|
+
|
|
57
|
+
## 2. 生成时行为约束(强制)
|
|
58
|
+
|
|
59
|
+
- 未显式声明前,生成组件默认假设 `border-box`。
|
|
60
|
+
- 在 `flex` 文本容器中必须显式处理溢出:`min-w-0` + `truncate`(或等效策略)。
|
|
61
|
+
- 弹层/下拉必须“锚定触发器”,禁止页面坐标硬定位。
|
|
62
|
+
- 图标优先复用项目图标系统;若缺失,用本地 `inline svg`,禁止运行时依赖 Figma 临时资产 URL。
|
|
63
|
+
- 默认覆盖 `default/hover/focus/active/selected/disabled`(按设计需求裁剪)。
|
|
64
|
+
- 禁止为“临时对齐”引入无意义嵌套;结构必须最小可读。
|
|
65
|
+
|
|
66
|
+
## 3. 老项目安全闸(强制)
|
|
67
|
+
|
|
68
|
+
- 当检测到项目未完成 reset 或存在历史样式冲突:
|
|
69
|
+
- 先输出“风险清单”(组件、影响面、回滚点)再改。
|
|
70
|
+
- 优先局部基线(页面容器或组件命名空间)而非全局覆盖。
|
|
71
|
+
- 不得在同一轮同时做“全局 reset + 大规模业务重构”。
|
|
72
|
+
|
|
73
|
+
## 4. 验证与验收(强制)
|
|
74
|
+
|
|
75
|
+
- 每次变更后至少执行:改动文件 lint + 关键页面可视化验证。
|
|
76
|
+
- 验收输出必须包含:
|
|
77
|
+
1. 本轮基线策略(新项目全局/老项目分层)
|
|
78
|
+
2. 影响范围
|
|
79
|
+
3. 回滚方式
|
|
80
|
+
4. 与组件生成约束的一致性说明
|
|
81
|
+
|
|
82
|
+
## 5. 失败反馈格式(固定)
|
|
83
|
+
|
|
84
|
+
1. 失败原因(违反哪条基线或安全闸)
|
|
85
|
+
2. 定位信息(文件 + 规则项)
|
|
86
|
+
3. 修复动作(分阶段方案与回滚点)
|
|
@@ -5,185 +5,33 @@ description: 将 Figma 链接信息沉淀到项目本地缓存并执行缓存优
|
|
|
5
5
|
|
|
6
6
|
# Figma MCP Local Cache
|
|
7
7
|
|
|
8
|
-
本 Skill
|
|
8
|
+
本 Skill 仅定义“执行次序与最小输出”。权威约束以 `.cursor/rules/01-figma-cache-core.mdc` 为准;若冲突,以规则文件为准。
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
## 触发
|
|
11
|
+
- 用户消息包含 Figma URL、`fileKey+nodeId`、或“figma 缓存/本地缓存/刷新”语义时触发。
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
| 参数 | 含 `node-id=`、`type=design` 等与 Figma 链接常见的查询串 |
|
|
18
|
-
| 键值 | 出现 `figma` 文件 key(约 22 字符)且同时出现 `node-id` /「节点」描述,意图为对齐某一节点 |
|
|
19
|
-
| 缓存词 | 「figma 缓存」「本地缓存」「先查缓存」「figma-cache」「index.json」「spec.md」「state-map」「命中/未命中」等且与具体设计任务绑定 |
|
|
20
|
-
| 落地词 | 「按 Figma 做」「还原设计稿」「对齐 Figma」「实现该节点」且上下文可解析出链接或 fileKey/node |
|
|
21
|
-
| 刷新词 | 「跳过缓存」「强制刷新」「以 Figma 最新为准」——走 MCP 与回写,状态标「更新」、来源 MCP |
|
|
22
|
-
|
|
23
|
-
未出现可解析链接/键/节点且纯概念讨论时,可不执行缓存流水线。
|
|
24
|
-
|
|
25
|
-
</Trigger Conditions>
|
|
26
|
-
|
|
27
|
-
## 适用场景
|
|
28
|
-
- 用户提供新的 Figma 链接并要求解析设计信息。
|
|
29
|
-
- 用户再次提供同一 Figma 文件或同一 node-id,期望复用历史结果。
|
|
30
|
-
- 用户明确要求「先查本地,不够再调 MCP」。
|
|
31
|
-
|
|
32
|
-
## 目录约定
|
|
33
|
-
- 缓存根目录(默认):`figma-cache/`
|
|
34
|
-
- 索引文件(默认):`figma-cache/index.json`
|
|
35
|
-
- 单链接缓存目录:`figma-cache/files/<fileKey>/nodes/<nodeId>/`
|
|
36
|
-
- 单链接缓存文件:
|
|
37
|
-
- `meta.json`:基础元数据与来源信息
|
|
38
|
-
- `spec.md`:可读规格摘要
|
|
39
|
-
- `state-map.md`:状态与交互映射(如适用)
|
|
40
|
-
- `raw.json`:必要的原始结构化数据摘录
|
|
41
|
-
- 可配置项:
|
|
42
|
-
- `FIGMA_CACHE_DIR`:缓存根目录
|
|
43
|
-
- `FIGMA_CACHE_INDEX_FILE`:索引文件名或绝对路径
|
|
44
|
-
- `FIGMA_ITERATIONS_DIR`:历史回填目录
|
|
45
|
-
- `FIGMA_CACHE_STALE_DAYS`:陈旧阈值(天)
|
|
46
|
-
- `FIGMA_DEFAULT_FLOW`:默认 flowId(大迭代可减少重复 `--flow`)
|
|
47
|
-
|
|
48
|
-
## 流程关系(Flow)
|
|
49
|
-
- `figma-cache/index.json` 中的 `flows` 用于维护业务/交互流程的节点集合与边关系。
|
|
50
|
-
- 当用户描述「下一步/分支/同一流程」时,应同步更新对应 `flow` 的 `nodes/edges`。
|
|
51
|
-
- 默认 completeness 不含 `flow`;仅命中 flow 白名单时自动追加。
|
|
52
|
-
- flow 白名单:关系关键词(关联/流程/跳转/前后页/上一步/下一步/分支/链路/路径/from/to/next/branch),或同轮/断续多链接且明确串联意图。
|
|
53
|
-
- 不触发:单链接且无关系意图、仅视觉微调、仅资产导出。
|
|
54
|
-
|
|
55
|
-
## 标准流程
|
|
56
|
-
1. 按 `figma-cache/docs/link-normalization-spec.md` 标准化链接并生成键:
|
|
57
|
-
- 节点级:`cacheKey = <fileKey>#<nodeId>`
|
|
58
|
-
- 文件级(无 `node-id`):`cacheKey = <fileKey>#__FILE__`
|
|
59
|
-
2. 读取 `index.json`:
|
|
60
|
-
- 若命中且字段满足当前任务,直接读取本地缓存并继续实现。
|
|
61
|
-
- 若未命中或信息不足,再调用 Figma MCP 拉取缺失数据。
|
|
62
|
-
3. 若需调用 MCP,默认按 **最小调用集**执行(同一 `fileKey + nodeId`):
|
|
63
|
-
- `get_design_context`(建议 `excludeScreenshot=true`)
|
|
13
|
+
## 执行清单(按序)
|
|
14
|
+
1. 标准化链接,先查 `figma-cache/index.json`(`figma:cache:get`)。
|
|
15
|
+
2. 命中且字段足够:复用本地缓存,结束。
|
|
16
|
+
3. 未命中/不足:仅调最小 MCP 集(默认):
|
|
17
|
+
- `get_design_context`(`excludeScreenshot=true`)
|
|
64
18
|
- `get_metadata`
|
|
65
19
|
- `get_variable_defs`
|
|
66
|
-
4.
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
5. **`get_design_context` 单轮硬约束**:同一 `fileKey + nodeId` 下,若已成功调用一次 `get_design_context`,除非参数发生变化(如 `forceCode`、`disableCodeConnect`、`excludeScreenshot`)或出现明确报错,否则禁止再次调用。
|
|
70
|
-
6. **按 completeness 的调用矩阵(强制)**:
|
|
71
|
-
- `layout` → `get_metadata`(若结构层级不足,再补 `get_design_context`)
|
|
72
|
-
- `text` → `get_design_context`
|
|
73
|
-
- `tokens` → `get_variable_defs`
|
|
74
|
-
- `interactions` / `flow` / `states` → `get_design_context`,并同步完善 `state-map.md` / `flows`
|
|
75
|
-
- `accessibility`(若任务声明)→ 优先 `get_design_context` 语义线索,不足需显式标注缺口
|
|
76
|
-
- `assets`(若任务声明)→ 使用 `get_design_context` 资产 URL;截图按需
|
|
77
|
-
7. **两阶段拉取**:先最小必要调用并检查字段缺口;仅在缺口存在时补调。
|
|
78
|
-
8. 同一参数的 MCP 工具在单轮内不得重复调用;若需落盘原始数据,必须优先复用首次响应。
|
|
79
|
-
9. **原始大文本直存策略**:当需保存 `mcp-raw-get-design-context.txt` 时,优先直接写入 `mcp-raw/` 子目录(不改写、不摘要、不二次解释),避免把整段文本再次喂给模型。
|
|
80
|
-
10. **反截断约束(强制)**:`mcp-raw` 文件中禁止出现摘要/截断标记(如 `omitted for brevity`、`...response omitted...`、`省略`、`截断`);一旦出现,必须视为无效证据并重新落盘完整回包。
|
|
81
|
-
11. **完整性签名(强制)**:`mcp-raw-manifest.json` 必须提供 `fileHashes`(sha256)与 `fileSizes`(utf8 字节数);任一工具文件不匹配即视为证据损坏。
|
|
82
|
-
12. **落盘后即时反精简检查(强制)**:每次写入 `mcp-raw` 后,必须立即执行反精简检查(截断标记 + hash/size);并在用户回复中显式输出 `mcp-raw anti-truncation: pass|fail`。
|
|
83
|
-
13. **本地分析优先**:若本地已存在可用 `mcp-raw-*` 与缓存加工文件,且用户未要求刷新/强制最新,后续分析默认只读本地文件,不再调用 Figma MCP。
|
|
84
|
-
14. 发生 MCP 拉取或本地补齐时,写入/更新 `meta.json`、`spec.md`、必要补充文件,并更新索引。
|
|
85
|
-
15. **`ensure` 语义边界(强制)**:`figma:cache:ensure` 仅补齐索引与骨架文件,不能替代 MCP 拉取;不得把“执行了 ensure”当成“完成了 figma-mcp 调用”。
|
|
86
|
-
16. **MCP 证据门禁(强制)**:当输出来源声明为 `figma-mcp` 时,节点目录必须存在 `mcp-raw/` 及最小调用集原始回包(按 completeness 裁剪);若缺失,立即停止并报告“未完成”,不得宣称更新成功。
|
|
87
|
-
17. **调用预算**:单节点默认 MCP 调用不超过 3 次;超过时必须在回复中说明缺口字段与补调理由。
|
|
88
|
-
18. **重试策略**:仅对超时/5xx进行指数退避重试;参数错误/权限错误不重试并直接报告。
|
|
89
|
-
19. **大文件读取策略(强制)**:
|
|
90
|
-
- UI 还原/像素对齐/组件实现任务:默认必须读取 `mcp-raw-get-design-context.txt` 全文,不反复拉扯“是否需要读全文”。
|
|
91
|
-
- 非 UI 任务(命中检查、预算统计、校验、流程维护):默认只读 `raw.json`/`spec.md`/`mcp-raw-manifest.json`。
|
|
92
|
-
20. **闭环校验(强制)**:凡本轮执行了 **`npm run figma:cache:upsert`** 或 **`npm run figma:cache:ensure`**(任意参数组合),在命令成功结束后,Agent **必须**在同一仓库根目录**自动、静默**执行 `npm run figma:cache:validate`。
|
|
93
|
-
21. **校验失败**:根据脚本输出修复索引、`paths`、缺失文件、JSON 结构等,**循环执行 validate 直至退出码为 0**;不得在 validate 未通过时结束本轮「写缓存」任务。
|
|
94
|
-
22. 对用户反馈时除 Blockquote 外可补充:`source: local-cache` / `source: figma-mcp`、`mcp-raw anti-truncation: pass|fail` 与简要文件列表(不必粘贴完整终端日志)。
|
|
95
|
-
|
|
96
|
-
## Agent 最终输出格式(强制)
|
|
97
|
-
- 触发 `<Trigger Conditions>` 且本轮触碰缓存读写的回复,**第一段**必须为单行 Blockquote:
|
|
98
|
-
- `> 🔄 Figma 缓存状态: [命中|缺失|更新] | 来源: [Local|MCP] | 节点: {nodeId}`
|
|
99
|
-
- `nodeId` 与索引一致;文件级写 `__FILE__` 或与 `index.json` 相同的占位。
|
|
100
|
-
- Blockquote 之后接任务正文。
|
|
20
|
+
4. 原始回包写入 `mcp-raw/`,并写 `mcp-raw-manifest.json`(必须含 `files/fileHashes/fileSizes/toolCalls`)。
|
|
21
|
+
5. 立即执行反精简检查(截断标记 + hash/size)并记录结果。
|
|
22
|
+
6. 执行 `upsert/ensure` 后自动执行 `validate`;失败时自修复并循环到通过。
|
|
101
23
|
|
|
102
|
-
##
|
|
103
|
-
-
|
|
104
|
-
-
|
|
105
|
-
-
|
|
24
|
+
## 关键约束
|
|
25
|
+
- 禁止同参数重复调用 MCP。
|
|
26
|
+
- `flow` 非默认维度,仅白名单触发时追加,并在回复说明原因。
|
|
27
|
+
- 缓存任务默认不写业务 UI 代码。
|
|
106
28
|
|
|
107
|
-
##
|
|
108
|
-
|
|
109
|
-
{
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
"updatedAt": "2026-04-14T12:00:00Z",
|
|
113
|
-
"flows": {
|
|
114
|
-
"example-flow": {
|
|
115
|
-
"id": "example-flow",
|
|
116
|
-
"title": "Example",
|
|
117
|
-
"nodes": ["xxxx#12:34"],
|
|
118
|
-
"edges": [
|
|
119
|
-
{
|
|
120
|
-
"id": "edge-1",
|
|
121
|
-
"from": "xxxx#12:34",
|
|
122
|
-
"to": "xxxx#56:78",
|
|
123
|
-
"type": "next_step",
|
|
124
|
-
"note": "",
|
|
125
|
-
"createdAt": "2026-04-14T12:00:00Z"
|
|
126
|
-
}
|
|
127
|
-
],
|
|
128
|
-
"assumptions": [],
|
|
129
|
-
"openQuestions": []
|
|
130
|
-
}
|
|
131
|
-
},
|
|
132
|
-
"items": {
|
|
133
|
-
"fileKey#nodeId": {
|
|
134
|
-
"fileKey": "xxxx",
|
|
135
|
-
"nodeId": "12:34",
|
|
136
|
-
"scope": "node",
|
|
137
|
-
"url": "https://www.figma.com/file/xxxx?node-id=12%3A34",
|
|
138
|
-
"originalUrls": [
|
|
139
|
-
"https://www.figma.com/file/xxxx?node-id=12%3A34&t=abc",
|
|
140
|
-
"https://www.figma.com/design/xxxx?node-id=12:34"
|
|
141
|
-
],
|
|
142
|
-
"normalizationVersion": 1,
|
|
143
|
-
"paths": {
|
|
144
|
-
"meta": "figma-cache/files/xxxx/nodes/12-34/meta.json",
|
|
145
|
-
"spec": "figma-cache/files/xxxx/nodes/12-34/spec.md",
|
|
146
|
-
"stateMap": "figma-cache/files/xxxx/nodes/12-34/state-map.md",
|
|
147
|
-
"raw": "figma-cache/files/xxxx/nodes/12-34/raw.json"
|
|
148
|
-
},
|
|
149
|
-
"syncedAt": "2026-04-14T12:00:00Z",
|
|
150
|
-
"completeness": ["layout", "text", "tokens", "interactions", "states", "accessibility"]
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
## 刷新策略
|
|
157
|
-
- 用户说「强制刷新/以最新 Figma 为准」:直接走 MCP,并覆盖 `syncedAt` 与内容;Blockquote 标「更新」、来源 MCP。
|
|
158
|
-
- 仅缺某些字段:执行部分刷新,保留已有内容,更新 `completeness`。
|
|
159
|
-
- 若链接无 `node-id`,先缓存到文件级(`__FILE__`),再按后续 node 增量补充。
|
|
160
|
-
- 当 `syncedAt` 超过 14 天时,默认先提示用户是否刷新。
|
|
161
|
-
- 若需“保存 MCP 原始数据”,默认保存最小调用集三项原始回包;截图原始回包按需保存。
|
|
162
|
-
- 原始数据统一写到节点目录 `mcp-raw/` 子目录;加工缓存继续放在节点根目录(`meta.json` / `raw.json` / `spec.md` / `state-map.md`)。
|
|
163
|
-
- 默认不保存 `whoami` 原始文件;仅在鉴权排障或用户显式要求时保存。
|
|
164
|
-
- 对 `mcp-raw-get-design-context.txt` 优先采用“直存”方式(不二次改写正文),降低 token 消耗并保持可追溯性。
|
|
165
|
-
- `completeness` 建议至少按以下维度声明:`layout`、`text`、`tokens`、`interactions`、`flow`、`states`、`assets`、`accessibility`(按任务取子集)。
|
|
166
|
-
- `mcp-raw-manifest.json` 应包含审计字段:`callPolicy`(如 `minimum-set-v1`)、`dedupeApplied`(布尔)、`toolCalls`(每个工具的 `count` / `effectiveSaved`),便于后续统计与复盘。
|
|
167
|
-
- 折中推荐:在 `raw.json` 增加 `coverageSummary`(`covered` / `missing` / `evidence`)用于最小覆盖审计,不强制完整模板。
|
|
168
|
-
|
|
169
|
-
## 输出约束
|
|
170
|
-
- **必须先**输出规定的缓存状态 Blockquote,再给出设计结论或实现说明。
|
|
171
|
-
- 若跳过 MCP,Blockquote 中来源为 Local,状态多为「命中」。
|
|
172
|
-
- 若调用 MCP,Blockquote 中来源为 MCP,状态多为「缺失→更新」或「更新」,并在后文简述触发原因(未命中/信息不足/用户强刷)。
|
|
173
|
-
- 默认采用低 token 输出:不回显 MCP 原始正文,仅输出调用统计、文件落盘与校验结果。
|
|
174
|
-
- 用户若明确要求“查看原文/贴出回包”时,才输出必要片段;默认引导用户查看 `mcp-raw/*` 本地文件。
|
|
29
|
+
## 用户可见输出(最小化)
|
|
30
|
+
- 首行固定:
|
|
31
|
+
- `> 🔄 Figma 缓存状态: [命中|缺失|更新] | 来源: [Local|MCP] | 节点: {nodeId}`
|
|
32
|
+
- 仅补充:`mcp-raw anti-truncation`、MCP 调用统计、最终 completeness、文件清单、validate 结果。
|
|
33
|
+
- 除非用户明确要求,禁止贴 MCP 原文与长日志。
|
|
175
34
|
|
|
176
|
-
##
|
|
177
|
-
- `
|
|
178
|
-
- `npm run
|
|
179
|
-
- `npm run figma:cache:get -- "<figma-url>"`:检查命中情况
|
|
180
|
-
- 先执行 MCP 最小调用集并写入 `mcp-raw/`,再执行:`npm run figma:cache:upsert -- "<figma-url>" --source=figma-mcp --completeness=layout,text,tokens,interactions,states,accessibility`
|
|
181
|
-
- `npm run figma:cache:ensure -- "<figma-url>" --source=manual --completeness=layout,text,tokens,interactions,states,accessibility`:自动补齐缓存骨架文件(非 MCP 拉取)
|
|
182
|
-
- 若命中 flow 白名单场景,自动或显式追加:`--completeness=layout,text,tokens,interactions,states,accessibility,flow`
|
|
183
|
-
- 一旦自动追加了 `flow`,对用户回复必须附带触发原因:`关键词命中` 或 `多链接串联意图`。
|
|
184
|
-
- MCP 默认最小调用集:`get_design_context(excludeScreenshot=true)` + `get_metadata` + `get_variable_defs`
|
|
185
|
-
- `npm run figma:cache:validate`:**每次 upsert/ensure 成功后必须自动执行**;失败则修至通过
|
|
186
|
-
- `npm run figma:cache:budget`:查看 MCP 节点预算汇总(默认 `--mcp-only`,按文件大小估算 token 代理)
|
|
187
|
-
- `npm run figma:cache:stale`:检查超 14 天的陈旧缓存
|
|
188
|
-
- `npm run figma:cache:backfill`:从历史迭代文档回填索引
|
|
189
|
-
- `npm run figma:cache:flow:init|add-node|link|chain|show|mermaid`:维护流程关系
|
|
35
|
+
## 模板维护约定(强制)
|
|
36
|
+
- `cursor-bootstrap` 是 Skill 唯一手写来源。
|
|
37
|
+
- 仓库内 `.cursor/skills/*` 为镜像产物,使用 `npm run cursor:shadow:sync` 同步生成。
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: figma-ui-dual-mode-execution
|
|
3
|
+
description: 仅用 nodeId(如 9277-28772)或 Figma 链接触发 UI 实现,自动在短流程与严格流程间切换。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Figma UI Dual Mode Execution
|
|
7
|
+
|
|
8
|
+
本 Skill 用于:用户仅提供节点线索(节点目录名、nodeId、或带 node-id 的 Figma 链接)时,自动完成“定位缓存 -> 判定模式 -> 实现与验证”。
|
|
9
|
+
|
|
10
|
+
## 支持输入
|
|
11
|
+
|
|
12
|
+
- 节点目录名:如 `9277-28772`
|
|
13
|
+
- nodeId:如 `9277:28772`
|
|
14
|
+
- Figma 链接:`...node-id=9277-28772`(需转换为 `9277:28772`)
|
|
15
|
+
|
|
16
|
+
## 执行步骤(强制)
|
|
17
|
+
|
|
18
|
+
1. 规范化节点标识:
|
|
19
|
+
- `9277-28772` -> `9277:28772`
|
|
20
|
+
2. 在 `figma-cache/index.json` 查命中并定位节点目录。
|
|
21
|
+
3. 读取四份必读文件:
|
|
22
|
+
- `spec.md`
|
|
23
|
+
- `raw.json`
|
|
24
|
+
- `state-map.md`
|
|
25
|
+
- `mcp-raw-get-design-context.txt`
|
|
26
|
+
4. 模式选择:
|
|
27
|
+
- 默认短流程;
|
|
28
|
+
- 命中任一升级条件(老项目/全局样式改动/复杂状态/历史漂移问题/信息冲突)-> 切严格流程。
|
|
29
|
+
5. 预检文档策略(降噪):
|
|
30
|
+
- 默认短流程:可跳过完整预检文档,仅输出精简事实清单。
|
|
31
|
+
- 严格流程:必须基于 `cursor-bootstrap/examples/ui-1to1-preflight.template.md` 生成并填写“预检文档”(可落到项目 `figma-cache/docs/` 或节点目录旁),至少完成:设计值快照、状态对照表、1:1 预检清单。
|
|
32
|
+
6. 先输出“事实对齐清单”,再实现组件与挂载。
|
|
33
|
+
7. 改动后执行 lint,并输出映射与验证结论。
|
|
34
|
+
|
|
35
|
+
## 关键硬约束
|
|
36
|
+
|
|
37
|
+
- 冲突裁决顺序:`mcp-raw-get-design-context.txt` 优先。
|
|
38
|
+
- 禁止猜测设计值;无法裁决必须先提问。
|
|
39
|
+
- 禁止使用 Figma 临时远程资产 URL 作为运行时图标。
|
|
40
|
+
- 图标优先项目图标系统;无则 `inline svg`。
|
|
41
|
+
- 默认按 `border-box` 思维实现;弹层必须锚定触发器。
|
|
42
|
+
|
|
43
|
+
## 固定输出
|
|
44
|
+
|
|
45
|
+
1. 缓存定位结果(命中节点目录)
|
|
46
|
+
2. 事实对齐清单(结构/文案/token/状态/交互)
|
|
47
|
+
3. 变更文件列表
|
|
48
|
+
4. 关键设计值 -> 代码映射
|
|
49
|
+
5. lint/验证结果
|
|
50
|
+
6. 未决问题(如有)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ui-baseline-governance
|
|
3
|
+
description: 为新项目或老项目建立可执行的全局样式基线,并把约束固化到组件生成行为。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# UI Baseline Governance Skill
|
|
7
|
+
|
|
8
|
+
本 Skill 用于“要不要上全局 reset / 如何在老项目安全落地 / 如何约束后续组件生成”三类问题。
|
|
9
|
+
若与规则冲突,以 `.cursor/rules/04-ui-baseline-governance.mdc` 为准。
|
|
10
|
+
|
|
11
|
+
## 触发场景
|
|
12
|
+
|
|
13
|
+
- 用户询问:全局 `border-box`、reset、默认样式基线。
|
|
14
|
+
- 用户反馈:组件反复出现超高/超宽/对齐漂移/图标不可见。
|
|
15
|
+
- 用户要求:把经验沉淀为长期规范,约束后续 Agent 生成行为。
|
|
16
|
+
|
|
17
|
+
## 执行步骤(按序)
|
|
18
|
+
|
|
19
|
+
1. 判断项目类型:`新项目` 或 `老项目`(**必须**按 `.cursor/rules/04-ui-baseline-governance.mdc` §1.0 机械启发式执行,输出结论 + 命中证据;不确定则按老项目)。
|
|
20
|
+
2. 输出一份“基线实施决策”:
|
|
21
|
+
- 新项目:一次性全局基线
|
|
22
|
+
- 老项目:分层分批迁移
|
|
23
|
+
3. 给出最小基线清单(不与栈强耦合):
|
|
24
|
+
- `border-box`
|
|
25
|
+
- margin/padding reset
|
|
26
|
+
- 媒体元素 display 规则
|
|
27
|
+
- 字体基线
|
|
28
|
+
- focus-visible
|
|
29
|
+
4. 同步“生成约束”到执行口径:
|
|
30
|
+
- 默认 `box-border`
|
|
31
|
+
- 文本溢出显式处理
|
|
32
|
+
- 弹层锚定触发器
|
|
33
|
+
- 图标优先项目库,兜底 `inline svg`
|
|
34
|
+
- 状态覆盖完整
|
|
35
|
+
5. 给出验证与回滚方案:
|
|
36
|
+
- lint + 视觉检查
|
|
37
|
+
- 影响范围
|
|
38
|
+
- 回滚点
|
|
39
|
+
|
|
40
|
+
## 用户可见输出模板(精简)
|
|
41
|
+
|
|
42
|
+
1. 当前项目类型与推荐策略(全局 or 分层)
|
|
43
|
+
2. 本轮要落的基线条目(最多 5 条)
|
|
44
|
+
3. 对后续组件生成的强约束(最多 5 条)
|
|
45
|
+
4. 验证与回滚
|
|
46
|
+
|
|
47
|
+
## 禁止事项
|
|
48
|
+
|
|
49
|
+
- 不得在老项目直接“全局 reset + 大规模重构”同轮执行。
|
|
50
|
+
- 不得把框架私有实现写入 `figma-cache/files/**` 的通用缓存文档。
|
|
51
|
+
- 不得在未声明风险的情况下修改大范围全局样式。
|
|
@@ -32,6 +32,14 @@ function copyCursorBootstrap(force, deps) {
|
|
|
32
32
|
from: path.join("rules", "02-figma-stack-adapter.mdc"),
|
|
33
33
|
to: path.join(".cursor", "rules", "02-figma-stack-adapter.mdc"),
|
|
34
34
|
},
|
|
35
|
+
{
|
|
36
|
+
from: path.join("rules", "03-figma-ui-implementation-hard-constraints.mdc"),
|
|
37
|
+
to: path.join(".cursor", "rules", "03-figma-ui-implementation-hard-constraints.mdc"),
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
from: path.join("rules", "04-ui-baseline-governance.mdc"),
|
|
41
|
+
to: path.join(".cursor", "rules", "04-ui-baseline-governance.mdc"),
|
|
42
|
+
},
|
|
35
43
|
{
|
|
36
44
|
from: path.join("rules", "figma-local-cache-first.mdc"),
|
|
37
45
|
to: path.join(".cursor", "rules", "figma-local-cache-first.mdc"),
|
|
@@ -40,6 +48,14 @@ function copyCursorBootstrap(force, deps) {
|
|
|
40
48
|
from: path.join("skills", "figma-mcp-local-cache", "SKILL.md"),
|
|
41
49
|
to: path.join(".cursor", "skills", "figma-mcp-local-cache", "SKILL.md"),
|
|
42
50
|
},
|
|
51
|
+
{
|
|
52
|
+
from: path.join("skills", "ui-baseline-governance", "SKILL.md"),
|
|
53
|
+
to: path.join(".cursor", "skills", "ui-baseline-governance", "SKILL.md"),
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
from: path.join("skills", "figma-ui-dual-mode-execution", "SKILL.md"),
|
|
57
|
+
to: path.join(".cursor", "skills", "figma-ui-dual-mode-execution", "SKILL.md"),
|
|
58
|
+
},
|
|
43
59
|
];
|
|
44
60
|
|
|
45
61
|
if (!fs.existsSync(CURSOR_BOOTSTRAP_DIR)) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "figma-cache-toolchain",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.2",
|
|
4
4
|
"description": "Figma link normalization, local cache index, validation, and Node CLI (framework-agnostic core).",
|
|
5
5
|
"homepage": "https://github.com/907086379/figma-cache-toolchain#readme",
|
|
6
6
|
"keywords": [
|
|
@@ -37,8 +37,8 @@
|
|
|
37
37
|
"registry": "https://registry.npmjs.org/"
|
|
38
38
|
},
|
|
39
39
|
"scripts": {
|
|
40
|
-
"test": "npm run docs:encoding:check && node tests/smoke.js",
|
|
41
|
-
"prepack": "npm run docs:encoding:check && node bin/figma-cache.js validate",
|
|
40
|
+
"test": "npm run cursor:shadow:check && npm run docs:encoding:check && node tests/rules-guard.js && node tests/smoke.js",
|
|
41
|
+
"prepack": "npm run cursor:shadow:check && npm run docs:encoding:check && node bin/figma-cache.js validate",
|
|
42
42
|
"figma:cache:normalize": "node bin/figma-cache.js normalize",
|
|
43
43
|
"figma:cache:get": "node bin/figma-cache.js get",
|
|
44
44
|
"figma:cache:upsert": "node bin/figma-cache.js upsert",
|
|
@@ -56,6 +56,8 @@
|
|
|
56
56
|
"figma:cache:flow:show": "node bin/figma-cache.js flow show",
|
|
57
57
|
"figma:cache:flow:mermaid": "node bin/figma-cache.js flow mermaid",
|
|
58
58
|
"figma:cache:cursor:init": "node bin/figma-cache.js cursor init",
|
|
59
|
+
"cursor:shadow:sync": "node scripts/sync-cursor-shadow.js",
|
|
60
|
+
"cursor:shadow:check": "node scripts/check-cursor-shadow.js",
|
|
59
61
|
"docs:encoding:check": "node scripts/check-doc-encoding.js",
|
|
60
62
|
"figma:cache:mobile:spec": "node scripts/mobile/generate-mobile-spec.js"
|
|
61
63
|
},
|