@agile-team/wl-skills-kit 2.3.4 → 2.3.6

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.
Files changed (96) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +16 -10
  3. package/files/.cursor/mcp.json +8 -8
  4. package/files/.github/guides/README.md +13 -13
  5. package/files/.github/guides/architecture.md +555 -555
  6. package/files/.github/guides/mcp-setup.md +109 -109
  7. package/files/.github/guides/usage.md +184 -184
  8. package/files/.github/reports/README.md +65 -65
  9. package/files/.github/reports/SYS_DICT_INFO.md +50 -50
  10. package/files/.github/reports/SYS_MENU_INFO.md +247 -247
  11. package/files/.github/reports/SYS_PERMISSION_INFO.md +20 -20
  12. package/files/.github/reports//347/273/204/344/273/266/346/217/220/345/217/226/345/273/272/350/256/256.md +33 -33
  13. package/files/.github/reports//350/247/204/350/214/203/345/256/241/346/237/245/346/212/245/345/221/212.md +44 -44
  14. package/files/.github/skills/_compat/README.md +108 -108
  15. package/files/.github/skills/_compat/headers/agents.txt +8 -8
  16. package/files/.github/skills/_compat/headers/claude-code.txt +7 -7
  17. package/files/.github/skills/_compat/headers/cline.txt +7 -7
  18. package/files/.github/skills/_compat/headers/cursor-mdc.txt +16 -16
  19. package/files/.github/skills/_compat/headers/cursor-rules.txt +7 -7
  20. package/files/.github/skills/_compat/headers/github-copilot.txt +1 -1
  21. package/files/.github/skills/_compat/headers/kiro.txt +10 -10
  22. package/files/.github/skills/_compat/headers/qoder.txt +8 -8
  23. package/files/.github/skills/_compat/headers/trae.txt +11 -11
  24. package/files/.github/skills/_compat/headers/windsurf.txt +7 -7
  25. package/files/.github/skills/_registry.md +81 -81
  26. package/files/.github/skills/core/api-contract/SKILL.md +344 -344
  27. package/files/.github/skills/core/api-contract/USAGE.md +110 -110
  28. package/files/.github/skills/core/convention-audit/SKILL.md +189 -189
  29. package/files/.github/skills/core/convention-audit/USAGE.md +99 -99
  30. package/files/.github/skills/core/page-codegen/SKILL.md +973 -973
  31. package/files/.github/skills/core/page-codegen/USAGE.md +102 -102
  32. package/files/.github/skills/core/page-codegen/templates/_index.md +46 -46
  33. package/files/.github/skills/core/page-codegen/templates/domains/_CONTRIBUTING.md +107 -107
  34. package/files/.github/skills/core/page-codegen/templates/domains/produce/TPL-OPERATION-STATION.md +442 -442
  35. package/files/.github/skills/core/page-codegen/templates/domains/sale/README.md +26 -26
  36. package/files/.github/skills/core/page-codegen/templates/universal/TPL-CHANGE-HISTORY.md +276 -276
  37. package/files/.github/skills/core/page-codegen/templates/universal/TPL-DETAIL-TABS.md +1145 -1145
  38. package/files/.github/skills/core/page-codegen/templates/universal/TPL-DRIVEN.md +309 -309
  39. package/files/.github/skills/core/page-codegen/templates/universal/TPL-FORM-ROUTE.md +436 -436
  40. package/files/.github/skills/core/page-codegen/templates/universal/TPL-LIST.md +191 -191
  41. package/files/.github/skills/core/page-codegen/templates/universal/TPL-MASTER-DETAIL.md +148 -148
  42. package/files/.github/skills/core/page-codegen/templates/universal/TPL-RECORD-FORM.md +376 -376
  43. package/files/.github/skills/core/page-codegen/templates/universal/TPL-TREE-LIST.md +186 -186
  44. package/files/.github/skills/core/prototype-scan/SKILL.md +498 -498
  45. package/files/.github/skills/core/prototype-scan/USAGE.md +95 -95
  46. package/files/.github/skills/core/template-extract/SKILL.md +139 -139
  47. package/files/.github/skills/core/template-extract/USAGE.md +93 -93
  48. package/files/.github/skills/domain/README.md +51 -51
  49. package/files/.github/skills/sync/env.local.json +0 -5
  50. package/files/.github/skills/sync/menu-sync/SKILL.md +263 -263
  51. package/files/.github/skills/sync/menu-sync/USAGE.md +104 -104
  52. package/files/.github/skills/sync/menu-sync/env/env.local.json +7 -7
  53. package/files/.github/skills/sync/menu-sync/env/guide.md +99 -99
  54. package/files/.github/skills/sync/permission-sync/SKILL.md +239 -0
  55. package/files/.github/skills/sync/permission-sync/USAGE.md +93 -0
  56. package/files/.github/standards/01-toolchain.md +57 -57
  57. package/files/.github/standards/02-code-structure.md +111 -111
  58. package/files/.github/standards/03-comments.md +53 -53
  59. package/files/.github/standards/04-coding-basics.md +33 -33
  60. package/files/.github/standards/05-logging.md +38 -38
  61. package/files/.github/standards/06-security.md +44 -44
  62. package/files/.github/standards/07-config.md +52 -52
  63. package/files/.github/standards/08-git.md +60 -60
  64. package/files/.github/standards/09-typescript.md +71 -71
  65. package/files/.github/standards/10-pinia.md +57 -57
  66. package/files/.github/standards/11-form-validation.md +81 -81
  67. package/files/.github/standards/12-base-table.md +153 -153
  68. package/files/.github/standards/13-platform-components.md +123 -123
  69. package/files/.github/standards/index.md +89 -89
  70. package/files/.kiro/settings/mcp.json +8 -8
  71. package/files/.mcp.json +8 -8
  72. package/files/.vscode/mcp.json +9 -9
  73. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/data.ts +196 -196
  74. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/index.scss +150 -150
  75. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/index.vue +79 -79
  76. package/files/docs/jh-date-range.md +257 -257
  77. package/files/docs/jh-date.md +222 -222
  78. package/files/docs/jh-dept-picker.md +190 -190
  79. package/files/docs/jh-drag-row.md +590 -590
  80. package/files/docs/jh-file-upload.md +216 -216
  81. package/files/docs/jh-picker.md +218 -218
  82. package/files/docs/jh-select.md +148 -148
  83. package/files/docs/jh-text.md +248 -248
  84. package/files/docs/jh-user-picker.md +197 -197
  85. package/files/src/components/global/C_RightToolbar/data.ts +228 -228
  86. package/files/src/components/global/C_RightToolbar/index.scss +44 -44
  87. package/files/src/components/global/C_Splitter/index.scss +61 -61
  88. package/files/src/components/global/C_SvgIcon/index.scss +15 -15
  89. package/files/src/components/global/C_TagStatus/index.scss +20 -20
  90. package/files/src/components/global/C_Tree/data.ts +61 -61
  91. package/files/src/components/local/c_listModal/index.scss +4 -4
  92. package/mcp/api/roleApi.js +60 -0
  93. package/mcp/server.js +125 -5
  94. package/mcp/tools/permissionSync.js +321 -0
  95. package/package.json +1 -1
  96. package/files/.github/skills/sync/permission-sync/SKILL.draft.md +0 -91
@@ -2,190 +2,190 @@
2
2
 
3
3
  > 见 SKILL.md 主文件(约束 + 按钮规则 + Mock 规范等共用规则)。
4
4
 
5
-
6
- #### index.vue
7
-
8
- ```vue
9
- <template>
10
- <div class="app-container app-page-container">
11
- <C_Splitter :left-width="220">
12
- <template #left>
13
- <C_Tree
14
- :tree-data="treeData"
15
- :show-search="true"
16
- @node-click="handleNodeClick"
17
- />
18
- </template>
19
- <template #right>
20
- <BaseQuery
21
- :form="queryParam"
22
- :items="queryItems"
23
- @select="select"
24
- @reset="select"
25
- />
26
- <BaseToolbar :items="toolbars" />
27
- <BaseTable ref="tableRef" :data="list" :columns="columns" showToolbar />
28
- <jh-pagination
29
- v-show="page.total && page.total > 0"
30
- :total="page.total || 0"
31
- v-model:currentPage="page.current"
32
- v-model:pageSize="page.size"
33
- @current-change="select"
34
- @size-change="select"
35
- />
36
- </template>
37
- </C_Splitter>
38
- </div>
39
- </template>
40
-
41
- <script setup lang="ts">
42
- import { createPage, loadTree } from "./data";
43
-
44
- const Page = createPage();
45
- const {
46
- tableRef,
47
- page,
48
- queryParam,
49
- list,
50
- treeData,
51
- queryItems,
52
- columns,
53
- toolbars,
54
- select,
55
- handleNodeClick
56
- } = Page;
57
-
58
- onMounted(() => {
59
- loadTree();
60
- select();
61
- });
62
- </script>
63
-
64
- <style scoped lang="scss">
65
- @import "./index.scss";
66
- </style>
67
- ```
68
-
69
- #### data.ts
70
-
71
- ```typescript
72
- import {
73
- AbstractPageQueryHook,
74
- BaseQueryItemDesc,
75
- ActionButtonDesc,
76
- TableColumnDesc,
77
- BusLogicDataType
78
- } from "@/types/page";
79
- import { getAction, postAction } from "@jhlc/common-core/src/api/action";
80
-
81
- export const API_CONFIG = {
82
- tree: "/[服务缩写]/[树资源]/tree",
83
- list: "/[服务缩写]/[主资源]/list",
84
- remove: "/[服务缩写]/[主资源]/remove",
85
- getById: "/[服务缩写]/[主资源]/getById",
86
- save: "/[服务缩写]/[主资源]/save",
87
- update: "/[服务缩写]/[主资源]/update"
88
- } as const;
89
-
90
- // ===== 树形数据 =====
91
- const treeData = ref<any[]>([]);
92
- let currentNodeId: string | undefined;
93
-
94
- export async function loadTree() {
95
- const res = await getAction(API_CONFIG.tree);
96
- treeData.value = res.result || res.data || res;
97
- }
98
-
99
- export function createPage(editModalRef?: any) {
100
- let _editModalRef = editModalRef;
101
-
102
- let Page = new (class extends AbstractPageQueryHook {
103
- constructor() {
104
- super({ url: { list: API_CONFIG.list, remove: API_CONFIG.remove } });
105
- }
106
-
107
- queryDef(): BaseQueryItemDesc<any>[] {
108
- return [
109
- { name: "[fieldName]", label: "[中文名]", placeholder: "请输入" }
110
- ];
111
- }
112
-
113
- toolbarDef(): ActionButtonDesc[] {
114
- return [
115
- {
116
- name: "primary",
117
- label: "新增",
118
- onClick: () => _editModalRef?.value?.open()
119
- },
120
- {
121
- name: "danger",
122
- label: "删除",
123
- onClick: () => {
124
- const rows = this.tableRef.value?.getSelectionRows();
125
- if (!rows?.length) return ElMessage.warning("请先选择数据");
126
- this.removeBatch();
127
- }
128
- }
129
- ];
130
- }
131
-
132
- columnsDef(): TableColumnDesc<any>[] {
133
- return [
134
- { type: "selection" },
135
- { type: "index" },
136
- { label: "[字段名]", name: "[fieldName]", minWidth: 120 },
137
- {
138
- label: "操作",
139
- width: 140,
140
- fixed: "right",
141
- operations: [
142
- {
143
- name: "edit",
144
- label: "编辑",
145
- onClick: (row: any) => _editModalRef?.value?.edit(row.id)
146
- },
147
- {
148
- name: "remove",
149
- label: "删除",
150
- onClick: (row: any) => this.remove(row.id)
151
- }
152
- ]
153
- }
154
- ];
155
- }
156
- })();
157
-
158
- const created = (Page as any).create() as any;
159
-
160
- // ⭐ 树节点点击 → 过滤右侧列表
161
- function handleNodeClick(data: any) {
162
- currentNodeId = data.id;
163
- created.queryParam.value.treeId = data.id;
164
- created.page.current = 1;
165
- created.select();
166
- }
167
-
168
- return {
169
- ...created,
170
- treeData,
171
- handleNodeClick
172
- };
173
- }
174
- ```
175
-
176
- #### index.scss
177
-
178
- ```scss
179
- .app-page-container {
180
- // C_Splitter 需要父容器撑满高度
181
- :deep(.my-splitter-container) {
182
- height: 100%;
183
- }
184
- }
185
- ```
186
-
187
- > **C_Tree Props 速查**:`tabs`(标签页数组)、`treeData`(必填)、`showSearch`(默认 true)、`defaultExpandAll`(默认 true)。
188
- > **Events**:`@node-click`(节点点击)、`@tab-change`(标签页切换)。
189
- > 详见 `src/components/global/C_Tree/README.md`。
190
-
5
+
6
+ #### index.vue
7
+
8
+ ```vue
9
+ <template>
10
+ <div class="app-container app-page-container">
11
+ <C_Splitter :left-width="220">
12
+ <template #left>
13
+ <C_Tree
14
+ :tree-data="treeData"
15
+ :show-search="true"
16
+ @node-click="handleNodeClick"
17
+ />
18
+ </template>
19
+ <template #right>
20
+ <BaseQuery
21
+ :form="queryParam"
22
+ :items="queryItems"
23
+ @select="select"
24
+ @reset="select"
25
+ />
26
+ <BaseToolbar :items="toolbars" />
27
+ <BaseTable ref="tableRef" :data="list" :columns="columns" showToolbar />
28
+ <jh-pagination
29
+ v-show="page.total && page.total > 0"
30
+ :total="page.total || 0"
31
+ v-model:currentPage="page.current"
32
+ v-model:pageSize="page.size"
33
+ @current-change="select"
34
+ @size-change="select"
35
+ />
36
+ </template>
37
+ </C_Splitter>
38
+ </div>
39
+ </template>
40
+
41
+ <script setup lang="ts">
42
+ import { createPage, loadTree } from "./data";
43
+
44
+ const Page = createPage();
45
+ const {
46
+ tableRef,
47
+ page,
48
+ queryParam,
49
+ list,
50
+ treeData,
51
+ queryItems,
52
+ columns,
53
+ toolbars,
54
+ select,
55
+ handleNodeClick
56
+ } = Page;
57
+
58
+ onMounted(() => {
59
+ loadTree();
60
+ select();
61
+ });
62
+ </script>
63
+
64
+ <style scoped lang="scss">
65
+ @import "./index.scss";
66
+ </style>
67
+ ```
68
+
69
+ #### data.ts
70
+
71
+ ```typescript
72
+ import {
73
+ AbstractPageQueryHook,
74
+ BaseQueryItemDesc,
75
+ ActionButtonDesc,
76
+ TableColumnDesc,
77
+ BusLogicDataType
78
+ } from "@/types/page";
79
+ import { getAction, postAction } from "@jhlc/common-core/src/api/action";
80
+
81
+ export const API_CONFIG = {
82
+ tree: "/[服务缩写]/[树资源]/tree",
83
+ list: "/[服务缩写]/[主资源]/list",
84
+ remove: "/[服务缩写]/[主资源]/remove",
85
+ getById: "/[服务缩写]/[主资源]/getById",
86
+ save: "/[服务缩写]/[主资源]/save",
87
+ update: "/[服务缩写]/[主资源]/update"
88
+ } as const;
89
+
90
+ // ===== 树形数据 =====
91
+ const treeData = ref<any[]>([]);
92
+ let currentNodeId: string | undefined;
93
+
94
+ export async function loadTree() {
95
+ const res = await getAction(API_CONFIG.tree);
96
+ treeData.value = res.result || res.data || res;
97
+ }
98
+
99
+ export function createPage(editModalRef?: any) {
100
+ let _editModalRef = editModalRef;
101
+
102
+ let Page = new (class extends AbstractPageQueryHook {
103
+ constructor() {
104
+ super({ url: { list: API_CONFIG.list, remove: API_CONFIG.remove } });
105
+ }
106
+
107
+ queryDef(): BaseQueryItemDesc<any>[] {
108
+ return [
109
+ { name: "[fieldName]", label: "[中文名]", placeholder: "请输入" }
110
+ ];
111
+ }
112
+
113
+ toolbarDef(): ActionButtonDesc[] {
114
+ return [
115
+ {
116
+ name: "primary",
117
+ label: "新增",
118
+ onClick: () => _editModalRef?.value?.open()
119
+ },
120
+ {
121
+ name: "danger",
122
+ label: "删除",
123
+ onClick: () => {
124
+ const rows = this.tableRef.value?.getSelectionRows();
125
+ if (!rows?.length) return ElMessage.warning("请先选择数据");
126
+ this.removeBatch();
127
+ }
128
+ }
129
+ ];
130
+ }
131
+
132
+ columnsDef(): TableColumnDesc<any>[] {
133
+ return [
134
+ { type: "selection" },
135
+ { type: "index" },
136
+ { label: "[字段名]", name: "[fieldName]", minWidth: 120 },
137
+ {
138
+ label: "操作",
139
+ width: 140,
140
+ fixed: "right",
141
+ operations: [
142
+ {
143
+ name: "edit",
144
+ label: "编辑",
145
+ onClick: (row: any) => _editModalRef?.value?.edit(row.id)
146
+ },
147
+ {
148
+ name: "remove",
149
+ label: "删除",
150
+ onClick: (row: any) => this.remove(row.id)
151
+ }
152
+ ]
153
+ }
154
+ ];
155
+ }
156
+ })();
157
+
158
+ const created = (Page as any).create() as any;
159
+
160
+ // ⭐ 树节点点击 → 过滤右侧列表
161
+ function handleNodeClick(data: any) {
162
+ currentNodeId = data.id;
163
+ created.queryParam.value.treeId = data.id;
164
+ created.page.current = 1;
165
+ created.select();
166
+ }
167
+
168
+ return {
169
+ ...created,
170
+ treeData,
171
+ handleNodeClick
172
+ };
173
+ }
174
+ ```
175
+
176
+ #### index.scss
177
+
178
+ ```scss
179
+ .app-page-container {
180
+ // C_Splitter 需要父容器撑满高度
181
+ :deep(.my-splitter-container) {
182
+ height: 100%;
183
+ }
184
+ }
185
+ ```
186
+
187
+ > **C_Tree Props 速查**:`tabs`(标签页数组)、`treeData`(必填)、`showSearch`(默认 true)、`defaultExpandAll`(默认 true)。
188
+ > **Events**:`@node-click`(节点点击)、`@tab-change`(标签页切换)。
189
+ > 详见 `src/components/global/C_Tree/README.md`。
190
+
191
191
  ---