@routerhub/agent-rules 1.5.83 → 1.5.85

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/AGENTS.base.md CHANGED
@@ -336,6 +336,37 @@ Closes #456
336
336
  - Figma 中配置或表达的跳转、链接、页面流、弹窗、hover/click 等交互必须同步实现;原型未明确但影响流程闭环的交互,需先核对现有产品或询问用户,禁止自行脑补。
337
337
  - 交付前必须对照 Figma 做视觉和交互验收,发现无法完全还原的素材、字体、数据或平台限制时,必须明确说明差异和原因。
338
338
 
339
+ ### Figma 设计还原规范(MCP 三步验证法)
340
+
341
+ ⚠️ Figma 设计还原时,**禁止直接使用 `get_design_context` 生成的 Tailwind 代码**。`get_design_context` 的代码是大模型推导的近似值,数值(px、间距、尺寸)、布局结构(flex 方向、嵌套关系)和定位方式(absolute/flex)都可能与 Figma 真实设计不符,必须通过以下三步验证:
342
+
343
+ **第 1 步:`get_design_context` → 获取设计意图**
344
+ - 用 `get_design_context` 了解组件的整体结构、颜色、字体、视觉效果
345
+ - ⚠️ 仅用于理解设计意图,**数值和结构不可信**
346
+
347
+ **第 2 步:`get_metadata` → 获取精确坐标(唯一事实源)**
348
+ - `get_metadata` 返回的是 Figma 内部每个节点的**真实 x/y/width/height 坐标**,这是所有尺寸、间距、定位的唯一事实源
349
+ - 用 metadata 坐标反推间距:section 内子元素 y 坐标 = section 的 top padding,子元素高度 + 上边距 + 下边距 = 父级高度
350
+ - 用 metadata 验证布局结构:同级兄弟节点的 x/y 关系决定它们是横向还是纵向排列,子节点 x 坐标决定它是 flex 子元素还是 absolute 定位
351
+
352
+ **第 3 步:`get_metadata` 坐标反推规则**
353
+
354
+ | 场景 | 反推方法 |
355
+ |------|----------|
356
+ | Section 上下 padding | 子元素 y 坐标 = 上 padding;父级高度 - 子元素 y - 子元素高度 = 下 padding |
357
+ | 元素间距(gap) | 兄弟元素之间的 y 差值(纵向)或 x 差值(横向) |
358
+ | 元素是 flex 还是 absolute | 子元素 x 超出父元素左边界 → absolute;子元素在父元素范围内 → flex |
359
+ | 固定宽度还是自适应 | metadata 有明确 width 值 → 固定宽度;否则 → 自适应 |
360
+ | 元素是否有旋转/变换 | `get_design_context` 中有 `rotate`、`-translate-` 等类名 |
361
+
362
+ **常见踩坑清单:**
363
+
364
+ 1. **`get_design_context` 生成的 padding 不准** → 必须以 metadata 坐标为基准重新计算
365
+ 2. **按钮被嵌套在文字 `flex-col` 内部** → metadata 中同级 x 坐标不同、y 坐标相近 = 横向并排,不应嵌套
366
+ 3. **固定宽度容器被改成了全宽** → metadata 中有明确 width 的容器不能去掉固定宽度
367
+ 4. **装饰图片被当成 flex 子元素** → metadata 中 x 坐标超出父元素范围 = absolute 定位
368
+ 5. **`justify-between` + 全宽把元素推到极端两端** → 必须先确认 metadata 中内容行的宽度
369
+
339
370
  ## 文件约束
340
371
 
341
372
  - 不随意修改核心业务文件和 API 相关代码,不编写或修改 `README.md`。
package/merge.js CHANGED
@@ -7,9 +7,10 @@
7
7
  * node merge.js [command]
8
8
  *
9
9
  * command:
10
- * init 初始化规则文件,并在缺失时创建 AGENTS.private.md 模板
11
- * sync 重新生成所有规则输出文件
12
- * watch 监听 AGENTS.private.md 变化并自动同步
10
+ * init 初始化规则文件,并在缺失时创建 AGENTS.private.md 模板
11
+ * sync 重新生成所有规则输出文件
12
+ * update 自动更新 @routerhub/agent-rules 到最新版本并重新生成规则文件
13
+ * watch 监听 AGENTS.private.md 变化并自动同步
13
14
  *
14
15
  * 输出文件:
15
16
  * AGENTS.md 全量合并(兼容 Cursor/Claude Code)
@@ -614,6 +615,44 @@ function watchAgents() {
614
615
  });
615
616
  }
616
617
 
618
+ function selfUpdate() {
619
+ const { execSync } = require("child_process");
620
+
621
+ // 检测包管理器:按锁文件优先级 pnpm > yarn > npm
622
+ const lockFiles = [
623
+ { name: "pnpm", file: "pnpm-lock.yaml", cmd: "pnpm update @routerhub/agent-rules --latest" },
624
+ { name: "yarn", file: "yarn.lock", cmd: "yarn upgrade @routerhub/agent-rules --latest" },
625
+ { name: "npm", file: "package-lock.json", cmd: "npm update @routerhub/agent-rules@latest" },
626
+ ];
627
+
628
+ let pm = lockFiles[lockFiles.length - 1]; // 默认 npm
629
+ for (const candidate of lockFiles) {
630
+ if (fs.existsSync(path.join(currentRoot, candidate.file))) {
631
+ pm = candidate;
632
+ break;
633
+ }
634
+ }
635
+
636
+ console.log(`📦 检测到包管理器: ${pm.name}`);
637
+ console.log(`🔄 正在更新 @routerhub/agent-rules 到最新版本...`);
638
+ console.log(` 执行: ${pm.cmd}`);
639
+
640
+ try {
641
+ execSync(pm.cmd, { cwd: currentRoot, stdio: "inherit" });
642
+ console.log("");
643
+ console.log("✅ 包更新完成,正在重新生成规则文件...");
644
+ } catch (err) {
645
+ console.error(`❌ 包更新失败: ${err.message}`);
646
+ console.error(" 请手动执行: " + pm.cmd);
647
+ process.exit(1);
648
+ }
649
+
650
+ // 更新完成后执行 sync,重新生成所有规则输出文件
651
+ mergeAgents(getDefaultConfig());
652
+ console.log("");
653
+ console.log("✅ 规则文件已全部更新完成!");
654
+ }
655
+
617
656
  function main() {
618
657
  const command = process.argv[2];
619
658
 
@@ -628,6 +667,9 @@ function main() {
628
667
  console.log(
629
668
  " agent-rules sync 重新生成所有规则输出文件(CLAUDE.md + AGENTS.md + copilot-instructions.md + instructions/*.instructions.md)",
630
669
  );
670
+ console.log(
671
+ " agent-rules update 自动更新 @routerhub/agent-rules 到最新版本并重新生成规则文件",
672
+ );
631
673
  console.log(
632
674
  " agent-rules watch 监听 AGENTS.private.md,变更后自动同步所有规则文件",
633
675
  );
@@ -659,6 +701,12 @@ function main() {
659
701
  return;
660
702
  }
661
703
 
704
+ if (command === "update") {
705
+ selfUpdate();
706
+ return;
707
+ }
708
+
709
+
662
710
  if (command === "watch") {
663
711
  watchAgents();
664
712
  return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@routerhub/agent-rules",
3
- "version": "1.5.83",
3
+ "version": "1.5.85",
4
4
  "description": "Shared Copilot agent rules and guidelines for RouterHub projects",
5
5
  "main": "AGENTS.base.md",
6
6
  "bin": {
package/rules/frontend.md CHANGED
@@ -10,6 +10,37 @@ outputName: "frontend"
10
10
  - Figma 中配置或表达的跳转、链接、页面流、弹窗、hover/click 等交互必须同步实现;原型未明确但影响流程闭环的交互,需先核对现有产品或询问用户,禁止自行脑补。
11
11
  - 交付前必须对照 Figma 做视觉和交互验收,发现无法完全还原的素材、字体、数据或平台限制时,必须明确说明差异和原因。
12
12
 
13
+ ### Figma 设计还原规范(MCP 三步验证法)
14
+
15
+ ⚠️ Figma 设计还原时,**禁止直接使用 `get_design_context` 生成的 Tailwind 代码**。`get_design_context` 的代码是大模型推导的近似值,数值(px、间距、尺寸)、布局结构(flex 方向、嵌套关系)和定位方式(absolute/flex)都可能与 Figma 真实设计不符,必须通过以下三步验证:
16
+
17
+ **第 1 步:`get_design_context` → 获取设计意图**
18
+ - 用 `get_design_context` 了解组件的整体结构、颜色、字体、视觉效果
19
+ - ⚠️ 仅用于理解设计意图,**数值和结构不可信**
20
+
21
+ **第 2 步:`get_metadata` → 获取精确坐标(唯一事实源)**
22
+ - `get_metadata` 返回的是 Figma 内部每个节点的**真实 x/y/width/height 坐标**,这是所有尺寸、间距、定位的唯一事实源
23
+ - 用 metadata 坐标反推间距:section 内子元素 y 坐标 = section 的 top padding,子元素高度 + 上边距 + 下边距 = 父级高度
24
+ - 用 metadata 验证布局结构:同级兄弟节点的 x/y 关系决定它们是横向还是纵向排列,子节点 x 坐标决定它是 flex 子元素还是 absolute 定位
25
+
26
+ **第 3 步:`get_metadata` 坐标反推规则**
27
+
28
+ | 场景 | 反推方法 |
29
+ |------|----------|
30
+ | Section 上下 padding | 子元素 y 坐标 = 上 padding;父级高度 - 子元素 y - 子元素高度 = 下 padding |
31
+ | 元素间距(gap) | 兄弟元素之间的 y 差值(纵向)或 x 差值(横向) |
32
+ | 元素是 flex 还是 absolute | 子元素 x 超出父元素左边界 → absolute;子元素在父元素范围内 → flex |
33
+ | 固定宽度还是自适应 | metadata 有明确 width 值 → 固定宽度;否则 → 自适应 |
34
+ | 元素是否有旋转/变换 | `get_design_context` 中有 `rotate`、`-translate-` 等类名 |
35
+
36
+ **常见踩坑清单:**
37
+
38
+ 1. **`get_design_context` 生成的 padding 不准** → 必须以 metadata 坐标为基准重新计算
39
+ 2. **按钮被嵌套在文字 `flex-col` 内部** → metadata 中同级 x 坐标不同、y 坐标相近 = 横向并排,不应嵌套
40
+ 3. **固定宽度容器被改成了全宽** → metadata 中有明确 width 的容器不能去掉固定宽度
41
+ 4. **装饰图片被当成 flex 子元素** → metadata 中 x 坐标超出父元素范围 = absolute 定位
42
+ 5. **`justify-between` + 全宽把元素推到极端两端** → 必须先确认 metadata 中内容行的宽度
43
+
13
44
  ## 文件约束
14
45
 
15
46
  - 不随意修改核心业务文件和 API 相关代码,不编写或修改 `README.md`。