@qilitt-mickey/vue3-temp-skill 1.1.74 → 1.1.76
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 +137 -137
- package/mapping/basic/color.json +35 -35
- package/mapping/basic/radius.json +17 -17
- package/mapping/basic/semantic-values.json +72 -72
- package/mapping/basic/spacing.json +21 -21
- package/mapping/basic/typography.json +21 -21
- package/mapping/component/button.json +90 -90
- package/mapping/component/card.json +31 -31
- package/mapping/component/input.json +42 -42
- package/mapping/component/overlay.json +79 -79
- package/mapping/component/pagination.json +34 -34
- package/mapping/component/table.json +42 -42
- package/mapping/component/tag.json +48 -48
- package/mapping/layout/breakpoint.json +20 -20
- package/mapping/scenes/admin/content.json +497 -494
- package/mapping/scenes/admin/layout.json +577 -574
- package/package.json +1 -1
- package/parser/fixtures/changeset-legacy.json +11 -11
- package/parser/fixtures/changeset-neg1.json +8 -8
- package/parser/fixtures/changeset-neg2.json +10 -10
- package/parser/fixtures/changeset-neg3.json +22 -22
- package/parser/fixtures/changeset-neg5-g8-stub.json +26 -26
- package/parser/fixtures/changeset-neg7-g10-dims.json +57 -57
- package/parser/fixtures/changeset-neg9-g6-token-chain.json +34 -0
- package/parser/fixtures/changeset-pos-g6-token-chain.json +35 -0
- package/parser/fixtures/changeset-pos-theme-nometa.json +260 -260
- package/parser/fixtures/changeset-registry-gap.json +29 -29
- package/parser/fixtures/fake-project/src/styles/app.scss +5 -5
- package/parser/fixtures/fake-project/src/views/list.vue +13 -13
- package/parser/fixtures/registry-bad.json +11 -11
- package/parser/fixtures/registry-g6-token-chain.json +10 -0
- package/parser/fixtures/verify/actual-clean.json +35 -35
- package/parser/fixtures/verify/actual.json +33 -33
- package/parser/fixtures/verify/mockup-g6-content.html +12 -0
- package/parser/fixtures/verify/mockup-neutral.html +26 -26
- package/parser/fixtures/verify/mockup-nometa.html +26 -26
- package/parser/fixtures/verify/snapshot-latest.json +102 -102
- package/parser/index.js +32 -1
- package/parser/loader.js +66 -66
- package/parser/validator.js +206 -206
- package/references/auth-pages.md +217 -217
- package/references/base-code-dict.md +56 -56
- package/references/data-compare.md +509 -509
- package/references/data-writeback.md +124 -124
- package/references/design-apply.md +167 -167
- package/references/detail-page.md +119 -119
- package/references/download-export.md +97 -97
- package/references/feedback-loading.md +104 -104
- package/references/feedback-ui.md +134 -134
- package/references/i18n-localization.md +230 -230
- package/references/layout-theme.md +2 -0
- package/references/project-inventory.md +438 -438
- package/references/rich-text.md +94 -94
- package/references/seamless-scroll.md +47 -47
- package/references/steps/step0-preflight.md +58 -58
- package/references/steps/step1-match.md +5 -2
- package/references/steps/step3-style.md +38 -33
- package/references/steps/step3b-shell.md +2 -0
- package/references/steps/step3c-priority.md +26 -26
- package/references/steps/step4-l3.md +14 -14
- package/references/steps/step5-gates.md +65 -63
- package/references/steps/step6-verify.md +77 -77
- package/references/verify-captcha.md +119 -119
- package/scripts/check.mjs +24 -0
- package/scripts/design-audit.mjs +208 -3
|
@@ -1,124 +1,124 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: data-writeback
|
|
3
|
-
description: 编辑回显用 Object.assign(formData, res.data) 避免破坏响应式
|
|
4
|
-
scope: project
|
|
5
|
-
tags: [回显, 回填, 回写, useFormCheck, Object.assign, 编辑数据]
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# 数据回写与编辑
|
|
9
|
-
|
|
10
|
-
> 按本文件示例编写,复用项目已有回显/回填约定与选择器回写方式,勿另起一套表单赋值实现。
|
|
11
|
-
|
|
12
|
-
**完整性守则**:编辑回显**必须** `Object.assign(formData, res.data)`,禁止 `formData = res.data` 破坏响应式。提交按钮默认带 `loading`。
|
|
13
|
-
|
|
14
|
-
## 强制样板(编辑回显)
|
|
15
|
-
|
|
16
|
-
```typescript
|
|
17
|
-
async function getDetail() {
|
|
18
|
-
const { id } = getParameter.value;
|
|
19
|
-
if (!id) return;
|
|
20
|
-
const res = await getDetailApi({ id });
|
|
21
|
-
if (res.status === 200 && res.data) Object.assign(formData, res.data);
|
|
22
|
-
}
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## 表单回显
|
|
26
|
-
|
|
27
|
-
### 新增/编辑页
|
|
28
|
-
|
|
29
|
-
```typescript
|
|
30
|
-
async function getDetail() {
|
|
31
|
-
const { id } = getParameter.value
|
|
32
|
-
if (!id) return
|
|
33
|
-
const res = await getDetailApi({ id })
|
|
34
|
-
Object.assign(formData, res.data)
|
|
35
|
-
}
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
### 选择类组件回填
|
|
39
|
-
|
|
40
|
-
| 组件 | 回填方式 |
|
|
41
|
-
|------|---------|
|
|
42
|
-
| `ReSelectQuery` | 传 `edit-data` 属性 |
|
|
43
|
-
| `el-tree-select` | 传 `:cache-data` 属性 |
|
|
44
|
-
| `ReCascader` | 直接传 `v-model` 数组 |
|
|
45
|
-
|
|
46
|
-
### 表单重置
|
|
47
|
-
|
|
48
|
-
```typescript
|
|
49
|
-
function reset() {
|
|
50
|
-
formRef.value.resetFields()
|
|
51
|
-
}
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## 表格行编辑
|
|
55
|
-
|
|
56
|
-
表格内编辑时维护行状态,支持备份/恢复:
|
|
57
|
-
|
|
58
|
-
```typescript
|
|
59
|
-
const tableData = ref([])
|
|
60
|
-
|
|
61
|
-
function startEdit(row) {
|
|
62
|
-
row._edit = true
|
|
63
|
-
row._backup = { ...row } // 备份原始数据
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
function cancelEdit(row) {
|
|
67
|
-
Object.assign(row, row._backup) // 恢复
|
|
68
|
-
row._edit = false
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
function saveEdit(row) {
|
|
72
|
-
// 调用保存接口
|
|
73
|
-
saveRowApi(row).then(() => {
|
|
74
|
-
row._edit = false
|
|
75
|
-
delete row._backup
|
|
76
|
-
})
|
|
77
|
-
}
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
## 多表单联合校验
|
|
81
|
-
|
|
82
|
-
页面包含多个表单时,使用 `validateForms` 统一校验:
|
|
83
|
-
|
|
84
|
-
```typescript
|
|
85
|
-
import { validateForms } from '@/utils/utils'
|
|
86
|
-
|
|
87
|
-
const formModulesRef = ref([])
|
|
88
|
-
const formModules = [
|
|
89
|
-
{ refName: 'formA' },
|
|
90
|
-
{ refName: 'formB' },
|
|
91
|
-
]
|
|
92
|
-
|
|
93
|
-
async function handleSubmit() {
|
|
94
|
-
const valid = await validateForms(formModulesRef.value, formModules)
|
|
95
|
-
if (!valid) return
|
|
96
|
-
// 所有表单校验通过,提交数据
|
|
97
|
-
}
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
## useFormCheck Hook
|
|
101
|
-
|
|
102
|
-
表单校验聚合,适用于需要监听多个字段校验状态的场景:
|
|
103
|
-
|
|
104
|
-
```typescript
|
|
105
|
-
import { useFormCheck } from '@/hooks/useFormCheck'
|
|
106
|
-
|
|
107
|
-
const { validateStatus, onValidate } = useFormCheck(['field1', 'field2'])
|
|
108
|
-
|
|
109
|
-
// 在 el-form 的 @validate 事件中收集
|
|
110
|
-
// validateStatus 响应式记录各字段的校验结果
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
## 关键约定
|
|
114
|
-
|
|
115
|
-
1. 回显时只覆盖表单字段,不破坏响应式结构(使用 `Object.assign` 而非重新赋值)。
|
|
116
|
-
2. 编辑前备份数据(`_backup`),取消时恢复。
|
|
117
|
-
3. 选择类组件回填需同时维护 code 与 name 两个字段。
|
|
118
|
-
4. 多表单校验使用 `validateForms`,不要手动逐个调用 `validate()`。
|
|
119
|
-
5. 提交按钮必须有 `loading` 状态防重复提交。
|
|
120
|
-
|
|
121
|
-
## 关联文件
|
|
122
|
-
|
|
123
|
-
- `src/utils/utils.ts`
|
|
124
|
-
- `src/hooks/useFormCheck.ts`
|
|
1
|
+
---
|
|
2
|
+
name: data-writeback
|
|
3
|
+
description: 编辑回显用 Object.assign(formData, res.data) 避免破坏响应式
|
|
4
|
+
scope: project
|
|
5
|
+
tags: [回显, 回填, 回写, useFormCheck, Object.assign, 编辑数据]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# 数据回写与编辑
|
|
9
|
+
|
|
10
|
+
> 按本文件示例编写,复用项目已有回显/回填约定与选择器回写方式,勿另起一套表单赋值实现。
|
|
11
|
+
|
|
12
|
+
**完整性守则**:编辑回显**必须** `Object.assign(formData, res.data)`,禁止 `formData = res.data` 破坏响应式。提交按钮默认带 `loading`。
|
|
13
|
+
|
|
14
|
+
## 强制样板(编辑回显)
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
async function getDetail() {
|
|
18
|
+
const { id } = getParameter.value;
|
|
19
|
+
if (!id) return;
|
|
20
|
+
const res = await getDetailApi({ id });
|
|
21
|
+
if (res.status === 200 && res.data) Object.assign(formData, res.data);
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 表单回显
|
|
26
|
+
|
|
27
|
+
### 新增/编辑页
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
async function getDetail() {
|
|
31
|
+
const { id } = getParameter.value
|
|
32
|
+
if (!id) return
|
|
33
|
+
const res = await getDetailApi({ id })
|
|
34
|
+
Object.assign(formData, res.data)
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### 选择类组件回填
|
|
39
|
+
|
|
40
|
+
| 组件 | 回填方式 |
|
|
41
|
+
|------|---------|
|
|
42
|
+
| `ReSelectQuery` | 传 `edit-data` 属性 |
|
|
43
|
+
| `el-tree-select` | 传 `:cache-data` 属性 |
|
|
44
|
+
| `ReCascader` | 直接传 `v-model` 数组 |
|
|
45
|
+
|
|
46
|
+
### 表单重置
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
function reset() {
|
|
50
|
+
formRef.value.resetFields()
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 表格行编辑
|
|
55
|
+
|
|
56
|
+
表格内编辑时维护行状态,支持备份/恢复:
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
const tableData = ref([])
|
|
60
|
+
|
|
61
|
+
function startEdit(row) {
|
|
62
|
+
row._edit = true
|
|
63
|
+
row._backup = { ...row } // 备份原始数据
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function cancelEdit(row) {
|
|
67
|
+
Object.assign(row, row._backup) // 恢复
|
|
68
|
+
row._edit = false
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function saveEdit(row) {
|
|
72
|
+
// 调用保存接口
|
|
73
|
+
saveRowApi(row).then(() => {
|
|
74
|
+
row._edit = false
|
|
75
|
+
delete row._backup
|
|
76
|
+
})
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## 多表单联合校验
|
|
81
|
+
|
|
82
|
+
页面包含多个表单时,使用 `validateForms` 统一校验:
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
import { validateForms } from '@/utils/utils'
|
|
86
|
+
|
|
87
|
+
const formModulesRef = ref([])
|
|
88
|
+
const formModules = [
|
|
89
|
+
{ refName: 'formA' },
|
|
90
|
+
{ refName: 'formB' },
|
|
91
|
+
]
|
|
92
|
+
|
|
93
|
+
async function handleSubmit() {
|
|
94
|
+
const valid = await validateForms(formModulesRef.value, formModules)
|
|
95
|
+
if (!valid) return
|
|
96
|
+
// 所有表单校验通过,提交数据
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## useFormCheck Hook
|
|
101
|
+
|
|
102
|
+
表单校验聚合,适用于需要监听多个字段校验状态的场景:
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
import { useFormCheck } from '@/hooks/useFormCheck'
|
|
106
|
+
|
|
107
|
+
const { validateStatus, onValidate } = useFormCheck(['field1', 'field2'])
|
|
108
|
+
|
|
109
|
+
// 在 el-form 的 @validate 事件中收集
|
|
110
|
+
// validateStatus 响应式记录各字段的校验结果
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## 关键约定
|
|
114
|
+
|
|
115
|
+
1. 回显时只覆盖表单字段,不破坏响应式结构(使用 `Object.assign` 而非重新赋值)。
|
|
116
|
+
2. 编辑前备份数据(`_backup`),取消时恢复。
|
|
117
|
+
3. 选择类组件回填需同时维护 code 与 name 两个字段。
|
|
118
|
+
4. 多表单校验使用 `validateForms`,不要手动逐个调用 `validate()`。
|
|
119
|
+
5. 提交按钮必须有 `loading` 状态防重复提交。
|
|
120
|
+
|
|
121
|
+
## 关联文件
|
|
122
|
+
|
|
123
|
+
- `src/utils/utils.ts`
|
|
124
|
+
- `src/hooks/useFormCheck.ts`
|
|
@@ -1,167 +1,167 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: design-apply
|
|
3
|
-
description: 设计变更集落地执行协议。接收 project-ui-design 输出的语义 ID 变更集 JSON,经 parser 三级匹配翻译为施工坐标,按"先结构后样式"顺序落地到目标项目,并过变更集合规闸门。
|
|
4
|
-
scope: project
|
|
5
|
-
tags: [design-apply, changeset, semantic-id, mapping, parser, theme, layout]
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# 设计变更集落地(design-apply)
|
|
9
|
-
|
|
10
|
-
## 定位
|
|
11
|
-
|
|
12
|
-
本能力组是**双 Skill 链路的项目侧执行端**:统一获取上游设计技能产出的「语义 ID 变更集」JSON(`design.changeset/1.0`,协议技术栈中立),由本 Skill 负责翻译并落地到目标项目(vue3-web-temp 及派生项目)。上游设计技能为 **project-ui-design**,协议文档见其 `references/changeset-schema.md`。
|
|
13
|
-
|
|
14
|
-
**变更集落点唯一化(强制)**:变更集一律落在 `<落地项目>/.design/changeset-<场景>-<页型>-<主题>.json`,与交付台账 `ledger.json` 同目录;多份并存时无法判定「本轮交付物」(`design-audit.mjs` 会告警)。**落地台账**(`ledger.json`,由审计闸自动维护)记录每轮的 `covered/applicable`、设计层行数与已落地语义 ID 集合——它既是**回退检测**的依据,也是**断点续传**的入口:跨轮「继续」时按 `applicable − 已落地点数` 取剩余工作项,禁止把「继续」当成重跑一次同样的开头。
|
|
15
|
-
|
|
16
|
-
```
|
|
17
|
-
设计变更集 JSON(设计技能产出,中立协议)
|
|
18
|
-
↓ 项目侧统一获取(设计技能不感知下游)
|
|
19
|
-
parser match(确定性翻译)→ 施工坐标 → AI 按坐标改代码 → 合规闸门
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
分工原则:**词典(mapping/)负责精确,parser 负责翻译,AI 负责施工**。AI 不自行猜测任何点位定位或变量映射。
|
|
23
|
-
|
|
24
|
-
**方向约定**:设计技能只做产出,不知道对接方是谁;本 Skill 是变更集的统一获取与执行方。变更集来源不限(project-ui-design 或任何按协议输出的设计工具/人工)。
|
|
25
|
-
|
|
26
|
-
## 变更集获取与词汇约束下发
|
|
27
|
-
|
|
28
|
-
变更集输入有两条来路,处理方式相同:
|
|
29
|
-
|
|
30
|
-
1. **直接输入**:用户/上游直接给出变更集 JSON 文件或内容。
|
|
31
|
-
2. **设计技能产出**:用户在设计会话产出变更集后转来落地。若用户尚未产出,可先**下发词汇约束**提升命中率——把 `node parser/index.js list --verbose` 的点位清单(ID + 字段 + 形态枚举)一并提供给设计侧(`mapping_version` 恒为 `1.0.0`,设计侧无需查询版本),设计侧按约束输出(约束外意图走其 pending 通道,落地时按 L3 处理)。
|
|
32
|
-
|
|
33
|
-
无论哪条来路,落地流程一律走下文「执行流程」。
|
|
34
|
-
|
|
35
|
-
**阅读纪律(防上下文溢出,与流程红线同级)**:
|
|
36
|
-
|
|
37
|
-
1. **词典走 parser,禁直读全文**:`mapping/` 下 JSON 是 parser 的事实源,不是给人(AI)通读的——查点位用 `parser query <id>`、查清单用 `parser list`,**禁止整文件读入 `mapping/scenes/*.json` / `mapping/basic/*.json`**(仅 validator/regression 维护场景或 parser 明确报错需要人工核对单条时,用 `Grep` 精确抽取相关条目,不整读)。
|
|
38
|
-
2. **落地会话禁读设计侧规范库**:设计技能的 `page-specs/`(规范/令牌/效果图)不属于项目侧视野——项目侧消费的是**变更集 + oracle.json + 登记表**三个交付物;`oracle.mockup` 指向的效果图由 `resolveFirstExisting` 跨库解析给 parser 使用,但人(AI)**不打开、不阅读设计侧效果图与规范文件**。
|
|
39
|
-
3. **效果图只读一次**:期望值优先直接消费设计侧交付的 `oracle.json`;确需现场抽取时(无产物降级路径),抽取完成后值落盘,**后续轮次禁止反复打开效果图 HTML/JPG**。
|
|
40
|
-
4. **做到哪一步读哪一份**:各步骤细节在 `steps/` 子文件(见下方索引),按当前阶段加载,禁止一次全部通读。
|
|
41
|
-
|
|
42
|
-
## 出厂中性 · 变更集驱动(架构红线,违反即返工)
|
|
43
|
-
|
|
44
|
-
**同一份模板源码,换一份变更集 = 换一套外观。** 任何「本次设计的结论」都不许固化进源码:
|
|
45
|
-
|
|
46
|
-
| | 允许 | 禁止 |
|
|
47
|
-
|---|---|---|
|
|
48
|
-
| 模板源码 | 只提供**能力通道**:CSS 变量的消费者挂载点、form 枚举、DOM/属性钩子、正确的层叠优先级 | 预置**设计结论**:某个具体颜色、某句问候语、某个方位的指示条、某个硬编码尺寸 |
|
|
49
|
-
| 设计产出 | AI 按本协议写入**设计层文件 / 页面级 scoped 样式 / DOM 属性与配置** | 为表达某张效果图而改写出厂样式文件与出厂组件(换设计即失效,且污染模板) |
|
|
50
|
-
|
|
51
|
-
**判据(一句话)**:换一张效果图只需要换变更集、不需要改源码 ⇒ 架构正确;需要改源码才能换 ⇒ 设计结论被烧进了源码,必须回退为通道。
|
|
52
|
-
|
|
53
|
-
- ❌ 反例:把「菜单激活指示条 = 左侧 3px」写死进 `sidebar.scss` / `element-plus.scss`;把问候语 DOM 直接加进 `lay-navbar/index.vue`;出厂 `<component>` 上硬编码 `data-content-mode="scroll"`。
|
|
54
|
-
- ✅ 正例:`admin.layout.sidebar.menu` 暴露 `forms`(pill/indicator_left/indicator_right/indicator_underline/none)+ 几何字段,方位与粗细由变更集驱动;高度模式出厂不带任何属性,由页面根节点按变更集声明。
|
|
55
|
-
|
|
56
|
-
**落地三落点判据**(每个变更字段先判落点再动手):
|
|
57
|
-
|
|
58
|
-
1. **有非样式通道**(DOM 属性 / 组件配置 / `platform-config.json`)→ 必须走该通道(form=scroll/fixed → 页面根节点 `data-content-mode`;form=card → `ShowModel`)。降级写成 SCSS = 未施工。
|
|
59
|
-
2. **无通道且需改 DOM**(新增节点,如问候语欢迎区)→ 结构增量施工(AI 在组件模板内按 `form` 插入,保形插入、不删原代码)。
|
|
60
|
-
3. **纯视觉表达**(颜色/圆角/间距/指示条几何)→ 设计层文件(见第 3 步)。
|
|
61
|
-
|
|
62
|
-
**出厂文件仅在「通道缺失」时才可改动**,且须同时满足:① 补的是能力不是结论(补变量消费者、补 form 枚举、修层叠优先级);② 在交付说明中单列「补通道」条目写明缺失点与修复内容。
|
|
63
|
-
|
|
64
|
-
**模板源码注释保持中性(防污染)**:源码注释只写「这段代码做什么」——给后续维护者看。**禁止把面向 AI 的规范写进模板源码**:语义 ID、变更条目、本协议步骤号、缺口 / 自举 / 申报 / 「设计还原禁止改写本段」这类纪律条款,一律留在技能侧(`crud-pages.md` 结构通道 / `code-quality.md` 清单 / 本节),不得写进 `lay-*.vue`、`element-plus.scss`、`sidebar.scss`、`index.scss`、`design-shell.scss` 等模板文件。判据:**技能侧改了内容不需要动模板 ⇒ 正确**;改一条纪律还要去改模板注释 ⇒ 放错层。落地时技能侧只承诺「这四类通道的能力」(`data-content-mode` / `data-fill` / `design-shell.scss` 落点 / 构图钩子),具体契约与纪律全部由技能文档承载。
|
|
65
|
-
|
|
66
|
-
## 输入契约(变更集 Schema v1.0)
|
|
67
|
-
|
|
68
|
-
```jsonc
|
|
69
|
-
{
|
|
70
|
-
"schema": "design.changeset/1.0", // 协议版本(parser 兼容历史值 design-changeset/v1,新输出一律用 1.0)
|
|
71
|
-
"changeset_version": "1.0.0", // 恒填 "1.0.0"
|
|
72
|
-
"mapping_version": "1.0.0", // 恒填 "1.0.0":版本由双侧 SKILL.md 体系版本统一管理,词典不单独演进。parser 校验口径 = 变更集值 ∈ 词典版本集合(恒通过);仅协议破坏性升级时双侧同步升版
|
|
73
|
-
"scene": "admin", // 场景前缀,须与 mapping 场景域一致
|
|
74
|
-
"scheme": "default", // 方案标识(mode=restore 时必填):取设计侧 page-specs/styles/registry.json 的方案 id;与 scene 共同定位「方案 × 场景」的清单/登记表
|
|
75
|
-
"mode": "restore", // 交付模式(G8 模式闸):restore=场景还原(scheme + oracle.mockup + coverage.registry 强制必填);design=显式声明的轻量微调;缺省 design
|
|
76
|
-
"layout_type": "vertical", // 标准布局枚举:vertical / horizontal / mix(字段名固定 layout_type,非 layout)
|
|
77
|
-
"page_bindings": [ // 页面映射(G13 页面绑定闸):效果图页面 → 项目页面的身份声明;缺省 = 全部映射已有页面。效果图页面默认是设计角色坐标系,不是页面增量——未显式 target:"new" 时禁止新增页面/路由/菜单
|
|
78
|
-
{ "mockup": "后台管理端.html", "target": "<项目已有列表页路由名/路径>", "note": "效果图标题是设计角色坐标系 = 已有页面换肤基线,非新增业务" }
|
|
79
|
-
],
|
|
80
|
-
"global": { "brand_primary": "钴蓝-5" }, // 可选:全局令牌通道(整套主题切换优先走此节点;值 = 语义名或临时主题 hex)
|
|
81
|
-
"changes": [
|
|
82
|
-
{
|
|
83
|
-
"id": "admin.layout.sidebar.menu", // 语义 ID(词典 key)
|
|
84
|
-
"visible": true, // 可选:隐藏用 false(v-if/display,不删代码)
|
|
85
|
-
"position": "right", // 可选:相对方位(left/right/top/bottom)
|
|
86
|
-
"form": "card", // 可选:形态切换(见条目 forms 枚举)
|
|
87
|
-
"style": { "menu_bg": "钴蓝-9" }, // 可选:抽象样式字段(词典 css_vars/custom_style_map key;值 = 语义名或 hex)
|
|
88
|
-
"apply_via": "admin.layout.sidebar.menu", // 可选:本声明引用的锚点来源条目(缺省 = 自身;值 = 语义 ID,不是选择器)
|
|
89
|
-
"layer": { "menu_text": "host" }, // 可选:落点层级(host 宿主盒 / inner 内层文本盒);可为字符串(整条生效)或「字段 → 层级」对象
|
|
90
|
-
"structure_ops": [ // 可选:结构施工声明(数据 / 结构驱动点位必须给,只写 CSS = 无效声明)
|
|
91
|
-
{ "op": "render_branch", "node": "status_tag", "source": "row.status" }
|
|
92
|
-
]
|
|
93
|
-
}
|
|
94
|
-
],
|
|
95
|
-
"pending": [ // 新增 ID 通道:parser 解析 function/parent 供 L3 施工
|
|
96
|
-
{ "proposed_id": "portal.content.banner.carousel", "function": "门户首页轮播横幅", "parent": "portal.content.banner" }
|
|
97
|
-
]
|
|
98
|
-
}
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
** 三个声明维度**(补齐「由哪个通道落地 / 被压时怎么赢 / 需要改结构时落在哪」):
|
|
102
|
-
|
|
103
|
-
| 字段 | 作用 | 值域 |
|
|
104
|
-
|---|---|---|
|
|
105
|
-
| `apply_via` | 指认本声明使用的**锚点来源条目**(在哪条词条的 `anchors` 上落地) | 语义 ID 字符串(2~4 段小写下划线);不是选择器 / 变量名 |
|
|
106
|
-
| `layer` | 指认样式落在**宿主盒**还是**内层文本盒** | `"host"` / `"inner"`;或 `{ "<style字段>": "host"|"inner" }` |
|
|
107
|
-
| `structure_ops[]` | 需要**结构施工**时声明「改哪个语义节点 / 数据源、怎么改」 | `op` ∈ `add_node` / `remove_node` / `move_node` / `render_branch` / `bind_source`;`node` / `source` / `from` / `to` 为语义名 |
|
|
108
|
-
|
|
109
|
-
硬约束:
|
|
110
|
-
- 变更集**只含变更点位**——未提到的点位一律不动。
|
|
111
|
-
- `style` 字段为**抽象视觉语义**(`menu_bg`、`radius`),不得出现 CSS 变量名、选择器、`!important`、技术栈词汇。值口径:官方 5 套主题用语义名(`钴蓝-5`,译表见 `mapping/basic/semantic-values.json`);库外临时主题直接 hex + `notes` 申报派生口径。
|
|
112
|
-
- `position` 用相对方位词,不用像素坐标。
|
|
113
|
-
- `visible: false` 只做隐藏,**永不删除代码**。
|
|
114
|
-
- `apply_via` / `layer` / `structure_ops` 与 `style` 同属**语义声明**,同样不得出现选择器、CSS 变量名、DOM 词、技术栈词:`apply_via` 必须是语义 ID(锚点名)、`layer` 只能取 `host` / `inner`、`structure_ops[].op` 只能取五枚举。
|
|
115
|
-
- `pending` 数组声明的是设计侧新点位,直接归入 L3 处理(不是错误)。**注意:pending 不是施工指令**——L3 施工的内容以 `changes[]` 中同 ID 新条目声明的意图为准;设计侧只登记 pending、未在 changes[] 声明意图的点位,落地时按出厂现状处理并在缺口清单中反馈「该点位设计意图缺失」。
|
|
116
|
-
- parser 校验已实现:schema 硬校验、mapping_version 缺失/不匹配拒绝、禁词与 hex 位置校验、语义 ID 命名校验、`layer` / `apply_via` / `structure_ops` 结构校验。
|
|
117
|
-
|
|
118
|
-
各步骤**子文件按需加载**(做到哪一步读哪一份,禁止一次全部通读):
|
|
119
|
-
|
|
120
|
-
| 步骤 | 子文件 | 内容 | 加载时机 |
|
|
121
|
-
|---|---|---|---|
|
|
122
|
-
| 第 0 步 | [`step0-preflight.md`](steps/step0-preflight.md) | 第 0 步 · 版本与场景检查 · 对接匹配(适配前置)· 运行时清场 | 每次落地开工前(版本/场景/对接匹配/运行时清场三件套) |
|
|
123
|
-
| 第 1 步 | [`step1-match.md`](steps/step1-match.md) | 第 1 步 · parser 确定性匹配(含词典硬闸 G8-G11/G1/G5) | match 执行与闸门判读 |
|
|
124
|
-
| 第 1 步附加 | [`step1b-audit.md`](steps/step1b-audit.md) | 第 1 步附加 · 挂载点审计(audit · 静态查三类隐性缺口) | match 通过后、施工前 |
|
|
125
|
-
| 第 1 步附加(之二) | [`step1c-registry.md`](steps/step1c-registry.md) | 登记表覆盖率(子项级细闸) | 变更集带 coverage.registry / --registry 时 |
|
|
126
|
-
| 第 2 步 | [`step2-structure.md`](steps/step2-structure.md) | 第 2 步 · 结构先行(visible / position / form · structure_ops · layer · suppress · priority 消费) | 进入施工时(先于一切样式) |
|
|
127
|
-
| 第 3 步 | [`step3-style.md`](steps/step3-style.md) | 第 3 步 · 样式落地(两层转换 + 语义值译表) | 结构完成后 |
|
|
128
|
-
| 第 3 步附加 | [`step3b-shell.md`](steps/step3b-shell.md) | 第 3 步附加 · 设计层落点文件 design-shell.scss(强制 · 覆写定律 · 自举) | 写任何新 CSS 规则前 |
|
|
129
|
-
| 第 3 步附加(之二) | [`step3c-priority.md`](steps/step3c-priority.md) | 覆写优先级消费(硬步骤) | 与 step3b 配套,落规则前逐条判定 |
|
|
130
|
-
| 第 4 步 | [`step4-l3.md`](steps/step4-l3.md) | 第 4 步 · L3 新模块处理(分级布局) | 存在未命中点位 / 新页面生成时 |
|
|
131
|
-
| 第 5 步 | [`step5-gates.md`](steps/step5-gates.md) | 第 5 步 · 合规闸门(变更集专属检查清单) | 施工完成后、验收前 |
|
|
132
|
-
| 第 6 步 | [`step6-verify.md`](steps/step6-verify.md) | 第 6 步 · 渲染态验收(oracle 逐点 diff · 快照回归 · 残差豁免) | 变更集含 oracle 时强制 |
|
|
133
|
-
| 维护 | [`maintenance.md`](steps/maintenance.md) | 词典维护纪律 · 出厂状态漂移排查 | 改 mapping / 排查词典假前提时 |
|
|
134
|
-
| 回归 | [`regression.md`](steps/regression.md) | 端到端回归 A-V · 配套工具 | 改 parser/mapping 后必跑 |
|
|
135
|
-
|
|
136
|
-
**红线摘要(全文适用,细节在各步子文件)**:出厂中性 · 变更集驱动(上文);先结构后样式(第 2 步先于第 3 步);缺口只分「能力缺口(当场落地)」与「意图缺口(回流设计侧)」两类;**效果图/大文件只读一次**——期望值落盘 `oracle.json` 后,后续环节一律消费落盘产物,禁止反复重读。环境无 Node 时按「环境备注」(见 maintenance.md)人工执行。
|
|
137
|
-
|
|
138
|
-
## 施工标记规范(G3:@sid / @closed,design-audit E15 机检)
|
|
139
|
-
|
|
140
|
-
结构性声明(`form` / `suppress` / `suppress_inner` / `structure_ops` / `text_visible:none` / `visible:false`)**必须在设计层留机读标记**——声明了不等于落地了,没有标记就没有对账凭证(悬空声明例:`collapse_trigger.form=header_inline` 声明后壳层零规则,落地端静默无效):
|
|
141
|
-
|
|
142
|
-
| 标记 | 写法 | 作用 |
|
|
143
|
-
|---|---|---|
|
|
144
|
-
| `@sid` | 规则上方 `/* @sid: <语义ID> */` | 「变更集 ↔ 设计层」逐条落点对账(@sid 强制) |
|
|
145
|
-
| `@closed` | 收口规则上方 `/* @closed: <通道名> */` | suppress 收口兑现证据(通道名 = 词典 forms/css_vars/custom_style_map 的键) |
|
|
146
|
-
|
|
147
|
-
补充证据通道:通道为 `css_vars` 键时,设计层对该 var 写关闭值(`transparent` / `none` / `0`)即视为兑现,可免 `@closed` 标记;`visible:false` 的 `display:none` 规则按 E6 口径取证。**双向对账(E15)**:设计层 `@closed` 了变更集未声明的通道 → WARN(台账失真,收口记录进不了 D13 继承链);声明了词典不认识的 form 值 / 通道名 → ERROR(悬空声明 = 无规则可挂);结构性声明在设计层零证据 → ERROR。
|
|
148
|
-
|
|
149
|
-
## 会话结束条件(终态硬闸,违反 = 交付未完成)
|
|
150
|
-
|
|
151
|
-
**落地会话不许「做一批、停下来等用户说继续」。** 「继续」只是异常中断后的恢复手段,不是交付形态——把恢复手段当成默认流程 = 把 1:1 还原降级为多次半成品。本轮做完一批点位后,**必须自动进入下一批**,直到同时满足以下三条才允许结束会话:
|
|
152
|
-
|
|
153
|
-
| # | 结束条件 | 判定方式 |
|
|
154
|
-
|---|---|---|
|
|
155
|
-
| 1 | **施工对账清零**:变更集全部已声明点位(`changes[]` ∪ `visible:false` ∪ `pending` 兑现项)全部落地 | 对照 `.design/ledger.json` 台账与 parser match 输出逐条核销;剩余 >0 → 继续施工 |
|
|
156
|
-
| 2 | **静态闸清零**:`parser audit` 与 `scripts/design-audit.mjs` 的 ERROR = 0 | 两闸任一 ERROR 即返工,不得带错收尾 |
|
|
157
|
-
| 3 | **验收闭环**:变更集含 oracle 时跑第 6 步 verify(本环境无浏览器 → 渲染态抽取显式移交用户执行,并说明移交项) | verify 全绿或移交说明已给出 |
|
|
158
|
-
| 4 | **终态机读凭证**:跑通 `node <技能>/scripts/apply-final-gate.mjs --project <项目根> --container-width <内容区宽>`,取得 `FINAL-GATE: PASS` | 该命令串联四闸(changeset-selfcheck → parser match → parser audit → design-audit),任何一步非零即 `FAIL`,会话**不得以完成态结尾**;PASS 凭证自动写入 `.design/ledger.json` 的 `finalGate` 字段——终态判定以凭证为准,不以会话自述为准。**mode 唯一合法值 restore**:缺 mode / 写 design / 基线命中却缺三件套,均在此拦截 |
|
|
159
|
-
|
|
160
|
-
> 条件 4 是 1–3 的机器汇总,不替代前三条的人读核对;前 3 条满足而凭证 FAIL = 仍有静态闸未清零,按 FAIL 输出逐项修复。
|
|
161
|
-
|
|
162
|
-
**禁止的收尾话术(出现即判定为本轮交付失败,必须继续)**:
|
|
163
|
-
- 「全量覆盖是迭代项 / 随迭代补齐 / 后续迭代再补其余细项 / 不阻塞已落地代码」——**覆盖率欠账 = 交付未完成**,不是迭代计划;设计侧变更集 `coverage.note` 出现同类表述同样视为交付失败(设计侧闸 D4/D9 会先拦,话术绕过闸的在这里兜底)。
|
|
164
|
-
- 「核心点位已落地,其余点位影响不大」——影响大小不由落地端裁定,范围只由变更集 `coverage` 与登记表裁定。
|
|
165
|
-
- 「已落地主题色与关键视觉,还原度已达 X%」——还原度以 verify / 登记表对账为准,不得以点位抽样自评。
|
|
166
|
-
|
|
167
|
-
**环境能力边界**:无浏览器只豁免「渲染态抽取与 verify」,**不豁免逐点施工**——静态可落地的 190 子项必须在会话内全部落地,施工不需要浏览器。
|
|
1
|
+
---
|
|
2
|
+
name: design-apply
|
|
3
|
+
description: 设计变更集落地执行协议。接收 project-ui-design 输出的语义 ID 变更集 JSON,经 parser 三级匹配翻译为施工坐标,按"先结构后样式"顺序落地到目标项目,并过变更集合规闸门。
|
|
4
|
+
scope: project
|
|
5
|
+
tags: [design-apply, changeset, semantic-id, mapping, parser, theme, layout]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# 设计变更集落地(design-apply)
|
|
9
|
+
|
|
10
|
+
## 定位
|
|
11
|
+
|
|
12
|
+
本能力组是**双 Skill 链路的项目侧执行端**:统一获取上游设计技能产出的「语义 ID 变更集」JSON(`design.changeset/1.0`,协议技术栈中立),由本 Skill 负责翻译并落地到目标项目(vue3-web-temp 及派生项目)。上游设计技能为 **project-ui-design**,协议文档见其 `references/changeset-schema.md`。
|
|
13
|
+
|
|
14
|
+
**变更集落点唯一化(强制)**:变更集一律落在 `<落地项目>/.design/changeset-<场景>-<页型>-<主题>.json`,与交付台账 `ledger.json` 同目录;多份并存时无法判定「本轮交付物」(`design-audit.mjs` 会告警)。**落地台账**(`ledger.json`,由审计闸自动维护)记录每轮的 `covered/applicable`、设计层行数与已落地语义 ID 集合——它既是**回退检测**的依据,也是**断点续传**的入口:跨轮「继续」时按 `applicable − 已落地点数` 取剩余工作项,禁止把「继续」当成重跑一次同样的开头。
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
设计变更集 JSON(设计技能产出,中立协议)
|
|
18
|
+
↓ 项目侧统一获取(设计技能不感知下游)
|
|
19
|
+
parser match(确定性翻译)→ 施工坐标 → AI 按坐标改代码 → 合规闸门
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
分工原则:**词典(mapping/)负责精确,parser 负责翻译,AI 负责施工**。AI 不自行猜测任何点位定位或变量映射。
|
|
23
|
+
|
|
24
|
+
**方向约定**:设计技能只做产出,不知道对接方是谁;本 Skill 是变更集的统一获取与执行方。变更集来源不限(project-ui-design 或任何按协议输出的设计工具/人工)。
|
|
25
|
+
|
|
26
|
+
## 变更集获取与词汇约束下发
|
|
27
|
+
|
|
28
|
+
变更集输入有两条来路,处理方式相同:
|
|
29
|
+
|
|
30
|
+
1. **直接输入**:用户/上游直接给出变更集 JSON 文件或内容。
|
|
31
|
+
2. **设计技能产出**:用户在设计会话产出变更集后转来落地。若用户尚未产出,可先**下发词汇约束**提升命中率——把 `node parser/index.js list --verbose` 的点位清单(ID + 字段 + 形态枚举)一并提供给设计侧(`mapping_version` 恒为 `1.0.0`,设计侧无需查询版本),设计侧按约束输出(约束外意图走其 pending 通道,落地时按 L3 处理)。
|
|
32
|
+
|
|
33
|
+
无论哪条来路,落地流程一律走下文「执行流程」。
|
|
34
|
+
|
|
35
|
+
**阅读纪律(防上下文溢出,与流程红线同级)**:
|
|
36
|
+
|
|
37
|
+
1. **词典走 parser,禁直读全文**:`mapping/` 下 JSON 是 parser 的事实源,不是给人(AI)通读的——查点位用 `parser query <id>`、查清单用 `parser list`,**禁止整文件读入 `mapping/scenes/*.json` / `mapping/basic/*.json`**(仅 validator/regression 维护场景或 parser 明确报错需要人工核对单条时,用 `Grep` 精确抽取相关条目,不整读)。
|
|
38
|
+
2. **落地会话禁读设计侧规范库**:设计技能的 `page-specs/`(规范/令牌/效果图)不属于项目侧视野——项目侧消费的是**变更集 + oracle.json + 登记表**三个交付物;`oracle.mockup` 指向的效果图由 `resolveFirstExisting` 跨库解析给 parser 使用,但人(AI)**不打开、不阅读设计侧效果图与规范文件**。
|
|
39
|
+
3. **效果图只读一次**:期望值优先直接消费设计侧交付的 `oracle.json`;确需现场抽取时(无产物降级路径),抽取完成后值落盘,**后续轮次禁止反复打开效果图 HTML/JPG**。
|
|
40
|
+
4. **做到哪一步读哪一份**:各步骤细节在 `steps/` 子文件(见下方索引),按当前阶段加载,禁止一次全部通读。
|
|
41
|
+
|
|
42
|
+
## 出厂中性 · 变更集驱动(架构红线,违反即返工)
|
|
43
|
+
|
|
44
|
+
**同一份模板源码,换一份变更集 = 换一套外观。** 任何「本次设计的结论」都不许固化进源码:
|
|
45
|
+
|
|
46
|
+
| | 允许 | 禁止 |
|
|
47
|
+
|---|---|---|
|
|
48
|
+
| 模板源码 | 只提供**能力通道**:CSS 变量的消费者挂载点、form 枚举、DOM/属性钩子、正确的层叠优先级 | 预置**设计结论**:某个具体颜色、某句问候语、某个方位的指示条、某个硬编码尺寸 |
|
|
49
|
+
| 设计产出 | AI 按本协议写入**设计层文件 / 页面级 scoped 样式 / DOM 属性与配置** | 为表达某张效果图而改写出厂样式文件与出厂组件(换设计即失效,且污染模板) |
|
|
50
|
+
|
|
51
|
+
**判据(一句话)**:换一张效果图只需要换变更集、不需要改源码 ⇒ 架构正确;需要改源码才能换 ⇒ 设计结论被烧进了源码,必须回退为通道。
|
|
52
|
+
|
|
53
|
+
- ❌ 反例:把「菜单激活指示条 = 左侧 3px」写死进 `sidebar.scss` / `element-plus.scss`;把问候语 DOM 直接加进 `lay-navbar/index.vue`;出厂 `<component>` 上硬编码 `data-content-mode="scroll"`。
|
|
54
|
+
- ✅ 正例:`admin.layout.sidebar.menu` 暴露 `forms`(pill/indicator_left/indicator_right/indicator_underline/none)+ 几何字段,方位与粗细由变更集驱动;高度模式出厂不带任何属性,由页面根节点按变更集声明。
|
|
55
|
+
|
|
56
|
+
**落地三落点判据**(每个变更字段先判落点再动手):
|
|
57
|
+
|
|
58
|
+
1. **有非样式通道**(DOM 属性 / 组件配置 / `platform-config.json`)→ 必须走该通道(form=scroll/fixed → 页面根节点 `data-content-mode`;form=card → `ShowModel`)。降级写成 SCSS = 未施工。
|
|
59
|
+
2. **无通道且需改 DOM**(新增节点,如问候语欢迎区)→ 结构增量施工(AI 在组件模板内按 `form` 插入,保形插入、不删原代码)。
|
|
60
|
+
3. **纯视觉表达**(颜色/圆角/间距/指示条几何)→ 设计层文件(见第 3 步)。
|
|
61
|
+
|
|
62
|
+
**出厂文件仅在「通道缺失」时才可改动**,且须同时满足:① 补的是能力不是结论(补变量消费者、补 form 枚举、修层叠优先级);② 在交付说明中单列「补通道」条目写明缺失点与修复内容。
|
|
63
|
+
|
|
64
|
+
**模板源码注释保持中性(防污染)**:源码注释只写「这段代码做什么」——给后续维护者看。**禁止把面向 AI 的规范写进模板源码**:语义 ID、变更条目、本协议步骤号、缺口 / 自举 / 申报 / 「设计还原禁止改写本段」这类纪律条款,一律留在技能侧(`crud-pages.md` 结构通道 / `code-quality.md` 清单 / 本节),不得写进 `lay-*.vue`、`element-plus.scss`、`sidebar.scss`、`index.scss`、`design-shell.scss` 等模板文件。判据:**技能侧改了内容不需要动模板 ⇒ 正确**;改一条纪律还要去改模板注释 ⇒ 放错层。落地时技能侧只承诺「这四类通道的能力」(`data-content-mode` / `data-fill` / `design-shell.scss` 落点 / 构图钩子),具体契约与纪律全部由技能文档承载。
|
|
65
|
+
|
|
66
|
+
## 输入契约(变更集 Schema v1.0)
|
|
67
|
+
|
|
68
|
+
```jsonc
|
|
69
|
+
{
|
|
70
|
+
"schema": "design.changeset/1.0", // 协议版本(parser 兼容历史值 design-changeset/v1,新输出一律用 1.0)
|
|
71
|
+
"changeset_version": "1.0.0", // 恒填 "1.0.0"
|
|
72
|
+
"mapping_version": "1.0.0", // 恒填 "1.0.0":版本由双侧 SKILL.md 体系版本统一管理,词典不单独演进。parser 校验口径 = 变更集值 ∈ 词典版本集合(恒通过);仅协议破坏性升级时双侧同步升版
|
|
73
|
+
"scene": "admin", // 场景前缀,须与 mapping 场景域一致
|
|
74
|
+
"scheme": "default", // 方案标识(mode=restore 时必填):取设计侧 page-specs/styles/registry.json 的方案 id;与 scene 共同定位「方案 × 场景」的清单/登记表
|
|
75
|
+
"mode": "restore", // 交付模式(G8 模式闸):restore=场景还原(scheme + oracle.mockup + coverage.registry 强制必填);design=显式声明的轻量微调;缺省 design
|
|
76
|
+
"layout_type": "vertical", // 标准布局枚举:vertical / horizontal / mix(字段名固定 layout_type,非 layout)
|
|
77
|
+
"page_bindings": [ // 页面映射(G13 页面绑定闸):效果图页面 → 项目页面的身份声明;缺省 = 全部映射已有页面。效果图页面默认是设计角色坐标系,不是页面增量——未显式 target:"new" 时禁止新增页面/路由/菜单
|
|
78
|
+
{ "mockup": "后台管理端.html", "target": "<项目已有列表页路由名/路径>", "note": "效果图标题是设计角色坐标系 = 已有页面换肤基线,非新增业务" }
|
|
79
|
+
],
|
|
80
|
+
"global": { "brand_primary": "钴蓝-5" }, // 可选:全局令牌通道(整套主题切换优先走此节点;值 = 语义名或临时主题 hex)
|
|
81
|
+
"changes": [
|
|
82
|
+
{
|
|
83
|
+
"id": "admin.layout.sidebar.menu", // 语义 ID(词典 key)
|
|
84
|
+
"visible": true, // 可选:隐藏用 false(v-if/display,不删代码)
|
|
85
|
+
"position": "right", // 可选:相对方位(left/right/top/bottom)
|
|
86
|
+
"form": "card", // 可选:形态切换(见条目 forms 枚举)
|
|
87
|
+
"style": { "menu_bg": "钴蓝-9" }, // 可选:抽象样式字段(词典 css_vars/custom_style_map key;值 = 语义名或 hex)
|
|
88
|
+
"apply_via": "admin.layout.sidebar.menu", // 可选:本声明引用的锚点来源条目(缺省 = 自身;值 = 语义 ID,不是选择器)
|
|
89
|
+
"layer": { "menu_text": "host" }, // 可选:落点层级(host 宿主盒 / inner 内层文本盒);可为字符串(整条生效)或「字段 → 层级」对象
|
|
90
|
+
"structure_ops": [ // 可选:结构施工声明(数据 / 结构驱动点位必须给,只写 CSS = 无效声明)
|
|
91
|
+
{ "op": "render_branch", "node": "status_tag", "source": "row.status" }
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
],
|
|
95
|
+
"pending": [ // 新增 ID 通道:parser 解析 function/parent 供 L3 施工
|
|
96
|
+
{ "proposed_id": "portal.content.banner.carousel", "function": "门户首页轮播横幅", "parent": "portal.content.banner" }
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
** 三个声明维度**(补齐「由哪个通道落地 / 被压时怎么赢 / 需要改结构时落在哪」):
|
|
102
|
+
|
|
103
|
+
| 字段 | 作用 | 值域 |
|
|
104
|
+
|---|---|---|
|
|
105
|
+
| `apply_via` | 指认本声明使用的**锚点来源条目**(在哪条词条的 `anchors` 上落地) | 语义 ID 字符串(2~4 段小写下划线);不是选择器 / 变量名 |
|
|
106
|
+
| `layer` | 指认样式落在**宿主盒**还是**内层文本盒** | `"host"` / `"inner"`;或 `{ "<style字段>": "host"|"inner" }` |
|
|
107
|
+
| `structure_ops[]` | 需要**结构施工**时声明「改哪个语义节点 / 数据源、怎么改」 | `op` ∈ `add_node` / `remove_node` / `move_node` / `render_branch` / `bind_source`;`node` / `source` / `from` / `to` 为语义名 |
|
|
108
|
+
|
|
109
|
+
硬约束:
|
|
110
|
+
- 变更集**只含变更点位**——未提到的点位一律不动。
|
|
111
|
+
- `style` 字段为**抽象视觉语义**(`menu_bg`、`radius`),不得出现 CSS 变量名、选择器、`!important`、技术栈词汇。值口径:官方 5 套主题用语义名(`钴蓝-5`,译表见 `mapping/basic/semantic-values.json`);库外临时主题直接 hex + `notes` 申报派生口径。
|
|
112
|
+
- `position` 用相对方位词,不用像素坐标。
|
|
113
|
+
- `visible: false` 只做隐藏,**永不删除代码**。
|
|
114
|
+
- `apply_via` / `layer` / `structure_ops` 与 `style` 同属**语义声明**,同样不得出现选择器、CSS 变量名、DOM 词、技术栈词:`apply_via` 必须是语义 ID(锚点名)、`layer` 只能取 `host` / `inner`、`structure_ops[].op` 只能取五枚举。
|
|
115
|
+
- `pending` 数组声明的是设计侧新点位,直接归入 L3 处理(不是错误)。**注意:pending 不是施工指令**——L3 施工的内容以 `changes[]` 中同 ID 新条目声明的意图为准;设计侧只登记 pending、未在 changes[] 声明意图的点位,落地时按出厂现状处理并在缺口清单中反馈「该点位设计意图缺失」。
|
|
116
|
+
- parser 校验已实现:schema 硬校验、mapping_version 缺失/不匹配拒绝、禁词与 hex 位置校验、语义 ID 命名校验、`layer` / `apply_via` / `structure_ops` 结构校验。
|
|
117
|
+
|
|
118
|
+
各步骤**子文件按需加载**(做到哪一步读哪一份,禁止一次全部通读):
|
|
119
|
+
|
|
120
|
+
| 步骤 | 子文件 | 内容 | 加载时机 |
|
|
121
|
+
|---|---|---|---|
|
|
122
|
+
| 第 0 步 | [`step0-preflight.md`](steps/step0-preflight.md) | 第 0 步 · 版本与场景检查 · 对接匹配(适配前置)· 运行时清场 | 每次落地开工前(版本/场景/对接匹配/运行时清场三件套) |
|
|
123
|
+
| 第 1 步 | [`step1-match.md`](steps/step1-match.md) | 第 1 步 · parser 确定性匹配(含词典硬闸 G8-G11/G1/G5) | match 执行与闸门判读 |
|
|
124
|
+
| 第 1 步附加 | [`step1b-audit.md`](steps/step1b-audit.md) | 第 1 步附加 · 挂载点审计(audit · 静态查三类隐性缺口) | match 通过后、施工前 |
|
|
125
|
+
| 第 1 步附加(之二) | [`step1c-registry.md`](steps/step1c-registry.md) | 登记表覆盖率(子项级细闸) | 变更集带 coverage.registry / --registry 时 |
|
|
126
|
+
| 第 2 步 | [`step2-structure.md`](steps/step2-structure.md) | 第 2 步 · 结构先行(visible / position / form · structure_ops · layer · suppress · priority 消费) | 进入施工时(先于一切样式) |
|
|
127
|
+
| 第 3 步 | [`step3-style.md`](steps/step3-style.md) | 第 3 步 · 样式落地(两层转换 + 语义值译表) | 结构完成后 |
|
|
128
|
+
| 第 3 步附加 | [`step3b-shell.md`](steps/step3b-shell.md) | 第 3 步附加 · 设计层落点文件 design-shell.scss(强制 · 覆写定律 · 自举) | 写任何新 CSS 规则前 |
|
|
129
|
+
| 第 3 步附加(之二) | [`step3c-priority.md`](steps/step3c-priority.md) | 覆写优先级消费(硬步骤) | 与 step3b 配套,落规则前逐条判定 |
|
|
130
|
+
| 第 4 步 | [`step4-l3.md`](steps/step4-l3.md) | 第 4 步 · L3 新模块处理(分级布局) | 存在未命中点位 / 新页面生成时 |
|
|
131
|
+
| 第 5 步 | [`step5-gates.md`](steps/step5-gates.md) | 第 5 步 · 合规闸门(变更集专属检查清单) | 施工完成后、验收前 |
|
|
132
|
+
| 第 6 步 | [`step6-verify.md`](steps/step6-verify.md) | 第 6 步 · 渲染态验收(oracle 逐点 diff · 快照回归 · 残差豁免) | 变更集含 oracle 时强制 |
|
|
133
|
+
| 维护 | [`maintenance.md`](steps/maintenance.md) | 词典维护纪律 · 出厂状态漂移排查 | 改 mapping / 排查词典假前提时 |
|
|
134
|
+
| 回归 | [`regression.md`](steps/regression.md) | 端到端回归 A-V · 配套工具 | 改 parser/mapping 后必跑 |
|
|
135
|
+
|
|
136
|
+
**红线摘要(全文适用,细节在各步子文件)**:出厂中性 · 变更集驱动(上文);先结构后样式(第 2 步先于第 3 步);缺口只分「能力缺口(当场落地)」与「意图缺口(回流设计侧)」两类;**效果图/大文件只读一次**——期望值落盘 `oracle.json` 后,后续环节一律消费落盘产物,禁止反复重读。环境无 Node 时按「环境备注」(见 maintenance.md)人工执行。
|
|
137
|
+
|
|
138
|
+
## 施工标记规范(G3:@sid / @closed,design-audit E15 机检)
|
|
139
|
+
|
|
140
|
+
结构性声明(`form` / `suppress` / `suppress_inner` / `structure_ops` / `text_visible:none` / `visible:false`)**必须在设计层留机读标记**——声明了不等于落地了,没有标记就没有对账凭证(悬空声明例:`collapse_trigger.form=header_inline` 声明后壳层零规则,落地端静默无效):
|
|
141
|
+
|
|
142
|
+
| 标记 | 写法 | 作用 |
|
|
143
|
+
|---|---|---|
|
|
144
|
+
| `@sid` | 规则上方 `/* @sid: <语义ID> */` | 「变更集 ↔ 设计层」逐条落点对账(@sid 强制) |
|
|
145
|
+
| `@closed` | 收口规则上方 `/* @closed: <通道名> */` | suppress 收口兑现证据(通道名 = 词典 forms/css_vars/custom_style_map 的键) |
|
|
146
|
+
|
|
147
|
+
补充证据通道:通道为 `css_vars` 键时,设计层对该 var 写关闭值(`transparent` / `none` / `0`)即视为兑现,可免 `@closed` 标记;`visible:false` 的 `display:none` 规则按 E6 口径取证。**双向对账(E15)**:设计层 `@closed` 了变更集未声明的通道 → WARN(台账失真,收口记录进不了 D13 继承链);声明了词典不认识的 form 值 / 通道名 → ERROR(悬空声明 = 无规则可挂);结构性声明在设计层零证据 → ERROR。
|
|
148
|
+
|
|
149
|
+
## 会话结束条件(终态硬闸,违反 = 交付未完成)
|
|
150
|
+
|
|
151
|
+
**落地会话不许「做一批、停下来等用户说继续」。** 「继续」只是异常中断后的恢复手段,不是交付形态——把恢复手段当成默认流程 = 把 1:1 还原降级为多次半成品。本轮做完一批点位后,**必须自动进入下一批**,直到同时满足以下三条才允许结束会话:
|
|
152
|
+
|
|
153
|
+
| # | 结束条件 | 判定方式 |
|
|
154
|
+
|---|---|---|
|
|
155
|
+
| 1 | **施工对账清零**:变更集全部已声明点位(`changes[]` ∪ `visible:false` ∪ `pending` 兑现项)全部落地 | 对照 `.design/ledger.json` 台账与 parser match 输出逐条核销;剩余 >0 → 继续施工 |
|
|
156
|
+
| 2 | **静态闸清零**:`parser audit` 与 `scripts/design-audit.mjs` 的 ERROR = 0 | 两闸任一 ERROR 即返工,不得带错收尾 |
|
|
157
|
+
| 3 | **验收闭环**:变更集含 oracle 时跑第 6 步 verify(本环境无浏览器 → 渲染态抽取显式移交用户执行,并说明移交项) | verify 全绿或移交说明已给出 |
|
|
158
|
+
| 4 | **终态机读凭证**:跑通 `node <技能>/scripts/apply-final-gate.mjs --project <项目根> --container-width <内容区宽>`,取得 `FINAL-GATE: PASS` | 该命令串联四闸(changeset-selfcheck → parser match → parser audit → design-audit),任何一步非零即 `FAIL`,会话**不得以完成态结尾**;PASS 凭证自动写入 `.design/ledger.json` 的 `finalGate` 字段——终态判定以凭证为准,不以会话自述为准。**mode 唯一合法值 restore**:缺 mode / 写 design / 基线命中却缺三件套,均在此拦截 |
|
|
159
|
+
|
|
160
|
+
> 条件 4 是 1–3 的机器汇总,不替代前三条的人读核对;前 3 条满足而凭证 FAIL = 仍有静态闸未清零,按 FAIL 输出逐项修复。
|
|
161
|
+
|
|
162
|
+
**禁止的收尾话术(出现即判定为本轮交付失败,必须继续)**:
|
|
163
|
+
- 「全量覆盖是迭代项 / 随迭代补齐 / 后续迭代再补其余细项 / 不阻塞已落地代码」——**覆盖率欠账 = 交付未完成**,不是迭代计划;设计侧变更集 `coverage.note` 出现同类表述同样视为交付失败(设计侧闸 D4/D9 会先拦,话术绕过闸的在这里兜底)。
|
|
164
|
+
- 「核心点位已落地,其余点位影响不大」——影响大小不由落地端裁定,范围只由变更集 `coverage` 与登记表裁定。
|
|
165
|
+
- 「已落地主题色与关键视觉,还原度已达 X%」——还原度以 verify / 登记表对账为准,不得以点位抽样自评。
|
|
166
|
+
|
|
167
|
+
**环境能力边界**:无浏览器只豁免「渲染态抽取与 verify」,**不豁免逐点施工**——静态可落地的 190 子项必须在会话内全部落地,施工不需要浏览器。
|