@agile-team/wl-skills-ui 1.6.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/CHANGELOG.md +207 -0
- package/README.md +623 -0
- package/SKILL.md +632 -0
- package/bin/wl-ui.js +794 -0
- package/design/spec/color.md +41 -0
- package/design/spec/spacing.md +28 -0
- package/design/spec/typography.md +29 -0
- package/design/tokens/base.css +144 -0
- package/design/tokens/index.css +8 -0
- package/dist/ag-grid-override.scss +1 -0
- package/dist/element.scss +1 -0
- package/dist/index.scss +1 -0
- package/dist/portal.scss +1 -0
- package/dist/style-override.scss +1 -0
- package/dist/tokens.css +144 -0
- package/es/chunk-GBB7LDKQ.js +261 -0
- package/es/chunk-MDI2SCUP.js +281 -0
- package/es/chunk-QDTNMM7W.js +286 -0
- package/es/chunk-YLNAFAWE.js +233 -0
- package/es/common-preset.d.ts +38 -0
- package/es/common-preset.js +157 -0
- package/es/index.d.ts +32 -0
- package/es/index.js +1 -0
- package/es/presets/security.d.ts +16 -0
- package/es/presets/security.js +99 -0
- package/es/renderers-BFRSp2BH.d.ts +51 -0
- package/es/renderers-DMZbi_Gs.d.ts +51 -0
- package/es/renderers-DWhUlI2y.d.ts +47 -0
- package/es/types-04qLKHMt.d.ts +62 -0
- package/es/types-BrCPjAH6.d.ts +62 -0
- package/es/types-QZ1gy9KX.d.ts +63 -0
- package/examples/migration-operations-to-renderOps.md +107 -0
- package/examples/wk-exempt.example.json +30 -0
- package/mcp/server.js +394 -0
- package/package.json +130 -0
- package/reference/SelectPopupCom.vue +634 -0
- package/reference/ag-cell-renders.ts +644 -0
- package/reference/define-columns.ts +185 -0
- package/reference/jhlc.d.ts +1 -0
- package/scanner/coverage.mjs +287 -0
- package/scanner/exempt.mjs +127 -0
- package/scanner/fix.mjs +216 -0
- package/scanner/index.mjs +403 -0
- package/scanner/integration.mjs +155 -0
- package/scanner/report.mjs +459 -0
- package/scanner/rules/_shared.mjs +134 -0
- package/scanner/rules/button.mjs +97 -0
- package/scanner/rules/color.mjs +118 -0
- package/scanner/rules/componentFamily.mjs +184 -0
- package/scanner/rules/dialog.mjs +42 -0
- package/scanner/rules/form.mjs +86 -0
- package/scanner/rules/index.mjs +58 -0
- package/scanner/rules/table.mjs +170 -0
- package/scanner/rules/tag.mjs +245 -0
- package/scanner/snapshot.mjs +198 -0
- package/skills/_flows/full-audit.md +65 -0
- package/skills/_flows/legacy-skin-align.md +71 -0
- package/skills/_flows/new-project-init.md +80 -0
- package/skills/_flows/progressive-migrate.md +49 -0
- package/skills/_meta/_compat/README.md +47 -0
- package/skills/_meta/_compat/editors.json +76 -0
- package/skills/_meta/_compat/headers/agents.txt +7 -0
- package/skills/_meta/_compat/headers/claude-code.txt +7 -0
- package/skills/_meta/_compat/headers/cline.txt +7 -0
- package/skills/_meta/_compat/headers/cursor-mdc.txt +5 -0
- package/skills/_meta/_compat/headers/github-copilot.txt +5 -0
- package/skills/_meta/_compat/headers/kiro.txt +4 -0
- package/skills/_meta/_compat/headers/qoder.txt +4 -0
- package/skills/_meta/_compat/headers/trae.txt +3 -0
- package/skills/_meta/_compat/headers/windsurf.txt +5 -0
- package/skills/_meta/_detection.md +81 -0
- package/skills/_meta/_registry.md +96 -0
- package/skills/element/component-family/SKILL.md +71 -0
- package/skills/element/el-dialog/SKILL.md +124 -0
- package/skills/element/el-form/SKILL.md +84 -0
- package/skills/element/el-table/SKILL.md +86 -0
- package/skills/element/el-tag/SKILL.md +127 -0
- package/skills/layouts/detail-page/SKILL.md +99 -0
- package/skills/layouts/form-dialog/SKILL.md +128 -0
- package/skills/layouts/list-page/SKILL.md +111 -0
- package/skills/layouts/tree-list/SKILL.md +108 -0
- package/skills/ops/audit/SKILL.md +109 -0
- package/skills/ops/fix/SKILL.md +52 -0
- package/skills/ops/fix/USAGE.md +24 -0
- package/skills/ops/migrate/SKILL.md +157 -0
- package/skills/ops/scan/SKILL.md +71 -0
- package/skills/ops/scan/USAGE.md +16 -0
- package/skills/runtime/design-tokens/SKILL.md +88 -0
- package/skills/runtime/design-tokens/USAGE.md +19 -0
- package/skills/runtime/migration/SKILL.md +106 -0
- package/skills/runtime/migration/USAGE.md +34 -0
- package/skills/runtime/style-align/SKILL.md +124 -0
- package/skills/runtime/style-align/USAGE.md +52 -0
- package/skills/vendors/ag-grid/SKILL.md +94 -0
- package/skills/vendors/base-table/SKILL.md +57 -0
- package/skills/vendors/c-components/SKILL.md +36 -0
- package/skills/vendors/custom-wrappers/SKILL.md +45 -0
- package/skills/vendors/jh-components/SKILL.md +42 -0
- package/skills/vendors/unknown-wrapper/SKILL.md +44 -0
- package/standards/engineering/01-import-order.md +46 -0
- package/standards/engineering/02-naming.md +54 -0
- package/standards/engineering/03-scss-structure.md +59 -0
- package/standards/ui/01-table.md +111 -0
- package/standards/ui/02-button.md +83 -0
- package/standards/ui/03-form.md +118 -0
- package/standards/ui/04-tag-status.md +110 -0
- package/standards/ui/05-dialog-pagination.md +118 -0
- package/styles/element/_card.scss +26 -0
- package/styles/element/_descriptions.scss +22 -0
- package/styles/element/_dialog.scss +43 -0
- package/styles/element/_drawer.scss +22 -0
- package/styles/element/_feedback.scss +52 -0
- package/styles/element/_form.scss +22 -0
- package/styles/element/_navigation.scss +36 -0
- package/styles/element/_overlay.scss +32 -0
- package/styles/element/_pagination.scss +16 -0
- package/styles/element/_steps.scss +32 -0
- package/styles/element/_table.scss +13 -0
- package/styles/element/_tabs.scss +40 -0
- package/styles/element/_tree.scss +27 -0
- package/styles/element/_upload.scss +34 -0
- package/styles/element/index.scss +17 -0
- package/styles/index.scss +21 -0
- package/styles/layouts/_detail-page.scss +27 -0
- package/styles/layouts/_form-dialog.scss +19 -0
- package/styles/layouts/_list-page.scss +47 -0
- package/styles/layouts/_tree-list.scss +33 -0
- package/styles/layouts/index.scss +6 -0
- package/styles/presets/element-only.scss +6 -0
- package/styles/presets/full.scss +12 -0
- package/styles/presets/security.scss +37 -0
- package/styles/presets/skin.scss +14 -0
- package/styles/presets/tokens-only.scss +7 -0
- package/styles/tokens/index.scss +79 -0
- package/styles/vendors/_ag-grid.scss +273 -0
- package/styles/vendors/_base-components.scss +480 -0
- package/styles/vendors/_base-query-toolbar.scss +253 -0
- package/styles/vendors/_base-table.scss +41 -0
- package/styles/vendors/_c-components.scss +34 -0
- package/styles/vendors/_custom-wrappers.scss +30 -0
- package/styles/vendors/_jh-drag-col.scss +63 -0
- package/styles/vendors/_jh-pagination.scss +81 -0
- package/styles/vendors/_jh-tree.scss +196 -0
- package/styles/vendors/_portal.scss +114 -0
- package/styles/vendors/index.scss +17 -0
- package/templates/ag-grid-page/TPL-AG-GRID.md +76 -0
- package/templates/form-dialog/TPL-FORM-DIALOG.md +165 -0
- package/templates/list-page/TPL-LIST.md +139 -0
- package/templates/tree-list/TPL-TREE-LIST.md +176 -0
- package/templates/ui-optimization-report/TPL-UI-OPTIM-REPORT.md +343 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: |
|
|
3
|
+
表单弹窗骨架 Skill — 检测/对齐 .form-dialog 标准结构(el-dialog + el-form + footer 操作按钮),
|
|
4
|
+
适用于新增/编辑/详情三合一弹窗模式。
|
|
5
|
+
applyTo: "**/*.vue"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# layouts/form-dialog SKILL
|
|
9
|
+
|
|
10
|
+
## 适用场景
|
|
11
|
+
|
|
12
|
+
以 `el-dialog` 承载 `el-form` 的新增/编辑/详情弹窗,支持 `optr: 'add' | 'edit' | 'view'` 三态切换。
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Detect — 识别表单弹窗
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
检测条件(满足任意 2 项即判定):
|
|
20
|
+
✓ 文件名含 Modal / Dialog / Form(如 AddModal.vue / EditDialog.vue)
|
|
21
|
+
✓ 存在 el-dialog 包裹 el-form
|
|
22
|
+
✓ defineExpose 中有 add / edit / view 方法
|
|
23
|
+
✓ 存在 optr ref 用于控制表单只读/可写状态
|
|
24
|
+
✓ el-dialog footer 中有"确定"/"取消"按钮
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Diagnose — 诊断问题
|
|
30
|
+
|
|
31
|
+
| 问题 | 规则 | 说明 |
|
|
32
|
+
|---|---|---|
|
|
33
|
+
| el-dialog 缺 `.form-dialog` class | L-201 | 应加 `class="form-dialog"` 便于全局覆盖 |
|
|
34
|
+
| el-form 缺 `labelWidth="150px"` | R008 | 统一 label 宽度 |
|
|
35
|
+
| el-input/el-select 缺 `size="small"` | R006 | 表单控件统一 small |
|
|
36
|
+
| el-date-picker 缺 `style="width:100%"` | R007 | 日期控件需撑满容器 |
|
|
37
|
+
| footer 中含分页组件 | R011 | 分页不应在 footer 内 |
|
|
38
|
+
| 弹窗内嵌套 el-table 操作列用文字按钮 | R015 | 应用 jh-op-btn 图标 |
|
|
39
|
+
| 详情态(optr=view)没有禁用所有输入 | L-202 | 应统一用 `:disabled="optr==='view'"` |
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Repair — 修复指引
|
|
44
|
+
|
|
45
|
+
### 标准结构
|
|
46
|
+
|
|
47
|
+
```vue
|
|
48
|
+
<template>
|
|
49
|
+
<el-dialog
|
|
50
|
+
v-model="visible"
|
|
51
|
+
class="form-dialog"
|
|
52
|
+
:title="title"
|
|
53
|
+
width="700px"
|
|
54
|
+
:close-on-click-modal="false"
|
|
55
|
+
@closed="reset"
|
|
56
|
+
>
|
|
57
|
+
<el-form
|
|
58
|
+
ref="formRef"
|
|
59
|
+
:model="form"
|
|
60
|
+
:rules="optr !== 'view' ? rules : {}"
|
|
61
|
+
label-width="150px"
|
|
62
|
+
label-position="right"
|
|
63
|
+
>
|
|
64
|
+
<el-row :gutter="20">
|
|
65
|
+
<el-col :span="12">
|
|
66
|
+
<el-form-item label="名称" prop="name">
|
|
67
|
+
<el-input
|
|
68
|
+
v-model="form.name"
|
|
69
|
+
size="small"
|
|
70
|
+
placeholder="请输入"
|
|
71
|
+
:disabled="optr === 'view'"
|
|
72
|
+
/>
|
|
73
|
+
</el-form-item>
|
|
74
|
+
</el-col>
|
|
75
|
+
<el-col :span="12">
|
|
76
|
+
<el-form-item label="日期" prop="date">
|
|
77
|
+
<el-date-picker
|
|
78
|
+
v-model="form.date"
|
|
79
|
+
type="date"
|
|
80
|
+
size="small"
|
|
81
|
+
style="width:100%"
|
|
82
|
+
:disabled="optr === 'view'"
|
|
83
|
+
/>
|
|
84
|
+
</el-form-item>
|
|
85
|
+
</el-col>
|
|
86
|
+
</el-row>
|
|
87
|
+
</el-form>
|
|
88
|
+
|
|
89
|
+
<template #footer>
|
|
90
|
+
<el-button @click="visible = false">取消</el-button>
|
|
91
|
+
<el-button
|
|
92
|
+
v-if="optr !== 'view'"
|
|
93
|
+
type="primary"
|
|
94
|
+
:loading="saving"
|
|
95
|
+
@click="handleSubmit"
|
|
96
|
+
>确定</el-button>
|
|
97
|
+
</template>
|
|
98
|
+
</el-dialog>
|
|
99
|
+
</template>
|
|
100
|
+
|
|
101
|
+
<script setup>
|
|
102
|
+
const visible = ref(false);
|
|
103
|
+
const optr = ref('add'); // 'add' | 'edit' | 'view'
|
|
104
|
+
const title = computed(() => ({ add: '新增', edit: '编辑', view: '详情' }[optr.value]);
|
|
105
|
+
|
|
106
|
+
function add() { optr.value = 'add'; reset(); visible.value = true; }
|
|
107
|
+
function edit(id) { optr.value = 'edit'; load(id); visible.value = true; }
|
|
108
|
+
function view(id) { optr.value = 'view'; load(id); visible.value = true; }
|
|
109
|
+
|
|
110
|
+
defineExpose({ add, edit, view });
|
|
111
|
+
</script>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### 三态最佳实践
|
|
115
|
+
|
|
116
|
+
| 态 | optr | 输入控件 | footer 按钮 |
|
|
117
|
+
|---|---|---|---|
|
|
118
|
+
| 新增 | `'add'` | 可编辑 | 取消 + 确定 |
|
|
119
|
+
| 编辑 | `'edit'` | 可编辑 | 取消 + 确定 |
|
|
120
|
+
| 详情 | `'view'` | `disabled` | 仅取消/关闭 |
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## 关联资源
|
|
125
|
+
|
|
126
|
+
- 样式实现:[styles/layouts/_form-dialog.scss](../../../styles/layouts/_form-dialog.scss)
|
|
127
|
+
- 代码模板:[templates/form-dialog/TPL-FORM-DIALOG.md](../../../templates/form-dialog/TPL-FORM-DIALOG.md)
|
|
128
|
+
- 相关 skills:[layouts/list-page](../list-page/SKILL.md) | [element/el-form](../../element/el-form/SKILL.md)
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: |
|
|
3
|
+
列表页骨架 Skill — 检测/对齐 .list-page 标准布局(搜索区 + 工具栏 + 表格 + 分页),
|
|
4
|
+
适用于 Native 模式新项目;同时提供 AI 修复指引。
|
|
5
|
+
applyTo: "**/*.vue"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# layouts/list-page SKILL
|
|
9
|
+
|
|
10
|
+
## 适用场景
|
|
11
|
+
|
|
12
|
+
页面结构为:**搜索栏 → 工具栏(增删按钮) → 数据表格 → 分页器** 的经典 CRUD 列表页。
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Detect — 识别列表页
|
|
17
|
+
|
|
18
|
+
### 方式一:结构特征识别
|
|
19
|
+
```
|
|
20
|
+
检测条件(满足任意 2 项即判定为列表页):
|
|
21
|
+
✓ 根节点或第一子节点含 class="list-page" / "page-wrapper" / "table-page"
|
|
22
|
+
✓ 存在 <BaseTable> 或 <el-table>
|
|
23
|
+
✓ 存在 <BaseQuery> 或包含搜索条件的 el-form
|
|
24
|
+
✓ 存在 <jh-pagination> 或 <el-pagination>
|
|
25
|
+
✓ 存在工具栏区域(包含"新增"按钮的 el-row / div.toolbar)
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### 方式二:命令触发
|
|
29
|
+
```
|
|
30
|
+
用 wk-ui 的 layouts/list-page skill 检查这个文件
|
|
31
|
+
→ AI 加载本 SKILL.md,对当前文件做 Detect → Diagnose → Repair
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Diagnose — 诊断问题
|
|
37
|
+
|
|
38
|
+
### 结构层问题
|
|
39
|
+
|
|
40
|
+
| 问题 | 规则 | 说明 |
|
|
41
|
+
|---|---|---|
|
|
42
|
+
| 根节点缺少 `.list-page` | L-001 | 应为 `<div class="list-page">` |
|
|
43
|
+
| 搜索区未用 `.list-page__query` | L-002 | 内部结构应遵循 BEM |
|
|
44
|
+
| 工具栏未用 `.list-page__toolbar` | L-003 | 按钮组应在 `.list-page__toolbar` 内 |
|
|
45
|
+
| 表格区未用 `.list-page__table` | L-004 | 表格容器应有独立 class |
|
|
46
|
+
| 分页区未用 `.list-page__pagination` | L-005 | 分页器位置需在 **内容区**,不得在 dialog footer |
|
|
47
|
+
|
|
48
|
+
### 内容层问题(复用 scanner 规则)
|
|
49
|
+
|
|
50
|
+
- R001 ~ R003:表格列对齐 + empty-text
|
|
51
|
+
- R005:工具栏按钮缺 icon
|
|
52
|
+
- R006:搜索区输入框缺 `size="small"`
|
|
53
|
+
- R011:分页在 footer 内(严重)
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Repair — 修复指引
|
|
58
|
+
|
|
59
|
+
### 标准结构
|
|
60
|
+
|
|
61
|
+
```vue
|
|
62
|
+
<template>
|
|
63
|
+
<div class="list-page">
|
|
64
|
+
<!-- 搜索区 -->
|
|
65
|
+
<div class="list-page__query">
|
|
66
|
+
<BaseQuery :params="searchParams" @search="reload" @reset="reset" />
|
|
67
|
+
</div>
|
|
68
|
+
|
|
69
|
+
<!-- 工具栏 -->
|
|
70
|
+
<div class="list-page__toolbar">
|
|
71
|
+
<el-button type="primary" icon="Plus" @click="modal.add()">新增</el-button>
|
|
72
|
+
<el-button icon="Download" @click="handleExport">导出</el-button>
|
|
73
|
+
</div>
|
|
74
|
+
|
|
75
|
+
<!-- 表格 -->
|
|
76
|
+
<div class="list-page__table">
|
|
77
|
+
<BaseTable :hook="page" empty-text="暂无数据" :columns="columns" />
|
|
78
|
+
</div>
|
|
79
|
+
|
|
80
|
+
<!-- 分页 -->
|
|
81
|
+
<div class="list-page__pagination">
|
|
82
|
+
<jh-pagination :hook="page" />
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
</template>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### SCSS 对应(由 styles/layouts/_list-page.scss 提供)
|
|
89
|
+
|
|
90
|
+
```scss
|
|
91
|
+
// 业务侧无需手写,全局 @use 后自动生效
|
|
92
|
+
// 如需定制,在组件 <style scoped> 内覆盖:
|
|
93
|
+
.list-page {
|
|
94
|
+
// 自定义
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### 使用脚手架
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
# 直接在编辑器让 AI:
|
|
102
|
+
# 按 wk-ui 的 templates/list-page/TPL-LIST.md 创建该页面
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## 关联资源
|
|
108
|
+
|
|
109
|
+
- 样式实现:[styles/layouts/_list-page.scss](../../../styles/layouts/_list-page.scss)
|
|
110
|
+
- 代码模板:[templates/list-page/TPL-LIST.md](../../../templates/list-page/TPL-LIST.md)
|
|
111
|
+
- 相关 skills:[vendors/base-table](../../vendors/base-table/SKILL.md) | [vendors/jh-components](../../vendors/jh-components/SKILL.md)
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: |
|
|
3
|
+
左树右表骨架 Skill — 检测/对齐 .tree-list 双栏布局(左侧分类树 + 右侧数据列表),
|
|
4
|
+
含 jh-drag-col 拖拽分割条处理;适用于组织/分类驱动的管理页面。
|
|
5
|
+
applyTo: "**/*.vue"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# layouts/tree-list SKILL
|
|
9
|
+
|
|
10
|
+
## 适用场景
|
|
11
|
+
|
|
12
|
+
页面结构为:**左侧分类/组织树 + 右侧数据列表(含搜索 + 表格 + 分页)** 的双栏页面。
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Detect — 识别左树右表页
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
检测条件(满足任意 2 项即判定):
|
|
20
|
+
✓ 页面存在并排的 el-tree 或 jh-tree
|
|
21
|
+
✓ 存在 jh-drag-col(拖拽分割条)
|
|
22
|
+
✓ 根节点含 class="tree-list" / "tree-page" / "left-tree-right-table"
|
|
23
|
+
✓ 布局中有宽度约 240px 的左侧容器 + 弹性宽度的右侧容器
|
|
24
|
+
✓ 存在 @node-click / @current-change 事件绑定
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Diagnose — 诊断问题
|
|
30
|
+
|
|
31
|
+
| 问题 | 规则 | 说明 |
|
|
32
|
+
|---|---|---|
|
|
33
|
+
| 根节点缺少 `.tree-list` | L-101 | 应为 `<div class="tree-list">` |
|
|
34
|
+
| 左侧区未用 `.tree-list__aside` | L-102 | 树容器应有独立 class |
|
|
35
|
+
| 右侧区未用 `.tree-list__main` | L-103 | 右侧内容区应有独立 class |
|
|
36
|
+
| 缺少 `jh-drag-col` 分割条 | L-104 | 应支持拖拽调整左右宽度 |
|
|
37
|
+
| 树节点点击后未触发右侧列表刷新 | L-105 | `@node-click` 应调用 `reload()` 并传入分类参数 |
|
|
38
|
+
| 左侧树无搜索/过滤 | L-106 | 数据量大时应加 `filter-node-method` |
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Repair — 修复指引
|
|
43
|
+
|
|
44
|
+
### 标准结构
|
|
45
|
+
|
|
46
|
+
```vue
|
|
47
|
+
<template>
|
|
48
|
+
<div class="tree-list">
|
|
49
|
+
<!-- 左侧树 -->
|
|
50
|
+
<div class="tree-list__aside" :style="{ width: treeWidth + 'px' }">
|
|
51
|
+
<el-tree
|
|
52
|
+
:data="treeData"
|
|
53
|
+
:props="{ label: 'name', children: 'children' }"
|
|
54
|
+
node-key="id"
|
|
55
|
+
highlight-current
|
|
56
|
+
@node-click="handleNodeClick"
|
|
57
|
+
/>
|
|
58
|
+
</div>
|
|
59
|
+
|
|
60
|
+
<!-- 拖拽分割条 -->
|
|
61
|
+
<jh-drag-col v-model="treeWidth" :min="180" :max="360" />
|
|
62
|
+
|
|
63
|
+
<!-- 右侧内容 -->
|
|
64
|
+
<div class="tree-list__main">
|
|
65
|
+
<!-- 复用 list-page 结构(搜索 + 工具栏 + 表格 + 分页) -->
|
|
66
|
+
<div class="list-page">
|
|
67
|
+
<div class="list-page__query"> ... </div>
|
|
68
|
+
<div class="list-page__toolbar"> ... </div>
|
|
69
|
+
<div class="list-page__table">
|
|
70
|
+
<BaseTable :hook="page" empty-text="暂无数据" :columns="columns" />
|
|
71
|
+
</div>
|
|
72
|
+
<div class="list-page__pagination">
|
|
73
|
+
<jh-pagination :hook="page" />
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
</template>
|
|
79
|
+
|
|
80
|
+
<script setup>
|
|
81
|
+
const treeWidth = ref(240);
|
|
82
|
+
|
|
83
|
+
function handleNodeClick(node) {
|
|
84
|
+
searchParams.value.classifyId = node.id;
|
|
85
|
+
page.reload();
|
|
86
|
+
}
|
|
87
|
+
</script>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### SCSS 对应
|
|
91
|
+
|
|
92
|
+
```scss
|
|
93
|
+
// styles/layouts/_tree-list.scss 已提供基础骨架
|
|
94
|
+
// 业务侧如需定制左侧宽度:
|
|
95
|
+
.tree-list__aside {
|
|
96
|
+
min-width: 180px;
|
|
97
|
+
max-width: 400px;
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## 关联资源
|
|
104
|
+
|
|
105
|
+
- 样式实现:[styles/layouts/_tree-list.scss](../../../styles/layouts/_tree-list.scss)
|
|
106
|
+
- 拖拽列样式:[styles/vendors/_jh-drag-col.scss](../../../styles/vendors/_jh-drag-col.scss)
|
|
107
|
+
- 代码模板:[templates/tree-list/TPL-TREE-LIST.md](../../../templates/tree-list/TPL-TREE-LIST.md)
|
|
108
|
+
- 相关 skills:[layouts/list-page](../list-page/SKILL.md) | [vendors/jh-components](../../vendors/jh-components/SKILL.md)
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: |
|
|
3
|
+
审计 Skill — 对项目做只读的全量 UI 规范合规审计,输出分层问题报告(不自动修改任何文件)。
|
|
4
|
+
支持 --layer / --vendor / --mode 精准过滤,生成 markdown 报告供人工或 AI 渐进修复。
|
|
5
|
+
applyTo: "**"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# ops/audit SKILL
|
|
9
|
+
|
|
10
|
+
## 一、审计目标
|
|
11
|
+
|
|
12
|
+
对目标项目做**完整只读扫描**,产出:
|
|
13
|
+
|
|
14
|
+
1. 接入完整性报告(I001-I005:tokens/styles/runtime/skills 是否接入)
|
|
15
|
+
2. 风格合规报告(R001-R018:按 layer/vendor 分组)
|
|
16
|
+
3. 优先级建议(高危 → 中危 → 低危 三层)
|
|
17
|
+
|
|
18
|
+
**本 skill 不修改任何文件,仅审计和报告。**
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 二、审计命令
|
|
23
|
+
|
|
24
|
+
### 全量审计(推荐)
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npx wk-ui all --project . --outFile audit-report.md
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### 分层审计
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# 仅看 L0 颜色 token 违规
|
|
34
|
+
npx wk-ui scan --target src --layer L0 --outFile l0-report.md
|
|
35
|
+
|
|
36
|
+
# 仅看 L1 Element Plus 控件问题
|
|
37
|
+
npx wk-ui scan --target src --layer L1 --outFile l1-report.md
|
|
38
|
+
|
|
39
|
+
# 仅看 L2 封装组件问题(vendor 层)
|
|
40
|
+
npx wk-ui scan --target src --layer L2 --outFile l2-report.md
|
|
41
|
+
|
|
42
|
+
# 化妆模式项目只看 L0/L1/L2(跳过 L3/L4)
|
|
43
|
+
npx wk-ui scan --target src --mode skin --outFile skin-audit.md
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 精准 vendor 审计
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# 仅扫描 BaseTable 相关规则
|
|
50
|
+
npx wk-ui scan --target src --vendor base-table
|
|
51
|
+
|
|
52
|
+
# 仅扫描 Element Plus 原生控件
|
|
53
|
+
npx wk-ui scan --target src --vendor element
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 三、AI 审计流程
|
|
59
|
+
|
|
60
|
+
在 AI 编辑器中触发:
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
用 wk-ui 的 ops/audit skill 对当前项目做全量审计
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**AI 执行步骤:**
|
|
67
|
+
|
|
68
|
+
1. `npx wk-ui check --project .` → 接入完整性(I001-I005)
|
|
69
|
+
2. `npx wk-ui scan --target src --output json --outFile /tmp/audit.json` → JSON 格式结果
|
|
70
|
+
3. 读取 JSON,按如下格式汇报:
|
|
71
|
+
|
|
72
|
+
```markdown
|
|
73
|
+
## 审计摘要
|
|
74
|
+
- 扫描文件数:XX
|
|
75
|
+
- 发现问题数:XX(高危 X / 中危 X / 低危 X)
|
|
76
|
+
- 接入完整性:✅ X 项通过 / ❌ X 项缺失
|
|
77
|
+
|
|
78
|
+
### 高危(直接影响视觉一致性)
|
|
79
|
+
| 规则 | 文件 | 行号 | 说明 |
|
|
80
|
+
| R001 | src/pages/Foo.vue | 45 | 列缺少 align="center" |
|
|
81
|
+
...
|
|
82
|
+
|
|
83
|
+
### 修复建议(优先级排序)
|
|
84
|
+
1. 运行 `npx wk-ui fix --target src --dry-run` 先预览 A 类自动修复
|
|
85
|
+
2. 对 R009/R010 状态字段手工确认并应用 renderTagNode
|
|
86
|
+
3. 对 L0 颜色违规批量替换为 CSS Token
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
4. 询问用户:是否进入修复阶段(`ops/fix` skill),还是只看报告?
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## 四、接入完整性检查项(I001-I005)
|
|
94
|
+
|
|
95
|
+
| 编号 | 检查项 | 说明 |
|
|
96
|
+
|---|---|---|
|
|
97
|
+
| I001 | tokens.css / base.css 已引入 | index.html `<head>` 中有 wk-skills-ui tokens |
|
|
98
|
+
| I002 | styles 预设已引入 | SCSS 入口含 `@use '@agile-team/wk-skills-ui/styles...'` |
|
|
99
|
+
| I003 | runtime preset 已安装 | main.ts 含 `installCommonPreset()` |
|
|
100
|
+
| I004 | skills 已安装 | `.github/instructions/` 或 `.cursor/rules/` 等目录存在 wk-skills 文件 |
|
|
101
|
+
| I005 | package.json 版本 | @agile-team/wk-skills-ui 版本 ≥ 0.3.0 |
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 关联资源
|
|
106
|
+
|
|
107
|
+
- 修复:[ops/fix](../fix/SKILL.md)
|
|
108
|
+
- 渐进迁移:[runtime/migration](../../runtime/migration/SKILL.md)
|
|
109
|
+
- 全审计流程:[_flows/full-audit]( ../../_flows/full-audit.md)
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: |
|
|
3
|
+
wk-ui fix 自动修复指南 — A 类问题(attr 缺失、hex 颜色)的批量自动修复,
|
|
4
|
+
支持 dry-run 预览,幂等安全,不修改已符合标准的文件。
|
|
5
|
+
applyTo: "**"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# 自动修复指南
|
|
9
|
+
|
|
10
|
+
## 可自动修复的问题(A 类)
|
|
11
|
+
|
|
12
|
+
| 规则 | 修复内容 |
|
|
13
|
+
| --------- | ------------------------------------------------- |
|
|
14
|
+
| R006 | el-input / el-select 补充 `size="small"` |
|
|
15
|
+
| R007 | el-date-picker 补充 `style="width:100%"` |
|
|
16
|
+
| R002/R003 | el-table / BaseTable 补充 `empty-text="暂无数据"` |
|
|
17
|
+
| R001 | el-table-column 补充 `align="center"` |
|
|
18
|
+
| R016/R017 | style/template 块 hex 颜色替换为 CSS Token |
|
|
19
|
+
|
|
20
|
+
## 命令
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# 先预览(推荐!)
|
|
24
|
+
npx wk-ui fix --target src --dry-run
|
|
25
|
+
|
|
26
|
+
# 确认后执行
|
|
27
|
+
npx wk-ui fix --target src
|
|
28
|
+
|
|
29
|
+
# 只修复特定目录
|
|
30
|
+
npx wk-ui fix --target src/views/check
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 修复后必须验证
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npx wk-ui scan --target src --outFile /tmp/after-fix.md
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
对比修复前后报告,确认 A 类问题归零,剩余仅为需人工处理的规则。
|
|
40
|
+
|
|
41
|
+
## 无法自动修复(B 类,需 AI 辅助人工处理)
|
|
42
|
+
|
|
43
|
+
| 规则 | 原因 |
|
|
44
|
+
| --------- | ---------------------------------------------- |
|
|
45
|
+
| R004/R013 | 操作列结构改造,需改写 defaultSlot + renderOps |
|
|
46
|
+
| R008 | labelWidth 需人工判断布局需求 |
|
|
47
|
+
| R009/R010 | 状态字段语义需人工识别 |
|
|
48
|
+
| R015 | 弹窗内操作按钮结构改造 |
|
|
49
|
+
|
|
50
|
+
## 幂等性保证
|
|
51
|
+
|
|
52
|
+
修复脚本可重复运行,已符合标准的文件不会被修改。
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# USAGE — 自动修复 Skill
|
|
2
|
+
|
|
3
|
+
## 调用方式
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
帮我修复扫描到的所有 A 类问题
|
|
7
|
+
批量修复这个目录的 hex 颜色
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## 最佳实践
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
# 1. 先扫描了解情况
|
|
14
|
+
npx wk-ui scan --target src --outFile /tmp/before.md
|
|
15
|
+
|
|
16
|
+
# 2. dry-run 预览修复效果
|
|
17
|
+
npx wk-ui fix --target src --dry-run
|
|
18
|
+
|
|
19
|
+
# 3. 确认无误后执行
|
|
20
|
+
npx wk-ui fix --target src
|
|
21
|
+
|
|
22
|
+
# 4. 验证效果
|
|
23
|
+
npx wk-ui scan --target src --outFile /tmp/after.md
|
|
24
|
+
```
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: |
|
|
3
|
+
渐进迁移 Skill — 指导老项目从 Skin 化妆模式渐进迁移到 Native 原生模式(按模块、按 vendor、按层次)。
|
|
4
|
+
明确迁移触发条件、安全顺序和回退机制。
|
|
5
|
+
applyTo: "**"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# ops/migrate SKILL
|
|
9
|
+
|
|
10
|
+
## 一、迁移目标
|
|
11
|
+
|
|
12
|
+
从 **Skin 模式**(只有 L0/L1/L2 化妆)升级到 **Native 模式**(全五层),同时保证:
|
|
13
|
+
- 迁移期间业务功能不中断
|
|
14
|
+
- 按模块/按 vendor 逐步替换,不做大爆炸式重写
|
|
15
|
+
- 每步可回退
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 二、迁移触发条件
|
|
20
|
+
|
|
21
|
+
以下任意条件满足时,建议启动对应模块的迁移:
|
|
22
|
+
|
|
23
|
+
| 条件 | 建议迁移内容 |
|
|
24
|
+
|---|---|
|
|
25
|
+
| 拿到封装组件源码(如 BaseTable)| 把 L2 化妆 → L4 runtime 调用 |
|
|
26
|
+
| 新增模块(CRUD 列表页)| 直接用 Native 骨架(list-page + defineColumns)|
|
|
27
|
+
| 发现大量 R009 状态字段纯文本 | 迁移到 renderTagNode / COLUMN_AUTO_MAP |
|
|
28
|
+
| 性能优化需要(减少全局 CSS override)| L2 vendor 选择器精细化 |
|
|
29
|
+
| 业务 preset 需要扩展 | 用 createPreset() / installPreset() 替代手写 map |
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 三、迁移安全顺序
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
Step 1 — 接入 design/tokens/base.css (可立即,无风险)
|
|
37
|
+
Step 2 — 接入 styles/presets/skin (可立即,只加不改)
|
|
38
|
+
Step 3 — 接入 styles/presets/full (替换 skin,确认布局无冲突)
|
|
39
|
+
Step 4 — 接入 installCommonPreset() (仅影响新页面,旧页面不动)
|
|
40
|
+
Step 5 — 新模块用 defineColumns + renderOps (只影响新写代码)
|
|
41
|
+
Step 6 — 旧模块逐批迁移 columnsDef → defineColumns
|
|
42
|
+
Step 7 — 旧 vendor 化妆层(_base-table.scss 等)按需保留或删除
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 四、AI 辅助迁移流程
|
|
48
|
+
|
|
49
|
+
在 AI 编辑器中触发:
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
用 wk-ui 的 ops/migrate skill 帮我迁移 src/pages/safety/ 目录
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**AI 执行步骤:**
|
|
56
|
+
|
|
57
|
+
1. 扫描目标目录:`npx wk-ui scan --target src/pages/safety --output json`
|
|
58
|
+
2. 识别迁移优先级:
|
|
59
|
+
- R013(columnsDef 旧格式)→ 优先迁移到 `defineColumns`
|
|
60
|
+
- R004/R005(按钮规则)→ 用 `renderOps` 替换
|
|
61
|
+
- R009(状态字段)→ 注册到 COLUMN_AUTO_MAP
|
|
62
|
+
3. 逐文件迁移,**每文件迁移后立即验证**(重跑 scan 确认问题归零)
|
|
63
|
+
4. 汇报迁移结果
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 五、具体迁移操作
|
|
68
|
+
|
|
69
|
+
### 5.1 columnsDef → defineColumns
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
// ❌ 旧写法
|
|
73
|
+
columnsDef() {
|
|
74
|
+
return [
|
|
75
|
+
{ label: '名称', name: 'name' },
|
|
76
|
+
{ label: '状态', name: 'enableStatus', logicType: BusLogicDataType.dict },
|
|
77
|
+
{ label: '操作', operations: [
|
|
78
|
+
{ name: 'edit', label: '编辑', onClick: (row) => modal.edit(row.id) },
|
|
79
|
+
]},
|
|
80
|
+
];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// ✅ 新写法
|
|
84
|
+
import { defineColumns, renderOps } from '@agile-team/wk-skills-ui/runtime';
|
|
85
|
+
|
|
86
|
+
columnsDef() {
|
|
87
|
+
return defineColumns([
|
|
88
|
+
{ label: '名称', name: 'name' },
|
|
89
|
+
{ label: '状态', name: 'enableStatus' }, // 自动 Tag(已注册)
|
|
90
|
+
{ label: '操作', width: 100, align: 'center',
|
|
91
|
+
defaultSlot: ({ row }) => renderOps([
|
|
92
|
+
{ type: 'edit', onClick: () => modal.edit(row.id) },
|
|
93
|
+
]),
|
|
94
|
+
},
|
|
95
|
+
]);
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### 5.2 新增 COLUMN_AUTO_MAP 字段
|
|
100
|
+
|
|
101
|
+
当项目有自定义状态字段时,扩展到 common preset:
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
// runtime/presets/my-biz.ts(用 wk-ui add-preset my-biz 生成)
|
|
105
|
+
import { createPreset } from '@agile-team/wk-skills-ui/runtime';
|
|
106
|
+
|
|
107
|
+
export const installMyBizPreset = createPreset({
|
|
108
|
+
name: 'my-biz',
|
|
109
|
+
columnAutoMap: {
|
|
110
|
+
myStatus: {
|
|
111
|
+
width: 90, align: 'center',
|
|
112
|
+
defaultSlot: ({ row }) => renderMyStatus(row.myStatus),
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
tagMaps: {
|
|
116
|
+
myStatus: {
|
|
117
|
+
'0': { label: '待处理', type: 'info' },
|
|
118
|
+
'1': { label: '处理中', type: '' },
|
|
119
|
+
'2': { label: '已完成', type: 'success' },
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### 5.3 styles/presets/skin → full 切换
|
|
126
|
+
|
|
127
|
+
```scss
|
|
128
|
+
// 确认没有布局冲突后,把:
|
|
129
|
+
@use '@agile-team/wk-skills-ui/styles/presets/skin' as *;
|
|
130
|
+
// 改为:
|
|
131
|
+
@use '@agile-team/wk-skills-ui/styles' as *;
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**验证方式:** 跑冒烟测试,确认以下页面类型视觉无异常:
|
|
135
|
+
- 列表页(.list-page 骨架生效)
|
|
136
|
+
- 左树右表页(.tree-list 骨架生效)
|
|
137
|
+
- 表单弹窗(.form-dialog 骨架生效)
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## 六、回退机制
|
|
142
|
+
|
|
143
|
+
每步迁移都是**加法或替换**,不是删除原有代码:
|
|
144
|
+
|
|
145
|
+
| 步骤 | 回退方式 |
|
|
146
|
+
|---|---|
|
|
147
|
+
| styles full → skin | 改回 `@use '...presets/skin'` |
|
|
148
|
+
| defineColumns 迁移 | git revert 单个文件 |
|
|
149
|
+
| installCommonPreset | 注释掉 `installCommonPreset()` 调用 |
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## 关联资源
|
|
154
|
+
|
|
155
|
+
- 渐进迁移流程:[_flows/progressive-migrate](../../_flows/progressive-migrate.md)
|
|
156
|
+
- 审计先行:[ops/audit](../audit/SKILL.md)
|
|
157
|
+
- 运行时迁移:[runtime/migration](../../runtime/migration/SKILL.md)
|