@qilitt-mickey/vue3-temp-skill 1.1.55 → 1.1.57
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/SKILL.md +1 -0
- package/package.json +1 -1
- package/parser/fixtures/verify/snapshot-latest.json +1 -1
- package/parser/index.js +48 -0
- package/references/design-apply.md +3 -0
- package/references/steps/step0-preflight.md +7 -0
- package/references/steps/step1-match.md +1 -0
- package/references/steps/step4-l3.md +2 -1
- package/references/steps/step5-gates.md +1 -0
package/SKILL.md
CHANGED
|
@@ -101,6 +101,7 @@ tags: [vue3, typescript, element-plus, pinia, vite, unocss, crud, demo, code-qua
|
|
|
101
101
|
目标项目源码 = **中性初始化**,只提供能力通道(CSS 变量的消费者挂载点、form 枚举、DOM/属性钩子、正确的层叠优先级),**不预置任何具体设计的结论**(某个颜色、某句问候语、某个方位的指示条、某个硬编码尺寸)。
|
|
102
102
|
|
|
103
103
|
- 一切设计决策由设计变更集驱动,经 `design-apply` 动态落到「设计层文件 `src/styles/design-shell.scss` / 页面级 scoped 样式 / DOM 属性与配置」,不落到出厂样式文件与出厂组件里。
|
|
104
|
+
- **效果图页面 = 设计角色坐标系,不是页面增量(G13 页面绑定闸)**:效果图页面(如「运单管理」)是设计侧为承载设计语言虚构的演示标题,**默认映射到项目已有页面**——落地动作恒为「在已有页面上同步结构与样式」,**禁止因效果图新增页面 / 路由 / 菜单项**;唯一例外是变更集 `page_bindings` 显式声明 `target:"new"` 且在 `notes` 申报。判据:换一张效果图不需要改项目的页面/路由/菜单清单 ⇒ 架构正确;需要新增页面才能换 ⇒ 设计演示页被误当业务增量,必须回退。
|
|
104
105
|
- 判据:换一张效果图只需换变更集、不必改源码 ⇒ 架构正确;需要改源码才能换 ⇒ 设计结论被烧进源码,必须回退为通道。
|
|
105
106
|
- 出厂文件仅在「通道缺失」时可动(补变量消费者 / 补 form 枚举 / 修层叠优先级),且必须在交付说明中单列「补通道」条目写明缺失点。
|
|
106
107
|
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generated_at": "2026-09-
|
|
2
|
+
"generated_at": "2026-09-22T05:33:53.887Z",
|
|
3
3
|
"oracle": "E:\\work\\Project\\Template\\skills\\vue3-temp-skill\\parser\\fixtures\\verify\\oracle.json",
|
|
4
4
|
"actual": "E:\\work\\Project\\Template\\skills\\vue3-temp-skill\\parser\\fixtures\\verify\\actual-clean.json",
|
|
5
5
|
"points": {
|
package/parser/index.js
CHANGED
|
@@ -292,6 +292,54 @@ function matchOne(file, dataset, batchSummary, opts = {}) {
|
|
|
292
292
|
console.log(` ✔ G8 模式闸:mode=restore,oracle + coverage 齐备(基线三件套完整)`);
|
|
293
293
|
}
|
|
294
294
|
|
|
295
|
+
// G13 页面绑定闸(2026-09-22 事故机制化):效果图页面是设计角色坐标系,不是页面增量。
|
|
296
|
+
// 事故背景:效果图演示页「运单管理」被误落地为项目新菜单/新页面——效果图标题只是
|
|
297
|
+
// 设计侧为承载设计语言虚构的演示名,落地动作恒为「映射已有页面 + 在其上同步结构与样式」,
|
|
298
|
+
// 「图上有这个页面」不构成新增依据。
|
|
299
|
+
// 机检范围(diff 级「不得出现新路由/菜单/页面文件」由第 5 步合规闸人工+AI 对账):
|
|
300
|
+
// ① page_bindings 结构校验(数组、mockup/target 必填);
|
|
301
|
+
// ② target:"new" 必须 notes 申报——未申报 = 效果图演示页被静默实体化,exit 1;
|
|
302
|
+
// ③ 每次输出页面绑定声明,让施工 AI 与交付说明都有映射口径可依。
|
|
303
|
+
const DEFAULT_BINDING_POLICY = "效果图页面默认映射已有页面(设计角色坐标系≠页面增量):禁止新增页面/路由/菜单,落地=在已有页面上同步结构与样式";
|
|
304
|
+
if (changeset.page_bindings !== undefined && changeset.page_bindings !== null) {
|
|
305
|
+
if (!Array.isArray(changeset.page_bindings)) {
|
|
306
|
+
console.error(`✖ G13 页面绑定闸:page_bindings 应为数组({ mockup, target, note }),实际 ${typeof changeset.page_bindings} → 拒绝执行。`);
|
|
307
|
+
batchSummary?.invalid.push(path.basename(file));
|
|
308
|
+
if (!batchSummary)
|
|
309
|
+
process.exit(1);
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
console.log(`\n=== 页面绑定声明(G13 · ${changeset.page_bindings.length} 条)===`);
|
|
313
|
+
for (const [i, b] of changeset.page_bindings.entries()) {
|
|
314
|
+
if (!b || typeof b !== "object" || !b.mockup || !b.target) {
|
|
315
|
+
console.error(`✖ G13 页面绑定闸:page_bindings[${i}] 缺 mockup 或 target → 拒绝执行。`);
|
|
316
|
+
batchSummary?.invalid.push(path.basename(file));
|
|
317
|
+
if (!batchSummary)
|
|
318
|
+
process.exit(1);
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
if (b.target === "new") {
|
|
322
|
+
const notes = typeof changeset.notes === "string" ? changeset.notes : "";
|
|
323
|
+
if (!notes.includes("新增页面") && !notes.includes("new 页面") && !notes.includes("target:\"new\"")) {
|
|
324
|
+
console.error(`✖ G13 页面绑定闸:${b.mockup} 声明 target:"new"(新增业务页面)但 notes 未申报 → 拒绝执行。`);
|
|
325
|
+
console.error(` 处置:确需落成新业务页面时,在 notes 显式写明「新增页面:<mockup> → <路由名>,理由…」后重跑;`);
|
|
326
|
+
console.error(` 否则该效果图页面按默认口径映射已有页面落地。`);
|
|
327
|
+
batchSummary?.invalid.push(path.basename(file));
|
|
328
|
+
if (!batchSummary)
|
|
329
|
+
process.exit(1);
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
console.log(` - ${b.mockup} → 新增页面(notes 已申报)`);
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
console.log(` - ${b.mockup} → 已有页面 ${b.target}${b.note ? `(${b.note})` : ""}`);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
console.log(` ✔ G13 页面绑定闸:page_bindings 缺省 → ${DEFAULT_BINDING_POLICY}`);
|
|
341
|
+
}
|
|
342
|
+
|
|
295
343
|
// 版本校验(mapping_version 缺失或不匹配 → 拒绝。版本恒定 1.0.0,此校验为破坏性升级保险丝:仅双侧同步升版时才会拦截)
|
|
296
344
|
const versions = new Set(
|
|
297
345
|
Object.values(dataset.files).map(d => d.meta?.version).filter(Boolean),
|
|
@@ -72,6 +72,9 @@ parser match(确定性翻译)→ 施工坐标 → AI 按坐标改代码 →
|
|
|
72
72
|
"scheme": "default", // 方案标识(mode=restore 时必填):取设计侧 page-specs/styles/registry.json 的方案 id;与 scene 共同定位「方案 × 场景」的清单/登记表
|
|
73
73
|
"mode": "restore", // 交付模式(G8 模式闸):restore=场景还原(scheme + oracle.mockup + coverage.registry 强制必填);design=显式声明的轻量微调;缺省 design
|
|
74
74
|
"layout_type": "vertical", // 标准布局枚举:vertical / horizontal / mix(字段名固定 layout_type,非 layout)
|
|
75
|
+
"page_bindings": [ // 页面映射(G13 页面绑定闸):效果图页面 → 项目页面的身份声明;缺省 = 全部映射已有页面。效果图页面默认是设计角色坐标系,不是页面增量——未显式 target:"new" 时禁止新增页面/路由/菜单
|
|
76
|
+
{ "mockup": "运单管理-钴蓝.html", "target": "<项目已有列表页路由名/路径>", "note": "效果图标题是设计角色坐标系 = 已有页面换肤基线,非新增业务" }
|
|
77
|
+
],
|
|
75
78
|
"global": { "brand_primary": "钴蓝-5" }, // 可选:全局令牌通道(整套主题切换优先走此节点;值 = 语义名或临时主题 hex)
|
|
76
79
|
"changes": [
|
|
77
80
|
{
|
|
@@ -11,6 +11,13 @@
|
|
|
11
11
|
- 变更集 `schema` 版本不在支持范围 → 停止,向上游(用户/设计侧)报告版本不匹配,不降级猜测。
|
|
12
12
|
- `scene` 在 `parser list` 场景清单中无对应域 → 报告并列出支持的场景,等待确认。
|
|
13
13
|
|
|
14
|
+
**0.0 页面绑定检查(G13 页面绑定闸 · 先于一切施工)**
|
|
15
|
+
|
|
16
|
+
- **默认口径(红线)**:效果图页面**默认映射到项目已有页面**——效果图页面(如「运单管理」)是设计侧为承载设计语言虚构的演示标题与角色坐标系(sid 标的是角色不是业务),**不是页面增量**。落地动作恒为「在已有页面上同步结构与样式」;**禁止因效果图新增页面 / 路由 / 菜单项**。
|
|
17
|
+
- 变更集 `page_bindings` 显式声明 `target:"new"` 且 `notes` 申报的条目,才可在申报范围内走新增页面路径(L3 生成页面 + 路由 + 菜单);未声明或申报与动作不符 → 阻断并报告(不猜测、不默认放行)。
|
|
18
|
+
- 对接动作:把效果图页面与项目已有页面的映射关系(mockup → target)写入交付说明;目标页面对不上、找不到合理已有页面承载时,先向用户确认映射,**不得以「图上有这个页面」为由新建**。
|
|
19
|
+
- 判据一句话:换一张效果图不需要改项目的页面/路由/菜单清单 ⇒ 正确;效果图标题 ≠ 项目业务名,验收只比「结构与样式」不比「页面标题文字」。
|
|
20
|
+
|
|
14
21
|
**0.2 对接匹配(适配前置)——把散落的匹配收拢为一个前置阶段**
|
|
15
22
|
|
|
16
23
|
在施工前,把「设计意图 ⇄ 模板能力」整体对一遍,输出匹配结论,供**生成前**决策(而不是落地时才发现对不上)。三步判定:
|
|
@@ -49,6 +49,7 @@ node parser/index.js match --batch <changesets-dir>
|
|
|
49
49
|
| **G9 登记表身份闸** | `mode=restore` 但登记表**身份对不上**:`coverage.registry` 实物解析失败,或登记表 `design_scheme`/`scene` 与变更集 `scheme`/`scene` 不一致(或缺身份字段)——凡身份对不上的表视同没有表,防止覆盖率分母被偷换(面包屑/顶栏图标/表头 nowrap 等点位从分母消失,欠声明不可数) | 登记表顶层 `design_scheme` / `scene` ↔ 变更集顶层 `scheme` / `scene` | `G9 登记表身份闸:登记表 … 属于 scheme="…"/scene="…",与变更集 … 不一致 → 拒绝执行` |
|
|
50
50
|
| **G10 dims 兑现闸** | `mode=restore` 下登记项的 ID 已在 `changes[]` 声明,但登记 `dims` 维度未全部给全(`form` 看 `change.form`,其余看 `style ∪ layer` 的键;`source:none`、global 伪点位、`visible:false` 豁免)——「点位在、细节丢」(表头竖排 = nowrap 丢失)正是样式细节不还原的机制成因,dims 缺口与欠声明同级阻断 | 登记表条目 `dims` ↔ 变更集条目 `form` / `style` / `layer` | `dims 兑现缺口(G10 · … 条 → exit 1):… 缺 dims=[…]` |
|
|
51
51
|
| **G11 oracle 基线闸** | `mode=restore` 下 oracle 校验发现问题(主题错配 / `oracle.sids` 欠声明或无基线 / 实物缺口):restore 下从「⚠ 软提示继续」升格为「拒绝执行」——基线断了仍绿灯交付,verify 无从做 1:1 证明。同构异色复用须在 oracle 显式声明 `theme_mapping: { from, to }` | oracle 主题词 ↔ `global.brand_primary` 主题词;`oracle.sids` ↔ `changes[].id` 双向 | `oracle 基线问题(G11 · … 类 → 拒绝执行):主题错配 …` |
|
|
52
|
+
| **G13 页面绑定闸** | 落地动作涉及**新增页面 / 路由 / 菜单项**,但变更集 `page_bindings` 未把该效果图页面对应声明为 `target:"new"`(或整字段缺省)——效果图页面默认是设计角色坐标系(演示标题),不是项目页面增量;「图上有这个页面」不构成新增依据 | 变更集顶层 `page_bindings[].target` ↔ 本次 diff 是否出现新路由/菜单/页面文件 | `G13 页面绑定闸:效果图页面 … 未声明 target:"new",禁止新增页面/路由/菜单 → 映射已有页面落地` |
|
|
52
53
|
| **G1 suppress 收口** | 条目声明某 `form`,词典 `suppress_rules[form]`(或 forms 描述「suppress 必含 x」内联标记)要求收口的出厂互斥通道未全部出现在该条目 `suppress[]` | 词典条目 `suppress_rules` | `suppress 缺口:…必须收口出厂互斥通道 [x],缺 [x]` |
|
|
53
54
|
| **G5 几何语境** | 词典 preconditions 含「几何语境随值迁移」标记 ∧ `style` 含 padding/margin 族几何字段落宿主 ∧ 未声明 `suppress_inner` | 词典条目 preconditions 标记句 | `suppress_inner 缺口:…两层之和 ≠ 设计值` |
|
|
54
55
|
|
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
### 第 4 步 · L3 新模块处理(分级布局)
|
|
8
8
|
|
|
9
9
|
- **验收对象闸(角色集合必须齐)**:验收页面的**角色集合**必须覆盖变更集声明的角色。缺角色的,按第 0.2 步「对接匹配 → 需适配」处置——**项目侧补齐该角色的骨架 / 结构**(走 `crud-pages` 样板 + L3 落地并申报),**不是要求设计侧换页面**。不得用出厂 demo 页充数:demo 页**结构上就没有**标题区 / 批量按钮 / 状态 Tag 这些角色 → 这类差异**无论怎么调 CSS 都消不掉**(不是样式问题,是角色集合不匹配)。
|
|
10
|
+
- **页面映射闸(G13 · 角色集合 ≠ 页面增量)**:本步一切「生成骨架 / 新页面」的授权,**只指向变更集 `page_bindings` 显式声明 `target:"new"` 的条目**(且 `notes` 已申报);`page_bindings` 缺省或 target 指向已有页面时,角色补齐一律落在**已有页面的结构增量**上(在既有路由页面内补角色节点),**禁止新建页面 / 路由 / 菜单项来承载角色**——效果图页面是设计角色坐标系(演示标题),项目侧按它换肤,不按它扩清单。
|
|
10
11
|
- **列宽口径(业务层 / 设计层边界)**:表格**业务列宽度属业务层**,设计侧不声明、项目侧不按效果图硬套——效果图里的列宽只是其示例数据下的参考值。**唯一例外是操作列**:宽度由组件公式推算(`resolveOperateColumnWidth`,已含分割线占位),业务页禁止写死。**固定列自查(落完后必做,防「符合规范但不合常规」)**:操作列按钮不被裁、不换行、分割线居中可见;状态列标签完整;表头/单元格标题不被省略号截断——任何一项不满足即返工,禁止用「设计值就是对的」搪塞。
|
|
11
12
|
|
|
12
13
|
- **L3 是施工指令,不是待办**:词典未命中的点位一律当场落地、交付说明申报「补映射」,不留待确认。新模块按「定制布局」三步走:① 基于全局规范生成结构(继承命名/作用域/组件规范)② 原子层字段(色彩/圆角/组件级)从 `basic/` + `component/` 词典借力 ③ 场景专属点位生成后**立即写入 mapping/ 对应场景域**(临时映射),累计复用 ≥3 次建议升级标准(由人工评审)。
|
|
13
|
-
- 生成的新页面必须带构图钩子(`vts-page-card` / `vts-filter-area` / `vts-table-area`
|
|
14
|
+
- 生成的新页面必须带构图钩子(`vts-page-card` / `vts-filter-area` / `vts-table-area` 等),保证后续变更集可命中。**本条仅在 G13 申报范围内生效**(`page_bindings` 有 `target:"new"` 条目);无申报时本步不产出任何新页面文件。
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
跑 `code-quality` 全量清单之外,追加:
|
|
10
10
|
|
|
11
11
|
- [ ] 变更集外的任何点位**零改动**(diff 只含变更集提到的文件/选择器)
|
|
12
|
+
- [ ] **页面清单零增量(G13 页面绑定闸 · 历史事故:效果图演示页「运单管理」被误落地为项目新菜单)**:diff 中不得出现新增的路由定义 / 菜单项 / 页面文件,除非变更集 `page_bindings` 显式声明 `target:"new"` 且 `notes` 已申报。效果图页面默认是设计角色坐标系(演示标题),落地 = 映射已有页面同步结构与样式;`page_bindings` 缺省时本项必须为零增量。验收只比「结构与样式」,不比「页面标题文字」
|
|
12
13
|
- [ ] `visible: false` 的模块代码仍存在(只是隐藏)
|
|
13
14
|
- [ ] **`!important` 使用合规**:新增 `!important` 仅允许两种情形——① 词典 `priority.strategy = self_plus_important`(对手带 `!important`);② 对手为组件 scoped 且提权后**实测**仍平手;且每条带理由注释。其余一律靠作用域限定解决。无内联 style 硬编码色值(全部走变量)
|
|
14
15
|
- [ ] 未修改 `src/components/`(Re* 组件库源码——**底线一**)
|