@brms/ai-skills 0.1.0

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 (90) hide show
  1. package/README.md +256 -0
  2. package/bin/brms-skills.mjs +411 -0
  3. package/package.json +30 -0
  4. package/skills/brms-prototype-generator/SKILL.md +129 -0
  5. package/skills/brms-prototype-generator/agents/openai.yaml +7 -0
  6. package/skills/brms-prototype-generator/examples/few-shot-examples.md +577 -0
  7. package/skills/brms-prototype-generator/references/01-list-query.md +444 -0
  8. package/skills/brms-prototype-generator/references/02-form-entry.md +129 -0
  9. package/skills/brms-prototype-generator/references/03-detail-display.md +125 -0
  10. package/skills/brms-prototype-generator/references/04-composite-page-package.md +339 -0
  11. package/skills/brms-prototype-generator/references/05-dialog-patterns.md +113 -0
  12. package/skills/brms-prototype-generator/references/06-backend-request-patterns.md +118 -0
  13. package/skills/brms-prototype-generator/references/resource-index.md +46 -0
  14. package/skills/brms-prototype-generator/references/system-prompt.md +242 -0
  15. package/skills/brms-prototype-generator/scripts/analyze-doc.mjs +554 -0
  16. package/skills/brms-prototype-generator/scripts/check-project.mjs +228 -0
  17. package/skills/brms-prototype-generator/scripts/discover-targets.mjs +158 -0
  18. package/skills/brms-prototype-generator/scripts/install-codex.mjs +74 -0
  19. package/skills/brms-prototype-generator/scripts/plan-pages.mjs +390 -0
  20. package/skills/brms-prototype-generator/scripts/validate-generated.mjs +838 -0
  21. package/skills/brms-prototype-generator/templates/user-input-template.md +182 -0
  22. package/skills/brms-vxe-plus-developer/SKILL.md +105 -0
  23. package/skills/brms-vxe-plus-developer/agents/openai.yaml +7 -0
  24. package/skills/brms-vxe-plus-developer/references/prototype-to-real.md +54 -0
  25. package/skills/brms-vxe-plus-developer/references/real-base-development.md +110 -0
  26. package/skills/brms-vxe-plus-developer/references/resource-index.md +43 -0
  27. package/skills/brms-vxe-plus-developer/references/review-checklist.md +49 -0
  28. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/01-mental-model.md +150 -0
  29. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/02-vxe-plus-form.md +302 -0
  30. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/03-vxe-plus-table.md +253 -0
  31. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/04-example-map.md +488 -0
  32. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/05-request-and-eiinfo.md +170 -0
  33. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/90-anti-patterns.md +137 -0
  34. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/README.md +43 -0
  35. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/README.md +21 -0
  36. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/A1/P0/A1P01601.vue +483 -0
  37. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/A1/P1/A1P11011.vue +444 -0
  38. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/AB/BP/ABBP0201.vue +1648 -0
  39. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/AM/AF/component/AMAF0601/Bidding/formConfig.ts +228 -0
  40. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/AM/AF/component/AMAF0601/Record/columns.ts +110 -0
  41. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/BM/BR/BMBR01.vue +130 -0
  42. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/BM/BR/component/BMBR01/columns.ts +94 -0
  43. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/BM/BR/component/BMBR01/formConfig.ts +108 -0
  44. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Change/formConfig.ts +123 -0
  45. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Change/index.vue +103 -0
  46. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Clause/columns.ts +48 -0
  47. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Clause/index.vue +202 -0
  48. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Correcte/formConfig.ts +117 -0
  49. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Correcte/index.vue +103 -0
  50. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Explain/Pay/Payment/formConfig.ts +90 -0
  51. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Explain/Pay/Payment/index.vue +42 -0
  52. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Explain/Pay/columns.ts +376 -0
  53. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Explain/Pay/index.vue +619 -0
  54. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Explain/Settle/Domestic/formConfig.ts +73 -0
  55. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Explain/Settle/Domestic/index.vue +47 -0
  56. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Explain/Settle/Foreign/formConfig.ts +141 -0
  57. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Explain/Settle/Foreign/index.vue +42 -0
  58. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Explain/Settle/columns.ts +123 -0
  59. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Explain/Settle/index.vue +593 -0
  60. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Explain/index.vue +68 -0
  61. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Fee/columns.ts +150 -0
  62. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Fee/index.vue +235 -0
  63. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Files/columns.ts +63 -0
  64. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Files/index.vue +117 -0
  65. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Goods/columns.ts +327 -0
  66. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Goods/index.vue +790 -0
  67. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/Base/Approve/formConfig.ts +341 -0
  68. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/Base/Approve/index.vue +63 -0
  69. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/Base/Approve2/formConfig.ts +232 -0
  70. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/Base/Approve2/index.vue +27 -0
  71. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/Base/Diff/columns.ts +46 -0
  72. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/Base/Diff/index.vue +92 -0
  73. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/Base/formConfig.ts +979 -0
  74. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/Base/index.vue +62 -0
  75. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/Other/formConfig.ts +179 -0
  76. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/Other/index.vue +140 -0
  77. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/Sign/formConfig.ts +118 -0
  78. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/Sign/index.vue +44 -0
  79. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/index.vue +168 -0
  80. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Party/Major/formConfig.ts +257 -0
  81. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Party/Major/index.vue +47 -0
  82. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Party/columns.ts +256 -0
  83. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Party/index.vue +738 -0
  84. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Price/formConfig.ts +174 -0
  85. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Price/index.vue +51 -0
  86. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Top/index.vue +924 -0
  87. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/SM/SW/SMSW0101.vue +567 -0
  88. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/demo/index.vue +448 -0
  89. package/skills/brms-vxe-plus-developer/scripts/check-project.mjs +259 -0
  90. package/skills/brms-vxe-plus-developer/scripts/check-vxe-plus-page.mjs +137 -0
@@ -0,0 +1,339 @@
1
+ # 组合页面包模式
2
+
3
+ 当产品输入不是单个页面,而是一组业务功能清单、字段清单和页面间导航关系时,使用组合页面包模式。
4
+
5
+ ## Compact planning first
6
+
7
+ 4 个及以上完整页面必须先运行 `scripts/plan-pages.mjs`,再生成 Vue 文件。使用脚本输出的 page packets 作为总控和子智能体的工作契约。
8
+
9
+ ```bash
10
+ node .claude/skills/brms-prototype-generator/scripts/plan-pages.mjs <entry-md> --repo-root . --target-project <project/name> --page-prefix <PAGE_PREFIX> --format both
11
+ ```
12
+
13
+ `<PAGE_PREFIX>` 必须是页面编码前缀,不是模块目录前缀。前缀至少 4 位,例如 `DMDA` 会生成 `DMDA01`、`DMDA02`;禁止用 `KQ` 这类 2 位前缀生成 `KQ01`。
14
+
15
+ 不要让每个页面生成任务都重新携带完整产品文档和全部 reference。每个页面任务只需要:全局计划摘要、自己的 page packet、`references/resource-index.md` 指定的必要规则、已创建的共享数据契约、以及该页面的校验命令。
16
+
17
+ ## 适用场景
18
+
19
+ - 文档中包含多个一级编号功能模块,如“1. 区域公司结构管理”“2. 矿权项目维护”
20
+ - 文档末尾包含“页面间导航关系”或明显的跨页面跳转
21
+ - 多个页面共享同一批业务维度、字典或 mock 数据
22
+ - 页面包中有明确 serviceName/methodName 的页面需要真实接口原型,其他页面仍保持 mock
23
+ - 一个功能既可以独立进入,也可以从其他页面带参数进入
24
+
25
+ ## 生成目标
26
+
27
+ 组合页面包不是生成一个超大 Vue 文件,而是生成一组可独立访问、可互相跳转的页面:
28
+
29
+ ```text
30
+ <target-project>/src/views/<MODULE>/<SUBMODULE>/
31
+ ├── <CODE01>.vue # 页面 1:区域公司结构管理
32
+ ├── <CODE02>.vue # 页面 2:矿权项目维护
33
+ ├── <CODE03>.vue # 页面 3:矿权信息维护
34
+ └── components/ # 仅当多个页面确实复用时才创建
35
+ ```
36
+
37
+ 每个页面仍然遵循单页面模式:
38
+
39
+ - 管理维护页:参考 `01-list-query.md`
40
+ - 新增/编辑弹窗:优先内嵌在当前维护页中,不单独注册菜单
41
+ - 详情/只读页:参考 `03-detail-display.md`
42
+ - 附件、任务、通知等功能:如果文档中给了独立入口,则生成独立页面;如果只是某页面的行操作,则生成弹窗或抽屉
43
+
44
+ ## 组合页布局规则
45
+
46
+ - 主从页不要把多个表格硬塞进一个纵向结果卡片;区域公司/公司这类页面使用左右布局。
47
+ - 左右布局推荐:
48
+
49
+ ```vue
50
+ <div class="flex h-full gap-4">
51
+ <BxRoundedContainer class="w-1/3 flex flex-col">
52
+ <BxContainer class="flex-initial" title="区域公司列表" />
53
+ <VxePlusTable class="flex-1" />
54
+ </BxRoundedContainer>
55
+
56
+ <BxRoundedContainer class="flex-1 flex flex-col">
57
+ <BxContainer class="flex-initial" title="下属公司" />
58
+ <VxePlusTable class="flex-1" />
59
+ </BxRoundedContainer>
60
+ </div>
61
+ ```
62
+
63
+ - `BxContainer` 是标题栏,必须使用 `flex-initial`,不要让标题栏挤压下方表格。
64
+ - 结果/列表标题不要使用 `custom-btn-auto`;查询按钮只属于查询区。
65
+ - 不生成操作列和复选框列;复选框使用 `VxePlusTable :show-checkbox="true"`,行操作使用工具栏、业务字段点击或行点击。
66
+ - 普通列使用 `useTable().createColumns([...], { width: undefined })` 自动撑开。
67
+
68
+ ## 拆分规则
69
+
70
+ 1. 每个一级编号功能默认拆成一个菜单页面。
71
+ 2. “新增/编辑弹窗”“上传弹窗”“附件列表弹窗”默认作为页面内部弹窗,不创建单独路由。
72
+ 3. “综合查询”“任务管理”“合规报告计划”等有独立入口的功能创建独立路由。
73
+ 4. 附录里的导航关系必须转化为按钮、链接或带 query 的路由跳转。
74
+ 5. 多页面共享的枚举、mock 数据和工具函数,放在同目录 `components/` 或 `data.ts` 中;只有两个以上 mock 页面复用时才抽取。`data.ts` 里导出的 mock 数组/对象必须在声明前写 `// @brms-mock-data <source-or-page>: <purpose>`,方便真实接口接入后清理。
75
+ 6. 接口是逐页、逐方法 opt-in:有明确 serviceName/methodName 的页面读 `06-backend-request-patterns.md` 并生成真实请求;没有明确接口的页面继续 mock。
76
+
77
+ ## 菜单结构优先级
78
+
79
+ 如果产品文档末尾存在“页面间导航关系”“导航关系”或类似文本树,必须先分析这棵树,再规划页面和菜单。
80
+
81
+ - 导航树是菜单层级和跨页面入口的主要依据,优先级高于章节顺序。
82
+ - 树节点能匹配生成页面时,注册为可访问菜单项。
83
+ - 树节点只是分组名称且有子节点时,注册为父菜单或分组节点。
84
+ - 树中的父子关系必须转化为真实交互:按钮、业务字段点击、卡片入口、tab 切换或 `router.push`。
85
+ - 不要把有层级的导航树简单拍平成同级菜单,除非用户明确确认。
86
+
87
+ 生成规划时先输出:
88
+
89
+ 1. 解析出的导航/菜单树。
90
+ 2. 树节点到页面编码、文件路径和菜单标题的映射。
91
+ 3. 每条跨页面边对应的 UI 入口和 `query` 参数。
92
+ 4. 无法匹配到页面的树节点及处理方式。
93
+
94
+ ## 按钮和功能完整性
95
+
96
+ 所有文档中的功能、按钮、操作和跳转都必须有可见入口和可执行处理函数。
97
+
98
+ - 新增、编辑、保存、删除、上传、下载、状态切换、提醒开关、生成任务等功能不能只画按钮。
99
+ - 每个按钮必须能打开弹窗/抽屉、修改本地 mock 数据、筛选表格、重置表单、切换状态、选择 mock 文件或执行页面跳转。
100
+ - 后台相关按钮使用 TODO toast,但仍然要在本地完成可见反馈,让原型可点击。
101
+ - 跨页面按钮必须使用 `router.push({ path: '/web/<MODULE>/<SUBMODULE>/<CODE>', query: {...} })`。
102
+ - 目标页必须读取 `route.query`,作为默认筛选条件或预填上下文。
103
+ - 每生成一个页面后,对照功能表逐项检查:没有 handler 的按钮视为未完成。
104
+
105
+ ## 生成方式选择
106
+
107
+ 拆分页面清单后,先输出识别出的完整页面数量,再让用户在三种方式中选择。不要在用户选择前直接写多页面代码。
108
+
109
+ | 生成方式 | 适用场景 | 执行规则 |
110
+ | ----------------------------------------------- | ----------------------------------------------- | --------------------------------------------------------------------------------------- |
111
+ | `single-agent-package` 整包一次性生成 | 1-3 个完整页面,页面关系简单 | 一个 agent 按全局规划生成全部页面、共享数据和菜单。速度最快,但页面多时更容易遗漏规则。 |
112
+ | `coordinator-sequential` 总控逐页顺序生成 | 4 个以上页面,或当前环境不支持子智能体 | 当前 agent 每次只生成一个页面,生成后立即做局部规则检查,最后统一生成共享数据和菜单。 |
113
+ | `coordinator-subagents` 总控 + 子智能体逐页生成 | 4 个以上页面,且当前环境支持子智能体/并行 agent | 总控负责规划、共享数据契约、菜单和最终验证;每个子智能体只负责一个页面文件。 |
114
+
115
+ 默认建议:
116
+
117
+ - 完整页面数 `<= 3`:推荐 `single-agent-package`。
118
+ - 完整页面数 `>= 4`:优先推荐 `coordinator-subagents`。
119
+ - 如果当前工具环境没有子智能体能力:推荐 `coordinator-sequential`。
120
+
121
+ ### 子智能体任务边界
122
+
123
+ 使用 `coordinator-subagents` 时,总控先产出全局页面包规划和共享数据契约,再给每个子智能体一个页面任务包。任务包至少包含:
124
+
125
+ - 页面编码、标题、路径、页面类型。
126
+ - 需要使用的字段、mock 数据名称、枚举名称;如有明确接口,列出 serviceName、methodName 和是否使用 serviceConfig。mock 数据名称旁必须说明对应的 `@brms-mock-data` 标记文本。
127
+ - 页面入口、跳转 query 契约和需要读取的 `route.query`。
128
+ - 必须遵守的布局/表格规则。
129
+ - 禁止修改的文件清单。
130
+
131
+ 子智能体只能编辑自己分配的 `<target-project>/src/views/<MODULE>/<SUBMODULE>/<CODE>.vue`。子智能体不能编辑路由配置、共享 `data.ts`、`localMenu.ts`、其他页面或文档。总控在所有页面完成后统一创建共享文件;只有目标项目存在 `src/routers/config/index.ts` 时才创建新的菜单配置文件,否则输出权限中心配置交接信息。
132
+
133
+ ## 页面编码规则
134
+
135
+ 如果产品文档没有给页面编码,需要先为页面包分配同一模块/子模块前缀,再按功能顺序编号:
136
+
137
+ - 页面编码必须是 6 位及以上大写字母数字,例如 `DMDA01`、`MNRG01`。
138
+ - 页面编码前 2 位是模块目录,后 2 位是子模块目录;`DMDA01` 对应 `src/views/DM/DA/DMDA01.vue`。
139
+ - 不允许只使用 2 位模块前缀编号,例如 `KQ01`。如果只知道模块是 `KQ`,必须先询问或从产品文档/菜单树推导子模块前缀,再生成页面。
140
+ - 页面文件名、Vue route `name`、动态路由 `path` 的页面编码必须一致。
141
+
142
+ ```text
143
+ MNRG01 区域公司结构管理
144
+ MNRG02 矿权项目维护
145
+ MNRG03 矿权信息维护
146
+ MNRG04 矿权信息综合查询
147
+ MNRG05 项目资料上传
148
+ MNRG06 矿权任务管理
149
+ MNRG07 任务到期提醒
150
+ MNRG08 合规报告计划
151
+ ```
152
+
153
+ 编码前 2 位决定模块目录,中 2 位决定子模块目录,例如:
154
+
155
+ ```text
156
+ <target-project>/src/views/MN/RG/MNRG01.vue
157
+ <target-project>/src/views/MN/RG/MNRG02.vue
158
+ ```
159
+
160
+ 如果用户指定编码前缀,必须使用用户指定前缀,但仍必须满足 4 位及以上前缀规则。例如用户指定 `DMDA` 时,页面必须命名为 `DMDA01`、`DMDA02`,不能退化成 `DM01` 或 `KQ01`。
161
+
162
+ ## 菜单注册
163
+
164
+ 组合页面包通常需要在同一个父菜单下注册多个子菜单。只有目标项目存在静态路由配置时才新建独立菜单文件,不要修改 `localMenu.ts`。
165
+
166
+ - 目录:`<target-project>/src/routers/config/`
167
+ - 文件名:`<小写页面包前缀>-<yyyymmddhhmmss>.ts`,例如 `mnrg-20260530143000.ts`
168
+ - 自动加载:`config/index.ts` 已经自动引入同目录 `.ts` 文件,无需手动 import
169
+ - 重复生成:旧的同前缀菜单文件仍会被加载;如出现重复菜单,提示用户删除或归档旧生成文件
170
+ - 如果 `<target-project>/src/routers/config/index.ts` 不存在,跳过菜单文件生成,不创建路由目录,并输出权限中心配置交接清单。
171
+ - 动态菜单 `path` 只写页面编码:`/MNRG01`。运行时 `auth.ts` 会自动拼成 `/web/MNRG01`。
172
+ - 不要把物理目录写进动态菜单 `path`,例如禁止 `/MN/RG/MNRG01`、`/KQ/02/KQ02`。物理目录只属于 `component`。
173
+ - 页面内跳转也必须使用运行时路径 `/web/<PAGE_CODE>`,例如 `router.push({ path: '/web/MNRG03' })`;不要写 `/web/MN/RG/MNRG03`。
174
+ - `name` 必须等于页面编码,例如 `DMDA01`。
175
+ - `component` 使用物理路径,例如 `'/DM/DA/DMDA01'`。
176
+ - 详情页、跳转页、仅从其他页面进入的页面也必须放在同一个父菜单的 `children` 中,只是设置 `meta.isHide: true`;不要把它们作为 `export default` 数组里的第二个顶层 route。
177
+ - 一个页面包通常只导出一个父菜单对象;除非产品文档明确要求多个并列父菜单,否则不要在顶层数组中混放父菜单和同前缀页面。
178
+
179
+ `component` 推荐填写相对 `src/views` 的文件路径,不含 `.vue`:
180
+
181
+ ```typescript
182
+ export default [
183
+ {
184
+ path: '/MNMenu',
185
+ name: 'MNMenu',
186
+ meta: {
187
+ icon: 'Folder',
188
+ title: '矿权管理',
189
+ isLink: '',
190
+ isHide: false,
191
+ isFull: false,
192
+ isAffix: false,
193
+ isKeepAlive: true,
194
+ },
195
+ children: [
196
+ {
197
+ path: '/MNRG01',
198
+ name: 'MNRG01',
199
+ component: '/MN/RG/MNRG01',
200
+ meta: {
201
+ icon: 'Menu',
202
+ title: '区域公司结构管理',
203
+ isLink: '',
204
+ isHide: false,
205
+ isFull: false,
206
+ isAffix: false,
207
+ isKeepAlive: true,
208
+ },
209
+ },
210
+ {
211
+ path: '/MNRG02',
212
+ name: 'MNRG02',
213
+ component: '/MN/RG/MNRG02',
214
+ meta: {
215
+ icon: 'Menu',
216
+ title: '矿权项目维护',
217
+ isLink: '',
218
+ isHide: false,
219
+ isFull: false,
220
+ isAffix: false,
221
+ isKeepAlive: true,
222
+ },
223
+ },
224
+ {
225
+ path: '/MNRG04',
226
+ name: 'MNRG04',
227
+ component: '/MN/RG/MNRG04',
228
+ meta: {
229
+ icon: 'Menu',
230
+ title: '矿权详情',
231
+ isLink: '',
232
+ isHide: true,
233
+ isFull: false,
234
+ isAffix: false,
235
+ isKeepAlive: true,
236
+ },
237
+ },
238
+ ],
239
+ },
240
+ ];
241
+ ```
242
+
243
+ ## 跨页面跳转规则
244
+
245
+ 使用 `router.push` 跳转,并通过 query 传递筛选条件或上下文:
246
+
247
+ ```typescript
248
+ router.push({
249
+ path: '/web/MNRG03',
250
+ query: {
251
+ projectCode: row.projectCode,
252
+ projectName: row.projectName,
253
+ },
254
+ });
255
+ ```
256
+
257
+ 目标页面在初始化时读取 query,作为默认筛选条件:
258
+
259
+ ```typescript
260
+ const route = useRoute();
261
+
262
+ onMounted(() => {
263
+ if (route.query.projectCode) formData.projectCode = String(route.query.projectCode);
264
+ });
265
+ ```
266
+
267
+ 跨页面跳转是完整性规则,不是装饰规则:
268
+
269
+ - 每条产品文档里的跳转关系,都必须在源页面有可见入口,例如按钮、业务字段点击、卡片入口或 tab。
270
+ - 源页面入口必须调用 `router.push({ path: '/web/<PAGE_CODE>', query: {...} })`。
271
+ - 目标页面必须读取 `route.query`,并将 query 用作默认筛选、预填上下文或高亮当前记录。
272
+ - 生成计划的 page packet 必须列出该页面的 inbound/outbound navigation contract;逐页生成时不得丢弃这些跳转。
273
+
274
+ ## 针对 function.md 的映射示例
275
+
276
+ `project/prototype/doc/function.md` 应拆成 8 个页面:
277
+
278
+ | 页面 | 页面类型 | 建议实现 |
279
+ | ---------------- | -------------- | ---------------------------------------------------- |
280
+ | 区域公司结构管理 | 主从维护页 | 左侧区域公司列表 + 右侧公司列表,新增/编辑公司用弹窗 |
281
+ | 矿权项目维护 | 列表维护页 | 项目列表 + 新增/编辑弹窗 + “查看矿权”跳转 |
282
+ | 矿权信息维护 | 列表维护页 | 筛选区 + 矿权列表 + 合计行 + 附件/任务操作 |
283
+ | 矿权信息综合查询 | 查询汇总页 | 筛选区 + 结果列表 + 汇总维度切换 |
284
+ | 项目资料上传 | 附件管理页 | 附件列表 + 上传弹窗 |
285
+ | 矿权任务管理 | 任务维护页 | 任务筛选 + 状态流转按钮 + 新增/编辑弹窗 |
286
+ | 任务到期提醒 | 通知设置页 | 提醒设置 + 通知列表 |
287
+ | 合规报告计划 | 报告计划维护页 | 报告类型列表 + 新增报告任务跳转 |
288
+
289
+ ## 输出顺序
290
+
291
+ 1. 先输出解析出的导航/菜单树;如果没有树,再按章节顺序规划。
292
+ 2. 输出页面包规划:页面编码、标题、类型、路径、菜单层级、跳转关系、按钮/功能清单。
293
+ 3. 输出完整页面数量、三种生成方式和推荐方式,等待用户选择。
294
+ 4. 根据用户选择执行整包生成、总控逐页生成或总控 + 子智能体逐页生成。
295
+ 5. 创建共享 mock 数据或工具文件;明确接口页不要为了表格数据额外创建无用 mock rows。共享 `data.ts` 的每个 mock export 都必须有 `@brms-mock-data`。
296
+ 6. 逐个生成页面文件,并逐页检查按钮 handler 和跳转 handler。
297
+ 7. 如果目标项目支持静态路由,最后新建独立菜单配置文件,不修改 `localMenu.ts`;否则输出权限中心菜单配置交接信息。
298
+ 8. 只在全部文件生成后做一次 `vue-tsc` 或 dev 启动验证。
299
+
300
+ ## Multi-Page Second-Pass Validation
301
+
302
+ At the end of a composite page package generation, run a second validation pass before reporting completion.
303
+
304
+ Required checks:
305
+
306
+ 1. Compare generated page count and route config against the analyzer report.
307
+ 2. If `menuStructureDetected` was true, compare route/menu hierarchy against the parsed navigation tree. Do not flatten the tree unless the user explicitly approved it.
308
+ 3. Check hidden detail/jump-only pages are inside the same parent menu `children` with `isHide: true`, not outside the parent as top-level route siblings.
309
+ 4. Check every generated `.vue` template has exactly one top-level root, and every dialog/modal is inside that root.
310
+ 5. Check every mock-backed generated `VxePlusTable` with `:columns` also has mock-backed `:data` and searchable `@brms-mock-data` / `@brms-mock-handler` markers; check every interface-backed table has a marker and documented `serviceConfig`.
311
+ 6. Check that no page has operation/action columns or checkbox columns in `createColumns`.
312
+ 7. Check every documented function, button, operation, and navigation edge has a visible UI entry and a wired handler.
313
+ 8. Check generated action buttons are not placed in `BxContainer` slots (`#left`, `#right`, `#default`, `#custom-btn`) unless the product document explicitly requested header-slot buttons.
314
+ 9. Check cross-page navigation uses `router.push({ path: '/web/<PAGE_CODE>' , query: {...} })`, and target pages read `route.query`.
315
+ 10. Check generated pages do not use `serviceConfig`, `EiCommunicator`, `EiInfo`, `http`, or real backend services unless the product document explicitly names the service and methods; explicit-interface files must include `// @brms-explicit-interface ...`.
316
+ 11. If static route config exists, check route config is a new file and `localMenu.ts` was not edited. If it does not exist, check no route directory/file was created and the permission-center handoff is present.
317
+ 12. Check generated `.vue` files do not use JSX/TSX; custom table cells must use template slots.
318
+ 13. Check dialogs follow `references/05-dialog-patterns.md`; reject unknown components such as `VxePlusDialog`.
319
+ 14. Check every dialog `VxePlusForm` uses `:form-options`, not `:form-config`.
320
+ 15. Check simple one-section dialogs do not contain `BxContainer`/`bx-container`; only multi-section dialogs may add section containers.
321
+ 16. Check attachment upload/view flows do not create custom modals. They must call `useFileUpload().openFileBFSS0001` with demo parameters and TODO markers when real parameters are unavailable.
322
+
323
+ Run:
324
+
325
+ ```bash
326
+ node .claude/skills/brms-prototype-generator/scripts/validate-generated.mjs <generated-vue-or-route-files> --repo-root .
327
+ ```
328
+
329
+ Then run `vue-tsc` when the correct Node/pnpm environment and installed dependencies are available. Fix failures and repeat this second pass.
330
+
331
+ After validation, write a compact handoff summary for follow-up turns:
332
+
333
+ ```text
334
+ <target-project>/.generation-summaries/<lowercase-page-prefix>-<yyyymmddhhmmss>.md
335
+ ```
336
+
337
+ Include generated files, menu tree, query contracts, per-page functions, validation output, remaining issues, and constraints. Read this summary first in later repair turns to avoid losing direction when chat context gets long.
338
+
339
+ For Claude Code, a skill cannot execute `/compact` automatically. After the summary is written, tell the user they may run `/compact` manually. Do not imply that compaction has already happened.
@@ -0,0 +1,113 @@
1
+ # Dialog Patterns
2
+
3
+ Use only dialog patterns that already exist in the confirmed target project or in the bundled references. Do not invent components such as `VxePlusDialog`, `FileUploadDialog`, `UploadDialog`, `BxUploadDialog`, `AttachmentDialog`, or other unverified dialog/upload wrappers.
4
+
5
+ ## Pattern A: Normal Form Or Detail Modal
6
+
7
+ Use this for add, edit, detail, change, confirmation-detail, and other page-local dialogs.
8
+
9
+ Reference behavior: `vxe-modal` provides the dialog title. Do not add another `BxContainer` title for a simple one-section form.
10
+
11
+ Rules:
12
+
13
+ - Use `<vxe-modal v-model="modal" title="..." width="..." show-footer show-cancel-button show-confirm-button cancel-button-text="取消" confirm-button-text="确定" @confirm="handleSave">`.
14
+ - Put `VxePlusForm` directly inside the modal for a simple one-section form.
15
+ - Use `VxePlusForm :form-options="formOption"` inside dialogs.
16
+ - Do not use `VxePlusForm :form-config` inside dialogs; that prop is for table query binding patterns and will render an empty dialog form.
17
+ - Do not wrap the form with `<bx-container>` or `<BxContainer>` unless the dialog has multiple sections that genuinely need section titles.
18
+ - Do not rely on `show-footer` alone. `vxe-modal` defaults `show-cancel-button` and `show-confirm-button` to `false` for normal modals, so generated add/edit/detail modals must explicitly set both button visibility props and button text props.
19
+ - Prefer the built-in modal footer buttons over a custom `<template #footer>` for generated form dialogs. Bind the save logic through `@confirm`; the cancel button should close the modal through the built-in behavior.
20
+ - Keep modal visibility as `const modal = ref(false)`.
21
+ - Open the modal from a real handler, such as `handleAdd`, `handleEdit`, or `handleView`.
22
+ - For table edit dialogs, open the modal from `toolbarButtonClick`, an explicit selected-row handler, or a business-field `tableLink`; do not use `cell-click` / `handleCellClick` as the edit opener.
23
+ - A table using this dialog edit pattern must not also set `VxePlusTable :is-edit="true"` or column `editRender`; those belong to the row edit pattern in `references/01-list-query.md`.
24
+ - The save/confirm handler must mutate local mock data and show a TODO backend toast when the action represents a backend operation.
25
+ - If the save/confirm handler only mutates local mock data, put `// @brms-mock-handler <source-or-page>: dialog save, replace with ServiceName.save` immediately before the handler.
26
+
27
+ Example:
28
+
29
+ ```vue
30
+ <vxe-modal
31
+ v-model="modal"
32
+ title="变更"
33
+ width="500px"
34
+ show-footer
35
+ show-cancel-button
36
+ show-confirm-button
37
+ cancel-button-text="取消"
38
+ confirm-button-text="确定"
39
+ @confirm="handleSave"
40
+ >
41
+ <VxePlusForm ref="formRef" :form-options="formOption" />
42
+ </vxe-modal>
43
+ ```
44
+
45
+ ```ts
46
+ const modal = ref(false);
47
+ const formData = reactive({
48
+ type: '',
49
+ name: '',
50
+ });
51
+
52
+ const formOption = reactive({
53
+ id: 'change_form',
54
+ data: formData,
55
+ items: [
56
+ { field: 'type', title: '类型', itemRender: { name: 'formSelect', props: { options: [] } } },
57
+ { field: 'name', title: '名称', itemRender: { name: 'vxe-input' } },
58
+ ],
59
+ });
60
+
61
+ function handleEdit(row: any) {
62
+ Object.assign(formData, row);
63
+ modal.value = true;
64
+ }
65
+
66
+ // @brms-mock-handler product-doc: dialog save, replace with ServiceName.save
67
+ function handleSave() {
68
+ // TODO: 接入后台保存接口
69
+ ElMessage.info('TODO: 接入后台接口');
70
+ upsertLocalRow(rows.value, formData);
71
+ modal.value = false;
72
+ }
73
+ ```
74
+
75
+ ## Pattern B: Existing File Upload Dialog
76
+
77
+ Use this for attachment upload and attachment view flows when the prototype should use the project's real file dialog shell.
78
+
79
+ Reference implementation: `<target-project>/src/hooks/useFileUpload.ts` when it exists; `project/prototype/src/hooks/useFileUpload.ts` can be used only as a fallback reference.
80
+
81
+ Rules:
82
+
83
+ - Import `useFileUpload` from `@/hooks/useFileUpload`.
84
+ - Always use `openFileBFSS0001` for generated attachment upload/view actions.
85
+ - Do not create a new upload/view modal with `vxe-modal`, `el-dialog`, `el-upload`, or a custom component.
86
+ - Do not create new upload dialog component names.
87
+ - Pass business identifiers from the selected mock row when available.
88
+ - If the product document does not provide ids or codes, demo-construct the parameters and add `TODO: confirm attachment parameters for openFileBFSS0001`.
89
+ - Show a TODO toast before opening or simulating the upload action so the backend boundary remains visible.
90
+
91
+ Example:
92
+
93
+ ```ts
94
+ import { useFileUpload } from '@/hooks/useFileUpload';
95
+
96
+ const { openFileBFSS0001 } = useFileUpload();
97
+
98
+ function handleUpload(row: any) {
99
+ // TODO: confirm attachment parameters for openFileBFSS0001.
100
+ ElMessage.info('TODO: 接入附件上传接口');
101
+ openFileBFSS0001({
102
+ bizTypeCode: 'MNRG_ATTACHMENT',
103
+ fileTypeCode: 'MNRG_ATTACHMENT',
104
+ bizBillId: row.id || row.attachmentId || 'DEMO_BILL_ID',
105
+ bizBillCode: row.code || row.mineralRightCode || row.projectCode || 'DEMO_BILL_CODE',
106
+ bizBillVersion: '1.00',
107
+ flag: 'operate',
108
+ cb: () => {
109
+ ElMessage.success('附件操作完成');
110
+ },
111
+ });
112
+ }
113
+ ```
@@ -0,0 +1,118 @@
1
+ # Backend Request Patterns
2
+
3
+ Use this reference only when the product document explicitly provides backend service and method names. Otherwise generate mock-backed pages.
4
+
5
+ ## Interface Gate
6
+
7
+ Treat an interface as explicit only when the document names at least:
8
+
9
+ - `serviceName`, such as `BMBF56`;
10
+ - one concrete method name, such as `query`, `insert`, `save`, `delete`, or `queryExport`.
11
+
12
+ Do not infer method names from common CRUD words, page codes, menu names, or examples from other pages. If the interface is unclear, keep local mock data and TODO backend toasts.
13
+
14
+ Every generated file that uses real interface wiring must include a marker comment near the request config/imports:
15
+
16
+ ```ts
17
+ // @brms-explicit-interface product-doc: BMBF56.query/BMBF56.delete
18
+ ```
19
+
20
+ ## Standard List CRUD Pattern
21
+
22
+ Follow the style of the standard sample `project/prototype/src/views/DM/DA/DMDA02.vue` for documented list CRUD interfaces, but add the explicit-interface marker required by this skill.
23
+
24
+ ```vue
25
+ <VxePlusTable
26
+ ref="xGrid"
27
+ :columns="columns"
28
+ :service-config="serviceConfig"
29
+ :show-checkbox="true"
30
+ :is-edit="true"
31
+ :form-config="formConfig"
32
+ v-on="gridEvents"
33
+ />
34
+ ```
35
+
36
+ ```ts
37
+ import { EiCommunicator, EiInfo } from '@eplat/ei';
38
+
39
+ // @brms-explicit-interface product-doc: BMBF56.query/BMBF56.insert/BMBF56.save/BMBF56.delete
40
+ const formConfig = reactive({
41
+ id: 'inqu_status',
42
+ data: formData,
43
+ });
44
+
45
+ const serviceConfig = reactive({
46
+ serviceName: 'BMBF56',
47
+ queryMethod: 'query',
48
+ insertMethod: 'insert',
49
+ updateMethod: 'save',
50
+ deleteMethod: 'delete',
51
+ });
52
+ ```
53
+
54
+ Query and reset buttons should reload the grid:
55
+
56
+ ```ts
57
+ function btnClick({ code }: { code: string }) {
58
+ if (code === 'BTN_QUERY' || code === 'QUERY') {
59
+ xGrid.value?.reload();
60
+ } else if (code === 'BTN_RESET' || code === 'RESET') {
61
+ formRef.value?.reset?.();
62
+ xGrid.value?.reload();
63
+ }
64
+ }
65
+ ```
66
+
67
+ ## Custom EiInfo Actions
68
+
69
+ For documented actions that are not covered by `serviceConfig`, call `EiCommunicator.send(serviceName, methodName, ei)` directly.
70
+
71
+ ```ts
72
+ async function deleteSelectedRows($grid: any) {
73
+ const selectedRows = $grid.getCheckboxRecords();
74
+ if (!selectedRows.length) {
75
+ ElMessage.warning('请选择一行数据!');
76
+ return;
77
+ }
78
+
79
+ const ei = new EiInfo();
80
+ selectedRows.forEach((row: RowVO, index: number) => {
81
+ ei.set('result', index, 'id', row.id);
82
+ });
83
+
84
+ const res = await EiCommunicator.send('BMBF56', 'delete', ei);
85
+ if (res.status < 0) {
86
+ ElMessage.error(res.msg || '删除失败');
87
+ return;
88
+ }
89
+
90
+ ElMessage.success(res.msg || '删除成功');
91
+ $grid.commitProxy('query');
92
+ }
93
+ ```
94
+
95
+ For export/query actions, map non-empty query fields using the form block naming convention expected by the backend:
96
+
97
+ ```ts
98
+ async function exportRows() {
99
+ const ei = new EiInfo();
100
+ Object.keys(formData).forEach((key) => {
101
+ const value = formData[key as keyof typeof formData];
102
+ if (value) {
103
+ ei.set(`inqu_status-0-${key}`, value);
104
+ }
105
+ });
106
+
107
+ const res = await EiCommunicator.send('BMBF56', 'queryExport', ei);
108
+ if (res.status < 0) {
109
+ ElMessage.error(res.msg || '导出失败');
110
+ }
111
+ }
112
+ ```
113
+
114
+ ## Mixed Page Rule
115
+
116
+ A page may mix real documented interfaces and mock-only interactions. Use real requests only for the documented methods. Keep undocumented buttons clickable with local mock behavior and TODO toasts.
117
+
118
+ Do not create fake `serviceConfig` values, fake `EiCommunicator.send` methods, or empty request shells just because the page has a backend service section.
@@ -0,0 +1,46 @@
1
+ # Resource Index
2
+
3
+ Use this index after `analyze-doc.mjs` or `plan-pages.mjs`. Load only the files required by the current page packet.
4
+
5
+ ## Workflow Resources
6
+
7
+ - `04-composite-page-package.md`: read for 4+ page packages, page code naming, route/menu hierarchy, cross-page navigation contracts, coordinator/worker split, shared data contracts, and final handoff.
8
+ - `templates/user-input-template.md`: read only when helping the user prepare or improve the product Markdown.
9
+ - `system-prompt.md`: legacy full prompt for external/manual use. Do not load during normal skill execution unless the user explicitly asks for the old full prompt.
10
+
11
+ ## Page Pattern Resources
12
+
13
+ - `01-list-query.md`: list pages, query/result layouts, row-edit vs dialog-edit selection, table toolbar buttons, mock table data, and `VxePlusTable` usage.
14
+ - `02-form-entry.md`: standalone add/edit/create pages and form-heavy entry pages.
15
+ - `03-detail-display.md`: detail/read-only pages, approval-like detail layouts, and subtable display.
16
+
17
+ ## Rule Resources
18
+
19
+ - `05-dialog-patterns.md`: load only when the page packet mentions add/edit/detail/change dialogs, drawers, upload, attachment view, attachment delete, or any modal behavior.
20
+ - `06-backend-request-patterns.md`: load only when the product document explicitly names backend service and method names. If only page codes or generic CRUD words exist, stay mock-backed and do not load this file.
21
+
22
+ ## Example Resource
23
+
24
+ - `examples/few-shot-examples.md`: search by keyword and read the smallest relevant snippet. Useful search terms: `查询条件`, `结果集`, `vxe-modal`, `@brms-explicit-interface`, `toolbarButtonClick`, `附件`, `page package`.
25
+
26
+ ## Page Type To Resources
27
+
28
+ | Page packet type | Required resources | Conditional resources |
29
+ | ----------------------- | -------------------------------------------------- | --------------------------------------------------------- |
30
+ | `list-query` | `01-list-query.md` | `05-dialog-patterns.md`, `06-backend-request-patterns.md` |
31
+ | `list-maintenance` | `01-list-query.md` | `05-dialog-patterns.md`, `06-backend-request-patterns.md` |
32
+ | `master-detail` | `01-list-query.md`, `04-composite-page-package.md` | `05-dialog-patterns.md` |
33
+ | `form-entry` | `02-form-entry.md` | `06-backend-request-patterns.md` |
34
+ | `detail-display` | `03-detail-display.md` | `06-backend-request-patterns.md` |
35
+ | `attachment-management` | `01-list-query.md`, `05-dialog-patterns.md` | `06-backend-request-patterns.md` |
36
+ | `task-management` | `01-list-query.md` | `05-dialog-patterns.md`, `06-backend-request-patterns.md` |
37
+
38
+ ## Multi-Page Context Rule
39
+
40
+ For 4+ pages, do not keep the full product document in context for each page. Use `plan-pages.mjs` and give each generation worker only:
41
+
42
+ - the global plan summary;
43
+ - its own page packet;
44
+ - the required resources listed in that page packet;
45
+ - the shared data contract if already created;
46
+ - the validation command for its file.