adspecs 0.1.39 → 0.1.41

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.
@@ -0,0 +1,374 @@
1
+ # 页面模板索引
2
+
3
+ 本文件是页面生成的唯一模板入口。模板均从丰富参考工程中提炼为“模式”,只描述可迁移结构、组件组合和生成要点;不要在生成代码或规则中引用参考工程的绝对路径。
4
+
5
+ ## 使用原则
6
+
7
+ - 生成页面前先在本文件选择模板模式,再按 `page-development-rules.md` 落到目标工程路径。
8
+ - 目标工程页面通常放在 `src/views/<menuUrl>/index.vue`,由后台菜单动态加载。
9
+ - API 放在 `src/api/<module>/<page>/index.ts`,语言包放在 `src/lang/modules/<module>/`。
10
+ - 不直接复制旧页面,不迁移参考工程的接口前缀、业务编码、绝对路径和专属本地组件。
11
+ - 目标工程没有的依赖或组件必须替换为已有组件,或先明确补依赖。
12
+
13
+ ## 1. 查询栏 + 高级表格 + 弹窗表单
14
+
15
+ 适用场景:普通 CRUD 列表、配置列表、调度任务、消息模板、基础资料维护。
16
+
17
+ 推荐结构:
18
+
19
+ ```text
20
+ src/views/<module>/<page>/
21
+ ├── index.vue
22
+ ├── searchConfig.ts
23
+ ├── gridConfig.ts
24
+ └── components/
25
+ ├── AddForm.vue
26
+ ├── EditForm.vue
27
+ └── DetailDrawer.vue
28
+ ```
29
+
30
+ 生成要点:
31
+
32
+ - 顶部使用 `GsSearchBar`,查询项放在 `searchConfig`。
33
+ - 主表使用 `GsCustomizeTable`,列配置放在 `gridConfig`。
34
+ - 外部查询更新 `queryParams.params.params` 后调用 `tableRef.value?.outSearch(false)`。
35
+ - 新增、编辑、调试、详情等动作放入独立弹窗/抽屉组件。
36
+ - 操作列使用 `slotArr: ['action']`,批量按钮放在 `#btn`。
37
+
38
+ ## 2. 单表 CRUD + 导入导出
39
+
40
+ 适用场景:字典类型、消息模板、系统参数、基础资料维护、带批量导入导出的业务列表。
41
+
42
+ 推荐结构:
43
+
44
+ ```text
45
+ src/views/<module>/<page>/
46
+ ├── index.vue
47
+ ├── gridConfig.ts
48
+ └── components/
49
+ ├── AddDialog.vue
50
+ ├── EditDialog.vue
51
+ └── BatchUpload.vue
52
+ ```
53
+
54
+ 生成要点:
55
+
56
+ - 表格开启 `selectable`、`rowKey`、唯一 `localstorageName`。
57
+ - 工具栏包含新增、导入、导出;导出以选中行 ID 组装请求。
58
+ - 导入成功后刷新表格。
59
+ - 复杂字段用字段插槽渲染,普通字典字段优先使用 `dictCode`。
60
+ - 保存、删除、导入、导出都要有 loading 或禁用态防重复点击。
61
+
62
+ ## 3. 左树右详情 Tab
63
+
64
+ 适用场景:菜单管理、组织机构、分类目录、资源配置、主从层级维护。
65
+
66
+ 推荐结构:
67
+
68
+ ```text
69
+ src/views/<module>/<page>/
70
+ ├── index.vue
71
+ └── components/
72
+ ├── TreePanel.vue
73
+ ├── BasicInfoTab.vue
74
+ ├── ResourceTab.vue
75
+ └── PermissionTab.vue
76
+ ```
77
+
78
+ 生成要点:
79
+
80
+ - 左侧固定宽度树,包含系统筛选、关键字过滤、新增按钮。
81
+ - 右侧根据当前节点显示 `el-tabs`,每个 Tab 独立组件。
82
+ - 当前节点通过 props 下发,子组件通过事件通知父组件刷新树。
83
+ - Tab 是否显示由按钮权限、节点类型和租户/所有者条件共同决定。
84
+ - 保留 `currentNode`、`defaultExpandedKeys`、`filterText`、`loading` 等状态。
85
+
86
+ ## 4. 左列表右内联编辑
87
+
88
+ 适用场景:模板中心、导入导出模板、打印模板、文档模板、需要边选边编辑的配置中心。
89
+
90
+ 推荐结构:
91
+
92
+ ```text
93
+ src/views/<module>/<page>/
94
+ ├── index.vue
95
+ └── components/
96
+ ├── TemplateListPanel.vue
97
+ ├── TemplateSearchBar.vue
98
+ ├── InlineEditor.vue
99
+ └── UseHistoryDialog.vue
100
+ ```
101
+
102
+ 生成要点:
103
+
104
+ - 左侧为可分页模板列表,右侧为详情/编辑区。
105
+ - `selectedItem` 控制右侧显示,`isEditing` 控制只读/编辑态。
106
+ - 顶部工具栏在查看态显示编辑/删除,在编辑态显示保存/取消。
107
+ - 右侧编辑区可用 `el-scrollbar` 包裹,避免页面整体滚动。
108
+ - 新增时构造临时选中项,保存成功后刷新左侧列表并选中最新项。
109
+
110
+ ## 5. 权限控制多 Tab 中心
111
+
112
+ 适用场景:权限中心、配置中心、模板中心、模块化后台页面。
113
+
114
+ 推荐结构:
115
+
116
+ ```text
117
+ src/views/<module>/<page>/
118
+ ├── index.vue
119
+ └── tabs/
120
+ ├── FirstTab.vue
121
+ ├── SecondTab.vue
122
+ └── ThirdTab.vue
123
+ ```
124
+
125
+ 生成要点:
126
+
127
+ - 父组件只负责 Tab 容器、权限判断和公共数据加载。
128
+ - `authTabs` 由 `isHaveBtnAuth(code)` 过滤生成,默认激活第一个可见 Tab。
129
+ - 公共数据通过 `provide` 下发给 Tab 子组件。
130
+ - 每个 Tab 自己负责列表、表单、弹窗和 API。
131
+ - 对首次切换才需要初始化的 Tab,在 `tab-change` 中调用子组件方法。
132
+
133
+ ## 6. 动态组件配置中心
134
+
135
+ 适用场景:系统配置中心、按权限展示多个配置模块、每个配置模块相互独立的页面。
136
+
137
+ 推荐结构:
138
+
139
+ ```text
140
+ src/views/<module>/<page>/
141
+ ├── index.vue
142
+ └── components/
143
+ ├── ConfigA.vue
144
+ ├── ConfigB.vue
145
+ └── ConfigC.vue
146
+ ```
147
+
148
+ 生成要点:
149
+
150
+ - `tabList` 由权限和运行配置计算得到。
151
+ - 使用 `<component :is="item.key" />` 渲染配置组件。
152
+ - 无可见 Tab 时展示 `el-empty`。
153
+ - 适合每个配置模块彼此独立、只共享少量全局配置的场景。
154
+
155
+ ## 7. 分段抽屉表单
156
+
157
+ 适用场景:任务配置、消息渠道、第三方接入、复杂基础资料。
158
+
159
+ 推荐结构:
160
+
161
+ ```text
162
+ src/views/<module>/<page>/components/
163
+ └── FormDrawer.vue
164
+ ```
165
+
166
+ 生成要点:
167
+
168
+ - 使用抽屉或弹窗承载大表单,表单内用分段标题分组。
169
+ - 每段用 `el-divider` 或统一分段标题组件。
170
+ - 字段按 12/24 栅格组织,复杂字段条件显示。
171
+ - 保存按钮带 `saveLoading`,保存成功后关闭并 emit `refresh`。
172
+ - 复杂子选择器、Cron、代码编辑器等放入二级弹窗组件。
173
+
174
+ ## 8. 调度任务与 Cron 配置
175
+
176
+ 适用场景:定时任务、计划任务、推送任务、需要启动/停止/执行一次的任务管理。
177
+
178
+ 推荐结构:
179
+
180
+ ```text
181
+ src/views/<module>/<page>/
182
+ ├── index.vue
183
+ ├── gridConfig.ts
184
+ ├── searchConfig.ts
185
+ └── components/
186
+ ├── TaskForm.vue
187
+ ├── TriggerDialog.vue
188
+ └── CodeEditorDialog.vue
189
+ ```
190
+
191
+ 生成要点:
192
+
193
+ - 列表操作列包含编辑、复制、删除、执行一次、查看日志、启动/停止。
194
+ - 表单按“基础配置 / 调度配置 / 执行配置 / 高级配置”分段。
195
+ - Cron 字段使用只读输入框触发 Cron 弹窗。
196
+ - `scheduleType` 改变时联动清空或校验 `scheduleConf`。
197
+ - 启停、执行一次等动作需要二次确认或 loading。
198
+
199
+ ## 9. 日志列表 + 详情抽屉 + 分析面板
200
+
201
+ 适用场景:接口日志、登录日志、审计日志、用户行为日志、调用统计。
202
+
203
+ 推荐结构:
204
+
205
+ ```text
206
+ src/views/<module>/<page>/
207
+ ├── index.vue
208
+ ├── config/
209
+ │ └── gridConfig.ts
210
+ └── components/
211
+ ├── ParamsDrawer.vue
212
+ ├── LinkDrawer.vue
213
+ └── DataViewDrawer.vue
214
+ ```
215
+
216
+ 生成要点:
217
+
218
+ - 列表 Tab 使用 `GsCustomizeTable`,可自定义 `#pager` 加首页/末页按钮。
219
+ - 查询条件可放在 `#btn-r` 或独立筛选栏。
220
+ - 大字段如 request/response/exception 只显示“详情”按钮,点击打开抽屉。
221
+ - 分析 Tab 展示统计卡片、趋势图、Top 列表。
222
+ - 图表依赖不存在时,先降级为统计卡片 + 表格,不要强行引入新依赖。
223
+
224
+ ## 10. 开放 API 列表 + 编辑页切换
225
+
226
+ 适用场景:接口管理、API 编排、服务接口定义、请求/响应参数维护。
227
+
228
+ 推荐结构:
229
+
230
+ ```text
231
+ src/views/<module>/<page>/
232
+ ├── index.vue
233
+ └── components/
234
+ ├── ParamTable.vue
235
+ ├── DebugDialog.vue
236
+ └── ApiImportDialog.vue
237
+ ```
238
+
239
+ 生成要点:
240
+
241
+ - 页面用 `isEditing` / `mode` 在列表区和编辑区之间切换。
242
+ - 列表区使用表格,支持增量/全量导入、导出、调试。
243
+ - 编辑区包含基础表单 + 请求参数表 + 响应参数表。
244
+ - 返回列表时刷新数据并重置表单。
245
+ - 参数表作为子组件维护增删改,父组件保存时统一组装 payload。
246
+
247
+ ## 11. 权限矩阵 / 授权选择器
248
+
249
+ 适用场景:字段权限、数据权限、接口权限、人员授权、组织授权。
250
+
251
+ 推荐结构:
252
+
253
+ ```text
254
+ src/views/<module>/<page>/
255
+ ├── index.vue
256
+ └── components/
257
+ ├── OrgTreePanel.vue
258
+ ├── PermissionListPanel.vue
259
+ ├── GrantDialog.vue
260
+ └── ConditionTable.vue
261
+ ```
262
+
263
+ 生成要点:
264
+
265
+ - 左侧组织/角色/用户树,右侧权限列表或矩阵。
266
+ - 权限数据通常需要系统、菜单、角色、组织等固定参数。
267
+ - 授权弹窗要支持已选回显和确认后局部刷新。
268
+ - 条件配置可用表格维护,复杂表达式再引入编辑器。
269
+
270
+ ## 12. 规则设计 / 多模式编辑器
271
+
272
+ 适用场景:规则引擎、表达式配置、低代码规则编排、条件动作设计。
273
+
274
+ 推荐结构:
275
+
276
+ ```text
277
+ src/views/<module>/<page>/
278
+ ├── index.vue
279
+ └── components/
280
+ ├── VisualDesigner.vue
281
+ ├── ExpressionEditor.vue
282
+ ├── CodeEditor.vue
283
+ └── ExecutionDrawer.vue
284
+ ```
285
+
286
+ 生成要点:
287
+
288
+ - 根据路由 query 或页面状态选择设计模式。
289
+ - 父组件统一加载规则对象、保存、执行。
290
+ - 视觉设计、表达式、代码编辑拆成互斥子组件。
291
+ - 执行前先保存或校验当前编辑内容。
292
+ - 若目标工程缺少编辑器依赖,先生成普通文本域或只读 JSON 预览,不直接引用外部编辑器组件。
293
+
294
+ ## 13. 基础资料表单
295
+
296
+ 适用场景:个人信息、密码修改、简单基础资料、只读/编辑切换的小表单。
297
+
298
+ 推荐结构:
299
+
300
+ ```text
301
+ src/views/<module>/<page>/
302
+ ├── index.vue
303
+ └── components/
304
+ └── BasicForm.vue
305
+ ```
306
+
307
+ 生成要点:
308
+
309
+ - 使用 `el-form` + `el-row` + `el-col`。
310
+ - 简单页面可以直接在 `index.vue` 放表单;字段超过一屏时拆 `BasicForm.vue`。
311
+ - 头像、附件、图片类字段优先使用目标工程已有上传组件。
312
+ - 保存前校验表单,保存成功后提示并按需刷新用户信息或返回列表。
313
+ - 密码类表单必须包含确认字段校验和 loading 防重复提交。
314
+
315
+ ## 14. 流程表单包装页
316
+
317
+ 适用场景:流程引擎嵌入业务表单、审批页内保存草稿、发起流程。
318
+
319
+ 推荐结构:
320
+
321
+ ```text
322
+ src/views/<module>/<page>/
323
+ ├── index.vue
324
+ └── components/
325
+ └── BusinessForm.vue
326
+ ```
327
+
328
+ 生成要点:
329
+
330
+ - 包装页接收 `isSubmit`、`editStatus`、`bpm_businessKey`、`taskServiceParams`、`curTaskName`。
331
+ - 业务表单实现 `get_process_variables()` 和 `ap_save()`。
332
+ - `editStatus` 和路由参数共同决定字段是否可编辑。
333
+ - 保存草稿返回 Promise,供流程引擎调用。
334
+ - 流程标识、系统类型、租户字段不要硬编码,优先从配置或 props 传入。
335
+
336
+ ## 15. 动态表单入口
337
+
338
+ 适用场景:后台表单设计器配置出的动态表单页面。
339
+
340
+ 推荐结构:
341
+
342
+ ```text
343
+ src/views/<module>/<page>/index.vue
344
+ ```
345
+
346
+ 生成要点:
347
+
348
+ - 使用 `FormRender` 前确认 `@gushen/gushen-form-render` 插件是否已注册。
349
+ - 动态表单页面通常不写业务字段,只负责挂载渲染器和同步路由标题。
350
+ - 如果菜单参数已经声明动态表单,优先走 `permission.ts` 的动态表单路由处理,不新建手写 CRUD。
351
+
352
+ ## API 模板模式
353
+
354
+ 新增 API 时按业务复杂度选择:
355
+
356
+ - 标准 CRUD:`findPagination`、`save`、`update`、`getById`、`delete`。
357
+ - 导入导出:列表查询、模板下载、导入上传、导出下载、历史记录。
358
+ - 树结构:树查询、节点新增、节点更新、节点删除、拖拽排序。
359
+ - 授权类:主体查询、权限查询、授权保存、授权删除、回显详情。
360
+ - 日志类:分页查询、详情查询、统计总数、趋势、TopN。
361
+
362
+ API 生成约束:
363
+
364
+ - 不复用参考工程接口前缀;先参考目标工程同模块 API 风格。
365
+ - POST 保存/更新通常使用 `{ params }` 包装。
366
+ - 文件下载使用 Blob 时要释放 URL。
367
+ - 用户可见错误和成功提示走 i18n。
368
+
369
+ ## 不建议直接迁移的模式
370
+
371
+ - 依赖专有设计器、Monaco、打印设计器、复杂工作流 SDK 的页面:目标工程未必具备依赖,应先确认包和注册方式。
372
+ - 深度绑定平台权限模型、租户模型、接口导入协议的页面:只迁移结构,不迁移字段和接口。
373
+ - 大量 Options API mixin 的旧页面:新页面优先用 `script setup` 重写结构。
374
+ - 使用参考工程专属本地组件的页面:必须替换为目标工程已有组件或先补组件。
@@ -0,0 +1,48 @@
1
+ # 项目结构与入口规则
2
+
3
+ ## 技术栈
4
+
5
+ - Vue 3 + TypeScript + Vite。
6
+ - Element Plus 全量注册,Element Plus 图标在 `src/core/initMain.ts` 中全局注册。
7
+ - `@gushen/gushen-common-components` 通过 `instance.use(GsComponents)` 全局注册,并引入组件库 CSS。
8
+ - `@gushen/gushen-form-render` 依赖存在,但当前 `src/core/initMain.ts` 中插件注册被注释;使用 `FormRender` 前先确认是否需要启用插件注册。
9
+ - 当前 `package.json` 未安装 `@gushen/gushen-work-flow`;流程相关页面主要作为壳层/包装层存在,若要直接使用工作流组件,先补依赖并确认注册方式。
10
+
11
+ ## 关键入口
12
+
13
+ - 应用入口:`src/main.ts`
14
+ - 插件、全局属性、全局组件:`src/core/initMain.ts`
15
+ - 本地全局组件:`src/components/global-register.ts`
16
+ - 路由:`src/router/index.ts`
17
+ - 动态菜单与路由守卫:`src/permission.ts`
18
+ - 页面:`src/views`
19
+ - API:`src/api`
20
+ - 语言包:`src/lang`、`src/lang/modules`
21
+
22
+ ## 代码风格
23
+
24
+ - 新增 Vue 页面优先使用 Vue 3 `script setup lang="ts"`;维护旧页面时可沿用 Options API。
25
+ - 新增业务代码不要使用 `// @ts-nocheck`。
26
+ - `ref([])`、`reactive({})`、回调参数要显式类型,避免 `vue-tsc` 隐式 `any`。
27
+ - 类型导入使用 `import type`。
28
+ - 不要把 `isc-web-ui` 中依赖本地组件的规则照搬到本工程,除非本工程已有同名组件或先补齐组件。
29
+
30
+ ## 路由规则
31
+
32
+ - 静态路由集中在 `src/router/index.ts` 的 `routes`。
33
+ - 主布局子页面放在根路由 `/` 的 `children` 中,常用 meta:`title`、`enTitle`、`icon`、`noCache`、`hideInMenu`、`isBootstrap`。
34
+ - 普通业务页优先走后台菜单动态路由:`src/permission.ts` 的 `formatRoutes` 会按 `menuUrl` / `originalAddr` 动态加载 `@/views${componentPath}/index.vue`。
35
+ - 新建业务页通常放在 `src/views/{菜单路径}/index.vue`,菜单平台配置 `menuUrl` 后即可加载;不要默认修改 `src/router/index.ts`。
36
+ - 只有登录页、首页、消息中心、个人中心等壳内固定页才补 `src/router/index.ts`。
37
+ - HTTP 菜单会走 `src/views/third-view.vue` iframe;动态表单菜单通过 `handleDynamicFormRoute` 映射到固定动态表单入口。
38
+
39
+ ## 全局属性
40
+
41
+ `src/core/initMain.ts` 中注入:
42
+
43
+ - `this.$http` / `window.$request`:请求工具。
44
+ - `this.reqIsSucceed`:统一成功判断。
45
+ - `this.$bus`:事件总线。
46
+ - `window._config`:运行配置。
47
+
48
+ 新增 Composition API 页面需要使用这些能力时,优先直接 import 对应工具函数;只有维护旧 Options API 页面时才使用 `this.xxx`。
@@ -407,7 +407,7 @@ questions: [
407
407
 
408
408
  - **补充检查(模式升级检测)**:当 `docs/` 已存在且 `docs` 决策为 `skip` 时,如果当前模式为**经典模式**、**完整模式**或**轻量模式**,需额外检查 `docs/40-project_conventions/` 的内容状态:
409
409
  - 检查 `docs/40-project_conventions/` 下是否存在实际文件(非空目录)
410
- - 如果 `40-project_conventions/` 仅包含空子目录(简易模式的产物:`end-integration/` + `frontend-integration/`,或仅 `frontend-standard/` 为空目录)→ 根据前端技术栈选择自动从 references 补充复制 `frontend-standard/` 的文件内容(Vue → `ecp-front-standard/`,Ant Design React → `ant6-front-standard/`),并输出:`📦 补充:检测到 40-project_conventions/ 为空目录(简易模式产物),已按前端技术栈补充 frontend-standard/`
410
+ - 如果 `40-project_conventions/` 仅包含空子目录(简易模式的产物:`end-integration/` + `frontend-integration/`,或仅 `frontend-standard/` 为空目录)→ 根据前端技术栈选择自动从 references 补充复制 `frontend-standard/` 的文件内容(Vue → `vue3-front-standard/`,Ant Design React → `ant6-front-standard/`),同时补充复制后端规范 `ecp-end-standard/` 到 `end-standard/`,并输出:`📦 补充:检测到 40-project_conventions/ 为空目录(简易模式产物),已按技术栈补充 frontend-standard/ 和 end-standard/`
411
411
  - 如果 `40-project_conventions/` 已包含文件 → 不做额外处理
412
412
 
413
413
  - **子目录更新检查(40-project_conventions/)**:当 `docs/` 已存在且 `docs` 决策为 `skip`,且 `docs/40-project_conventions/` 下已包含实际文件时,需额外询问用户是否更新此子目录:
@@ -513,13 +513,13 @@ questions: [
513
513
  根据区域决策执行:
514
514
 
515
515
  - `docs` 决策为 `skip` → 输出 `⏭ 阶段 1 跳过:docs/ 已存在,保留现有内容`,但需检查 `conventions_decision` 子决策:
516
- - 如果 `conventions_decision` = `"update"` → 根据前端技术栈选择从 `references/ecp-front-standard/`(Vue)或 `references/ant6-front-standard/`(Ant Design React)复制到 `$TARGET/docs/40-project_conventions/frontend-standard/`,覆盖更新前端规范文件,输出:`🔄 阶段 1 补充更新:docs/40-project_conventions/frontend-standard/ 已按前端技术栈更新`
516
+ - 如果 `conventions_decision` = `"update"` → 根据前端技术栈选择从 `references/vue3-front-standard/`(Vue)或 `references/ant6-front-standard/`(Ant Design React)复制到 `$TARGET/docs/40-project_conventions/frontend-standard/`,覆盖更新前端规范文件;经典/完整模式下同时从 `references/ecp-end-standard/` 复制到 `$TARGET/docs/40-project_conventions/end-standard/` 更新后端规范文件,输出:`🔄 阶段 1 补充更新:docs/40-project_conventions/ 已按技术栈更新前后端规范`
517
517
  - 如果 `conventions_decision` = `"skip"` → 不做额外处理
518
518
  - 处理完子决策后进入阶段 2
519
519
  - `docs` 决策为 `recreate` → 执行 `rm -rf "$TARGET/docs"`,然后按下方步骤完整重建
520
520
  - `docs` 决策为 `create` → 直接按下方步骤创建
521
521
 
522
- 创建以下完整目录树。大部分目录使用 `mkdir -p` 创建并写入 `README.md`;其中 `40-project_conventions/` 在经典/完整模式下根据前端技术栈选择复制 `ecp-front-standard/`(Vue)或 `ant6-front-standard/`(Ant Design React)到 `frontend-standard/` 子目录,轻量模式下同时复制 `python-end-standard/` 到 `end-standard/` `ant6-front-standard/` 到 `frontend-standard/`,在简易模式下仅创建空子目录结构。模板文件(原 `50-templates/`)已迁移至 `.adspecs/templates/`,随阶段 6 的 `.adspecs/` 复制一并完成。
522
+ 创建以下完整目录树。大部分目录使用 `mkdir -p` 创建并写入 `README.md`;其中 `40-project_conventions/` 在经典/完整模式下根据前端技术栈选择复制 `vue3-front-standard/`(Vue)或 `ant6-front-standard/`(Ant Design React)到 `frontend-standard/` 子目录,并复制 `ecp-end-standard/` 到 `end-standard/` 子目录(后端 Java 规范);轻量模式下复制 `ant6-front-standard/` 到 `frontend-standard/` `python-end-standard/` 到 `end-standard/`;在简易模式下仅创建空子目录结构。模板文件(原 `50-templates/`)已迁移至 `.adspecs/templates/`,随阶段 6 的 `.adspecs/` 复制一并完成。
523
523
 
524
524
  #### 目录结构
525
525
 
@@ -531,8 +531,8 @@ docs/
531
531
  ├── 20-prd/
532
532
  ├── 30-system-design/
533
533
  ├── 40-project_conventions/
534
- │ ├── frontend-standard/ # 经典/完整模式按前端技术栈复制(Vue→ecp-front-standard,AntD→ant6-front-standard);轻量模式固定 ant6-front-standard;简易模式为空
535
- │ └── end-standard/ # 轻量模式固定 python-end-standard;其他模式为空
534
+ │ ├── frontend-standard/ # 经典/完整模式按前端技术栈复制(Vue→vue3-front-standard,AntD→ant6-front-standard);轻量模式固定 ant6-front-standard;简易模式为空
535
+ │ └── end-standard/ # 经典/完整模式复制 ecp-end-standard(Java);轻量模式固定 python-end-standard;简易模式为空
536
536
  ├── 70-scripts/
537
537
  │ └── depoly/
538
538
  ├── 80-development/
@@ -603,14 +603,15 @@ docs/
603
603
  - 用途: 项目约定,前后端集成开发规范和接口约定
604
604
  - 子目录:
605
605
  - `frontend-standard/` — 前端约定(按技术栈来源不同)
606
- - `end-standard/` — 后端约定(仅轻量模式复制 Python 后端规范)
606
+ - `end-standard/` — 后端约定(按模式来源不同)
607
607
  - 来源规则(经典/完整模式):
608
- - 前端演示技术栈选择 **Vue(默认)** → 复制 `$PLUGIN_DIR/references/ecp-front-standard/` 到 `$TARGET/docs/40-project_conventions/frontend-standard/`
608
+ - 前端演示技术栈选择 **Vue(默认)** → 复制 `$PLUGIN_DIR/references/vue3-front-standard/` 到 `$TARGET/docs/40-project_conventions/frontend-standard/`
609
609
  - 前端演示技术栈选择 **Ant Design React** → 复制 `$PLUGIN_DIR/references/ant6-front-standard/` 到 `$TARGET/docs/40-project_conventions/frontend-standard/`
610
+ - 后端规范(所有经典/完整模式)→ 复制 `$PLUGIN_DIR/references/ecp-end-standard/` 到 `$TARGET/docs/40-project_conventions/end-standard/`
610
611
  - 来源规则(轻量模式):
611
612
  - 前端规范:复制 `$PLUGIN_DIR/references/ant6-front-standard/` 到 `$TARGET/docs/40-project_conventions/frontend-standard/`
612
613
  - 后端规范:复制 `$PLUGIN_DIR/references/python-end-standard/` 到 `$TARGET/docs/40-project_conventions/end-standard/`
613
- - 来源规则(简易模式): 仅创建空目录结构 `frontend-standard/`,不复制文件
614
+ - 来源规则(简易模式): 仅创建空目录结构 `frontend-standard/` + `end-standard/`,不复制文件
614
615
 
615
616
  **70-scripts/**:
616
617
 
@@ -665,6 +666,7 @@ mkdir -p "$TARGET/docs/300-specs"
665
666
  if [ "{mode}" = "simple" ]; then
666
667
  # 简易模式:仅创建空子目录结构,不复制 references 文件
667
668
  mkdir -p "$TARGET/docs/40-project_conventions/frontend-standard"
669
+ mkdir -p "$TARGET/docs/40-project_conventions/end-standard"
668
670
  elif [ "{mode}" = "demo" ]; then
669
671
  # 轻量模式:固定技术栈 Python + SQLite + React + AntD6,前后端规范都复制
670
672
  mkdir -p "$TARGET/docs/40-project_conventions/frontend-standard"
@@ -672,16 +674,18 @@ elif [ "{mode}" = "demo" ]; then
672
674
  cp -r "$PLUGIN_DIR/references/ant6-front-standard/." "$TARGET/docs/40-project_conventions/frontend-standard/"
673
675
  cp -r "$PLUGIN_DIR/references/python-end-standard/." "$TARGET/docs/40-project_conventions/end-standard/"
674
676
  else
675
- # 经典/完整模式:按前端技术栈选择复制前端规范到 frontend-standard/
677
+ # 经典/完整模式:按前端技术栈选择复制前端规范到 frontend-standard/,后端统一复制 ecp-end-standard
676
678
  if [ "$FRONT_DEMO_SOURCE" = "antd-front-demo" ]; then
677
679
  # Ant Design React 技术栈
678
680
  FRONTEND_STANDARD_SOURCE="ant6-front-standard"
679
681
  else
680
682
  # Vue 技术栈(默认)
681
- FRONTEND_STANDARD_SOURCE="ecp-front-standard"
683
+ FRONTEND_STANDARD_SOURCE="vue3-front-standard"
682
684
  fi
683
685
  mkdir -p "$TARGET/docs/40-project_conventions/frontend-standard"
686
+ mkdir -p "$TARGET/docs/40-project_conventions/end-standard"
684
687
  cp -r "$PLUGIN_DIR/references/$FRONTEND_STANDARD_SOURCE/." "$TARGET/docs/40-project_conventions/frontend-standard/"
688
+ cp -r "$PLUGIN_DIR/references/ecp-end-standard/." "$TARGET/docs/40-project_conventions/end-standard/"
685
689
  fi
686
690
 
687
691
  # 注意:模板文件已迁移至 .adspecs/templates/,随阶段 6 的 .adspecs/ 复制一并完成,无需单独复制
@@ -694,7 +698,7 @@ fi
694
698
  完成后输出:
695
699
 
696
700
  - 新建时(简易模式):`✅ 阶段 1 完成:docs/ 目录结构已创建(11 个一级子目录,40 仅创建空目录;模板在 .adspecs/templates/ 随阶段 6 复制)`
697
- - 新建时(经典/完整模式):`✅ 阶段 1 完成:docs/ 目录结构已创建(11 个一级子目录,其中 40 从 references 复制;模板在 .adspecs/templates/ 随阶段 6 复制)`
701
+ - 新建时(经典/完整模式):`✅ 阶段 1 完成:docs/ 目录结构已创建(11 个一级子目录,其中 40 从 references 复制前后端规范;模板在 .adspecs/templates/ 随阶段 6 复制)`
698
702
  - 新建时(轻量模式):`✅ 阶段 1 完成:docs/ 目录结构已创建(11 个一级子目录,40 按 Python+React 技术栈复制前后端规范;模板在 .adspecs/templates/ 随阶段 6 复制)`
699
703
  - 重建时:`🔄 阶段 1 完成:docs/ 目录结构已重新创建(删除旧目录后重建)`
700
704
  - 跳过时:`⏭ 阶段 1 跳过:docs/ 已存在,保留现有内容`
@@ -1128,7 +1132,7 @@ echo "更新了 ${#REPLACE_FILES[@]} 个模板文件,保留了 ${#KEEP_FILES[@
1128
1132
  hooks/
1129
1133
  ├── hooks.json # 跨平台 Hook 配置(SessionStart/PreCompact/PostToolUse/Stop)
1130
1134
  ├── platform.js # 平台检测工具模块(Claude Code / Qoder / WorkBuddy 兼容)
1131
- ├── session-start.js # SessionStart — 注入 using-adspecs 技能引导
1135
+ ├── session-start.js # SessionStart — 会话启动占位(会话引导由 session-logger.js init 承担)
1132
1136
  ├── wiki-queue.js # PostToolUse/Stop — wiki 同步队列管理
1133
1137
  ├── commit-queue.js # PostToolUse/Stop — commit 候选队列管理
1134
1138
  └── session-logger.js # SessionStart/PreCompact/Stop — AI 会话日志管理
@@ -1151,9 +1155,9 @@ find "$TARGET/hooks" -type f | wc -l
1151
1155
  ```
1152
1156
 
1153
1157
  **注意**:
1154
- - hooks.json 中的 `${CLAUDE_PLUGIN_ROOT}` 由平台在加载插件时注入,指向插件根目录或项目目录
1155
- - 复制 hooks/ 到项目目录确保脚本在任何平台环境下都能正确解析
1156
- - 不要修改 hooks.json 内容,保持 `${CLAUDE_PLUGIN_ROOT}` 变量引用不变
1158
+ - hooks.json 中的脚本命令使用项目根目录相对路径(`hooks/xxx.js`),运行时由平台 CWD 解析到目标项目的 `hooks/` 目录
1159
+ - 复制 hooks/ 到目标项目根目录是脚本可执行的前提,不可省略
1160
+ - 不要修改 hooks.json 内容,保持 `hooks/xxx.js` 路径格式不变
1157
1161
 
1158
1162
  完成后输出:
1159
1163
 
@@ -1245,7 +1249,7 @@ mkdir -p "$TARGET/.adspecs"
1245
1249
  | .adspecs/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | 插件配置、脚本、模板(extensions.yml、feature.json、templates/、scripts/) |
1246
1250
  | └ templates/ | 🔄 部分更新 / ⏭ 全部跳过 | .adspecs/ 跳过时,逐文件确认结果({N} 个替换,{M} 个保留) |
1247
1251
  | └ feature.json | 🔧 已补全 / ✅ 已完整 / ✅ 已创建 | 属性补全检查(已有属性保留,缺失属性补充) |
1248
- | docs/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | 11 个骨架目录,40 仅创建空目录 |
1252
+ | docs/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | 11 个骨架目录,40 仅创建空目录(含 frontend-standard/ + end-standard/) |
1249
1253
  | └ 40-project_conventions/ | 🔄 已更新 / ⏭ 已跳过 | docs/ 跳过时,40 子目录的更新决策 |
1250
1254
  | wiki/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | 基线文件目录 + README.md |
1251
1255
  | hooks/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | Hook 脚本(hooks.json + platform.js + 4 个事件脚本) |
@@ -1259,7 +1263,7 @@ mkdir -p "$TARGET/.adspecs"
1259
1263
  | .adspecs/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | 插件配置、脚本、模板(extensions.yml、feature.json、templates/、scripts/) |
1260
1264
  | └ templates/ | 🔄 部分更新 / ⏭ 全部跳过 | .adspecs/ 跳过时,逐文件确认结果({N} 个替换,{M} 个保留) |
1261
1265
  | └ feature.json | 🔧 已补全 / ✅ 已完整 / ✅ 已创建 | 属性补全检查(已有属性保留,缺失属性补充) |
1262
- | docs/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | 11 个骨架目录 + 40 从 references 复制 |
1266
+ | docs/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | 11 个骨架目录 + 40 从 references 复制前后端规范 |
1263
1267
  | └ 40-project_conventions/ | 🔄 已更新 / ⏭ 已跳过 | docs/ 跳过时,40 子目录的更新决策 |
1264
1268
  | wiki/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | 基线文件目录 + README.md |
1265
1269
  | front-demo/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | {技术栈名},{N} 个文件 |
@@ -1274,7 +1278,7 @@ mkdir -p "$TARGET/.adspecs"
1274
1278
  | .adspecs/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | 插件配置、脚本、模板(extensions.yml、feature.json、templates/、scripts/) |
1275
1279
  | └ templates/ | 🔄 部分更新 / ⏭ 全部跳过 | .adspecs/ 跳过时,逐文件确认结果({N} 个替换,{M} 个保留) |
1276
1280
  | └ feature.json | 🔧 已补全 / ✅ 已完整 / ✅ 已创建 | 属性补全检查(已有属性保留,缺失属性补充) |
1277
- | docs/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | 11 个骨架目录 + 40 从 references 复制 |
1281
+ | docs/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | 11 个骨架目录 + 40 从 references 复制前后端规范 |
1278
1282
  | └ 40-project_conventions/ | 🔄 已更新 / ⏭ 已跳过 | docs/ 跳过时,40 子目录的更新决策 |
1279
1283
  | wiki/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | 基线文件目录 + README.md |
1280
1284
  | web-ui/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | {N} 个文件 |
@@ -1321,7 +1325,7 @@ mkdir -p "$TARGET/.adspecs"
1321
1325
  **经典模式:**
1322
1326
  {pwd}/{PROJECT_DIR}/(或直接 {pwd}/)
1323
1327
  ├── .adspecs/ (插件配置、脚本、模板 + project.json)
1324
- ├── docs/ (11 个子目录)
1328
+ ├── docs/ (11 个子目录 + 40-project_conventions/ 含前端规范 + Java 后端规范)
1325
1329
  ├── hooks/ (Hook 脚本:SessionStart/Stop/PostToolUse 等)
1326
1330
  ├── wiki/ (基线文件目录)
1327
1331
  └── front-demo/ ({技术栈名}前端演示项目)
@@ -1329,7 +1333,7 @@ mkdir -p "$TARGET/.adspecs"
1329
1333
  **完整模式:**
1330
1334
  {pwd}/{PROJECT_DIR}/(或直接 {pwd}/)
1331
1335
  ├── .adspecs/ (插件配置、脚本、模板 + project.json)
1332
- ├── docs/ (11 个子目录)
1336
+ ├── docs/ (11 个子目录 + 40-project_conventions/ 含前端规范 + Java 后端规范)
1333
1337
  ├── hooks/ (Hook 脚本:SessionStart/Stop/PostToolUse 等)
1334
1338
  ├── wiki/ (基线文件目录)
1335
1339
  ├── web-ui/ (Vue3 壳工程)
@@ -1420,7 +1424,7 @@ mkdir -p "$TARGET/.adspecs"
1420
1424
  - [ ] 已选择前端演示技术栈(经典/完整模式:Vue / Ant Design React;轻量模式固定 Ant Design React)
1421
1425
  - [ ] 已按模式检查目标路径下对应区域的存在情况
1422
1426
  - [ ] 对已存在的区域已通过 AskUserQuestion 获取用户选择(重新创建 / 跳过)
1423
- - [ ] docs/ 目录结构已创建/重建/跳过(按用户决策执行;简易模式下 40-project_conventions/ 仅创建空目录,经典/完整模式从 references 复制前端规范,轻量模式复制前后端规范)
1427
+ - [ ] docs/ 目录结构已创建/重建/跳过(按用户决策执行;简易模式下 40-project_conventions/ 仅创建空目录,经典/完整模式从 references 复制前后端规范(前端按技术栈 + ecp-end-standard),轻量模式复制 ant6-front-standard + python-end-standard)
1424
1428
  - [ ] 模式升级补充检查已完成(docs/ 跳过时,经典/完整/轻量模式自动检测并补充空的 40-project_conventions/)
1425
1429
  - [ ] 40-project_conventions/ 子目录更新检查已完成(docs/ 跳过且目录已包含文件时,已通过 AskUserQuestion 获取更新/跳过决策并按决策执行)
1426
1430
  - [ ] wiki/ 基线文件目录已创建/重建/跳过