@microi.net/cli 5.8.5 → 5.8.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 (211) hide show
  1. package/.codebuddy-plugin/marketplace.json +2 -2
  2. package/.codebuddy-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/.mcp.json +1 -1
  5. package/.workbuddy-plugin/marketplace.json +2 -2
  6. package/.workbuddy-plugin/plugin.json +1 -1
  7. package/LICENSE +21 -21
  8. package/README.md +71 -71
  9. package/assets/build-meta.json +6 -6
  10. package/assets/feature-matrix.json +138 -138
  11. package/assets/logo.svg +4 -4
  12. package/cordis.patch.yml +1 -1
  13. package/package.json +1 -1
  14. package/scripts/codex-marketplace.json +20 -20
  15. package/scripts/mcp-codex-stdio-adapter.js +189 -189
  16. package/scripts/mcp-trae-windows-launcher.cmd +21 -21
  17. package/scripts/microi-cli-mcp.js +7 -7
  18. package/scripts/microi-cli.js +66 -65
  19. package/scripts/microi-codex-broker.js +450 -450
  20. package/scripts/microi-codex-router.js +618 -618
  21. package/scripts/microi-skills.meta.json +384 -384
  22. package/skills/.microi-skills-version.json +2 -2
  23. package/skills/.progressive-disclosure-manifest.json +3566 -3566
  24. package/skills/README.md +287 -287
  25. package/skills/ai-engine/SKILL.md +269 -265
  26. package/skills/ai-engine/agents/openai.yaml +4 -4
  27. package/skills/ai-engine/references/ai-employees.md +48 -48
  28. package/skills/ai-engine/references/self-hosted-digital-human.md +59 -59
  29. package/skills/ai-platform-governance/SKILL.md +177 -177
  30. package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -190
  31. package/skills/app-store/SKILL.md +525 -525
  32. package/skills/app-store/agents/openai.yaml +4 -4
  33. package/skills/business-blueprint/SKILL.md +193 -193
  34. package/skills/datasource-engine/SKILL.md +93 -93
  35. package/skills/datasource-engine/agents/openai.yaml +4 -4
  36. package/skills/dos-orm/SKILL.md +97 -97
  37. package/skills/dos-orm/references/api-reference.md +229 -229
  38. package/skills/email-engine/SKILL.md +81 -81
  39. package/skills/email-engine/references/v8-email.md +34 -34
  40. package/skills/job-engine/SKILL.md +176 -176
  41. package/skills/job-engine/agents/openai.yaml +4 -4
  42. package/skills/message-notification/SKILL.md +156 -156
  43. package/skills/message-notification/agents/openai.yaml +5 -5
  44. package/skills/message-notification/references/contracts.md +102 -102
  45. package/skills/microi/SKILL.md +14 -14
  46. package/skills/microi-ai-app-auth.js +652 -652
  47. package/skills/microi-ai-application/SKILL.md +115 -115
  48. package/skills/microi-ai-application/agents/openai.yaml +4 -4
  49. package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
  50. package/skills/microi-client-frontend/SKILL.md +244 -244
  51. package/skills/microi-client-frontend/references/progressive-01-3-/345/212/250/346/200/201/346/214/211/351/222/256/347/263/273/347/273/237.md +144 -144
  52. package/skills/microi-client-frontend/references/progressive-02-8-/350/277/220/350/241/214/346/227/266/351/253/230/351/242/221/345/235/221/345/244/215/347/233/230.md +196 -196
  53. package/skills/microi-client-frontend/references/progressive-03-vue3-/345/211/215/347/253/257/345/276/256/346/234/215/345/212/241/345/256/277/344/270/273/350/247/204/345/210/231.md +167 -167
  54. package/skills/microi-codex/SKILL.md +102 -102
  55. package/skills/microi-codex-installer/SKILL.md +231 -231
  56. package/skills/microi-codex-installer/agents/openai.yaml +7 -7
  57. package/skills/microi-datasource-mapping/SKILL.md +122 -122
  58. package/skills/microi-db-schema/SKILL.md +175 -175
  59. package/skills/microi-db-schema/agents/openai.yaml +4 -4
  60. package/skills/microi-db-schema/references/core-tables.md +695 -695
  61. package/skills/microi-db-schema/references/form-component-options.md +256 -256
  62. package/skills/microi-db-schema/references/schema-overview.md +202 -202
  63. package/skills/microi-db-schema/references/schema.md +646 -646
  64. package/skills/microi-db-schema/references/table-catalog.md +1599 -1599
  65. package/skills/microi-deployment/SKILL.md +221 -221
  66. package/skills/microi-deployment/references/deployment-matrix.md +109 -109
  67. package/skills/microi-docs-coverage/SKILL.md +133 -133
  68. package/skills/microi-docs-coverage/references/capability-map.md +91 -91
  69. package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
  70. package/skills/microi-form-engine/SKILL.md +333 -333
  71. package/skills/microi-form-engine/references/component-catalog.md +218 -218
  72. package/skills/microi-form-engine/references/data-source-events.md +124 -124
  73. package/skills/microi-form-layout/SKILL.md +205 -205
  74. package/skills/microi-form-layout/references/progressive-01-3-/344/270/211/347/247/215/345/210/206/347/273/204/347/232/204/345/255/230/345/202/250/344/270/216/351/205/215/347/275/256.md +235 -235
  75. package/skills/microi-frontend-sdk/SKILL.md +194 -194
  76. package/skills/microi-frontend-sdk/references/progressive-01-token-/345/275/223/345/211/215/347/231/273/345/275/225/347/224/250/346/210/267/344/270/216/345/275/223/345/211/215/347/273/210/347/253/257/347/231/273/345/275/225/345/215/217/350/256/256.md +176 -176
  77. package/skills/microi-left-right-layout/SKILL.md +141 -141
  78. package/skills/microi-microservice/SKILL.md +326 -324
  79. package/skills/microi-microservice/references/runtime-delivery.md +278 -278
  80. package/skills/microi-mobile-app-quality/SKILL.md +185 -185
  81. package/skills/microi-mobile-app-quality/references/progressive-01-4-/351/207/215/350/246/201/346/214/211/351/222/256/345/277/205/351/241/273/345/270/246/345/233/276/346/240/207.md +213 -213
  82. package/skills/microi-mobile-app-quality/references/progressive-02-9-/344/270/273/351/242/230/345/210/207/346/215/242/345/277/205/351/241/273/347/234/237/345/256/236/344/270/224/345/205/250/345/261/200/347/224/237/346/225/210.md +128 -128
  83. package/skills/microi-solution-quotation/SKILL.md +78 -78
  84. package/skills/microi-solution-quotation/agents/openai.yaml +4 -4
  85. package/skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -296
  86. package/skills/microi-sso/SKILL.md +92 -92
  87. package/skills/microi-sso/references/acceptance.md +49 -49
  88. package/skills/microi-sso/references/configuration-and-security.md +53 -53
  89. package/skills/microi-sso/references/inbound.md +53 -53
  90. package/skills/microi-sso/references/outbound.md +39 -39
  91. package/skills/microi-system-delivery/SKILL.md +137 -137
  92. package/skills/microi-system-delivery/references/progressive-01-/346/240/207/345/207/206/345/267/245/344/275/234/346/265/201.md +193 -193
  93. package/skills/microi-system-delivery/references/progressive-02-/350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/345/277/205/351/241/273/350/246/206/347/233/226/347/232/204/345/235/221.md +217 -217
  94. package/skills/microi-ui/SKILL.md +192 -192
  95. package/skills/microi-ui/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/234/272/346/231/257/350/223/235/345/233/276.md +183 -183
  96. package/skills/microi-uniapp-frontend/SKILL.md +193 -193
  97. package/skills/microi-uniapp-frontend/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/210/206/347/261/273-/345/217/214/346/240/217/345/210/227/350/241/250/347/213/254/347/253/213/346/273/232/345/212/250.md +225 -225
  98. package/skills/microi-uniapp-frontend/references/progressive-02-/345/205/263/351/224/256/344/270/232/345/212/241/350/265/204/344/272/247/344/270/215/345/276/227/351/273/230/350/256/244/351/200/211/344/270/255.md +154 -154
  99. package/skills/microi.v8.js +1921 -1921
  100. package/skills/module-engine/SKILL.md +255 -255
  101. package/skills/module-engine/references/module-config.md +204 -204
  102. package/skills/ocr-engine/SKILL.md +113 -113
  103. package/skills/ocr-engine/agents/openai.yaml +4 -4
  104. package/skills/page-engine/SKILL.md +206 -206
  105. package/skills/page-engine/examples/compact-dashboard.json +1444 -1444
  106. package/skills/page-engine/references/progressive-01-/346/211/200/346/234/211/347/273/204/344/273/266/347/261/273/345/236/213.md +234 -234
  107. package/skills/page-engine/references/progressive-02-/347/211/210/346/234/254/345/216/206/345/217/262-/345/271/266/345/217/221/344/277/235/345/255/230/344/270/216/345/233/236/346/273/232.md +60 -60
  108. package/skills/performance-testing/SKILL.md +221 -221
  109. package/skills/playwright-e2e/SKILL.md +196 -196
  110. package/skills/playwright-e2e/references/progressive-01-/345/205/250/350/207/252/345/212/250/347/231/273/345/275/225-/345/205/215/351/252/214/350/257/201/347/240/201-/344/275/206/344/270/215/345/205/215/345/257/206/347/240/201-/345/277/205/350/257/273.md +173 -173
  111. package/skills/playwright-e2e/references/progressive-02-/346/226/207/345/255/227/345/257/271/346/257/224/345/272/246/344/270/216/345/217/257/350/257/273/346/200/247/350/207/252/345/212/250/345/214/226/346/243/200/346/237/245-/345/277/205/345/201/232.md +183 -183
  112. package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +221 -221
  113. package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +115 -115
  114. package/skills/print-engine/SKILL.md +259 -259
  115. package/skills/production-readonly-audit/SKILL.md +41 -41
  116. package/skills/report-engine/SKILL.md +71 -71
  117. package/skills/report-engine/agents/openai.yaml +4 -4
  118. package/skills/scripts/optimize-progressive-disclosure.mjs +204 -204
  119. package/skills/scripts/refresh-progressive-disclosure.mjs +64 -64
  120. package/skills/scripts/sync-embedded-skills.mjs +46 -46
  121. package/skills/scripts/validate-progressive-disclosure.mjs +57 -57
  122. package/skills/search-engine/SKILL.md +75 -75
  123. package/skills/search-engine/agents/openai.yaml +4 -4
  124. package/skills/spider-engine/SKILL.md +190 -190
  125. package/skills/system-observability/SKILL.md +248 -248
  126. package/skills/system-observability/references/memory-incident-triage.md +77 -77
  127. package/skills/translate-engine/SKILL.md +140 -140
  128. package/skills/translate-engine/agents/openai.yaml +4 -4
  129. package/skills/ui-design/SKILL.md +223 -223
  130. package/skills/ui-design/assets/pattern-showcase/app.js +54 -54
  131. package/skills/ui-design/assets/pattern-showcase/index.html +163 -163
  132. package/skills/ui-design/assets/pattern-showcase/styles.css +311 -311
  133. package/skills/ui-design/assets/templates/MCI-DESIGN.md +206 -206
  134. package/skills/ui-design/references/design-pattern-library.md +184 -184
  135. package/skills/ui-design/references/mci-design-contract.md +163 -163
  136. package/skills/ui-design/references/motion-and-media.md +78 -78
  137. package/skills/ui-design/references/product-flow-recipes.md +94 -94
  138. package/skills/ui-design/references/progressive-01-/351/242/234/350/211/262/344/275/223/347/263/273-css-variables-/346/224/257/346/214/201/344/270/273/351/242/230/345/210/207/346/215/242.md +218 -218
  139. package/skills/ui-design/references/progressive-02-/345/255/227/344/275/223.md +164 -164
  140. package/skills/ui-design/references/progressive-03-/345/212/250/346/225/210/350/247/204/350/214/203-/344/270/260/345/257/214/344/275/206/344/270/215/345/215/241.md +235 -235
  141. package/skills/ui-design/references/progressive-04-/347/273/204/344/273/266/351/243/216/346/240/274/351/200/237/346/237/245.md +152 -152
  142. package/skills/ui-design/references/progressive-05-/347/247/273/345/212/250/347/253/257/344/270/223/347/224/250/350/247/204/350/214/203.md +238 -238
  143. package/skills/ui-design/references/progressive-06-/344/270/273/351/242/230/345/210/207/346/215/242/345/256/236/347/216/260.md +194 -194
  144. package/skills/ui-design/references/progressive-07-/351/200/237/346/237/245-/344/273/216/345/244/264/346/220/255/345/273/272/344/270/200/344/270/252/347/247/273/345/212/250/347/253/257/351/241/265/351/235/242.md +207 -207
  145. package/skills/ui-design/references/progressive-08-/350/241/250/345/215/225/345/210/206/347/273/204/350/247/204/350/214/203-tabs-vs-collapsegroup-/345/274/272/345/210/266.md +142 -142
  146. package/skills/uniapp-mall-assets/SKILL.md +176 -176
  147. package/skills/unity-integration/SKILL.md +171 -171
  148. package/skills/unity-integration/agents/openai.yaml +4 -4
  149. package/skills/unity-integration/references/ai-app-delivery.md +119 -119
  150. package/skills/unity-integration/references/sdk-api.md +82 -82
  151. package/skills/unity-integration/references/toolbox-migration.md +66 -66
  152. package/skills/unity-integration/references/webgl-hosting.md +57 -57
  153. package/skills/v8-api-config/SKILL.md +388 -388
  154. package/skills/v8-cache-pattern/SKILL.md +312 -312
  155. package/skills/v8-crud-api/SKILL.md +178 -178
  156. package/skills/v8-crud-api/references/progressive-01-/346/237/245/350/257/242/345/210/227/350/241/250-/345/210/206/351/241/265.md +226 -226
  157. package/skills/v8-crud-api/references/progressive-02-where-/346/235/241/344/273/266/350/257/255/346/263/225/351/200/237/346/237/245.md +49 -49
  158. package/skills/v8-debugging/SKILL.md +284 -284
  159. package/skills/v8-explorer-tree/SKILL.md +228 -228
  160. package/skills/v8-export-import/SKILL.md +219 -219
  161. package/skills/v8-export-import/references/progressive-01-excellayout-/351/253/230/347/272/247/350/207/252/347/224/261/345/270/203/345/261/200.md +211 -211
  162. package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +202 -202
  163. package/skills/v8-export-import/references/progressive-03-/345/256/211/345/205/250-/346/200/247/350/203/275/346/263/250/346/204/217.md +42 -42
  164. package/skills/v8-file-upload/SKILL.md +284 -284
  165. package/skills/v8-file-upload/references/progressive-01-/345/205/254/346/234/211/346/241/266-vs-/347/247/201/346/234/211/346/241/266.md +263 -263
  166. package/skills/v8-file-upload/references/progressive-02-office-/346/226/207/344/273/266/345/234/250/347/272/277/347/274/226/350/276/221/347/211/210/346/234/254/345/217/267/350/247/204/345/210/231.md +161 -161
  167. package/skills/v8-formengine-http/SKILL.md +238 -238
  168. package/skills/v8-frontend-events/SKILL.md +180 -180
  169. package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
  170. package/skills/v8-frontend-events/references/bluetooth-print.md +258 -258
  171. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +219 -219
  172. package/skills/v8-http-integration/SKILL.md +182 -182
  173. package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +220 -220
  174. package/skills/v8-http-integration/references/progressive-02-/351/224/231/350/257/257/345/244/204/347/220/206/346/250/241/345/274/217.md +44 -44
  175. package/skills/v8-image-processing/SKILL.md +190 -190
  176. package/skills/v8-image-processing/agents/openai.yaml +4 -4
  177. package/skills/v8-image-processing/references/api-reference.md +623 -623
  178. package/skills/v8-menu-buttons/SKILL.md +186 -186
  179. package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +222 -222
  180. package/skills/v8-menu-buttons/references/progressive-02-8-/346/250/241/345/274/217-f-/345/220/216/345/217/260/344/273/273/345/212/241/346/214/211/351/222/256-/351/225/277/344/273/273/345/212/241.md +228 -228
  181. package/skills/v8-menu-buttons/references/progressive-03-10-/345/217/215/346/250/241/345/274/217-/351/201/277/345/205/215.md +104 -104
  182. package/skills/v8-mongodb/SKILL.md +200 -200
  183. package/skills/v8-mq-mqtt/SKILL.md +176 -176
  184. package/skills/v8-mq-mqtt/references/mqtt-production.md +342 -342
  185. package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +181 -181
  186. package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +203 -203
  187. package/skills/v8-saas-multi-tenant/SKILL.md +305 -305
  188. package/skills/v8-security/SKILL.md +210 -210
  189. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +200 -200
  190. package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +160 -160
  191. package/skills/v8-sql-query/SKILL.md +302 -302
  192. package/skills/v8-table-event/SKILL.md +176 -176
  193. package/skills/v8-table-event/references/progressive-01-informv8-js-/350/241/250/345/215/225/346/211/223/345/274/200/344/272/213/344/273/266.md +216 -216
  194. package/skills/v8-table-event/references/progressive-02-/345/211/215/347/253/257/344/272/213/344/273/266/345/220/215-v8-eventname-/345/217/257/350/203/275/347/232/204/345/200/274.md +46 -46
  195. package/skills/v8-tcp-integration/SKILL.md +147 -147
  196. package/skills/v8-tcp-integration/agents/openai.yaml +4 -4
  197. package/skills/v8-template-engine/SKILL.md +167 -167
  198. package/skills/v8-utilities/SKILL.md +104 -104
  199. package/skills/v8-utilities/references/client-api-index.md +143 -143
  200. package/skills/v8-utilities/references/platform-http-routes.md +83 -83
  201. package/skills/v8-utilities/references/server-api-index.md +188 -188
  202. package/skills/v8-workflow/SKILL.md +252 -252
  203. package/skills/v8-workflow/references/progressive-01-/350/212/202/347/202/271/345/274/200/345/247/213-v8-/344/272/213/344/273/266.md +180 -180
  204. package/skills/v8-workflow/references/workflow-configuration.md +49 -49
  205. package/skills/vision-engine/SKILL.md +160 -160
  206. package/skills/vision-engine/agents/openai.yaml +4 -4
  207. package/skills/vision-engine/references/architecture-and-acceptance.md +194 -194
  208. package/skills/workspace-conventions/SKILL.md +273 -273
  209. package/skills/workspace-conventions/references/progressive-01-/347/211/210/346/234/254/346/233/264/346/226/260/346/227/245/345/277/227/344/277/235/346/212/244/350/247/204/345/210/231-/345/274/272/345/210/266.md +209 -209
  210. package/skills/workspace-conventions/references/progressive-02-microi-net-api-/346/234/254/345/234/260/345/220/257/345/212/250/347/272/246/345/256/232.md +217 -217
  211. package/skills/workspace-conventions/references/progressive-03-cli-/344/270/216-ide-/346/217/222/344/273/266/351/224/231/347/211/210/345/205/261/345/255/230/347/272/246/345/256/232.md +27 -27
@@ -1,209 +1,209 @@
1
- # workspace-conventions 详细参考 1
2
-
3
- > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
-
5
- <!-- microi-progressive:chunk id=workspace-conventions-010 sha256=d4ee69df49b8cba8d6365f485bd44aab8f5fcccc4cc1c8394220af14ff68f83f -->
6
- ## 版本更新日志保护规则(强制)
7
-
8
- - 日常功能开发、缺陷修复、测试、普通文档补充、Skill 完善和代码重构期间,不得修改 `microi.doc/docs/doc/about/update-log.md`。
9
- - 只有用户明确提出“发布版本”“准备发版”“更新版本日志”或直接点名要求修改该文件时,才允许编辑更新日志;“完善文档”或“补充官网说明”不等于授权修改版本日志。
10
- - 如果本轮误改了更新日志,必须先按上节完成多对话归属核验;只撤回有本对话精确写入证据的 hunk。必须保留用户、其它对话或其它任务的已提交和未提交内容,归属不明时不得修改并应询问用户。
11
-
12
- <!-- /microi-progressive:chunk -->
13
- <!-- microi-progressive:chunk id=workspace-conventions-011 sha256=8e3904f45392b7c27746de274bbc4725a7eb0964f0aeab1d83918c0174336dc4 -->
14
- ## 配置文件说明中文优先规则
15
-
16
- AI 新增或修改 Microi 配置文件时,凡是面向开发者、部署人员或用户阅读的自然语言描述,默认必须写中文。适用范围包括 `appsettings*.json`、`docker-compose*.yml`、`launchSettings.json`、`*.example`、安装脚本注释、部署说明和示例配置。
17
-
18
- - `Description`、`Important`、`EnvironmentVariables` 的说明文字、JSON/YAML 注释、示例说明、字段说明默认使用中文。
19
- - 字段名、环境变量名、枚举值、路由、类名、方法名、包名、协议名等标识符保持原始英文,不要为了中文化而破坏程序读取。
20
- - 如果配置面向海外交付,才可以在中文说明后补充英文括注;不要整段只写英文。
21
- - 修改配置说明后,必须确认 JSON/YAML 仍可解析,不能因为中文标点或注释方式导致配置文件失效。
22
-
23
- <!-- /microi-progressive:chunk -->
24
- <!-- microi-progressive:chunk id=workspace-conventions-012 sha256=f54d1c6d9ce2a86496dbc89d49158fb5efa7501817be350493247bd6bde37f63 -->
25
- ## 后端 API 配置白名单与 SaaS 单一事实源(强制)
26
-
27
- - `Microi.net.Api` 的 `AppSettings` 与同名容器环境变量只允许:`OsClient`、`OsClientType`、`OsClientNetwork`、`OsClientDbType`、`OsClientDbConn`、`OsClientRedisHost`、`OsClientRedisPort`、`OsClientRedisPwd`、`OsClientRedisDataBase`、`OsClientDbMongoConn`。
28
- - 除上述十项外,不得新增 API 业务环境变量或 `AppSettings` 节点。影响整个部署/节点或决定租户基础设施路由的开关、超时、限额、安全策略和密钥进入主控 `sys_osclients`;允许每个子租户自行维护的 OAuth、业务集成和展示设置进入该租户数据库的 `mci_system_setting`。两者都必须提供幂等升级、默认值、缓存刷新、敏感字段脱敏和租户隔离。官方 License 信任链是固定例外:恢复重试次数/间隔使用代码常量,签发私钥固定只读挂载 `/app/microi_private.pem`。禁止新增 `MICROI_*`、`DOS_ORM_*`、额外 `AppSettings` 节点或通用动态环境变量读取。
29
- - `ASPNETCORE_*`、`DOTNET_*` 是框架宿主配置;`PW_*`、MCP、构建、安装器和发布脚本变量只服务各自工具进程。它们不能成为生产 API 的业务配置入口。
30
- - 修改后必须用源码测试扫描生产 `.cs`、API `appsettings.json` 及在线/离线 Compose,精确断言十项白名单。不能用注释约定代替自动化守卫。
31
-
32
- <!-- /microi-progressive:chunk -->
33
- <!-- microi-progressive:chunk id=workspace-conventions-013 sha256=dbf22caaf1673270e6abf2277704505481f632c68c1da61df992c81a577e24df -->
34
- ## 身份、可逆业务秘密与敏感操作统一规范(强制)
35
-
36
- - DiyToken 是吾码多租户、多终端、V8 和低代码权限体系的唯一会话入口。新增密码、SSO、OAuth、Passkey、人脸或其它登录方式时,验证成功后必须继续签发 DiyToken,并复用现有角色、部门、菜单、表权限、数据范围、终端吊销和 Token 轮换;禁止整体替换为 ASP.NET Identity 或并行建立第二套用户/权限 Token。
37
- - 登录密码的新存储必须使用后端带盐、可调成本的专用密码哈希。存量 `PwdEncode=DES` 的管理员显示密码只是兼容能力,不得扩展给普通 V8、FormEngine、匿名或访问密钥会话。
38
- - 业务明确要求再次显示原文的设备口令、第三方业务账号密码等字段,允许使用吾码可逆加密兼容机制。保存只在可信后端加密;列表/导出默认掩码;显示明文走独立授权动作,校验 DiyToken、租户和业务权限,返回 `no-store`,记录不含明文的审计,失焦/超时后清除。
39
- - DES 是现有兼容格式,不得宣称能抵抗服务器所有者或代码执行者。新高价值秘密优先使用带版本的现代认证加密与集中密钥管理;基础设施密钥仍不得进入可编辑 V8。
40
- - 登录后的敏感操作优先用 `V8.Identity.Verify` 申请 Passkey、Authenticator TOTP 或严格人脸一次性票据,接口引擎从权威数据重算 `ActionHash` 后调用 `V8.Method.ConsumeIdentityVerificationTicket` 原子消费。票据不能代替菜单/表/行权限、状态机、幂等、事务或审计。
41
- - Windows Hello、Touch ID、Face ID 和 Android 设备验证优先采用 WebAuthn/Passkey;Microsoft/Google Authenticator 采用标准 TOTP,两者都不增加模型服务。只有服务端严格人脸与活体检测才接入独立 `Microi Face Gateway v1` 云服务或 Docker/集群。完整规范读取 `microi.skills/v8-security/SKILL.md` 与 `microi.doc/docs/doc/more/identity-verification.md`。
42
- - 外部登录统一在登录页【登录方式】中展示;Gitee、微信、GitHub 等 Provider 只登录个人中心已绑定的吾码用户,最终签发 DiyToken。Provider 固定协议端点,租户自己的 ClientId/ClientSecret 放 `mci_system_setting`;Secret 不进入浏览器/前端 `V8.SysConfig`,后端接口引擎和后端 V8 事件只能从当前租户 `V8.SysConfig.ServerPrivateSettings[ConfigKey]` 使用,禁止回传或记录原文。
43
- - 一键安装恢复客户旧库时只允许定位精确主租户三元组;缺失则幂等创建,重复则停止,不能批量重写其它子租户。新主租户行不得持久化数据库、MongoDB 或 Redis 连接,安装器对 MinIO/OCR 等业务配置的后续更新也必须带同一三元组、活动状态条件并做唯一回读。
44
-
45
- <!-- /microi-progressive:chunk -->
46
- <!-- microi-progressive:chunk id=workspace-conventions-014 sha256=d17f000dd9548f104277acca846c450066e6979a1e0bfec31879a7ba42deccfe -->
47
- ## 多语言优先约定
48
-
49
- Microi 平台默认支持多语言。AI 修改 `Microi.Client`、`Microi.Server`、`Microi-V8-Engine`、MCP 建模数据、菜单按钮、接口引擎或表单 V8 事件时,凡是用户可见文字都必须先考虑多语言,不要把中文提示、按钮名、Tab 名、菜单名、字段名、Toast/Msg 等硬写死后结束任务。
50
- - 前端框架固定文案优先使用 `$t('Msg.xxx')` 或项目现有 i18n 工具;中文简体、中文繁体、英语作为前端兜底包,其它语言应来自后端 `diy_lang` 缓存/接口返回,不要随意把十几种语言全写死到前端源码。
51
- - 后端返回给前端的表名、字段名、菜单名、按钮名、Tab 名、错误提示等,优先从 `diy_lang` 缓存取值;没有词条时再返回原文,并异步补齐词条。
52
- - V8 接口引擎、表单 V8 事件、菜单按钮 V8 若需要返回中文 `Msg`、通知、按钮提示或日志标题,应优先使用 `V8.TranslateEngine.GetLang(key)` / 约定多语言 Key,或至少为后端自动同步留下稳定 Key,不要只写一次性中文字符串。
53
- - 通过 MCP 创建或维护 `diy_lang` 数据时必须保持树形结构:`系统`、`模块引擎`、`表单引擎`、`业务数据` 等分类。菜单名称归 `模块引擎`;表名、字段名、V8 按钮名、Tab 名归 `表单引擎`;固定框架文案归 `系统`;业务数据默认不写入 `diy_lang`,除非用户明确要求某类业务表进入词库。
54
- - 不允许把所有多语言映射都创建到 `diy_lang` 根目录。新增词条前先查询是否已有同 Key/同分类数据;写入后需要刷新/回读多语言缓存。
55
- - 完成多语言相关改动后,至少切换一次目标语言或调用对应接口验证;涉及页面的任务优先用 Playwright 截图确认关键区域没有残留明显中文。
56
-
57
- <!-- /microi-progressive:chunk -->
58
- <!-- microi-progressive:chunk id=workspace-conventions-015 sha256=3db1eb06c79e7d3b5158a7fc4992af4848406d892c054699db3f9215849fcab4 -->
59
- ## 后台菜单层级默认规则
60
-
61
- AI 通过 MCP、Manifest、V8 或平台 API 创建/修复 Microi 后台菜单时,默认必须规划为至少两级菜单树。真实系统不能把一批 CRUD、报表、日志、设置页直接平铺到根级菜单。
62
-
63
- - 顶级菜单只放业务域、系统域或产品域父菜单,例如系统引擎、业务中心、运营管理、基础资料等。
64
- - 具体表单 CRUD、报表、导出、日志、规则、配置、任务页必须挂在对应父级或二级分类下。
65
- - 同一业务域下超过 3 个叶子模块时,优先再按基础资料、业务执行、配置中心、日志记录、数据产物等通用类别分组。
66
- - 通过 MCP/Manifest 创建菜单时,必须显式包含父菜单和子菜单关系;叶子菜单必须写入正确 `ParentId`,并在交付说明中列出最终菜单树。
67
- - 改造已生成菜单时,不能只停留在文档建议。必须回读 `sys_menu`,列出现有菜单、目标父级、`ParentId`/`Sort` 迁移关系,更新管理员角色权限,再次回读验证菜单树深度。
68
- - 只有表单内嵌子表、隐藏路由、系统内部入口等不应出现在导航中的菜单可以例外隐藏;隐藏菜单必须明确设置 `Display=0`、`AppDisplay=0`,并避免误标为有子级的空父菜单。
69
-
70
- <!-- /microi-progressive:chunk -->
71
- <!-- microi-progressive:chunk id=workspace-conventions-016 sha256=ea4975115c96e1968ae32b8f2271b79288f99a35cd8cdbf9de672481f3964521 -->
72
- ## 后台任务与安全防护约定
73
-
74
- Microi 平台级长任务和安全防护属于系统能力,AI 修改框架、MCP 或 V8 示例时必须同步考虑:
75
-
76
- - 应用安装、初始化多语言、批量导入、批量修复、跨系统同步等长任务优先接入后台任务中心,进度通过吾码标准 WebSocket/SignalR 推送,不要默认用前端轮询接口。
77
- - 菜单按钮可使用 `RunBackground` / `BackgroundTask` / `IsBackgroundTask` 配合 `ApiEngineKey` 启动后台任务;接口引擎内必须用 `V8.Method.UpdateBackgroundTask` 上报进度。
78
- - 后台任务按钮创建后,平台会向接口引擎参数注入 `_BackgroundTaskId`。V8 代码应读取 `_BackgroundTaskId` / `BackgroundTaskId` / `TaskId`,按真实阶段或处理条数上报 `Current`、`Total`、`Progress`、`Msg` / `Message`。不要写假进度、不要只在结束时写 100%,成功返回 `Code:1` 后由平台统一置为 100%。
79
- - 后台任务运行态会写入 Redis 并推送通知中心;清除已完成应同时清理内存态和 Redis 态。新增类似能力时要验证刷新页面后任务仍可见、进度百分比正确、完成后可清除。
80
- - 平台级安全、访问审计、后台任务、运行态监控等系统表统一使用 `mci_` 前缀;普通业务系统表不要使用 `mci_` 前缀,避免与平台能力混淆。
81
- - 恶意攻击防护只能根据短时间高频、异常状态码爆发、扫描不存在路径、封禁后继续访问等行为判断,不能因为接口执行时间长或排队时间长就封禁用户。
82
- - 攻击事件、IP 封禁/解封记录应异步写入 MySQL `mci_` 表并写系统日志;同一 IP、同一原因、同一时间窗必须去重合并,不要重复写大量相同失败原因。
83
- - 手动封禁、手动解封、自动解封都要有审计记录。封禁响应要返回 DosResult 风格 JSON,便于前端明确提示。
84
-
85
- <!-- /microi-progressive:chunk -->
86
- <!-- microi-progressive:chunk id=workspace-conventions-017 sha256=f3f2f378b99fc5621ea9a6dd1b924a8db171ca8e55588f6b48d3ac4084306e41 -->
87
- ## 业务逻辑优先接口引擎约定
88
-
89
- AI 为 Microi 平台新增或修改任何业务逻辑、后台工具、数据维护能力、官网流程、在线 AI 能力、导入导出、初始化、修复任务、页面配套接口或租户 SaaS 流程时,默认优先使用接口引擎实现,不要直接新增 `Microi.net.Api` Controller 或把业务分支写死到 C# 后端。
90
-
91
- - 能用 `V8.FormEngine`、`V8.Db`、`V8.Method`、`V8.Http`、`V8.Office`、`V8.ApiEngine` 完成的功能,必须优先建 `sys_apiengine` 接口引擎,并通过前端 `DiyCommon.ApiEngine.Run` 或菜单按钮调用。
92
- - 需要持久化的数据结构必须优先通过 MCP / Manifest 创建标准低代码表、字段和菜单,让表能在表单引擎中可见、可维护、可授权;不要只在 C# 中 `CREATE TABLE` 物理表。
93
- - 如果接口引擎缺少底层能力,优先扩展 V8 能力(例如 `V8.Method`、`V8.FormEngine`、HDFS 辅助方法),再让接口引擎调用新增能力;只有跨平台核心框架、协议层、鉴权管线、SignalR/WebSocket、ORM、任务调度内核等接口引擎无法表达的能力,才新增或修改 C# Controller/Service。
94
- - 新增 C# Controller 前必须能说明为什么不能用接口引擎实现,并在交付说明中列出原因、影响范围和版本升级要求。
95
- - 从 C# Controller 迁移到接口引擎时,前端不得继续调用旧 `/api/<Controller>/<Action>`;应统一改为 `DiyCommon.ApiEngine.Run('<ApiEngineKey>', params)`,并保留 DosResult 返回格式。
96
- - 修改 `Microi.Server` 前必须先做四级归类并留下结论:① 现有表单引擎 CRUD/事件能完成;② 现有 V8 接口引擎能完成;③ 只缺一个可复用的底层原子能力,应先扩展 V8 再由接口引擎编排;④ 只有平台协议、可信鉴权、密钥隔离、存储/网络边界或运行时内核才允许直接写 C#。未完成归类不得直接新增 Controller/Service。
97
- - 第三方回调必须优先采用“C# 最小协议网关 + 应用拥有的 `Managed` 核心接口引擎 + 租户拥有的 `CreateIfMissing` 扩展 Hook”。C# 只验签、解密、校验租户/AppId 和整理脱敏事件;状态、日志、数据写入、通知及业务编排放接口引擎。扩展 Hook 以稳定 `EventId` 幂等,不能因修改业务规则再次发布后端。
98
- - 第三方平台不支持 QueryString 时使用 `/path--OsClient--{OsClient}--`;支持 Query 时参数名固定为 `?OsClient=`,不得发明 `?o=` 等缩写。路径与 Query 同时出现时必须一致。
99
- - 第三方 HTTP 集成默认用 `V8.Http` 放在接口引擎;若平台密钥绝不能进入可编辑 V8,只在 C# 暴露最小、租户隔离、不可覆盖密钥的安全原子方法,业务字段选择、状态流转和页面动作仍由接口引擎/表单事件编排。
100
- - 平台级强制安全校验不能为了“全部低代码化”放进租户可编辑脚本而被绕过;可以留在 C#,但必须是通用、失败关闭的安全边界,不得夹带某个项目的业务文案、字段组合或状态机。
101
-
102
- <!-- /microi-progressive:chunk -->
103
- <!-- microi-progressive:chunk id=workspace-conventions-018 sha256=e33b8387bbe8dbc400249ca9d16f91656149492f5f7ce253cbfa67b80f4ca8ef -->
104
- ## 应用商城优先于 Microi.Upgrade(强制)
105
-
106
- 能由应用包声明、差异安装和回读验收完成的升级,不得在 `Microi.Server/Microi.Upgrade/` 新增定制 .NET 升级类。表、字段、Tab、菜单、角色权限、接口引擎、表单事件、数据源、页面、打印、工作流、任务及可幂等安装的种子数据,默认都属于应用商城资源。
107
-
108
- - 应用包中的接口引擎必须声明 `ResourcePolicies.ApiEngines`:当前包声明为 `Managed` 的资源以本次选定且已校验的包正文为最终事实,同版本重装、目标端源码/版本差异、软删除、稳定 Id 或路由占用都自动覆盖或重映射;`BaseHash/LocalHash` 只保留审计,不得再形成整包冲突。当前包声明为 `CreateIfMissing` 的租户 Hook 只在 Key 完全不存在时创建,既有记录(含禁用或软删除)保持原样。覆盖范围只限包拥有的声明式资源,禁止整表清空业务数据或覆盖 `InsertIfMissing` 租户配置值。
109
- - 吾码官方开发者若可调用绑定 `https://api.itdos.com`、`OsClient=iTdos` 的 `microi_itdos`,必须先在官方主租户通过 MCP 更新资源,重新制作并发布对应官方应用,发布后按字段/菜单/引擎/包版本回读;再用目标租户 MCP 安装/更新并轮询后台任务到 `Succeeded`。
110
- - 当前用户没有 `microi_itdos` 权限时,通过其自己的 MCP/Manifest 幂等升级自己的数据库并回读;不得为了单个租户把定制迁移塞进通用后端。确需让更多用户复用时,应生成其有权维护的社区/私有应用包。
111
- - 只有应用商城运行前就必须存在的物理兼容基础、跨版本核心协议迁移、存储格式变化,或安装器自身无法安全表达的不可逆平台迁移,才允许进入 `Microi.Upgrade`。每个例外必须写明“为什么应用包不能完成”、影响范围、回滚/前后兼容、分布式幂等和验收依据。
112
- - 自动恢复只保证启动、普通登录、菜单导航和应用商城安装/更新,SSO、AI、通知、备份、OCR、翻译等应用不能成为自动升级或启动门禁。完整官方资源放在 `Microi.Server/OfficialApplications/Resource/`,按显式清单生成 `Microi.Upgrade/Resource/` 的两项恢复资源;完整官方包的增长不得自动扩大启动闭包。更高版本且就绪的手动商城更新和既有租户 Hook 保留,失败不推进版本。
113
- - 允许的 .NET 迁移只能按持久化版本/迁移账本执行待办步骤,使用共享租约且业务幂等;禁止把新迁移同时加入版本链和“每次启动无条件全租户对账”列表。启动成本必须与待执行迁移数相关,不能随历史升级文件总数对每个租户线性增长。
114
- - 评审 `Microi.Upgrade` PR 时先做资源分类:若只是补字段、Tab 或低代码元数据,移出升级器并发布应用包;若保留 C#,必须提供双节点、重复启动、租约丢失、失败不推进版本以及旧新节点共存测试。
115
-
116
- <!-- /microi-progressive:chunk -->
117
- <!-- microi-progressive:chunk id=workspace-conventions-019 sha256=333125c854376da9f58b988c0ff2e4e94592de5437107182da838878ceb6b447 -->
118
- ## 在线 AI 应用上下文默认发现规则(强制)
119
-
120
- AI 开始处理定制页面、弹窗、Web、UniApp、微服务或应用商城任务时,不能只搜索本地目录。只要当前 MCP 已连接到目标 `OsClient`,必须先读取在线 AI 应用上下文:
121
-
122
- 1. 调用 `microi_list_applications` 获取当前租户全部 `Web / UniApp / MicroService` 应用和完整文件清单。
123
- 2. 找到候选应用后调用 `microi_get_application_context`,默认 `includeContents=true`,读取所有可读源码内容以及微服务运行页面。
124
- 3. 只需核对单个大文件或二进制文件时,再调用 `microi_get_application_file` 精确读取。
125
- 4. 已存在合适微服务时优先在原应用内新增页面/路由;不存在时才调用 `microi_create_microservice`、`microi_sync_microservice_source`、`microi_publish_microservice` 创建并发布。
126
-
127
- 三个读取工具的关键参数:
128
-
129
- | 工具 | 参数 | 说明 |
130
- |---|---|---|
131
- | `microi_list_applications` | `appType` | 可选:`Web`、`UniApp`、`MicroService`;省略表示全部类型 |
132
- | | `keyword` | 可选:按名称、`AppKey`、类型、描述筛选 |
133
- | | `includeFiles` | 默认 `true`,返回每个应用完整文件清单 |
134
- | `microi_get_application_context` | `appIdOrKey` | 必填,支持统一应用商城 `sys_microistore.Id` 或 `AppKey` |
135
- | | `includeContents` | 默认 `true`;读取私有 HDFS 源码内容 |
136
- | | `maxFileBytes` | 可选,默认单文件 2MB |
137
- | | `maxTotalBytes` | 可选,默认单应用 50MB |
138
- | `microi_get_application_file` | `appIdOrKey`、`filePath` | 必填;`filePath` 必须来自文件清单 |
139
-
140
- 如果 MCP 返回登录过期,必须先修复或刷新目标 MCP 身份,再继续把 MCP 读取结果当作当前事实;不能因为读取失败就假设在线应用不存在并重复创建。
141
-
142
- <!-- /microi-progressive:chunk -->
143
- <!-- microi-progressive:chunk id=workspace-conventions-020 sha256=60e6dac03e25861d4e0507c30ab28d28e26ada4cbe3231c3b029eb2367dc7224 -->
144
- ## VS Code 插件空目录生成规则
145
-
146
- Microi.Agent 面向普通用户时,用户本地可能只是一个空工作区。插件生成 AI 指令文件时不能假设用户已经有 `microi.skills/`、`Microi-V8-Engine/`、`AI-Project/` 或某个固定前端项目目录。
147
-
148
- 强制要求:
149
- - 插件的“初始化AI配置”必须能在空目录生成 `microi.skills/`、`.github/copilot-instructions.md`、`AGENTS.md`、`CLAUDE.md`、`.cursorrules`、`.cursor/rules/microi-skills.mdc`、类型提示、`jsconfig.json` 和 MCP 配置。
150
- - Cursor rule 的 `globs` 必须覆盖任意新建项目目录下的常见源码、配置和文档文件,例如 `**/*.{vue,js,ts,jsx,tsx,css,scss,json,md,mdc,cs,csproj,xml,yml,yaml}`,不能只覆盖 `Microi-V8-Engine/**/*.js`。
151
- - 生成文案必须明确:普通用户不需要手动克隆 skills,也不需要每次对 AI 说“严格遵循 microi.skills”;只要插件初始化成功,AI 就应默认按 skills 工作。
152
- - 插件升级时应继续保护用户本地修改过的 skill 文件,只覆盖插件曾生成且用户未改过的文件。
153
-
154
- <!-- /microi-progressive:chunk -->
155
- <!-- microi-progressive:chunk id=workspace-conventions-021 sha256=963e489e2bdda4614c8b3089830b8bb855603dbd4338ddcc7ae29519d560766f -->
156
- ## Microi 版本号规则
157
-
158
- Microi 通用版本号采用 `主版本.次版本.修订版本` 三段数字格式,从 `1.0.0` 开始。每次发布时最后一位加 1;当某一位超过 `9` 时向前一位进位并将当前位归 `0`,例如 `1.0.9 -> 1.1.0`、`1.9.9 -> 2.0.0`、`9.9.9 -> 10.0.0`。
159
-
160
- 接口引擎代码头、表单/工作流 V8 事件代码头、前端微服务 `sys_microiservice.BuildVersion` 与 `sys_microiservice_page.BuildVersion` 这类业务发布版本统一使用带 `v` 前缀的格式:`v1.0.0 -> v1.0.1 -> v1.0.9 -> v1.1.0 -> v1.9.9 -> v2.0.0 -> v9.9.9 -> v10.0.0`。禁止使用时间戳、随机串或日期作为 BuildVersion;前端微服务上传到分布式存储的目录也必须使用同一个 BuildVersion 分段,便于回溯与 CDN 缓存隔离。
161
-
162
- `Microi.Agent` 发布时会通过 `bump-version.js` 自动自增插件版本,并把 `microi.skills/.microi-skills-version.json` 中的 skills 发布版本写成同一个插件版本号;skills 不再独立自增。`.microi-skills-version.json` 只用于记录 skills 包版本和提示用户当前来源,不能单独作为覆盖依据。
163
-
164
- 插件初始化或升级同步 `microi.skills/` 时,必须以 `.microi-skills-manifest.json` 的逐文件 hash 判断是否可覆盖:本地文件不存在则写入;本地文件与旧 manifest hash 一致说明用户未改,可自动升级;本地文件已被用户修改、或本地版本比插件捆绑版本更新时,必须保留用户版本并提示差异。不能因为插件版本号更高或更低,就粗暴覆盖本地 skills。创始人本地随时修改 skills 的工作区尤其要保护;普通用户未修改过的旧 skills 才应该被最新插件覆盖升级。
165
-
166
- <!-- /microi-progressive:chunk -->
167
- <!-- microi-progressive:chunk id=workspace-conventions-022 sha256=709c669676154b9b469feefad4761544a8cb29fba2e050262b26390c1c4e327c -->
168
- ## C# dynamic 强类型落地规则
169
-
170
- 后端源码中从 `dynamic`、`JObject`、`ExpandoObject`、表单参数或 `DynamicHelper` 读取出来的值,如果后续要调用字符串方法、扩展方法或参与强类型判断,必须先显式落到强类型变量。不要用 `var` 承接 `DynamicHelper.GetDynamicStringValue(...)` 后再调用 `DosIsNullOrWhiteSpace()` 这类扩展方法,因为调用点可能仍按 dynamic 绑定,运行时会出现 `'string' does not contain a definition for ...`。
171
-
172
- 错误写法:
173
-
174
- ```csharp
175
- var tableName = DynamicHelper.GetDynamicStringValue(diyTableModel, "Name", "");
176
- if (tableName.DosIsNullOrWhiteSpace()) { return; }
177
- ```
178
-
179
- 推荐写法:
180
-
181
- ```csharp
182
- string tableName = DynamicHelper.GetDynamicStringValue(diyTableModel, "Name", "");
183
- if (string.IsNullOrWhiteSpace(tableName)) { return; }
184
- ```
185
-
186
- 如果方法内部只通过 `DynamicHelper` 读取对象字段,方法参数优先声明为 `object`,不要声明为 `dynamic`。这样可以减少 C# 运行时动态绑定进入普通字符串工具链的机会。
187
-
188
- <!-- /microi-progressive:chunk -->
189
- <!-- microi-progressive:chunk id=workspace-conventions-023 sha256=4ef009cbfca343640e69ccdb6be47f3cb13ad8a67f9ff770debce20c919f1bb3 -->
190
- ## 根目录保留文件说明
191
-
192
- 根目录只允许存在以下类型的文件和目录:
193
-
194
- | 路径 | 说明 | 是否可删除 |
195
- |------|------|-----------|
196
- | `.github/` | GitHub Actions、Copilot 配置 | 否 |
197
- | `.venv/` | Python 虚拟环境,AI 代理使用 | 否(必要) |
198
- | `.vscode/` | VS Code 工作区配置 | 否 |
199
- | `microi.skills/` | 通用技能文档库 | 否 |
200
- | `Microi.Server/` | .NET 后端 | 否 |
201
- | `Microi.Client/` | PC 前端 Vue3 | 否 |
202
- | `microi-v8-engine/` | V8 接口引擎代码 | 否 |
203
- | `AI-Project/` | 各租户/项目 | 否 |
204
- | `switch-env.ps1` | 本地环境切换工具 | 否(有用) |
205
- | `.tmp/` | AI 临时文件(gitignored) | 可删整个目录 |
206
- | `.microi-e2e/` | Microi.Agent 插件 E2E 产物 | 可定期清理 |
207
- | `.microi-performance/` | 性能测试报告 | 可定期清理 |
208
-
209
- <!-- /microi-progressive:chunk -->
1
+ # workspace-conventions 详细参考 1
2
+
3
+ > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
+
5
+ <!-- microi-progressive:chunk id=workspace-conventions-010 sha256=d4ee69df49b8cba8d6365f485bd44aab8f5fcccc4cc1c8394220af14ff68f83f -->
6
+ ## 版本更新日志保护规则(强制)
7
+
8
+ - 日常功能开发、缺陷修复、测试、普通文档补充、Skill 完善和代码重构期间,不得修改 `microi.doc/docs/doc/about/update-log.md`。
9
+ - 只有用户明确提出“发布版本”“准备发版”“更新版本日志”或直接点名要求修改该文件时,才允许编辑更新日志;“完善文档”或“补充官网说明”不等于授权修改版本日志。
10
+ - 如果本轮误改了更新日志,必须先按上节完成多对话归属核验;只撤回有本对话精确写入证据的 hunk。必须保留用户、其它对话或其它任务的已提交和未提交内容,归属不明时不得修改并应询问用户。
11
+
12
+ <!-- /microi-progressive:chunk -->
13
+ <!-- microi-progressive:chunk id=workspace-conventions-011 sha256=8e3904f45392b7c27746de274bbc4725a7eb0964f0aeab1d83918c0174336dc4 -->
14
+ ## 配置文件说明中文优先规则
15
+
16
+ AI 新增或修改 Microi 配置文件时,凡是面向开发者、部署人员或用户阅读的自然语言描述,默认必须写中文。适用范围包括 `appsettings*.json`、`docker-compose*.yml`、`launchSettings.json`、`*.example`、安装脚本注释、部署说明和示例配置。
17
+
18
+ - `Description`、`Important`、`EnvironmentVariables` 的说明文字、JSON/YAML 注释、示例说明、字段说明默认使用中文。
19
+ - 字段名、环境变量名、枚举值、路由、类名、方法名、包名、协议名等标识符保持原始英文,不要为了中文化而破坏程序读取。
20
+ - 如果配置面向海外交付,才可以在中文说明后补充英文括注;不要整段只写英文。
21
+ - 修改配置说明后,必须确认 JSON/YAML 仍可解析,不能因为中文标点或注释方式导致配置文件失效。
22
+
23
+ <!-- /microi-progressive:chunk -->
24
+ <!-- microi-progressive:chunk id=workspace-conventions-012 sha256=f54d1c6d9ce2a86496dbc89d49158fb5efa7501817be350493247bd6bde37f63 -->
25
+ ## 后端 API 配置白名单与 SaaS 单一事实源(强制)
26
+
27
+ - `Microi.net.Api` 的 `AppSettings` 与同名容器环境变量只允许:`OsClient`、`OsClientType`、`OsClientNetwork`、`OsClientDbType`、`OsClientDbConn`、`OsClientRedisHost`、`OsClientRedisPort`、`OsClientRedisPwd`、`OsClientRedisDataBase`、`OsClientDbMongoConn`。
28
+ - 除上述十项外,不得新增 API 业务环境变量或 `AppSettings` 节点。影响整个部署/节点或决定租户基础设施路由的开关、超时、限额、安全策略和密钥进入主控 `sys_osclients`;允许每个子租户自行维护的 OAuth、业务集成和展示设置进入该租户数据库的 `mci_system_setting`。两者都必须提供幂等升级、默认值、缓存刷新、敏感字段脱敏和租户隔离。官方 License 信任链是固定例外:恢复重试次数/间隔使用代码常量,签发私钥固定只读挂载 `/app/microi_private.pem`。禁止新增 `MICROI_*`、`DOS_ORM_*`、额外 `AppSettings` 节点或通用动态环境变量读取。
29
+ - `ASPNETCORE_*`、`DOTNET_*` 是框架宿主配置;`PW_*`、MCP、构建、安装器和发布脚本变量只服务各自工具进程。它们不能成为生产 API 的业务配置入口。
30
+ - 修改后必须用源码测试扫描生产 `.cs`、API `appsettings.json` 及在线/离线 Compose,精确断言十项白名单。不能用注释约定代替自动化守卫。
31
+
32
+ <!-- /microi-progressive:chunk -->
33
+ <!-- microi-progressive:chunk id=workspace-conventions-013 sha256=dbf22caaf1673270e6abf2277704505481f632c68c1da61df992c81a577e24df -->
34
+ ## 身份、可逆业务秘密与敏感操作统一规范(强制)
35
+
36
+ - DiyToken 是吾码多租户、多终端、V8 和低代码权限体系的唯一会话入口。新增密码、SSO、OAuth、Passkey、人脸或其它登录方式时,验证成功后必须继续签发 DiyToken,并复用现有角色、部门、菜单、表权限、数据范围、终端吊销和 Token 轮换;禁止整体替换为 ASP.NET Identity 或并行建立第二套用户/权限 Token。
37
+ - 登录密码的新存储必须使用后端带盐、可调成本的专用密码哈希。存量 `PwdEncode=DES` 的管理员显示密码只是兼容能力,不得扩展给普通 V8、FormEngine、匿名或访问密钥会话。
38
+ - 业务明确要求再次显示原文的设备口令、第三方业务账号密码等字段,允许使用吾码可逆加密兼容机制。保存只在可信后端加密;列表/导出默认掩码;显示明文走独立授权动作,校验 DiyToken、租户和业务权限,返回 `no-store`,记录不含明文的审计,失焦/超时后清除。
39
+ - DES 是现有兼容格式,不得宣称能抵抗服务器所有者或代码执行者。新高价值秘密优先使用带版本的现代认证加密与集中密钥管理;基础设施密钥仍不得进入可编辑 V8。
40
+ - 登录后的敏感操作优先用 `V8.Identity.Verify` 申请 Passkey、Authenticator TOTP 或严格人脸一次性票据,接口引擎从权威数据重算 `ActionHash` 后调用 `V8.Method.ConsumeIdentityVerificationTicket` 原子消费。票据不能代替菜单/表/行权限、状态机、幂等、事务或审计。
41
+ - Windows Hello、Touch ID、Face ID 和 Android 设备验证优先采用 WebAuthn/Passkey;Microsoft/Google Authenticator 采用标准 TOTP,两者都不增加模型服务。只有服务端严格人脸与活体检测才接入独立 `Microi Face Gateway v1` 云服务或 Docker/集群。完整规范读取 `microi.skills/v8-security/SKILL.md` 与 `microi.doc/docs/doc/more/identity-verification.md`。
42
+ - 外部登录统一在登录页【登录方式】中展示;Gitee、微信、GitHub 等 Provider 只登录个人中心已绑定的吾码用户,最终签发 DiyToken。Provider 固定协议端点,租户自己的 ClientId/ClientSecret 放 `mci_system_setting`;Secret 不进入浏览器/前端 `V8.SysConfig`,后端接口引擎和后端 V8 事件只能从当前租户 `V8.SysConfig.ServerPrivateSettings[ConfigKey]` 使用,禁止回传或记录原文。
43
+ - 一键安装恢复客户旧库时只允许定位精确主租户三元组;缺失则幂等创建,重复则停止,不能批量重写其它子租户。新主租户行不得持久化数据库、MongoDB 或 Redis 连接,安装器对 MinIO/OCR 等业务配置的后续更新也必须带同一三元组、活动状态条件并做唯一回读。
44
+
45
+ <!-- /microi-progressive:chunk -->
46
+ <!-- microi-progressive:chunk id=workspace-conventions-014 sha256=d17f000dd9548f104277acca846c450066e6979a1e0bfec31879a7ba42deccfe -->
47
+ ## 多语言优先约定
48
+
49
+ Microi 平台默认支持多语言。AI 修改 `Microi.Client`、`Microi.Server`、`Microi-V8-Engine`、MCP 建模数据、菜单按钮、接口引擎或表单 V8 事件时,凡是用户可见文字都必须先考虑多语言,不要把中文提示、按钮名、Tab 名、菜单名、字段名、Toast/Msg 等硬写死后结束任务。
50
+ - 前端框架固定文案优先使用 `$t('Msg.xxx')` 或项目现有 i18n 工具;中文简体、中文繁体、英语作为前端兜底包,其它语言应来自后端 `diy_lang` 缓存/接口返回,不要随意把十几种语言全写死到前端源码。
51
+ - 后端返回给前端的表名、字段名、菜单名、按钮名、Tab 名、错误提示等,优先从 `diy_lang` 缓存取值;没有词条时再返回原文,并异步补齐词条。
52
+ - V8 接口引擎、表单 V8 事件、菜单按钮 V8 若需要返回中文 `Msg`、通知、按钮提示或日志标题,应优先使用 `V8.TranslateEngine.GetLang(key)` / 约定多语言 Key,或至少为后端自动同步留下稳定 Key,不要只写一次性中文字符串。
53
+ - 通过 MCP 创建或维护 `diy_lang` 数据时必须保持树形结构:`系统`、`模块引擎`、`表单引擎`、`业务数据` 等分类。菜单名称归 `模块引擎`;表名、字段名、V8 按钮名、Tab 名归 `表单引擎`;固定框架文案归 `系统`;业务数据默认不写入 `diy_lang`,除非用户明确要求某类业务表进入词库。
54
+ - 不允许把所有多语言映射都创建到 `diy_lang` 根目录。新增词条前先查询是否已有同 Key/同分类数据;写入后需要刷新/回读多语言缓存。
55
+ - 完成多语言相关改动后,至少切换一次目标语言或调用对应接口验证;涉及页面的任务优先用 Playwright 截图确认关键区域没有残留明显中文。
56
+
57
+ <!-- /microi-progressive:chunk -->
58
+ <!-- microi-progressive:chunk id=workspace-conventions-015 sha256=3db1eb06c79e7d3b5158a7fc4992af4848406d892c054699db3f9215849fcab4 -->
59
+ ## 后台菜单层级默认规则
60
+
61
+ AI 通过 MCP、Manifest、V8 或平台 API 创建/修复 Microi 后台菜单时,默认必须规划为至少两级菜单树。真实系统不能把一批 CRUD、报表、日志、设置页直接平铺到根级菜单。
62
+
63
+ - 顶级菜单只放业务域、系统域或产品域父菜单,例如系统引擎、业务中心、运营管理、基础资料等。
64
+ - 具体表单 CRUD、报表、导出、日志、规则、配置、任务页必须挂在对应父级或二级分类下。
65
+ - 同一业务域下超过 3 个叶子模块时,优先再按基础资料、业务执行、配置中心、日志记录、数据产物等通用类别分组。
66
+ - 通过 MCP/Manifest 创建菜单时,必须显式包含父菜单和子菜单关系;叶子菜单必须写入正确 `ParentId`,并在交付说明中列出最终菜单树。
67
+ - 改造已生成菜单时,不能只停留在文档建议。必须回读 `sys_menu`,列出现有菜单、目标父级、`ParentId`/`Sort` 迁移关系,更新管理员角色权限,再次回读验证菜单树深度。
68
+ - 只有表单内嵌子表、隐藏路由、系统内部入口等不应出现在导航中的菜单可以例外隐藏;隐藏菜单必须明确设置 `Display=0`、`AppDisplay=0`,并避免误标为有子级的空父菜单。
69
+
70
+ <!-- /microi-progressive:chunk -->
71
+ <!-- microi-progressive:chunk id=workspace-conventions-016 sha256=ea4975115c96e1968ae32b8f2271b79288f99a35cd8cdbf9de672481f3964521 -->
72
+ ## 后台任务与安全防护约定
73
+
74
+ Microi 平台级长任务和安全防护属于系统能力,AI 修改框架、MCP 或 V8 示例时必须同步考虑:
75
+
76
+ - 应用安装、初始化多语言、批量导入、批量修复、跨系统同步等长任务优先接入后台任务中心,进度通过吾码标准 WebSocket/SignalR 推送,不要默认用前端轮询接口。
77
+ - 菜单按钮可使用 `RunBackground` / `BackgroundTask` / `IsBackgroundTask` 配合 `ApiEngineKey` 启动后台任务;接口引擎内必须用 `V8.Method.UpdateBackgroundTask` 上报进度。
78
+ - 后台任务按钮创建后,平台会向接口引擎参数注入 `_BackgroundTaskId`。V8 代码应读取 `_BackgroundTaskId` / `BackgroundTaskId` / `TaskId`,按真实阶段或处理条数上报 `Current`、`Total`、`Progress`、`Msg` / `Message`。不要写假进度、不要只在结束时写 100%,成功返回 `Code:1` 后由平台统一置为 100%。
79
+ - 后台任务运行态会写入 Redis 并推送通知中心;清除已完成应同时清理内存态和 Redis 态。新增类似能力时要验证刷新页面后任务仍可见、进度百分比正确、完成后可清除。
80
+ - 平台级安全、访问审计、后台任务、运行态监控等系统表统一使用 `mci_` 前缀;普通业务系统表不要使用 `mci_` 前缀,避免与平台能力混淆。
81
+ - 恶意攻击防护只能根据短时间高频、异常状态码爆发、扫描不存在路径、封禁后继续访问等行为判断,不能因为接口执行时间长或排队时间长就封禁用户。
82
+ - 攻击事件、IP 封禁/解封记录应异步写入 MySQL `mci_` 表并写系统日志;同一 IP、同一原因、同一时间窗必须去重合并,不要重复写大量相同失败原因。
83
+ - 手动封禁、手动解封、自动解封都要有审计记录。封禁响应要返回 DosResult 风格 JSON,便于前端明确提示。
84
+
85
+ <!-- /microi-progressive:chunk -->
86
+ <!-- microi-progressive:chunk id=workspace-conventions-017 sha256=f3f2f378b99fc5621ea9a6dd1b924a8db171ca8e55588f6b48d3ac4084306e41 -->
87
+ ## 业务逻辑优先接口引擎约定
88
+
89
+ AI 为 Microi 平台新增或修改任何业务逻辑、后台工具、数据维护能力、官网流程、在线 AI 能力、导入导出、初始化、修复任务、页面配套接口或租户 SaaS 流程时,默认优先使用接口引擎实现,不要直接新增 `Microi.net.Api` Controller 或把业务分支写死到 C# 后端。
90
+
91
+ - 能用 `V8.FormEngine`、`V8.Db`、`V8.Method`、`V8.Http`、`V8.Office`、`V8.ApiEngine` 完成的功能,必须优先建 `sys_apiengine` 接口引擎,并通过前端 `DiyCommon.ApiEngine.Run` 或菜单按钮调用。
92
+ - 需要持久化的数据结构必须优先通过 MCP / Manifest 创建标准低代码表、字段和菜单,让表能在表单引擎中可见、可维护、可授权;不要只在 C# 中 `CREATE TABLE` 物理表。
93
+ - 如果接口引擎缺少底层能力,优先扩展 V8 能力(例如 `V8.Method`、`V8.FormEngine`、HDFS 辅助方法),再让接口引擎调用新增能力;只有跨平台核心框架、协议层、鉴权管线、SignalR/WebSocket、ORM、任务调度内核等接口引擎无法表达的能力,才新增或修改 C# Controller/Service。
94
+ - 新增 C# Controller 前必须能说明为什么不能用接口引擎实现,并在交付说明中列出原因、影响范围和版本升级要求。
95
+ - 从 C# Controller 迁移到接口引擎时,前端不得继续调用旧 `/api/<Controller>/<Action>`;应统一改为 `DiyCommon.ApiEngine.Run('<ApiEngineKey>', params)`,并保留 DosResult 返回格式。
96
+ - 修改 `Microi.Server` 前必须先做四级归类并留下结论:① 现有表单引擎 CRUD/事件能完成;② 现有 V8 接口引擎能完成;③ 只缺一个可复用的底层原子能力,应先扩展 V8 再由接口引擎编排;④ 只有平台协议、可信鉴权、密钥隔离、存储/网络边界或运行时内核才允许直接写 C#。未完成归类不得直接新增 Controller/Service。
97
+ - 第三方回调必须优先采用“C# 最小协议网关 + 应用拥有的 `Managed` 核心接口引擎 + 租户拥有的 `CreateIfMissing` 扩展 Hook”。C# 只验签、解密、校验租户/AppId 和整理脱敏事件;状态、日志、数据写入、通知及业务编排放接口引擎。扩展 Hook 以稳定 `EventId` 幂等,不能因修改业务规则再次发布后端。
98
+ - 第三方平台不支持 QueryString 时使用 `/path--OsClient--{OsClient}--`;支持 Query 时参数名固定为 `?OsClient=`,不得发明 `?o=` 等缩写。路径与 Query 同时出现时必须一致。
99
+ - 第三方 HTTP 集成默认用 `V8.Http` 放在接口引擎;若平台密钥绝不能进入可编辑 V8,只在 C# 暴露最小、租户隔离、不可覆盖密钥的安全原子方法,业务字段选择、状态流转和页面动作仍由接口引擎/表单事件编排。
100
+ - 平台级强制安全校验不能为了“全部低代码化”放进租户可编辑脚本而被绕过;可以留在 C#,但必须是通用、失败关闭的安全边界,不得夹带某个项目的业务文案、字段组合或状态机。
101
+
102
+ <!-- /microi-progressive:chunk -->
103
+ <!-- microi-progressive:chunk id=workspace-conventions-018 sha256=e33b8387bbe8dbc400249ca9d16f91656149492f5f7ce253cbfa67b80f4ca8ef -->
104
+ ## 应用商城优先于 Microi.Upgrade(强制)
105
+
106
+ 能由应用包声明、差异安装和回读验收完成的升级,不得在 `Microi.Server/Microi.Upgrade/` 新增定制 .NET 升级类。表、字段、Tab、菜单、角色权限、接口引擎、表单事件、数据源、页面、打印、工作流、任务及可幂等安装的种子数据,默认都属于应用商城资源。
107
+
108
+ - 应用包中的接口引擎必须声明 `ResourcePolicies.ApiEngines`:当前包声明为 `Managed` 的资源以本次选定且已校验的包正文为最终事实,同版本重装、目标端源码/版本差异、软删除、稳定 Id 或路由占用都自动覆盖或重映射;`BaseHash/LocalHash` 只保留审计,不得再形成整包冲突。当前包声明为 `CreateIfMissing` 的租户 Hook 只在 Key 完全不存在时创建,既有记录(含禁用或软删除)保持原样。覆盖范围只限包拥有的声明式资源,禁止整表清空业务数据或覆盖 `InsertIfMissing` 租户配置值。
109
+ - 吾码官方开发者若可调用绑定 `https://api.itdos.com`、`OsClient=iTdos` 的 `microi_itdos`,必须先在官方主租户通过 MCP 更新资源,重新制作并发布对应官方应用,发布后按字段/菜单/引擎/包版本回读;再用目标租户 MCP 安装/更新并轮询后台任务到 `Succeeded`。
110
+ - 当前用户没有 `microi_itdos` 权限时,通过其自己的 MCP/Manifest 幂等升级自己的数据库并回读;不得为了单个租户把定制迁移塞进通用后端。确需让更多用户复用时,应生成其有权维护的社区/私有应用包。
111
+ - 只有应用商城运行前就必须存在的物理兼容基础、跨版本核心协议迁移、存储格式变化,或安装器自身无法安全表达的不可逆平台迁移,才允许进入 `Microi.Upgrade`。每个例外必须写明“为什么应用包不能完成”、影响范围、回滚/前后兼容、分布式幂等和验收依据。
112
+ - 自动恢复只保证启动、普通登录、菜单导航和应用商城安装/更新,SSO、AI、通知、备份、OCR、翻译等应用不能成为自动升级或启动门禁。完整官方资源放在 `Microi.Server/OfficialApplications/Resource/`,按显式清单生成 `Microi.Upgrade/Resource/` 的两项恢复资源;完整官方包的增长不得自动扩大启动闭包。更高版本且就绪的手动商城更新和既有租户 Hook 保留,失败不推进版本。
113
+ - 允许的 .NET 迁移只能按持久化版本/迁移账本执行待办步骤,使用共享租约且业务幂等;禁止把新迁移同时加入版本链和“每次启动无条件全租户对账”列表。启动成本必须与待执行迁移数相关,不能随历史升级文件总数对每个租户线性增长。
114
+ - 评审 `Microi.Upgrade` PR 时先做资源分类:若只是补字段、Tab 或低代码元数据,移出升级器并发布应用包;若保留 C#,必须提供双节点、重复启动、租约丢失、失败不推进版本以及旧新节点共存测试。
115
+
116
+ <!-- /microi-progressive:chunk -->
117
+ <!-- microi-progressive:chunk id=workspace-conventions-019 sha256=333125c854376da9f58b988c0ff2e4e94592de5437107182da838878ceb6b447 -->
118
+ ## 在线 AI 应用上下文默认发现规则(强制)
119
+
120
+ AI 开始处理定制页面、弹窗、Web、UniApp、微服务或应用商城任务时,不能只搜索本地目录。只要当前 MCP 已连接到目标 `OsClient`,必须先读取在线 AI 应用上下文:
121
+
122
+ 1. 调用 `microi_list_applications` 获取当前租户全部 `Web / UniApp / MicroService` 应用和完整文件清单。
123
+ 2. 找到候选应用后调用 `microi_get_application_context`,默认 `includeContents=true`,读取所有可读源码内容以及微服务运行页面。
124
+ 3. 只需核对单个大文件或二进制文件时,再调用 `microi_get_application_file` 精确读取。
125
+ 4. 已存在合适微服务时优先在原应用内新增页面/路由;不存在时才调用 `microi_create_microservice`、`microi_sync_microservice_source`、`microi_publish_microservice` 创建并发布。
126
+
127
+ 三个读取工具的关键参数:
128
+
129
+ | 工具 | 参数 | 说明 |
130
+ |---|---|---|
131
+ | `microi_list_applications` | `appType` | 可选:`Web`、`UniApp`、`MicroService`;省略表示全部类型 |
132
+ | | `keyword` | 可选:按名称、`AppKey`、类型、描述筛选 |
133
+ | | `includeFiles` | 默认 `true`,返回每个应用完整文件清单 |
134
+ | `microi_get_application_context` | `appIdOrKey` | 必填,支持统一应用商城 `sys_microistore.Id` 或 `AppKey` |
135
+ | | `includeContents` | 默认 `true`;读取私有 HDFS 源码内容 |
136
+ | | `maxFileBytes` | 可选,默认单文件 2MB |
137
+ | | `maxTotalBytes` | 可选,默认单应用 50MB |
138
+ | `microi_get_application_file` | `appIdOrKey`、`filePath` | 必填;`filePath` 必须来自文件清单 |
139
+
140
+ 如果 MCP 返回登录过期,必须先修复或刷新目标 MCP 身份,再继续把 MCP 读取结果当作当前事实;不能因为读取失败就假设在线应用不存在并重复创建。
141
+
142
+ <!-- /microi-progressive:chunk -->
143
+ <!-- microi-progressive:chunk id=workspace-conventions-020 sha256=60e6dac03e25861d4e0507c30ab28d28e26ada4cbe3231c3b029eb2367dc7224 -->
144
+ ## VS Code 插件空目录生成规则
145
+
146
+ Microi.Agent 面向普通用户时,用户本地可能只是一个空工作区。插件生成 AI 指令文件时不能假设用户已经有 `microi.skills/`、`Microi-V8-Engine/`、`AI-Project/` 或某个固定前端项目目录。
147
+
148
+ 强制要求:
149
+ - 插件的“初始化AI配置”必须能在空目录生成 `microi.skills/`、`.github/copilot-instructions.md`、`AGENTS.md`、`CLAUDE.md`、`.cursorrules`、`.cursor/rules/microi-skills.mdc`、类型提示、`jsconfig.json` 和 MCP 配置。
150
+ - Cursor rule 的 `globs` 必须覆盖任意新建项目目录下的常见源码、配置和文档文件,例如 `**/*.{vue,js,ts,jsx,tsx,css,scss,json,md,mdc,cs,csproj,xml,yml,yaml}`,不能只覆盖 `Microi-V8-Engine/**/*.js`。
151
+ - 生成文案必须明确:普通用户不需要手动克隆 skills,也不需要每次对 AI 说“严格遵循 microi.skills”;只要插件初始化成功,AI 就应默认按 skills 工作。
152
+ - 插件升级时应继续保护用户本地修改过的 skill 文件,只覆盖插件曾生成且用户未改过的文件。
153
+
154
+ <!-- /microi-progressive:chunk -->
155
+ <!-- microi-progressive:chunk id=workspace-conventions-021 sha256=963e489e2bdda4614c8b3089830b8bb855603dbd4338ddcc7ae29519d560766f -->
156
+ ## Microi 版本号规则
157
+
158
+ Microi 通用版本号采用 `主版本.次版本.修订版本` 三段数字格式,从 `1.0.0` 开始。每次发布时最后一位加 1;当某一位超过 `9` 时向前一位进位并将当前位归 `0`,例如 `1.0.9 -> 1.1.0`、`1.9.9 -> 2.0.0`、`9.9.9 -> 10.0.0`。
159
+
160
+ 接口引擎代码头、表单/工作流 V8 事件代码头、前端微服务 `sys_microiservice.BuildVersion` 与 `sys_microiservice_page.BuildVersion` 这类业务发布版本统一使用带 `v` 前缀的格式:`v1.0.0 -> v1.0.1 -> v1.0.9 -> v1.1.0 -> v1.9.9 -> v2.0.0 -> v9.9.9 -> v10.0.0`。禁止使用时间戳、随机串或日期作为 BuildVersion;前端微服务上传到分布式存储的目录也必须使用同一个 BuildVersion 分段,便于回溯与 CDN 缓存隔离。
161
+
162
+ `Microi.Agent` 发布时会通过 `bump-version.js` 自动自增插件版本,并把 `microi.skills/.microi-skills-version.json` 中的 skills 发布版本写成同一个插件版本号;skills 不再独立自增。`.microi-skills-version.json` 只用于记录 skills 包版本和提示用户当前来源,不能单独作为覆盖依据。
163
+
164
+ 插件初始化或升级同步 `microi.skills/` 时,必须以 `.microi-skills-manifest.json` 的逐文件 hash 判断是否可覆盖:本地文件不存在则写入;本地文件与旧 manifest hash 一致说明用户未改,可自动升级;本地文件已被用户修改、或本地版本比插件捆绑版本更新时,必须保留用户版本并提示差异。不能因为插件版本号更高或更低,就粗暴覆盖本地 skills。创始人本地随时修改 skills 的工作区尤其要保护;普通用户未修改过的旧 skills 才应该被最新插件覆盖升级。
165
+
166
+ <!-- /microi-progressive:chunk -->
167
+ <!-- microi-progressive:chunk id=workspace-conventions-022 sha256=709c669676154b9b469feefad4761544a8cb29fba2e050262b26390c1c4e327c -->
168
+ ## C# dynamic 强类型落地规则
169
+
170
+ 后端源码中从 `dynamic`、`JObject`、`ExpandoObject`、表单参数或 `DynamicHelper` 读取出来的值,如果后续要调用字符串方法、扩展方法或参与强类型判断,必须先显式落到强类型变量。不要用 `var` 承接 `DynamicHelper.GetDynamicStringValue(...)` 后再调用 `DosIsNullOrWhiteSpace()` 这类扩展方法,因为调用点可能仍按 dynamic 绑定,运行时会出现 `'string' does not contain a definition for ...`。
171
+
172
+ 错误写法:
173
+
174
+ ```csharp
175
+ var tableName = DynamicHelper.GetDynamicStringValue(diyTableModel, "Name", "");
176
+ if (tableName.DosIsNullOrWhiteSpace()) { return; }
177
+ ```
178
+
179
+ 推荐写法:
180
+
181
+ ```csharp
182
+ string tableName = DynamicHelper.GetDynamicStringValue(diyTableModel, "Name", "");
183
+ if (string.IsNullOrWhiteSpace(tableName)) { return; }
184
+ ```
185
+
186
+ 如果方法内部只通过 `DynamicHelper` 读取对象字段,方法参数优先声明为 `object`,不要声明为 `dynamic`。这样可以减少 C# 运行时动态绑定进入普通字符串工具链的机会。
187
+
188
+ <!-- /microi-progressive:chunk -->
189
+ <!-- microi-progressive:chunk id=workspace-conventions-023 sha256=4ef009cbfca343640e69ccdb6be47f3cb13ad8a67f9ff770debce20c919f1bb3 -->
190
+ ## 根目录保留文件说明
191
+
192
+ 根目录只允许存在以下类型的文件和目录:
193
+
194
+ | 路径 | 说明 | 是否可删除 |
195
+ |------|------|-----------|
196
+ | `.github/` | GitHub Actions、Copilot 配置 | 否 |
197
+ | `.venv/` | Python 虚拟环境,AI 代理使用 | 否(必要) |
198
+ | `.vscode/` | VS Code 工作区配置 | 否 |
199
+ | `microi.skills/` | 通用技能文档库 | 否 |
200
+ | `Microi.Server/` | .NET 后端 | 否 |
201
+ | `Microi.Client/` | PC 前端 Vue3 | 否 |
202
+ | `microi-v8-engine/` | V8 接口引擎代码 | 否 |
203
+ | `AI-Project/` | 各租户/项目 | 否 |
204
+ | `switch-env.ps1` | 本地环境切换工具 | 否(有用) |
205
+ | `.tmp/` | AI 临时文件(gitignored) | 可删整个目录 |
206
+ | `.microi-e2e/` | Microi.Agent 插件 E2E 产物 | 可定期清理 |
207
+ | `.microi-performance/` | 性能测试报告 | 可定期清理 |
208
+
209
+ <!-- /microi-progressive:chunk -->