@givolt/i3-composer-agent 3.2.1 → 4.0.1

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 (611) hide show
  1. package/.agents/plugins/marketplace.json +1 -1
  2. package/.claude/commands/i3-build.md +1 -0
  3. package/.claude/commands/i3-code-simplify.md +1 -0
  4. package/.claude/commands/i3-constraints.md +1 -0
  5. package/.claude/commands/i3-plan.md +1 -0
  6. package/.claude/commands/i3-review.md +1 -0
  7. package/.claude/commands/i3-ship.md +1 -0
  8. package/.claude/commands/i3-spec.md +1 -0
  9. package/.claude/commands/i3-test.md +1 -0
  10. package/.claude/commands/i3-webperf.md +1 -0
  11. package/.claude-plugin/marketplace.json +1 -1
  12. package/.claude-plugin/plugin.json +1 -1
  13. package/.codex-plugin/plugin.json +2 -2
  14. package/README.md +31 -25
  15. package/bin/i3-composer-agent.cjs +4 -59
  16. package/bin/install.cjs +6 -14
  17. package/bin/native-layout.cjs +11 -2
  18. package/bin/native-migration.cjs +68 -28
  19. package/bin/retired-custom-fingerprints.json +1597 -0
  20. package/bin/wizard.cjs +2 -13
  21. package/docs/antigravity-setup.md +3 -1
  22. package/docs/codebuddy-setup.md +19 -76
  23. package/docs/codex-setup.md +10 -4
  24. package/docs/comparison.md +1 -1
  25. package/docs/copilot-cli-setup.md +4 -4
  26. package/docs/cursor-setup.md +1 -1
  27. package/docs/gemini-cli-setup.md +1 -1
  28. package/docs/other-hosts.md +2 -2
  29. package/docs/windsurf-setup.md +2 -2
  30. package/docs/workbuddy-setup.md +9 -16
  31. package/evals/README.md +10 -0
  32. package/evals/cases/i3-code-simplification.json +8 -0
  33. package/evals/cases/i3-documentation-and-adrs.json +4 -0
  34. package/evals/cases/i3-enterprise-sop.json +1 -1
  35. package/evals/cases/i3-frontend-ui-engineering.json +1 -1
  36. package/evals/cases/i3-security-and-hardening.json +4 -0
  37. package/evals/cases/i3-ui-demo.json +2 -2
  38. package/evals/cases/i3-using-agent-skills.json +5 -5
  39. package/evals/plugin/simplify-fires-on-pasted-function/graders/behavior-kept-and-explained.md +7 -0
  40. package/evals/plugin/simplify-fires-on-pasted-function/graders/skill-fired.md +5 -0
  41. package/evals/plugin/simplify-fires-on-pasted-function/prompt.md +30 -0
  42. package/evals/plugin/simplify-stays-quiet-on-make-it-fast/graders/not-fired.md +8 -0
  43. package/evals/plugin/simplify-stays-quiet-on-make-it-fast/prompt.md +20 -0
  44. package/evals/zh-CN/cases/i3-code-simplification.json +8 -0
  45. package/evals/zh-CN/cases/i3-documentation-and-adrs.json +4 -0
  46. package/evals/zh-CN/cases/i3-enterprise-sop.json +1 -1
  47. package/evals/zh-CN/cases/i3-frontend-ui-engineering.json +2 -2
  48. package/evals/zh-CN/cases/i3-security-and-hardening.json +4 -0
  49. package/evals/zh-CN/cases/i3-ui-demo.json +2 -2
  50. package/evals/zh-CN/cases/i3-using-agent-skills.json +6 -6
  51. package/hooks/SDD-CACHE.md +1 -1
  52. package/package.json +13 -80
  53. package/plugin.json +15 -2
  54. package/references/accessibility-checklist.md +4 -4
  55. package/references/performance-checklist.md +5 -4
  56. package/references/testing-patterns.md +2 -1
  57. package/scripts/floor-guard-reference-test.js +32 -0
  58. package/scripts/lib/execution-status.js +44 -0
  59. package/scripts/run-evals-test.js +157 -7
  60. package/scripts/run-evals.js +59 -12
  61. package/scripts/ui-demo-test.js +2 -2
  62. package/scripts/validate-artifact-paths-test.js +14 -0
  63. package/scripts/validate-artifact-paths.js +4 -2
  64. package/skills/i3-api-and-interface-design/SKILL.md +3 -1
  65. package/skills/i3-ci-cd-and-automation/SKILL.md +7 -4
  66. package/skills/i3-code-simplification/SKILL.md +3 -3
  67. package/skills/i3-constraint-driven-development/SKILL.md +4 -4
  68. package/skills/i3-constraint-driven-development/references/floor-guard.md +2 -2
  69. package/skills/i3-context-engineering/SKILL.md +1 -1
  70. package/skills/i3-debugging-and-error-recovery/SKILL.md +1 -1
  71. package/skills/i3-deprecation-and-migration/SKILL.md +6 -1
  72. package/skills/i3-documentation-and-adrs/SKILL.md +3 -2
  73. package/skills/i3-enterprise-sop/SKILL.md +38 -71
  74. package/skills/i3-enterprise-sop/references/engineering-skeleton/directory-standard.md +7 -7
  75. package/skills/i3-enterprise-sop/references/handoff.py +149 -120
  76. package/skills/i3-enterprise-sop/references/technical-baseline/baselines/enterprise-application-technical-baseline-v0-0-4.md +24 -24
  77. package/skills/i3-enterprise-sop/references/technical-baseline/templates/technical-baseline.md +8 -8
  78. package/skills/i3-enterprise-sop/references/templates/ad.md +31 -31
  79. package/skills/i3-enterprise-sop/references/templates/brd.md +6 -6
  80. package/skills/i3-enterprise-sop/references/templates/prd.md +37 -37
  81. package/skills/i3-enterprise-sop/references/templates/testcase.md +25 -25
  82. package/skills/i3-frontend-ui-engineering/SKILL.md +6 -10
  83. package/skills/i3-idea-refine/SKILL.md +4 -2
  84. package/skills/i3-incremental-implementation/SKILL.md +0 -4
  85. package/skills/i3-performance-optimization/SKILL.md +2 -2
  86. package/skills/i3-security-and-hardening/references/hardening-patterns.md +5 -0
  87. package/skills/i3-source-driven-development/SKILL.md +3 -2
  88. package/skills/i3-spec-driven-development/SKILL.md +1 -1
  89. package/skills/i3-ui-demo/SKILL.md +3 -1
  90. package/skills/i3-ui-demo/references/dependencies.md +1 -1
  91. package/skills/i3-ui-demo/references/resources.md +1 -1
  92. package/skills/i3-ui-demo/scripts/dependencies.cjs +0 -3
  93. package/skills/i3-using-agent-skills/SKILL.md +2 -2
  94. package/.claude/commands/i3-prototype.md +0 -23
  95. package/.gemini/commands/i3-prototype.toml +0 -23
  96. package/commands/i3-prototype.toml +0 -23
  97. package/evals/cases/i3-ui-prototype.json +0 -158
  98. package/evals/fixtures/i3-ui-prototype/admin-list/assets/reference.css +0 -3
  99. package/evals/fixtures/i3-ui-prototype/admin-list/assets/reference.js +0 -8
  100. package/evals/fixtures/i3-ui-prototype/admin-list/capability-definition.json +0 -67
  101. package/evals/fixtures/i3-ui-prototype/admin-list/index.html +0 -89
  102. package/evals/fixtures/i3-ui-prototype/admin-list/readme.md +0 -52
  103. package/evals/fixtures/i3-ui-prototype/admin-list/template.json +0 -8
  104. package/evals/fixtures/i3-ui-prototype/business-brief.md +0 -7
  105. package/evals/zh-CN/cases/i3-ui-prototype.json +0 -165
  106. package/hooks/PROTOTYPE.md +0 -31
  107. package/hooks/codebuddy-upstream.cjs +0 -93
  108. package/hooks/i3-prototype.cjs +0 -7
  109. package/hooks/manage.cjs +0 -169
  110. package/scripts/design-provider-discovery-test.js +0 -190
  111. package/scripts/design-provider-test.js +0 -75
  112. package/scripts/enterprise-template-test.js +0 -205
  113. package/scripts/lib/prototype-fixture.cjs +0 -17
  114. package/scripts/prototype-cache-test.js +0 -55
  115. package/scripts/prototype-generation-entry-test.js +0 -6
  116. package/scripts/prototype-generation-evidence-test.js +0 -10
  117. package/scripts/prototype-generation-native-test.js +0 -78
  118. package/scripts/prototype-generation-test.js +0 -99
  119. package/scripts/prototype-inventory-test.js +0 -43
  120. package/scripts/prototype-locations-test.js +0 -79
  121. package/scripts/prototype-project-test.js +0 -183
  122. package/scripts/template-adapter-test.js +0 -155
  123. package/scripts/ui-prototype-binding-recovery-test.js +0 -84
  124. package/scripts/ui-prototype-buddy-lifecycle-test.js +0 -102
  125. package/scripts/ui-prototype-codebuddy-hook-test.js +0 -112
  126. package/scripts/ui-prototype-content-test.js +0 -123
  127. package/scripts/ui-prototype-dependencies-test.js +0 -226
  128. package/scripts/ui-prototype-devtools-test.js +0 -53
  129. package/scripts/ui-prototype-execution-evidence-test.js +0 -62
  130. package/scripts/ui-prototype-execution-gates-test.js +0 -91
  131. package/scripts/ui-prototype-execution-policy-test.js +0 -53
  132. package/scripts/ui-prototype-execution-runtime-test.js +0 -27
  133. package/scripts/ui-prototype-ide-source-test.js +0 -73
  134. package/scripts/ui-prototype-native-test.js +0 -526
  135. package/scripts/ui-prototype-recovery-test.js +0 -81
  136. package/scripts/ui-prototype-registration-test.js +0 -53
  137. package/scripts/ui-prototype-template-test.js +0 -261
  138. package/scripts/ui-prototype-test.js +0 -124
  139. package/scripts/ui-prototype-transcript-auto-test.js +0 -67
  140. package/skills/i3-ui-prototype/SKILL.md +0 -256
  141. package/skills/i3-ui-prototype/assets/capabilities/generation.json +0 -833
  142. package/skills/i3-ui-prototype/assets/capabilities/management.json +0 -294
  143. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/acceptance.json +0 -51
  144. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/component-map.json +0 -13
  145. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/generation-component-map.json +0 -300
  146. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/index.html +0 -11
  147. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/package-lock.json +0 -2298
  148. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/package.json +0 -22
  149. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/public/prototype-config.json +0 -6
  150. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/App.vue +0 -136
  151. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/components/DeviceEditor.vue +0 -111
  152. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/config.ts +0 -19
  153. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/content.ts +0 -28
  154. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/domain/devices.ts +0 -50
  155. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/domain/theme.ts +0 -25
  156. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/main.ts +0 -18
  157. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/style.css +0 -50
  158. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/useDevices.ts +0 -66
  159. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/tests/devices.test.ts +0 -44
  160. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/tests/theme.test.ts +0 -26
  161. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/tsconfig.json +0 -15
  162. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/vite.config.ts +0 -4
  163. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/profile.json +0 -174
  164. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/readme.md +0 -61
  165. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/index.html +0 -11
  166. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/package-lock.json +0 -2298
  167. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/package.json +0 -22
  168. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/public/prototype-config.json +0 -21
  169. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/App.vue +0 -62
  170. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/PrototypeShell.vue +0 -59
  171. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/config.ts +0 -23
  172. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/domain/presentation.ts +0 -29
  173. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/domain/theme.ts +0 -25
  174. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/main.ts +0 -18
  175. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/style.css +0 -26
  176. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/tests/presentation.test.ts +0 -23
  177. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/tests/theme.test.ts +0 -26
  178. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/tsconfig.json +0 -15
  179. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/vite.config.ts +0 -4
  180. package/skills/i3-ui-prototype/assets/hosts/codebuddy/profile.json +0 -17
  181. package/skills/i3-ui-prototype/assets/optional-skills/host-targets.json +0 -739
  182. package/skills/i3-ui-prototype/assets/optional-skills/sources.json +0 -27
  183. package/skills/i3-ui-prototype/assets/templates/catalog.js +0 -149
  184. package/skills/i3-ui-prototype/assets/templates/catalog.json +0 -149
  185. package/skills/i3-ui-prototype/assets/templates/classic-admin/manifest.json +0 -9
  186. package/skills/i3-ui-prototype/assets/templates/classic-admin/preset.json +0 -6
  187. package/skills/i3-ui-prototype/assets/templates/common/app/app.mjs +0 -89
  188. package/skills/i3-ui-prototype/assets/templates/common/app/config.json +0 -1
  189. package/skills/i3-ui-prototype/assets/templates/common/app/domain.mjs +0 -20
  190. package/skills/i3-ui-prototype/assets/templates/common/app/index.html +0 -17
  191. package/skills/i3-ui-prototype/assets/templates/common/app/serve.cjs +0 -16
  192. package/skills/i3-ui-prototype/assets/templates/common/app/styles.css +0 -670
  193. package/skills/i3-ui-prototype/assets/templates/common/app/tokens.css +0 -19
  194. package/skills/i3-ui-prototype/assets/templates/common/design-system/master.md +0 -20
  195. package/skills/i3-ui-prototype/assets/templates/common/gallery.html +0 -2
  196. package/skills/i3-ui-prototype/assets/templates/common/mocks/applications.json +0 -5
  197. package/skills/i3-ui-prototype/assets/templates/common/requirements-map.json +0 -8
  198. package/skills/i3-ui-prototype/assets/templates/common/serve-gallery.cjs +0 -16
  199. package/skills/i3-ui-prototype/assets/templates/credits.md +0 -17
  200. package/skills/i3-ui-prototype/assets/templates/data-operations/manifest.json +0 -9
  201. package/skills/i3-ui-prototype/assets/templates/data-operations/preset.json +0 -6
  202. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/capability-definition.json +0 -294
  203. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/component-inventory.json +0 -707
  204. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/design-system.md +0 -32
  205. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/generation.json +0 -49
  206. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/index.html +0 -534
  207. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/manifest.json +0 -9
  208. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/offline-build.json +0 -265
  209. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/offline.js +0 -8888
  210. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/origin.json +0 -344
  211. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/preset.json +0 -928
  212. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/app.js +0 -22
  213. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/empty.svg +0 -1
  214. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/reference-styles.json +0 -1
  215. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/result-403.svg +0 -1
  216. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/result-404.svg +0 -1
  217. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets-manifest.json +0 -334
  218. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/baseline.json +0 -173
  219. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/conversion.md +0 -30
  220. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/credits.md +0 -17
  221. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/design-tokens.json +0 -881
  222. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/index.html +0 -28
  223. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/@qin-ui-antdv-next-pro.txt +0 -9
  224. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/ant-design-icons.txt +0 -22
  225. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/antdv-next.txt +0 -21
  226. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/package.json +0 -12
  227. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/browser-routes.json +0 -298
  228. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/coverage.json +0 -180
  229. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/integrity.json +0 -13
  230. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/keyboard.json +0 -11
  231. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/responsive.json +0 -125
  232. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/review.md +0 -51
  233. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/rules.log +0 -150
  234. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-html.png +0 -0
  235. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-original.png +0 -0
  236. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-html.png +0 -0
  237. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-original.png +0 -0
  238. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/models-html.png +0 -0
  239. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/models-original.png +0 -0
  240. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-html.png +0 -0
  241. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-original.png +0 -0
  242. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/selection.json +0 -9
  243. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/visual-comparison.json +0 -342
  244. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/readme.md +0 -73
  245. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/reference.md +0 -59
  246. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/routes.json +0 -178
  247. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/controls.js +0 -99
  248. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/dialogs.js +0 -54
  249. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/dom.js +0 -264
  250. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/forms.js +0 -47
  251. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/icons.js +0 -41
  252. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/layout.js +0 -47
  253. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/router.js +0 -63
  254. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/state.js +0 -90
  255. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/table.js +0 -41
  256. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/widgets.js +0 -8
  257. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.html +0 -3
  258. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.js +0 -36
  259. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.html +0 -2
  260. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.js +0 -51
  261. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.html +0 -3
  262. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.js +0 -48
  263. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/CheckResults.html +0 -2
  264. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/CheckResults.js +0 -6
  265. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.html +0 -2
  266. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.js +0 -13
  267. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/data.js +0 -24
  268. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/domain.js +0 -32
  269. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/registry.js +0 -25
  270. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/store.js +0 -85
  271. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentClose.html +0 -2
  272. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentClose.js +0 -17
  273. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.html +0 -2
  274. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.js +0 -66
  275. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.html +0 -3
  276. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.js +0 -38
  277. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.html +0 -2
  278. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.js +0 -66
  279. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.html +0 -2
  280. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.js +0 -5
  281. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.html +0 -2
  282. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.js +0 -12
  283. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.html +0 -2
  284. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.js +0 -11
  285. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentList.html +0 -2
  286. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentList.js +0 -116
  287. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.html +0 -2
  288. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.js +0 -32
  289. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.html +0 -2
  290. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.js +0 -49
  291. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.html +0 -2
  292. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.js +0 -10
  293. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.html +0 -2
  294. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.js +0 -77
  295. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/data.js +0 -60
  296. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/domain.js +0 -105
  297. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/store.js +0 -212
  298. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/AuditPanel.html +0 -2
  299. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/AuditPanel.js +0 -18
  300. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelDetail.html +0 -2
  301. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelDetail.js +0 -23
  302. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelEditor.html +0 -2
  303. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelEditor.js +0 -78
  304. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelGrant.html +0 -2
  305. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelGrant.js +0 -55
  306. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelReferences.html +0 -2
  307. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelReferences.js +0 -26
  308. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelRelease.html +0 -2
  309. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelRelease.js +0 -38
  310. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelStatus.html +0 -2
  311. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelStatus.js +0 -7
  312. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTable.html +0 -2
  313. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTable.js +0 -72
  314. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTester.html +0 -2
  315. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTester.js +0 -46
  316. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelsPage.html +0 -2
  317. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelsPage.js +0 -52
  318. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/RowActions.html +0 -2
  319. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/RowActions.js +0 -19
  320. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/UsagePanel.html +0 -2
  321. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/UsagePanel.js +0 -30
  322. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/data.js +0 -48
  323. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/domain.js +0 -39
  324. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/store.js +0 -129
  325. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.html +0 -4
  326. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.js +0 -21
  327. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IntentSource.html +0 -2
  328. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IntentSource.js +0 -8
  329. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.html +0 -2
  330. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.js +0 -37
  331. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.html +0 -2
  332. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.js +0 -10
  333. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.html +0 -2
  334. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.js +0 -37
  335. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.html +0 -2
  336. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.js +0 -49
  337. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RunDetail.html +0 -4
  338. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RunDetail.js +0 -22
  339. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.html +0 -2
  340. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.js +0 -9
  341. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/commands.js +0 -82
  342. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/examples.js +0 -47
  343. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/model.js +0 -61
  344. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/repair.js +0 -68
  345. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/store.js +0 -55
  346. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/types.js +0 -1
  347. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/workbench.js +0 -18
  348. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.html +0 -3
  349. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.js +0 -28
  350. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.html +0 -2
  351. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.js +0 -18
  352. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.html +0 -2
  353. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.js +0 -31
  354. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.html +0 -2
  355. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.js +0 -27
  356. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.html +0 -2
  357. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.js +0 -16
  358. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.html +0 -2
  359. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.js +0 -43
  360. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.html +0 -4
  361. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.js +0 -34
  362. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.html +0 -2
  363. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.js +0 -30
  364. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.html +0 -3
  365. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.js +0 -67
  366. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.html +0 -2
  367. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.js +0 -41
  368. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.html +0 -2
  369. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.js +0 -31
  370. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.html +0 -2
  371. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.js +0 -26
  372. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.html +0 -2
  373. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.js +0 -70
  374. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/data.js +0 -8
  375. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/domain.js +0 -62
  376. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/management.js +0 -36
  377. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/managementStore.js +0 -49
  378. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/store.js +0 -132
  379. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/AdminList.html +0 -2
  380. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/AdminList.js +0 -38
  381. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.html +0 -2
  382. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.js +0 -11
  383. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.html +0 -2
  384. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.js +0 -45
  385. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.html +0 -2
  386. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.js +0 -54
  387. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.html +0 -3
  388. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.js +0 -27
  389. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.html +0 -2
  390. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.js +0 -12
  391. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.html +0 -2
  392. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.js +0 -45
  393. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.html +0 -3
  394. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.js +0 -38
  395. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/domain.js +0 -61
  396. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/state.js +0 -51
  397. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/store.js +0 -116
  398. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.html +0 -2
  399. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.js +0 -45
  400. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.html +0 -4
  401. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.js +0 -30
  402. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.html +0 -2
  403. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.js +0 -67
  404. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.html +0 -2
  405. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.js +0 -5
  406. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.html +0 -4
  407. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.js +0 -60
  408. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/commands.js +0 -157
  409. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/model.js +0 -136
  410. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/store.js +0 -76
  411. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.html +0 -3
  412. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.js +0 -26
  413. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.html +0 -2
  414. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.js +0 -14
  415. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.html +0 -2
  416. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.js +0 -113
  417. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.html +0 -3
  418. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.js +0 -62
  419. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/commands.js +0 -97
  420. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/model.js +0 -147
  421. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/store.js +0 -13
  422. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.html +0 -2
  423. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.js +0 -9
  424. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.html +0 -2
  425. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.js +0 -8
  426. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.html +0 -2
  427. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.js +0 -37
  428. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListMore.html +0 -2
  429. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListMore.js +0 -8
  430. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.html +0 -2
  431. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.js +0 -17
  432. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/columns.js +0 -32
  433. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/deliveryGuide.js +0 -49
  434. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/deliveryView.js +0 -12
  435. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/listBatch.js +0 -15
  436. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/listSelection.js +0 -37
  437. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/policy.js +0 -68
  438. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/session.js +0 -44
  439. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.html +0 -2
  440. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.js +0 -25
  441. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.html +0 -2
  442. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.js +0 -53
  443. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.html +0 -10
  444. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.js +0 -30
  445. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ScopePage.html +0 -2
  446. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ScopePage.js +0 -10
  447. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.html +0 -2
  448. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.js +0 -9
  449. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/confirmation.js +0 -3
  450. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/navigation.js +0 -19
  451. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.html +0 -2
  452. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.js +0 -8
  453. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.html +0 -2
  454. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.js +0 -32
  455. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.html +0 -2
  456. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.js +0 -15
  457. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.html +0 -2
  458. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.js +0 -11
  459. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecReview.html +0 -2
  460. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecReview.js +0 -57
  461. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.html +0 -2
  462. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.js +0 -37
  463. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/data.js +0 -20
  464. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/domain.js +0 -55
  465. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/store.js +0 -151
  466. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.html +0 -3
  467. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.js +0 -18
  468. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.html +0 -2
  469. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.js +0 -40
  470. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.html +0 -2
  471. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.js +0 -51
  472. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.html +0 -2
  473. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.js +0 -9
  474. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.html +0 -5
  475. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.js +0 -48
  476. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/domain.js +0 -204
  477. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/exampleSource.js +0 -22
  478. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/registry.js +0 -135
  479. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/store.js +0 -137
  480. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.html +0 -3
  481. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.js +0 -36
  482. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/model.js +0 -56
  483. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/store.js +0 -15
  484. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.html +0 -2
  485. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.js +0 -27
  486. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.html +0 -4
  487. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.js +0 -31
  488. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.html +0 -2
  489. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.js +0 -68
  490. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.html +0 -5
  491. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.js +0 -55
  492. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/data.js +0 -16
  493. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/domain.js +0 -83
  494. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/registry.js +0 -18
  495. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/store.js +0 -61
  496. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/admin.css +0 -60
  497. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/agents.css +0 -46
  498. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/antdv.css +0 -295
  499. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/app.css +0 -102
  500. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/delivery.css +0 -4
  501. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/intents.css +0 -37
  502. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/native.css +0 -22
  503. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/operations.css +0 -2
  504. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/pbc.css +0 -3
  505. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/permissions.css +0 -22
  506. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/pro.css +0 -1
  507. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/releases.css +0 -4
  508. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/reset.css +0 -246
  509. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/reviews.css +0 -8
  510. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/tasks.css +0 -6
  511. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/tokens.css +0 -15
  512. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/workbench.css +0 -61
  513. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/workflows.css +0 -1
  514. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/admin-rules.test.js +0 -96
  515. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/agents.test.js +0 -14
  516. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/intent-state.test.js +0 -37
  517. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/list-batch.test.js +0 -44
  518. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operation-fixtures.js +0 -19
  519. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operation-repair.test.js +0 -14
  520. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operations.test.js +0 -25
  521. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/pbc-management.test.js +0 -17
  522. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/pbc-state.test.js +0 -24
  523. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/permission-config.test.js +0 -23
  524. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/permissions.test.js +0 -24
  525. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/releases.test.js +0 -50
  526. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/reviews.test.js +0 -36
  527. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-forms-router.test.js +0 -28
  528. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-state.test.js +0 -42
  529. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-stores.test.js +0 -16
  530. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/spec-state.test.js +0 -11
  531. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/tasks.test.js +0 -27
  532. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/workbench.test.js +0 -34
  533. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/workflows.test.js +0 -16
  534. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/convert.mjs +0 -168
  535. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/serve.mjs +0 -7
  536. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/styles.mjs +0 -11
  537. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/verify.mjs +0 -24
  538. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/serve.cjs +0 -16
  539. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/template-inventory.json +0 -28791
  540. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/template.json +0 -9
  541. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/usability.css +0 -44
  542. package/skills/i3-ui-prototype/assets/templates/gallery/index.html +0 -40
  543. package/skills/i3-ui-prototype/assets/templates/generation-options.js +0 -42
  544. package/skills/i3-ui-prototype/assets/templates/index.html +0 -3
  545. package/skills/i3-ui-prototype/assets/templates/modern-workspace/manifest.json +0 -9
  546. package/skills/i3-ui-prototype/assets/templates/modern-workspace/preset.json +0 -6
  547. package/skills/i3-ui-prototype/assets/templates/presentation.html +0 -17
  548. package/skills/i3-ui-prototype/assets/templates/serve-gallery.cjs +0 -23
  549. package/skills/i3-ui-prototype/references/artifact-contract.md +0 -66
  550. package/skills/i3-ui-prototype/references/content-template.md +0 -81
  551. package/skills/i3-ui-prototype/references/enterprise-admin.md +0 -44
  552. package/skills/i3-ui-prototype/references/entry-contract.md +0 -71
  553. package/skills/i3-ui-prototype/references/execution-evidence.md +0 -51
  554. package/skills/i3-ui-prototype/references/expert-adapter.md +0 -76
  555. package/skills/i3-ui-prototype/references/framework-contract.md +0 -76
  556. package/skills/i3-ui-prototype/references/generation-contract.md +0 -122
  557. package/skills/i3-ui-prototype/references/interaction-acceptance.md +0 -169
  558. package/skills/i3-ui-prototype/references/legacy-native.md +0 -58
  559. package/skills/i3-ui-prototype/references/optional-skills.md +0 -63
  560. package/skills/i3-ui-prototype/references/project-layout.md +0 -92
  561. package/skills/i3-ui-prototype/references/template-adapters.md +0 -63
  562. package/skills/i3-ui-prototype/references/workflow-contract.md +0 -77
  563. package/skills/i3-ui-prototype/scripts/adapters/easel-html.cjs +0 -30
  564. package/skills/i3-ui-prototype/scripts/adapters/legacy-html.cjs +0 -28
  565. package/skills/i3-ui-prototype/scripts/browser-workspace.cjs +0 -72
  566. package/skills/i3-ui-prototype/scripts/buddy-host.cjs +0 -40
  567. package/skills/i3-ui-prototype/scripts/check-design-provider.cjs +0 -9
  568. package/skills/i3-ui-prototype/scripts/check-prototype.cjs +0 -14
  569. package/skills/i3-ui-prototype/scripts/codebuddy-context.cjs +0 -92
  570. package/skills/i3-ui-prototype/scripts/codebuddy-hook.cjs +0 -298
  571. package/skills/i3-ui-prototype/scripts/codebuddy-ide-source.cjs +0 -69
  572. package/skills/i3-ui-prototype/scripts/codebuddy-registration.cjs +0 -125
  573. package/skills/i3-ui-prototype/scripts/content-template.cjs +0 -98
  574. package/skills/i3-ui-prototype/scripts/design-provider-discovery.cjs +0 -128
  575. package/skills/i3-ui-prototype/scripts/enterprise-template.cjs +0 -104
  576. package/skills/i3-ui-prototype/scripts/execution-assertions.cjs +0 -43
  577. package/skills/i3-ui-prototype/scripts/execution-diagnostics.cjs +0 -91
  578. package/skills/i3-ui-prototype/scripts/execution-evidence.cjs +0 -177
  579. package/skills/i3-ui-prototype/scripts/execution-gates.cjs +0 -216
  580. package/skills/i3-ui-prototype/scripts/execution-policy.cjs +0 -62
  581. package/skills/i3-ui-prototype/scripts/execution-recovery.cjs +0 -58
  582. package/skills/i3-ui-prototype/scripts/execution-runtime.cjs +0 -69
  583. package/skills/i3-ui-prototype/scripts/generation-assets.cjs +0 -18
  584. package/skills/i3-ui-prototype/scripts/generation-contract.cjs +0 -214
  585. package/skills/i3-ui-prototype/scripts/generation-evidence.cjs +0 -50
  586. package/skills/i3-ui-prototype/scripts/generation-replan.cjs +0 -34
  587. package/skills/i3-ui-prototype/scripts/hosts/codebuddy.cjs +0 -21
  588. package/skills/i3-ui-prototype/scripts/init-prototype.cjs +0 -8
  589. package/skills/i3-ui-prototype/scripts/manage-baseline.cjs +0 -11
  590. package/skills/i3-ui-prototype/scripts/native-browser.cjs +0 -785
  591. package/skills/i3-ui-prototype/scripts/native-build.cjs +0 -91
  592. package/skills/i3-ui-prototype/scripts/native-command.cjs +0 -35
  593. package/skills/i3-ui-prototype/scripts/native-delivery.cjs +0 -104
  594. package/skills/i3-ui-prototype/scripts/native-devtools.cjs +0 -92
  595. package/skills/i3-ui-prototype/scripts/native-files.cjs +0 -44
  596. package/skills/i3-ui-prototype/scripts/native-pilot-lib.cjs +0 -290
  597. package/skills/i3-ui-prototype/scripts/native-pilot.cjs +0 -59
  598. package/skills/i3-ui-prototype/scripts/native-tool-name.cjs +0 -5
  599. package/skills/i3-ui-prototype/scripts/native-tool-result.cjs +0 -14
  600. package/skills/i3-ui-prototype/scripts/optional-skill-install.cjs +0 -203
  601. package/skills/i3-ui-prototype/scripts/project-registry.cjs +0 -126
  602. package/skills/i3-ui-prototype/scripts/prototype-dependencies.cjs +0 -103
  603. package/skills/i3-ui-prototype/scripts/prototype-hooks.cjs +0 -94
  604. package/skills/i3-ui-prototype/scripts/prototype-lib.cjs +0 -277
  605. package/skills/i3-ui-prototype/scripts/prototype-locations.cjs +0 -69
  606. package/skills/i3-ui-prototype/scripts/ptc-callbacks.cjs +0 -131
  607. package/skills/i3-ui-prototype/scripts/sync-template.cjs +0 -19
  608. package/skills/i3-ui-prototype/scripts/template-adapters.cjs +0 -89
  609. package/skills/i3-ui-prototype/scripts/template-contract.cjs +0 -407
  610. package/skills/i3-ui-prototype/scripts/template-inventory.cjs +0 -78
  611. package/skills/i3-ui-prototype/scripts/validate-result.cjs +0 -117
@@ -1,22 +0,0 @@
1
- {
2
- "name": "admin-list-antdv-prototype",
3
- "version": "1.0.0",
4
- "private": true,
5
- "type": "module",
6
- "packageManager": "npm@11.12.1",
7
- "engines": { "node": ">=22.18.0", "npm": ">=10" },
8
- "scripts": {
9
- "dev": "vite --host 127.0.0.1",
10
- "typecheck": "vue-tsc --noEmit",
11
- "test": "node --experimental-strip-types --test tests/*.test.ts",
12
- "build": "vue-tsc --noEmit && vite build",
13
- "preview": "vite preview --host 127.0.0.1"
14
- },
15
- "dependencies": { "antdv-next": "1.5.3", "vue": "3.5.42" },
16
- "devDependencies": {
17
- "@vitejs/plugin-vue": "6.0.4",
18
- "typescript": "5.9.3",
19
- "vite": "7.3.1",
20
- "vue-tsc": "3.3.13"
21
- }
22
- }
@@ -1,6 +0,0 @@
1
- {
2
- "instanceId": "admin-list-preview",
3
- "storageNamespace": "prototype:admin-list-preview",
4
- "mockVersion": "devices-v1",
5
- "title": "设备管理"
6
- }
@@ -1,136 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed, h, onBeforeUnmount, ref, watch } from 'vue'
3
- import { Alert, Button, ConfigProvider, Empty, Input, Select, Space, Table, Tag, theme as antdTheme } from 'antdv-next'
4
- import zhCN from 'antdv-next/locale/zh_CN'
5
- import type { PrototypeConfig } from './config'
6
- import type { PaginationProps } from 'antdv-next'
7
- import { resolveContent } from './content'
8
- import type { Device } from './domain/devices'
9
- import DeviceEditor from './components/DeviceEditor.vue'
10
- import { useDevices } from './useDevices'
11
- import { THEME_IDS, THEME_PRESETS, resolveThemeConfig, safeThemeStorage, themeStorageKey, loadThemePreference, saveThemePreference } from './domain/theme'
12
- import type { ThemeId } from './domain/theme'
13
-
14
- const props = defineProps<{ config: PrototypeConfig }>()
15
- const content = resolveContent(props.config)
16
- const themeBinding = resolveThemeConfig(props.config.theme)
17
- const preferenceStorage = themeBinding ? safeThemeStorage(() => window.localStorage) : null
18
- const preferenceKey = themeStorageKey(props.config.storageNamespace)
19
- const themeId = ref<ThemeId>(themeBinding ? loadThemePreference(preferenceStorage, preferenceKey) : 'light')
20
- const themeWarning = ref('')
21
- const themeOptions = THEME_IDS.map(value => ({ value, label: THEME_PRESETS[value].label }))
22
- function chooseTheme(value: unknown) {
23
- if (!themeBinding || typeof value !== 'string' || !THEME_IDS.includes(value as ThemeId)) return
24
- themeId.value = value as ThemeId
25
- themeWarning.value = saveThemePreference(preferenceStorage, preferenceKey, themeId.value) ? '' : '无法保存主题偏好,本页仍可切换。'
26
- }
27
- const documentRoot = document.documentElement
28
- const oldTheme = documentRoot.getAttribute('data-prototype-theme')
29
- const oldScheme = documentRoot.style.colorScheme
30
- const previousVariables = new Map<string,string>()
31
- watch(themeId, value => {
32
- if (!themeBinding) return
33
- const preset=THEME_PRESETS[value]
34
- documentRoot.dataset.prototypeTheme=value
35
- documentRoot.style.colorScheme=preset.mode
36
- for (const name of ['primary','bg','surface','subtle','text','muted','border','accent','onPrimary'] as const) {
37
- const property=`--proto-${name === 'onPrimary' ? 'on-primary' : name}`
38
- if (!previousVariables.has(property)) previousVariables.set(property,documentRoot.style.getPropertyValue(property))
39
- documentRoot.style.setProperty(property,preset[name])
40
- }
41
- }, { immediate: true })
42
- onBeforeUnmount(() => {
43
- if (!themeBinding) return
44
- if (oldTheme === null) documentRoot.removeAttribute('data-prototype-theme'); else documentRoot.setAttribute('data-prototype-theme',oldTheme)
45
- documentRoot.style.colorScheme=oldScheme
46
- for (const [property,value] of previousVariables) { if (value) documentRoot.style.setProperty(property,value); else documentRoot.style.removeProperty(property) }
47
- })
48
- const { devices, nameInput, statusInput, page, selected, mode, notice, storageWarning, filtered, activeCount, query, changePage, bulkDisable, save, setMode, resetData } = useDevices(props.config)
49
- const editing = ref<Device | null>(null)
50
- const editorOpen = ref(false)
51
- const lifecycle = ref('closed')
52
- let opener: HTMLElement | null = null
53
- const media = window.matchMedia('(prefers-reduced-motion: reduce)')
54
- const reducedMotion = ref(media.matches)
55
- const updateMotion = (event: MediaQueryListEvent) => { reducedMotion.value = event.matches }
56
- media.addEventListener('change', updateMotion)
57
- onBeforeUnmount(() => media.removeEventListener('change', updateMotion))
58
- const theme = computed(() => {
59
- const base={ colorPrimary: '#176b56', borderRadius: 6, fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif', motion: !reducedMotion.value }
60
- if (!themeBinding) return { token: base }
61
- const preset=THEME_PRESETS[themeId.value]
62
- return { algorithm: preset.mode === 'dark' ? antdTheme.darkAlgorithm : antdTheme.defaultAlgorithm, token: { ...base, colorPrimary:preset.primary,colorBgBase:preset.bg,colorBgLayout:preset.bg,colorBgContainer:preset.surface,colorBgElevated:preset.surface,colorText:preset.text,colorTextSecondary:preset.muted,colorTextTertiary:preset.muted,colorTextQuaternary:preset.muted,colorTextDescription:preset.muted,colorTextPlaceholder:preset.muted,colorBorder:preset.border,colorBorderSecondary:preset.border,colorFillAlter:preset.subtle,controlItemBgActive:preset.subtle,controlItemBgActiveHover:preset.subtle,controlItemBgHover:preset.subtle,colorErrorText:preset.error,colorErrorTextHover:preset.error,colorErrorTextActive:preset.error,colorTextLightSolid:preset.onPrimary }, components:{Button:{colorLink:preset.accent,colorLinkHover:preset.accent,colorLinkActive:preset.accent},Tag:{colorSuccess:preset.success,colorSuccessBg:preset.subtle,colorSuccessBorder:preset.border},Form:{colorError:preset.error},Table:{headerBg:preset.subtle,rowHoverBg:preset.subtle},Select:{optionSelectedBg:preset.subtle,optionActiveBg:preset.subtle}} }
63
- })
64
- const columns = [
65
- { title: content.fields.code.label, dataIndex: 'code', key: 'code', width: 140 },
66
- { title: content.fields.name.label, dataIndex: 'name', key: 'name', ellipsis: true },
67
- { title: content.fields.category.label, dataIndex: 'category', key: 'category', width: 150 },
68
- { title: content.fields.status.label, dataIndex: 'status', key: 'status', width: 120 },
69
- { title: '操作', key: 'action', width: 100 },
70
- ]
71
- const rowSelection = computed(() => ({ selectedRowKeys: selected.value, onChange: (keys: (string | number)[]) => { selected.value = keys.map(String) }, preserveSelectedRowKeys: false }))
72
- const renderPaginationItem: PaginationProps['itemRender'] = (_page, type, element) => type === 'page' ? h('span', { 'aria-hidden': 'true' }, String(_page)) : type === 'prev' || type === 'next' ? h('button', { type: 'button', tabIndex: -1, class: 'ant-pagination-item-link' }, type === 'prev' ? content.actions.previousPage : content.actions.nextPage) : element
73
- const pagination = computed(() => ({ current: page.value, pageSize: 10, total: filtered.value.length, showSizeChanger: false, showTotal: (total: number) => `共 ${total} 条`, itemRender: renderPaginationItem }))
74
- const statuses = [{ value: 'all', label: '全部状态' }, { value: 'active', label: '运行中' }, { value: 'inactive', label: '已停用' }]
75
-
76
- function edit(device: Device, event: MouseEvent) {
77
- opener = event.currentTarget as HTMLElement
78
- editing.value = { ...device }
79
- lifecycle.value = 'opening'
80
- editorOpen.value = true
81
- }
82
- function closeEditor() {
83
- lifecycle.value = 'closing'
84
- editorOpen.value = false
85
- }
86
- function editorClosed() {
87
- lifecycle.value = 'closed'
88
- editing.value = null
89
- if (opener?.isConnected) opener.focus()
90
- else document.querySelector<HTMLButtonElement>('[data-testid="query"]')?.focus()
91
- }
92
- function saved(device: Device) { save(device); closeEditor() }
93
- </script>
94
-
95
- <template>
96
- <ConfigProvider :locale="zhCN" :theme="theme">
97
- <div class="app-shell" :data-editor-lifecycle="lifecycle" :data-reduced-motion="reducedMotion">
98
- <header class="app-header">
99
- <a class="brand" href="./" aria-label="设备管理首页"><span class="brand-mark" aria-hidden="true">E</span><span>设备工作台</span></a>
100
- <div class="header-actions"><span class="preview-label">交互原型 · 本地演示</span><div v-if="themeBinding" class="theme-control"><label for="theme-picker-main-input">主题</label><Select id="theme-picker-main-input" :value="themeId" :options="themeOptions" data-testid="theme-picker-main" @change="chooseTheme" /></div></div>
101
- </header>
102
- <main>
103
- <Alert v-if="themeWarning" type="warning" :title="themeWarning" role="status" data-testid="theme-storage-warning" />
104
- <div class="page-heading">
105
- <div><p class="eyebrow">设备运营 / 基础信息</p><h1>{{ content.pageTitle }}</h1><p class="page-description">{{ content.description }}</p></div>
106
- <div class="summary" aria-label="设备概览"><strong>{{ devices.length }}</strong><span>台设备</span><span class="summary-divider"></span><strong>{{ activeCount }}</strong><span>运行中</span></div>
107
- </div>
108
-
109
- <section class="list-panel" aria-label="设备清单" data-page-id="devices" data-region-id="device-list">
110
- <form class="filter-row" @submit.prevent="query()" aria-label="筛选设备">
111
- <div class="filter-field"><label for="name-filter">{{ content.fields.queryName.label }}</label><Input id="name-filter" v-model:value="nameInput" allow-clear :placeholder="content.fields.queryName.placeholder" data-testid="name-filter" /></div>
112
- <div class="filter-field status-filter"><label for="status-filter-input">{{ content.fields.queryStatus.label }}</label><Select id="status-filter-input" v-model:value="statusInput" :options="statuses" data-testid="status-filter" /></div>
113
- <Space class="filter-actions"><Button type="primary" html-type="submit" data-testid="query">{{ content.actions.query }}</Button><Button @click="query(true)" data-testid="reset-filter">{{ content.actions.resetQuery }}</Button></Space>
114
- </form>
115
- <div class="list-toolbar">
116
- <div><h2>{{ content.listTitle }}</h2><p class="selection-count" role="status" aria-live="polite" aria-atomic="true" data-testid="selection-count">已选择 {{ selected.length }} 项 <span>· 翻页或筛选后清空选择</span></p></div>
117
- <Button :disabled="!selected.length || mode !== 'normal'" @click="bulkDisable" data-testid="bulk-disable">{{ content.actions.bulkDisable }}</Button>
118
- </div>
119
- <Alert v-if="notice" type="success" :title="notice" show-icon role="status" data-testid="success-notice" class="list-notice" />
120
- <Alert v-if="storageWarning" type="warning" :title="storageWarning" show-icon class="list-notice" />
121
- <div v-if="mode === 'error'" class="error-state" role="alert" data-testid="list-error"><h3>设备列表加载失败</h3><p>这是可恢复的演示错误,设备数据未被修改。</p><Button @click="setMode('normal')" data-testid="retry-list">重新加载</Button></div>
122
- <Table v-else :columns="columns" :data-source="filtered" row-key="id" :pagination="pagination" :row-selection="rowSelection" :loading="mode === 'loading'" :scroll="{ x: 740 }" @change="changePage" data-testid="device-table">
123
- <template #bodyCell="{ column, record }">
124
- <template v-if="column.key === 'status'"><Tag :color="record.status === 'active' ? (themeBinding ? 'success' : 'green') : 'default'">{{ record.status === 'active' ? '运行中' : '已停用' }}</Tag></template>
125
- <template v-else-if="column.key === 'action'"><Button type="link" size="small" :aria-label="`${content.actions.edit} ${record.code}`" :data-testid="`edit-${record.id}`" @click="edit(record, $event)">{{ content.actions.edit }}</Button></template>
126
- </template>
127
- <template #emptyText><Empty description="暂无符合条件的设备"><Button @click="query(true)" data-testid="clear-empty">清除筛选</Button></Empty></template>
128
- </Table>
129
- </section>
130
-
131
- <details class="demo-tools"><summary>演示状态与数据</summary><p>演示工具仅影响当前原型实例。恢复初始数据会清除本实例的修改。</p><Space wrap><Button @click="setMode('loading')" data-testid="show-loading">加载中</Button><Button @click="setMode('empty')" data-testid="show-empty">空列表</Button><Button @click="setMode('error')" data-testid="show-error">加载失败</Button><Button @click="setMode('normal')" data-testid="restore-list">恢复列表</Button><Button @click="resetData" data-testid="reset-data">恢复初始数据</Button></Space></details>
132
- </main>
133
- <DeviceEditor :open="editorOpen" :device="editing" :content="content" :theme-value="themeBinding ? themeId : undefined" :theme-options="themeOptions" @theme="chooseTheme" @close="closeEditor" @closed="editorClosed" @opened="lifecycle = 'open'" @saved="saved" />
134
- </div>
135
- </ConfigProvider>
136
- </template>
@@ -1,111 +0,0 @@
1
- <script setup lang="ts">
2
- import { nextTick, reactive, ref, watch } from 'vue'
3
- import { Alert, Button, Drawer, Form, FormItem, Input, Select, Space, Switch } from 'antdv-next'
4
- import type { FormInstance } from 'antdv-next'
5
- import type { Device, DeviceStatus } from '../domain/devices'
6
- import type { PrototypeContent } from '../content'
7
- import type { ThemeId } from '../domain/theme'
8
-
9
- const props = defineProps<{ open: boolean; device: Device | null; content: PrototypeContent; themeValue?: ThemeId; themeOptions?: {value:ThemeId;label:string}[] }>()
10
- const emit = defineEmits<{ close: []; closed: []; saved: [device: Device]; opened: []; theme: [value:ThemeId] }>()
11
- function chooseTheme(value: unknown) { if (typeof value === 'string' && props.themeOptions?.some(option => option.value === value)) emit('theme',value as ThemeId) }
12
- const form = ref<FormInstance>()
13
- const values = reactive({ name: '', category: '', status: 'active' as DeviceStatus })
14
- const saving = ref(false)
15
- const failNext = ref(false)
16
- const error = ref('')
17
- const rules = { name: [{ required: true, whitespace: true, message: `请输入${props.content.fields.editName.label}` }], category: [{ required: true, message: `请选择${props.content.fields.editCategory.label}` }] }
18
- const categories = ['温度传感器', '控制器', '压力传感器'].map(value => ({ value, label: value }))
19
- const statuses = [{ value: 'active', label: '运行中' }, { value: 'inactive', label: '已停用' }]
20
-
21
- watch(() => props.device, device => {
22
- if (!device) return
23
- Object.assign(values, { name: device.name, category: device.category, status: device.status })
24
- error.value = ''
25
- saving.value = false
26
- failNext.value = false
27
- nextTick(() => form.value?.clearValidate())
28
- })
29
-
30
- async function submit() {
31
- if (saving.value || !props.device) return
32
- try { await form.value?.validateFields() } catch {
33
- await nextTick()
34
- document.querySelector<HTMLInputElement>('.prototype-device-editor input[aria-invalid="true"]')?.focus()
35
- return
36
- }
37
- saving.value = true
38
- error.value = ''
39
- await new Promise(resolve => setTimeout(resolve, 450))
40
- if (failNext.value) {
41
- failNext.value = false
42
- saving.value = false
43
- error.value = '保存失败,已保留输入。请重试。'
44
- return
45
- }
46
- emit('saved', { ...props.device, ...values, name: values.name.trim() })
47
- saving.value = false
48
- }
49
-
50
- async function afterOpenChange(open: boolean) {
51
- if (open) {
52
- await nextTick()
53
- document.querySelector<HTMLInputElement>('.prototype-device-editor input[data-testid="edit-name"]')?.focus()
54
- emit('opened')
55
- } else emit('closed')
56
- }
57
- function close() { if (!saving.value) emit('close') }
58
- function keepFocus(event: KeyboardEvent) {
59
- if (event.key !== 'Tab') return
60
- const dialog = document.querySelector('.prototype-device-editor [role="dialog"]')
61
- const controls = [...(dialog?.querySelectorAll<HTMLElement>('button:not(:disabled), input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex]:not([tabindex="-1"])') ?? [])].filter(element => element.offsetParent !== null && element.tabIndex >= 0)
62
- const first = controls[0], last = controls.at(-1)
63
- if (!first || !last) return
64
- if (event.shiftKey && document.activeElement === first) { event.preventDefault(); last.focus() }
65
- else if (!event.shiftKey && document.activeElement === last) { event.preventDefault(); first.focus() }
66
- }
67
- </script>
68
-
69
- <template>
70
- <Drawer
71
- :open="open"
72
- :title="`${content.editorTitle} · ${content.fields.editCode.label} ${device?.code ?? ''}`"
73
- placement="right"
74
- :size="520"
75
- :mask="{ enabled: true, blur: true, closable: !saving }"
76
- :destroy-on-hidden="true"
77
- :closable="{ disabled: saving }"
78
- root-class="prototype-device-editor"
79
- :after-open-change="afterOpenChange"
80
- @close="close"
81
- @keydown="keepFocus"
82
- >
83
- <div data-testid="editor-content">
84
- <div v-if="themeValue" class="theme-control editor-theme-control"><label for="theme-picker-editor-input">主题</label><Select id="theme-picker-editor-input" :value="themeValue" :options="themeOptions" data-testid="theme-picker-editor" @change="chooseTheme" /></div>
85
- <p class="editor-intro">更新设备基础信息。保存后,列表会同步最新状态。</p>
86
- <Alert v-if="error" type="error" show-icon :title="error" role="alert" data-testid="save-error" class="editor-error" />
87
- <Form ref="form" name="device-editor" :model="values" :rules="rules" layout="vertical" @finish="submit">
88
- <FormItem :label="content.fields.editName.label" name="name">
89
- <Input v-model:value="values.name" data-testid="edit-name" :maxlength="60" :disabled="saving" :placeholder="content.fields.editName.placeholder ?? `请输入${content.fields.editName.label}`" />
90
- </FormItem>
91
- <FormItem :label="content.fields.editCategory.label" name="category">
92
- <Select v-model:value="values.category" :options="categories" :disabled="saving" data-testid="edit-category" />
93
- </FormItem>
94
- <FormItem :label="content.fields.editStatus.label" name="status">
95
- <Select v-model:value="values.status" :options="statuses" :disabled="saving" data-testid="edit-status" />
96
- </FormItem>
97
- </Form>
98
- <div class="failure-control">
99
- <Switch v-model:checked="failNext" :disabled="saving" aria-label="下次保存模拟失败" data-testid="fail-next-save" />
100
- <span>下次保存模拟失败</span>
101
- </div>
102
- <p class="help-text">仅用于演示失败后保留输入和重试。</p>
103
- </div>
104
- <template #footer>
105
- <Space class="editor-footer">
106
- <Button :disabled="saving" @click="close" data-testid="cancel-edit">{{ content.actions.cancel }}</Button>
107
- <Button type="primary" :loading="saving" @click="submit" data-testid="save-device">{{ content.actions.save }}</Button>
108
- </Space>
109
- </template>
110
- </Drawer>
111
- </template>
@@ -1,19 +0,0 @@
1
- import type { PrototypeContent } from './content'
2
- import { resolveThemeConfig } from './domain/theme'
3
- import type { ThemeBinding } from './domain/theme'
4
- export interface PrototypeConfig { instanceId: string; storageNamespace: string; mockVersion: string; title?: string; content?: PrototypeContent; theme?: ThemeBinding }
5
- export interface PrototypeMeta extends PrototypeConfig { candidateId: string }
6
- declare global { interface Window { __PROTOTYPE_META__: PrototypeMeta } }
7
-
8
- export async function loadConfig(): Promise<PrototypeConfig> {
9
- const response = await fetch(`${import.meta.env.BASE_URL}prototype-config.json`, { cache: 'no-store' })
10
- if (!response.ok) throw new Error('无法读取原型配置,请检查当前预览构建。')
11
- const config: unknown = await response.json()
12
- if (!config || typeof config !== 'object') throw new Error('原型配置无效。')
13
- const value = config as Record<string, unknown>
14
- for (const key of ['instanceId', 'storageNamespace', 'mockVersion']) {
15
- if (typeof value[key] !== 'string' || !(value[key] as string).trim()) throw new Error(`原型配置缺少 ${key}。`)
16
- }
17
- resolveThemeConfig(value.theme)
18
- return value as unknown as PrototypeConfig
19
- }
@@ -1,28 +0,0 @@
1
- import type { PrototypeConfig } from './config'
2
-
3
- export interface PrototypeContent {
4
- schemaVersion: 1
5
- templateDigest: string
6
- pageTitle: string
7
- description: string
8
- listTitle: string
9
- editorTitle: string
10
- fields: Record<'code' | 'name' | 'category' | 'status' | 'queryName' | 'queryStatus' | 'editCode' | 'editName' | 'editCategory' | 'editStatus', { label: string; placeholder?: string; required?: boolean }>
11
- actions: Record<'query' | 'resetQuery' | 'bulkDisable' | 'edit' | 'save' | 'cancel' | 'previousPage' | 'nextPage', string>
12
- }
13
-
14
- const defaults: PrototypeContent = {
15
- schemaVersion: 1, templateDigest: 'legacy-starter-defaults', pageTitle: '设备管理', description: '查看设备信息、调整运行状态,并在当前页面完成编辑。', listTitle: '设备清单', editorTitle: '编辑设备',
16
- fields: {
17
- code: { label: '设备编号' }, name: { label: '设备名称' }, category: { label: '分类' }, status: { label: '状态' },
18
- queryName: { label: '设备名称', placeholder: '搜索设备名称' }, queryStatus: { label: '运行状态' },
19
- editCode: { label: '设备编号' }, editName: { label: '设备名称', required: true }, editCategory: { label: '设备分类' }, editStatus: { label: '运行状态' },
20
- },
21
- actions: { query: '查询', resetQuery: '重置', bulkDisable: '批量停用', edit: '编辑', save: '保存', cancel: '取消', previousPage: '上一页', nextPage: '下一页' },
22
- }
23
-
24
- export function resolveContent(config: PrototypeConfig): PrototypeContent {
25
- // v2 instances created before projection retain their fixed original content.
26
- // New templates are validated by the projector before instance creation.
27
- return config.content ?? { ...defaults, pageTitle: config.title || defaults.pageTitle }
28
- }
@@ -1,50 +0,0 @@
1
- export type DeviceStatus = 'active' | 'inactive'
2
- export interface Device { id: string; code: string; name: string; category: string; status: DeviceStatus }
3
- interface StorageReader { getItem(key: string): string | null }
4
- interface StorageWriter { setItem(key: string, value: string): void }
5
-
6
- export function createSeed(): Device[] {
7
- return Array.from({ length: 21 }, (_, index) => ({
8
- id: `device-${index + 1}`,
9
- code: `DEV-${String(index + 1).padStart(3, '0')}`,
10
- name: `${index < 10 ? '北区' : index < 20 ? '南区' : '中心'}设备 ${String(index + 1).padStart(2, '0')}`,
11
- category: ['温度传感器', '控制器', '压力传感器'][index % 3]!,
12
- status: index % 4 === 3 ? 'inactive' : 'active',
13
- }))
14
- }
15
-
16
- export function filterDevices(devices: Device[], name: string, status: DeviceStatus | 'all') {
17
- const keyword = name.trim().toLocaleLowerCase()
18
- return devices.filter(item => (!keyword || item.name.toLocaleLowerCase().includes(keyword)) && (status === 'all' || item.status === status))
19
- }
20
-
21
- export function updateDevices(devices: Device[], ids: string[], patch: Partial<Pick<Device, 'name' | 'category' | 'status'>>) {
22
- const selected = new Set(ids)
23
- return devices.map(item => selected.has(item.id) ? { ...item, ...patch } : item)
24
- }
25
-
26
- export function storageKey(namespace: string, version: string) {
27
- if (!namespace.trim() || !version.trim()) throw new Error('storage namespace and mock version are required')
28
- return `${namespace}:${version}:devices`
29
- }
30
-
31
- export function loadDevices(storage: StorageReader, key: string): Device[] {
32
- try {
33
- const raw = storage.getItem(key)
34
- if (!raw) return createSeed()
35
- const parsed: unknown = JSON.parse(raw)
36
- if (!Array.isArray(parsed) || parsed.length !== 21 || !parsed.every(isDevice) || new Set(parsed.map(item => item.id)).size !== 21) return createSeed()
37
- const expected = new Set(createSeed().map(item => item.id))
38
- return parsed.every(item => expected.has(item.id)) ? parsed : createSeed()
39
- } catch { return createSeed() }
40
- }
41
-
42
- function isDevice(item: unknown): item is Device {
43
- if (!item || typeof item !== 'object') return false
44
- const value = item as Record<string, unknown>
45
- return ['id', 'code', 'name', 'category'].every(key => typeof value[key] === 'string') && (value.status === 'active' || value.status === 'inactive')
46
- }
47
-
48
- export function persistDevices(storage: StorageWriter, key: string, devices: Device[]) {
49
- storage.setItem(key, JSON.stringify(devices))
50
- }
@@ -1,25 +0,0 @@
1
- export type ThemeId = 'light' | 'dark' | 'fresh' | 'tech'
2
- export interface ThemeBinding { defaultTheme: 'light'; presets: ThemeId[] }
3
- export interface ThemeStorage { getItem(key: string): string | null; setItem(key: string, value: string): void }
4
- export const THEME_IDS: ThemeId[] = ['light', 'dark', 'fresh', 'tech']
5
- export const THEME_PRESETS = {
6
- light: { label: '明亮', mode: 'light', primary: '#155bc2', bg: '#f4f7fc', surface: '#ffffff', subtle: '#f8faff', text: '#172b45', muted: '#506174', border: '#b9c8da', accent: '#155bc2', onPrimary: '#ffffff', error: '#b4232c', success: '#166534' },
7
- dark: { label: '暗黑', mode: 'dark', primary: '#8fb8ff', bg: '#15181d', surface: '#20242b', subtle: '#1b2028', text: '#edf1f7', muted: '#b2bece', border: '#667387', accent: '#a6c7ff', onPrimary: '#101c2c', error: '#ffb4ab', success: '#9bddad' },
8
- fresh: { label: '清新', mode: 'light', primary: '#0c6a55', bg: '#edf8f4', surface: '#fbfffd', subtle: '#e6f4ed', text: '#173b31', muted: '#4c665c', border: '#a4c4b5', accent: '#0c6a55', onPrimary: '#ffffff', error: '#b4232c', success: '#166534' },
9
- tech: { label: '科技', mode: 'dark', primary: '#55ddc6', bg: '#07131f', surface: '#102536', subtle: '#0b1c2b', text: '#e1f4f7', muted: '#a0bdca', border: '#5b8294', accent: '#55ddc6', onPrimary: '#071b20', error: '#ffb4ab', success: '#9bddad' },
10
- } as const
11
- export function resolveThemeConfig(value: unknown): ThemeBinding | null {
12
- if (value === undefined) return null
13
- const config=value as Partial<ThemeBinding> | null
14
- if (!config || config.defaultTheme !== 'light' || !Array.isArray(config.presets) || config.presets.length !== 4 || new Set(config.presets).size !== 4 || !THEME_IDS.every(id => config.presets!.includes(id))) throw new Error('主题配置必须包含明亮、暗黑、清新、科技且默认明亮。')
15
- return { defaultTheme: 'light', presets: [...THEME_IDS] }
16
- }
17
- export const themeStorageKey = (namespace: string) => `${namespace}:ui-theme:v1`
18
- export function safeThemeStorage(access: () => ThemeStorage): ThemeStorage | null { try { return access() } catch { return null } }
19
- export function loadThemePreference(storage: ThemeStorage | null, key: string): ThemeId {
20
- try { const value=JSON.parse(storage?.getItem(key) ?? 'null'); if (value?.version===1 && THEME_IDS.includes(value.themeId)) return value.themeId } catch { /* Damaged or denied storage uses the explicit default. */ }
21
- return 'light'
22
- }
23
- export function saveThemePreference(storage: ThemeStorage | null, key: string, themeId: ThemeId): boolean {
24
- try { if (!storage) return false; storage.setItem(key,JSON.stringify({version:1,themeId})); return true } catch { return false }
25
- }
@@ -1,18 +0,0 @@
1
- import { createApp } from 'vue'
2
- import 'antdv-next/dist/reset.css'
3
- import App from './App.vue'
4
- import { loadConfig } from './config'
5
- import './style.css'
6
-
7
- loadConfig().then(config => {
8
- window.__PROTOTYPE_META__ = { ...config, candidateId: import.meta.env.VITE_CANDIDATE_ID || 'unverified-development' }
9
- createApp(App, { config }).mount('#app')
10
- }).catch(error => {
11
- const container = document.querySelector('#app')!
12
- const heading = document.createElement('h1')
13
- heading.textContent = '原型无法启动'
14
- const message = document.createElement('p')
15
- message.textContent = error instanceof Error ? error.message : '配置读取失败。'
16
- container.setAttribute('role', 'alert')
17
- container.append(heading, message)
18
- })
@@ -1,50 +0,0 @@
1
- :root { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif; color: var(--proto-text, #1c2b29); background: var(--proto-bg, #f3f6f5); font-synthesis: none; text-rendering: optimizeLegibility; }
2
- * { box-sizing: border-box; }
3
- body { margin: 0; min-width: 320px; }
4
- button, input { font: inherit; }
5
- .app-header { height: 64px; background: var(--proto-surface, #fff); border-bottom: 1px solid var(--proto-border, #e1e8e5); display: flex; align-items: center; justify-content: space-between; padding: 0 40px; }
6
- .brand { display: inline-flex; align-items: center; gap: 12px; color: var(--proto-text, #213c34); font-size: 16px; font-weight: 600; text-decoration: none; }
7
- .brand-mark { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 6px; background: var(--proto-primary, #176b56); color: var(--proto-on-primary, #fff); font-weight: 700; }
8
- .preview-label, .help-text { font-size: 12px; color: var(--proto-muted, #66776f); }
9
- main { max-width: 1360px; margin: auto; padding: 32px 40px 48px; }
10
- .page-heading { display: flex; justify-content: space-between; gap: 24px; align-items: flex-end; margin-bottom: 24px; }
11
- .eyebrow { color: var(--proto-muted, #63776e); font-size: 12px; margin: 0 0 8px; }
12
- h1 { font-size: 28px; line-height: 1.35; letter-spacing: -.5px; margin: 0; font-weight: 650; }
13
- .page-description { margin: 10px 0 0; color: var(--proto-muted, #63726c); font-size: 14px; }
14
- .summary { white-space: nowrap; display: flex; gap: 8px; align-items: baseline; color: var(--proto-muted, #63726c); font-size: 12px; padding-bottom: 4px; }
15
- .summary strong { color: var(--proto-accent, #264d3f); font-size: 24px; font-weight: 600; }
16
- .summary-divider { height: 16px; width: 1px; background: var(--proto-border, #d8e2dd); margin: 0 8px; }
17
- .list-panel { background: var(--proto-surface, #fff); border: 1px solid var(--proto-border, #dfe7e2); border-radius: 8px; overflow: hidden; }
18
- .filter-row { display: flex; flex-wrap: wrap; gap: 16px; align-items: flex-end; padding: 24px; border-bottom: 1px solid var(--proto-border, #edf0ee); background: var(--proto-subtle, #fdfefd); }
19
- .filter-field { display: flex; flex-direction: column; gap: 8px; width: 260px; }
20
- .filter-field label { font-size: 13px; color: var(--proto-muted, #46594f); }
21
- .status-filter { width: 170px; }
22
- .filter-actions { margin-left: auto; }
23
- .list-toolbar { display: flex; justify-content: space-between; align-items: center; padding: 20px 24px; gap: 12px; }
24
- h2 { margin: 0; font-size: 16px; font-weight: 600; }
25
- .selection-count { margin: 6px 0 0; font-size: 12px; color: var(--proto-muted, #536c5e); }
26
- .selection-count span { color: var(--proto-muted, #718078); }
27
- .list-notice { margin: 0 24px 16px; }
28
- .ant-table-wrapper .ant-table-pagination { margin: 16px 24px; }
29
- .ant-pagination .ant-pagination-prev, .ant-pagination .ant-pagination-next { width: auto; min-width: 64px; padding: 0 8px; }
30
- .error-state { padding: 64px 24px; text-align: center; color: var(--proto-muted, #63726c); }
31
- .error-state h3 { color: var(--proto-text, #283f33); font-size: 16px; }
32
- .demo-tools { margin-top: 24px; color: var(--proto-muted, #66776f); font-size: 12px; }
33
- .demo-tools summary { display: list-item; width: fit-content; cursor: pointer; color: var(--proto-muted, #53675d); padding: 8px 0; }
34
- .demo-tools p { margin: 8px 0 12px; }
35
- .editor-intro { margin: 0 0 24px; color: var(--proto-muted, #68796e); font-size: 13px; line-height: 1.7; }
36
- .editor-error { margin-bottom: 20px; }
37
- .editor-footer { display: flex; justify-content: flex-end; }
38
- .failure-control { display: flex; gap: 8px; align-items: center; margin-top: 32px; font-size: 12px; color: var(--proto-muted, #68796e); }
39
- .help-text { margin-top: 8px; }
40
- :focus-visible { outline: 2px solid var(--proto-primary, #176b56); outline-offset: 3px; }
41
- @media (max-width: 767px) { .app-header { padding: 0 16px; } main { padding: 24px 16px; } .page-heading { align-items: flex-start; flex-direction: column; gap: 16px; } h1 { font-size: 24px; } .preview-label { font-size: 11px; } .filter-row { padding: 16px; gap: 12px; } .filter-field { width: 100%; } .filter-actions { margin-left: 0; } .list-toolbar { padding: 16px; align-items: flex-start; } .selection-count span { display: block; margin-top: 4px; } .list-notice { margin: 0 16px 16px; } .ant-table-wrapper .ant-table-pagination { margin: 16px; } }
42
- @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; animation-iteration-count: 1 !important; scroll-behavior: auto !important; } }
43
-
44
- .app-shell { min-height: 100vh; background: var(--proto-bg, #f3f6f5); color: var(--proto-text, #1c2b29); }
45
- .header-actions, .theme-control { display: flex; align-items: center; gap: 8px; }
46
- .header-actions { gap: 16px; }
47
- .theme-control label { color: var(--proto-muted, #66776f); font-size: 12px; white-space: nowrap; }
48
- .theme-control .ant-select { width: 104px; }
49
- .editor-theme-control { justify-content: flex-end; margin-bottom: 20px; }
50
- @media (max-width: 767px) { html[data-prototype-theme] .header-actions .preview-label { display: none; } }
@@ -1,66 +0,0 @@
1
- import { computed, ref } from 'vue'
2
- import { createSeed, filterDevices, loadDevices, persistDevices, storageKey, updateDevices } from './domain/devices'
3
- import type { Device, DeviceStatus } from './domain/devices'
4
- import type { PrototypeConfig } from './config'
5
-
6
- export function useDevices(config: PrototypeConfig) {
7
- const key = storageKey(config.storageNamespace, config.mockVersion)
8
- const storage = (() => { try { return window.localStorage } catch { return { getItem: () => null, setItem: () => { throw new Error('Storage unavailable') } } } })()
9
- const devices = ref(loadDevices(storage, key))
10
- const nameInput = ref('')
11
- const statusInput = ref<DeviceStatus | 'all'>('all')
12
- const filters = ref({ name: '', status: 'all' as DeviceStatus | 'all' })
13
- const page = ref(1)
14
- const selected = ref<string[]>([])
15
- const mode = ref<'normal' | 'loading' | 'empty' | 'error'>('normal')
16
- const notice = ref('')
17
- const storageWarning = ref('')
18
- const filtered = computed(() => mode.value === 'empty' ? [] : filterDevices(devices.value, filters.value.name, filters.value.status))
19
- const activeCount = computed(() => devices.value.filter(item => item.status === 'active').length)
20
-
21
- function persist(next: Device[]) {
22
- devices.value = next
23
- try {
24
- persistDevices(storage, key, next)
25
- storageWarning.value = ''
26
- } catch { storageWarning.value = '浏览器未允许本地存储,本次修改仍在当前页面保留。' }
27
- }
28
- function query(reset = false) {
29
- if (reset) { nameInput.value = ''; statusInput.value = 'all' }
30
- filters.value = { name: nameInput.value, status: statusInput.value }
31
- page.value = 1
32
- selected.value = []
33
- mode.value = 'normal'
34
- notice.value = ''
35
- }
36
- function changePage(pagination: { current?: number }) {
37
- page.value = pagination.current ?? 1
38
- selected.value = []
39
- }
40
- function bulkDisable() {
41
- const ids = [...selected.value]
42
- if (!ids.length) return
43
- persist(updateDevices(devices.value, ids, { status: 'inactive' }))
44
- selected.value = []
45
- page.value = 1
46
- notice.value = `已停用 ${ids.length} 台设备。`
47
- }
48
- function save(device: Device) {
49
- persist(updateDevices(devices.value, [device.id], { name: device.name.trim(), category: device.category, status: device.status }))
50
- selected.value = []
51
- page.value = 1
52
- notice.value = `设备 ${device.code} 已保存。`
53
- }
54
- function setMode(next: typeof mode.value) {
55
- mode.value = next
56
- page.value = 1
57
- selected.value = []
58
- notice.value = ''
59
- }
60
- function resetData() {
61
- persist(createSeed())
62
- query(true)
63
- notice.value = '已恢复 21 条演示数据。'
64
- }
65
- return { devices, nameInput, statusInput, page, selected, mode, notice, storageWarning, filtered, activeCount, query, changePage, bulkDisable, save, setMode, resetData }
66
- }
@@ -1,44 +0,0 @@
1
- import assert from 'node:assert/strict'
2
- import test from 'node:test'
3
- import { createSeed, filterDevices, updateDevices, loadDevices, persistDevices, storageKey } from '../src/domain/devices.ts'
4
-
5
- test('seed has 21 stable unique records and filters compose', () => {
6
- const seed = createSeed()
7
- assert.equal(seed.length, 21)
8
- assert.equal(new Set(seed.map(item => item.id)).size, 21)
9
- assert.equal(seed[0]?.code, 'DEV-001')
10
- assert.deepEqual(createSeed(), seed)
11
- const result = filterDevices(seed, ' 设备 ', 'inactive')
12
- assert.ok(result.length > 0 && result.length < seed.length)
13
- assert.ok(result.every(item => item.status === 'inactive' && item.name.includes('设备')))
14
- assert.equal(filterDevices(seed, '不存在', 'all').length, 0)
15
- })
16
-
17
- test('bulk mutation touches selected identities only, without mutating prior state', () => {
18
- const seed = createSeed()
19
- const updated = updateDevices(seed, ['device-1', 'device-3'], { status: 'inactive' })
20
- assert.equal(updated[0]?.status, 'inactive')
21
- assert.equal(updated[2]?.status, 'inactive')
22
- assert.deepEqual(updated[1], seed[1])
23
- assert.equal(seed[0]?.status, 'active')
24
- })
25
-
26
- test('storage is isolated by instance namespace and mock version; reset is deterministic', () => {
27
- const map = new Map<string, string>()
28
- const storage = { getItem: (key: string) => map.get(key) ?? null, setItem: (key: string, value: string) => { map.set(key, value) } }
29
- const a = storageKey('pilot-A', 'v1')
30
- const b = storageKey('pilot-B', 'v1')
31
- const seed = createSeed()
32
- persistDevices(storage, a, updateDevices(seed, ['device-1'], { name: 'changed' }))
33
- assert.equal(loadDevices(storage, a)[0]?.name, 'changed')
34
- assert.deepEqual(loadDevices(storage, b), seed)
35
- assert.deepEqual(loadDevices(storage, storageKey('pilot-A', 'v2')), seed)
36
- persistDevices(storage, a, seed)
37
- assert.deepEqual(loadDevices(storage, a), createSeed())
38
- })
39
-
40
- test('invalid persisted data recovers to fixed seed and empty namespaces are rejected', () => {
41
- assert.deepEqual(loadDevices({ getItem: () => '{broken' }, 'key'), createSeed())
42
- assert.deepEqual(loadDevices({ getItem: () => '[{"id":"fake"}]' }, 'key'), createSeed())
43
- assert.throws(() => storageKey('', 'v1'), /namespace/)
44
- })
@@ -1,26 +0,0 @@
1
- import assert from 'node:assert/strict'
2
- import test from 'node:test'
3
- import { THEME_PRESETS, resolveThemeConfig, themeStorageKey, loadThemePreference, saveThemePreference, safeThemeStorage } from '../src/domain/theme.ts'
4
-
5
- const binding = { defaultTheme: 'light', presets: ['light', 'dark', 'fresh', 'tech'] }
6
- test('four named presets are explicit while an unbound instance stays legacy', () => {
7
- assert.equal(resolveThemeConfig(undefined), null)
8
- assert.deepEqual(resolveThemeConfig(binding), binding)
9
- assert.deepEqual(Object.values(THEME_PRESETS).map(theme => theme.label), ['明亮', '暗黑', '清新', '科技'])
10
- assert.deepEqual(Object.values(THEME_PRESETS).map(theme => theme.mode), ['light', 'dark', 'light', 'dark'])
11
- for (const config of [{ ...binding, defaultTheme: 'dark' }, { ...binding, presets: [1,2,3,4] }, { ...binding, presets: ['light','dark','fresh','fresh'] }]) assert.throws(() => resolveThemeConfig(config))
12
- })
13
- test('theme preference is namespaced independently and damaged cache falls back', () => {
14
- const values=new Map<string,string>(), storage={ getItem:(key:string)=>values.get(key)??null,setItem:(key:string,value:string)=>{values.set(key,value)} }
15
- const a=themeStorageKey('instance-a'),b=themeStorageKey('instance-b')
16
- assert.notEqual(a,b);assert.match(a,/:ui-theme:v1$/)
17
- assert.equal(saveThemePreference(storage,a,'tech'),true)
18
- assert.equal(loadThemePreference(storage,a),'tech');assert.equal(loadThemePreference(storage,b),'light')
19
- for (const broken of ['{','null','{"version":1,"themeId":2}','{"version":2,"themeId":"tech"}','{"version":1,"themeId":"unknown"}']) { values.set(a,broken);assert.equal(loadThemePreference(storage,a),'light') }
20
- })
21
- test('denied storage never prevents local theme changes or returns a fake saved preference', () => {
22
- const denied={getItem(){throw Error('denied')},setItem(){throw Error('denied')}}
23
- assert.equal(safeThemeStorage(()=>{throw Error('getter denied')}),null)
24
- assert.equal(loadThemePreference(denied,'key'),'light');assert.equal(loadThemePreference(null,'key'),'light')
25
- assert.equal(saveThemePreference(denied,'key','dark'),false);assert.equal(saveThemePreference(null,'key','dark'),false)
26
- })