@givolt/i3-composer-agent 2.2.3 → 2.3.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 (439) hide show
  1. package/.agents/plugins/marketplace.json +1 -1
  2. package/.claude/commands/i3-prototype.md +23 -0
  3. package/.claude/commands/i3-review.md +1 -1
  4. package/.claude/commands/i3-ship.md +1 -1
  5. package/.claude-plugin/marketplace.json +1 -1
  6. package/.claude-plugin/plugin.json +1 -1
  7. package/.codex-plugin/plugin.json +2 -2
  8. package/.gemini/commands/i3-prototype.toml +23 -0
  9. package/.gemini/commands/i3-review.toml +1 -1
  10. package/.gemini/commands/i3-ship.toml +1 -1
  11. package/README.md +15 -5
  12. package/agents/code-reviewer.md +1 -1
  13. package/agents/test-engineer.md +1 -1
  14. package/bin/native-layout.cjs +2 -0
  15. package/commands/i3-prototype.toml +23 -0
  16. package/commands/i3-review.toml +1 -1
  17. package/commands/i3-ship.toml +1 -1
  18. package/docs/agents.md +2 -2
  19. package/docs/codebuddy-setup.md +2 -2
  20. package/docs/codex-setup.md +1 -1
  21. package/docs/copilot-setup.md +4 -0
  22. package/docs/cursor-setup.md +3 -0
  23. package/docs/other-hosts.md +44 -9
  24. package/docs/workbuddy-setup.md +2 -2
  25. package/evals/README.md +2 -0
  26. package/evals/cases/i3-documentation-and-adrs.json +18 -0
  27. package/evals/cases/i3-test-driven-development.json +8 -0
  28. package/evals/cases/i3-ui-prototype.json +49 -0
  29. package/evals/fixtures/i3-documentation-and-adrs/prose-review/README.md +19 -0
  30. package/evals/fixtures/i3-documentation-and-adrs/prose-review/queue.js +32 -0
  31. package/evals/fixtures/i3-ui-prototype/business-brief.md +7 -0
  32. package/evals/plugin/tdd-fires-on-pasted-bug/graders/failing-test-first.md +7 -0
  33. package/evals/plugin/tdd-fires-on-pasted-bug/graders/skill-fired.md +5 -0
  34. package/evals/plugin/tdd-fires-on-pasted-bug/prompt.md +15 -0
  35. package/evals/plugin/tdd-stays-quiet-on-debug/graders/not-fired.md +8 -0
  36. package/evals/plugin/tdd-stays-quiet-on-debug/prompt.md +25 -0
  37. package/evals/zh-CN/cases/i3-documentation-and-adrs.json +19 -0
  38. package/evals/zh-CN/cases/i3-test-driven-development.json +4 -0
  39. package/evals/zh-CN/cases/i3-ui-prototype.json +50 -0
  40. package/hooks/SIMPLIFY-IGNORE.md +3 -2
  41. package/hooks/simplify-ignore-test.sh +93 -1
  42. package/hooks/simplify-ignore.sh +94 -11
  43. package/package.json +31 -1
  44. package/plugin.json +1 -1
  45. package/references/performance-checklist.md +4 -2
  46. package/scripts/design-provider-discovery-test.js +190 -0
  47. package/scripts/design-provider-test.js +68 -0
  48. package/scripts/enterprise-template-test.js +179 -0
  49. package/scripts/lib/skill-lint-test.js +113 -1
  50. package/scripts/lib/skill-lint.js +62 -8
  51. package/scripts/run-evals-test.js +207 -0
  52. package/scripts/run-evals.js +47 -9
  53. package/scripts/template-adapter-test.js +155 -0
  54. package/scripts/ui-prototype-test.js +114 -0
  55. package/scripts/validate-commands-test.js +30 -0
  56. package/scripts/validate-commands.js +6 -16
  57. package/scripts/validate-reference-links-test.js +18 -0
  58. package/scripts/validate-reference-links.js +4 -2
  59. package/scripts/validate-skills.js +26 -3
  60. package/skills/i3-documentation-and-adrs/SKILL.md +9 -0
  61. package/skills/i3-frontend-ui-engineering/SKILL.md +5 -1
  62. package/skills/i3-idea-refine/SKILL.md +20 -5
  63. package/skills/i3-incremental-implementation/SKILL.md +4 -0
  64. package/skills/i3-performance-optimization/SKILL.md +10 -10
  65. package/skills/i3-security-and-hardening/references/hardening-patterns.md +1 -1
  66. package/skills/i3-shipping-and-launch/SKILL.md +6 -0
  67. package/skills/i3-test-driven-development/SKILL.md +3 -3
  68. package/skills/i3-ui-prototype/SKILL.md +119 -0
  69. package/skills/i3-ui-prototype/assets/templates/catalog.json +148 -0
  70. package/skills/i3-ui-prototype/assets/templates/classic-admin/manifest.json +9 -0
  71. package/skills/i3-ui-prototype/assets/templates/classic-admin/preset.json +6 -0
  72. package/skills/i3-ui-prototype/assets/templates/common/app/app.mjs +89 -0
  73. package/skills/i3-ui-prototype/assets/templates/common/app/config.json +1 -0
  74. package/skills/i3-ui-prototype/assets/templates/common/app/domain.mjs +20 -0
  75. package/skills/i3-ui-prototype/assets/templates/common/app/index.html +17 -0
  76. package/skills/i3-ui-prototype/assets/templates/common/app/serve.cjs +16 -0
  77. package/skills/i3-ui-prototype/assets/templates/common/app/styles.css +670 -0
  78. package/skills/i3-ui-prototype/assets/templates/common/app/tokens.css +19 -0
  79. package/skills/i3-ui-prototype/assets/templates/common/design-system/master.md +20 -0
  80. package/skills/i3-ui-prototype/assets/templates/common/gallery.html +2 -0
  81. package/skills/i3-ui-prototype/assets/templates/common/mocks/applications.json +5 -0
  82. package/skills/i3-ui-prototype/assets/templates/common/requirements-map.json +8 -0
  83. package/skills/i3-ui-prototype/assets/templates/common/serve-gallery.cjs +16 -0
  84. package/skills/i3-ui-prototype/assets/templates/credits.md +17 -0
  85. package/skills/i3-ui-prototype/assets/templates/data-operations/manifest.json +9 -0
  86. package/skills/i3-ui-prototype/assets/templates/data-operations/preset.json +6 -0
  87. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/design-system.md +32 -0
  88. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/index.html +29 -0
  89. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/manifest.json +9 -0
  90. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/origin.json +344 -0
  91. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/preset.json +928 -0
  92. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/app.js +22 -0
  93. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/empty.svg +1 -0
  94. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/reference-styles.json +1 -0
  95. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/result-403.svg +1 -0
  96. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/result-404.svg +1 -0
  97. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets-manifest.json +334 -0
  98. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/baseline.json +173 -0
  99. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/conversion.md +30 -0
  100. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/credits.md +17 -0
  101. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/design-tokens.json +881 -0
  102. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/index.html +28 -0
  103. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/@qin-ui-antdv-next-pro.txt +9 -0
  104. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/ant-design-icons.txt +22 -0
  105. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/antdv-next.txt +21 -0
  106. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/package.json +12 -0
  107. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/browser-routes.json +298 -0
  108. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/coverage.json +180 -0
  109. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/integrity.json +13 -0
  110. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/keyboard.json +11 -0
  111. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/responsive.json +125 -0
  112. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/review.md +51 -0
  113. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/rules.log +150 -0
  114. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-html.png +0 -0
  115. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-original.png +0 -0
  116. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-html.png +0 -0
  117. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-original.png +0 -0
  118. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/models-html.png +0 -0
  119. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/models-original.png +0 -0
  120. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-html.png +0 -0
  121. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-original.png +0 -0
  122. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/selection.json +9 -0
  123. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/visual-comparison.json +342 -0
  124. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/readme.md +73 -0
  125. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/reference.md +59 -0
  126. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/routes.json +178 -0
  127. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/controls.js +99 -0
  128. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/dialogs.js +54 -0
  129. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/dom.js +264 -0
  130. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/forms.js +47 -0
  131. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/icons.js +41 -0
  132. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/layout.js +47 -0
  133. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/router.js +63 -0
  134. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/state.js +90 -0
  135. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/table.js +41 -0
  136. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/widgets.js +8 -0
  137. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.html +3 -0
  138. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.js +36 -0
  139. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.html +2 -0
  140. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.js +51 -0
  141. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.html +3 -0
  142. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.js +48 -0
  143. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/CheckResults.html +2 -0
  144. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/CheckResults.js +6 -0
  145. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.html +2 -0
  146. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.js +13 -0
  147. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/data.js +24 -0
  148. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/domain.js +32 -0
  149. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/registry.js +25 -0
  150. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/store.js +85 -0
  151. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentClose.html +2 -0
  152. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentClose.js +17 -0
  153. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.html +2 -0
  154. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.js +66 -0
  155. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.html +3 -0
  156. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.js +38 -0
  157. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.html +2 -0
  158. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.js +66 -0
  159. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.html +2 -0
  160. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.js +5 -0
  161. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.html +2 -0
  162. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.js +12 -0
  163. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.html +2 -0
  164. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.js +11 -0
  165. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentList.html +2 -0
  166. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentList.js +116 -0
  167. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.html +2 -0
  168. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.js +32 -0
  169. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.html +2 -0
  170. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.js +49 -0
  171. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.html +2 -0
  172. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.js +10 -0
  173. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.html +2 -0
  174. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.js +77 -0
  175. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/data.js +60 -0
  176. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/domain.js +105 -0
  177. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/store.js +212 -0
  178. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/AuditPanel.html +2 -0
  179. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/AuditPanel.js +18 -0
  180. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelDetail.html +2 -0
  181. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelDetail.js +23 -0
  182. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelEditor.html +2 -0
  183. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelEditor.js +78 -0
  184. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelGrant.html +2 -0
  185. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelGrant.js +55 -0
  186. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelReferences.html +2 -0
  187. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelReferences.js +26 -0
  188. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelRelease.html +2 -0
  189. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelRelease.js +38 -0
  190. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelStatus.html +2 -0
  191. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelStatus.js +7 -0
  192. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTable.html +2 -0
  193. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTable.js +72 -0
  194. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTester.html +2 -0
  195. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTester.js +46 -0
  196. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelsPage.html +2 -0
  197. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelsPage.js +52 -0
  198. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/RowActions.html +2 -0
  199. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/RowActions.js +19 -0
  200. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/UsagePanel.html +2 -0
  201. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/UsagePanel.js +30 -0
  202. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/data.js +48 -0
  203. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/domain.js +39 -0
  204. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/store.js +129 -0
  205. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.html +4 -0
  206. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.js +21 -0
  207. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IntentSource.html +2 -0
  208. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IntentSource.js +8 -0
  209. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.html +2 -0
  210. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.js +37 -0
  211. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.html +2 -0
  212. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.js +10 -0
  213. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.html +2 -0
  214. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.js +37 -0
  215. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.html +2 -0
  216. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.js +49 -0
  217. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RunDetail.html +4 -0
  218. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RunDetail.js +22 -0
  219. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.html +2 -0
  220. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.js +9 -0
  221. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/commands.js +82 -0
  222. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/examples.js +47 -0
  223. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/model.js +61 -0
  224. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/repair.js +68 -0
  225. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/store.js +55 -0
  226. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/types.js +1 -0
  227. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/workbench.js +18 -0
  228. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.html +3 -0
  229. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.js +28 -0
  230. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.html +2 -0
  231. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.js +18 -0
  232. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.html +2 -0
  233. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.js +31 -0
  234. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.html +2 -0
  235. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.js +27 -0
  236. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.html +2 -0
  237. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.js +16 -0
  238. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.html +2 -0
  239. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.js +43 -0
  240. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.html +4 -0
  241. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.js +34 -0
  242. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.html +2 -0
  243. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.js +30 -0
  244. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.html +3 -0
  245. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.js +67 -0
  246. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.html +2 -0
  247. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.js +41 -0
  248. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.html +2 -0
  249. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.js +31 -0
  250. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.html +2 -0
  251. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.js +26 -0
  252. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.html +2 -0
  253. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.js +70 -0
  254. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/data.js +8 -0
  255. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/domain.js +62 -0
  256. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/management.js +36 -0
  257. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/managementStore.js +49 -0
  258. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/store.js +132 -0
  259. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/AdminList.html +2 -0
  260. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/AdminList.js +38 -0
  261. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.html +2 -0
  262. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.js +11 -0
  263. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.html +2 -0
  264. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.js +45 -0
  265. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.html +2 -0
  266. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.js +54 -0
  267. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.html +3 -0
  268. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.js +27 -0
  269. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.html +2 -0
  270. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.js +12 -0
  271. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.html +2 -0
  272. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.js +45 -0
  273. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.html +3 -0
  274. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.js +38 -0
  275. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/domain.js +61 -0
  276. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/state.js +51 -0
  277. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/store.js +116 -0
  278. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.html +2 -0
  279. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.js +45 -0
  280. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.html +4 -0
  281. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.js +30 -0
  282. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.html +2 -0
  283. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.js +67 -0
  284. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.html +2 -0
  285. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.js +5 -0
  286. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.html +4 -0
  287. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.js +60 -0
  288. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/commands.js +157 -0
  289. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/model.js +136 -0
  290. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/store.js +76 -0
  291. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.html +3 -0
  292. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.js +26 -0
  293. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.html +2 -0
  294. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.js +14 -0
  295. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.html +2 -0
  296. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.js +113 -0
  297. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.html +3 -0
  298. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.js +62 -0
  299. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/commands.js +97 -0
  300. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/model.js +147 -0
  301. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/store.js +13 -0
  302. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.html +2 -0
  303. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.js +9 -0
  304. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.html +2 -0
  305. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.js +8 -0
  306. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.html +2 -0
  307. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.js +37 -0
  308. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListMore.html +2 -0
  309. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListMore.js +8 -0
  310. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.html +2 -0
  311. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.js +17 -0
  312. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/columns.js +32 -0
  313. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/deliveryGuide.js +49 -0
  314. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/deliveryView.js +12 -0
  315. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/listBatch.js +15 -0
  316. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/listSelection.js +37 -0
  317. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/policy.js +68 -0
  318. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/session.js +44 -0
  319. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.html +2 -0
  320. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.js +25 -0
  321. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.html +2 -0
  322. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.js +53 -0
  323. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.html +10 -0
  324. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.js +30 -0
  325. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ScopePage.html +2 -0
  326. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ScopePage.js +10 -0
  327. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.html +2 -0
  328. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.js +9 -0
  329. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/confirmation.js +3 -0
  330. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/navigation.js +19 -0
  331. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.html +2 -0
  332. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.js +8 -0
  333. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.html +2 -0
  334. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.js +32 -0
  335. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.html +2 -0
  336. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.js +15 -0
  337. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.html +2 -0
  338. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.js +11 -0
  339. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecReview.html +2 -0
  340. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecReview.js +57 -0
  341. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.html +2 -0
  342. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.js +37 -0
  343. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/data.js +20 -0
  344. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/domain.js +55 -0
  345. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/store.js +151 -0
  346. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.html +3 -0
  347. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.js +18 -0
  348. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.html +2 -0
  349. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.js +40 -0
  350. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.html +2 -0
  351. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.js +51 -0
  352. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.html +2 -0
  353. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.js +9 -0
  354. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.html +5 -0
  355. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.js +48 -0
  356. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/domain.js +204 -0
  357. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/exampleSource.js +22 -0
  358. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/registry.js +135 -0
  359. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/store.js +137 -0
  360. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.html +3 -0
  361. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.js +36 -0
  362. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/model.js +56 -0
  363. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/store.js +15 -0
  364. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.html +2 -0
  365. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.js +27 -0
  366. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.html +4 -0
  367. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.js +31 -0
  368. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.html +2 -0
  369. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.js +68 -0
  370. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.html +5 -0
  371. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.js +55 -0
  372. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/data.js +16 -0
  373. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/domain.js +83 -0
  374. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/registry.js +18 -0
  375. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/store.js +61 -0
  376. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/admin.css +60 -0
  377. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/agents.css +46 -0
  378. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/antdv.css +295 -0
  379. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/app.css +102 -0
  380. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/delivery.css +4 -0
  381. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/intents.css +37 -0
  382. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/native.css +22 -0
  383. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/operations.css +2 -0
  384. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/pbc.css +3 -0
  385. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/permissions.css +22 -0
  386. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/pro.css +1 -0
  387. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/releases.css +4 -0
  388. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/reset.css +246 -0
  389. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/reviews.css +8 -0
  390. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/tasks.css +6 -0
  391. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/tokens.css +15 -0
  392. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/workbench.css +61 -0
  393. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/workflows.css +1 -0
  394. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/admin-rules.test.js +96 -0
  395. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/agents.test.js +14 -0
  396. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/intent-state.test.js +37 -0
  397. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/list-batch.test.js +44 -0
  398. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operation-fixtures.js +19 -0
  399. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operation-repair.test.js +14 -0
  400. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operations.test.js +25 -0
  401. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/pbc-management.test.js +17 -0
  402. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/pbc-state.test.js +24 -0
  403. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/permission-config.test.js +23 -0
  404. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/permissions.test.js +24 -0
  405. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/releases.test.js +50 -0
  406. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/reviews.test.js +36 -0
  407. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-forms-router.test.js +28 -0
  408. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-state.test.js +42 -0
  409. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-stores.test.js +16 -0
  410. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/spec-state.test.js +11 -0
  411. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/tasks.test.js +27 -0
  412. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/workbench.test.js +34 -0
  413. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/workflows.test.js +16 -0
  414. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/convert.mjs +168 -0
  415. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/serve.mjs +7 -0
  416. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/styles.mjs +11 -0
  417. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/verify.mjs +24 -0
  418. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/serve.cjs +16 -0
  419. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/usability.css +44 -0
  420. package/skills/i3-ui-prototype/assets/templates/gallery/index.html +40 -0
  421. package/skills/i3-ui-prototype/assets/templates/modern-workspace/manifest.json +9 -0
  422. package/skills/i3-ui-prototype/assets/templates/modern-workspace/preset.json +6 -0
  423. package/skills/i3-ui-prototype/assets/templates/serve-gallery.cjs +23 -0
  424. package/skills/i3-ui-prototype/references/artifact-contract.md +41 -0
  425. package/skills/i3-ui-prototype/references/enterprise-admin.md +38 -0
  426. package/skills/i3-ui-prototype/references/expert-adapter.md +48 -0
  427. package/skills/i3-ui-prototype/references/template-adapters.md +57 -0
  428. package/skills/i3-ui-prototype/references/workflow-contract.md +19 -0
  429. package/skills/i3-ui-prototype/scripts/adapters/easel-html.cjs +30 -0
  430. package/skills/i3-ui-prototype/scripts/adapters/legacy-html.cjs +28 -0
  431. package/skills/i3-ui-prototype/scripts/check-design-provider.cjs +9 -0
  432. package/skills/i3-ui-prototype/scripts/check-prototype.cjs +14 -0
  433. package/skills/i3-ui-prototype/scripts/design-provider-discovery.cjs +128 -0
  434. package/skills/i3-ui-prototype/scripts/enterprise-template.cjs +97 -0
  435. package/skills/i3-ui-prototype/scripts/init-prototype.cjs +8 -0
  436. package/skills/i3-ui-prototype/scripts/manage-baseline.cjs +11 -0
  437. package/skills/i3-ui-prototype/scripts/prototype-lib.cjs +259 -0
  438. package/skills/i3-ui-prototype/scripts/template-adapters.cjs +89 -0
  439. package/skills/i3-using-agent-skills/SKILL.md +5 -0
@@ -0,0 +1,32 @@
1
+ import { Alert, Modal, message } from "../../runtime/widgets.js";
2
+ import { ProForm, useForm } from "../../runtime/widgets.js";
3
+ import { useIntents } from "./store.js";
4
+ import { questions } from "./data.js";
5
+ import { createComponent } from '../../runtime/dom.js';
6
+ export default createComponent({ name: 'IntentReplan', propKeys: ["intent"], template: new URL('./IntentReplan.html', import.meta.url).href, setup(__props, __emit) {
7
+ const props = __props, emit = __emit, store = useIntents();
8
+ const expected = props.intent.recordVersion;
9
+ const form = useForm({ keys: ['boundary'], note: '' }, [
10
+ { path: 'keys', label: '重新澄清的部分', component: 'select', mode: 'multiple', span: 24, options: questions.map(q => ({ label: q.label, value: q.key })), rules: [{ required: true, type: 'array', min: 1, message: '请选择至少一项' }] },
11
+ { path: 'note', label: '调整原因', component: 'textarea', placeholder: '说明哪些方向需要调整,后续澄清将保留这条意见。', span: 24, autoSize: { minRows: 4, maxRows: 8 }, maxlength: 500, rules: [{ required: true, whitespace: true, message: '请填写调整原因' }] },
12
+ ]);
13
+ async function save() {
14
+ if (!store.canEdit)
15
+ return;
16
+ try {
17
+ await form.formRef.value?.validate();
18
+ }
19
+ catch {
20
+ return;
21
+ }
22
+ try {
23
+ store.replan(props.intent.id, form.formData.keys, form.formData.note, expected);
24
+ message.success('已保留当前版本,返回澄清工作区');
25
+ emit('close');
26
+ }
27
+ catch (e) {
28
+ message.error(e.message);
29
+ }
30
+ }
31
+ return { Alert, Modal, message, ProForm, useForm, useIntents, questions, props, emit, store, expected, form, save };
32
+ } });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/intents/IntentRevision.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <template data-component="Drawer" data-bind-open="(true)" title="修改意图" data-bind-size="(720)" data-bind-mask="({ closable: false })" data-on-close="(close)"><template data-component="Alert" class="form-intro" type="info" show-icon="" data-bind-title="('保存后形成 v' + ((lastVersion(intent)?.number || 0) + 1) + ',需要重新确认。旧版本继续保留。')"></template><template data-component="Alert" data-if="(error)" class="form-intro" type="error" show-icon="" data-bind-title="(error)"></template><template data-component="ProForm" name="intent-revision" data-bind-form="(form)" layout="vertical" data-bind-disabled="(!store.canEdit)" class="intent-form"></template><template data-component="IntentDecisions" data-bind-decisions="(decisions)" data-bind-editable="(store.canEdit)" data-on-change="(decisions = $event)"></template><template data-slot="footer"><div class="drawer-footer"><span class="muted">修改仅保存在演示数据中</span><template data-component="Space"><template data-component="Button" data-on-click="(close)">取消</template><template data-component="Button" type="primary" data-bind-disabled="(!store.canEdit || !dirty)" data-on-click="(save)">保存新版本</template></template></div></template></template>
@@ -0,0 +1,49 @@
1
+ import { confirmAction } from "../shell/confirmation.js";
2
+ import { computed, ref } from '../../runtime/state.js';
3
+ import { Alert, Button, Drawer, Space, message } from "../../runtime/widgets.js";
4
+ import { ProForm, useForm } from "../../runtime/widgets.js";
5
+ import { contexts, questions } from "./data.js";
6
+ import { lastVersion, questionKeys } from "./domain.js";
7
+ import { useIntents } from "./store.js";
8
+ import IntentDecisions from "./IntentDecisions.js";
9
+ import { createComponent } from '../../runtime/dom.js';
10
+ export default createComponent({ name: 'IntentRevision', propKeys: ["intent"], template: new URL('./IntentRevision.html', import.meta.url).href, setup(__props, __emit) {
11
+ const props = __props, emit = __emit, store = useIntents();
12
+ const expected = props.intent.recordVersion, error = ref(''), decisions = ref(props.intent.decisions.map(d => ({ ...d })));
13
+ const initial = { title: props.intent.title, request: props.intent.request, outcome: props.intent.outcome || '', context: props.intent.context, ...props.intent.answers };
14
+ const form = useForm({ ...initial });
15
+ const required = (label) => [{ required: true, whitespace: true, message: '请补充' + label }];
16
+ form.fields.value = [
17
+ { path: 'title', label: '意图名称', component: 'input', span: 24, maxlength: 80, rules: required('意图名称') },
18
+ { path: 'request', label: '要解决的问题', component: 'textarea', span: 24, autoSize: { minRows: 3, maxRows: 8 }, maxlength: 2000, rules: required('问题描述') },
19
+ { path: 'outcome', label: '预期结果', component: 'textarea', span: 24, autoSize: { minRows: 3, maxRows: 6 }, maxlength: 1000, rules: required('预期结果') },
20
+ { path: 'context', label: '拟归属', component: 'select', span: 24, options: contexts.map(value => ({ label: value, value })), allowClear: false },
21
+ ...questions.map(q => ({ path: q.key, label: q.label, component: 'textarea', span: 24, autoSize: { minRows: 3, maxRows: 8 }, maxlength: 2000, rules: required(q.label) })),
22
+ ];
23
+ const dirty = computed(() => JSON.stringify(form.formData) !== JSON.stringify(initial) || JSON.stringify(decisions.value) !== JSON.stringify(props.intent.decisions));
24
+ function close() { if (dirty.value)
25
+ confirmAction({ title: '放弃本次修改?', content: '已保存的意图版本不会受影响。', okText: '放弃修改', cancelText: '继续编辑', onOk: () => emit('close') });
26
+ else
27
+ emit('close'); }
28
+ async function save() {
29
+ if (!store.canEdit || !dirty.value)
30
+ return;
31
+ try {
32
+ await form.formRef.value?.validate();
33
+ }
34
+ catch {
35
+ return;
36
+ }
37
+ const { title, request, outcome, context } = form.formData;
38
+ const answers = Object.fromEntries(questionKeys.map(q => [q, form.formData[q]]));
39
+ try {
40
+ store.revise(props.intent.id, { title, request, outcome, context }, answers, decisions.value, expected);
41
+ message.success('已保存新版本,请重新确认');
42
+ emit('close');
43
+ }
44
+ catch (e) {
45
+ error.value = e.message;
46
+ }
47
+ }
48
+ return { confirmAction, computed, ref, Alert, Button, Drawer, Space, message, ProForm, useForm, contexts, questions, lastVersion, questionKeys, useIntents, IntentDecisions, props, emit, store, expected, error, decisions, initial, form, required, dirty, close, save };
49
+ } });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/intents/IntentSummary.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <aside class="panel intent-summary" aria-label="意图摘要"><h2>意图摘要</h2><ol class="intent-outline"><li data-each="(q, index) in (questions)" data-bind-key="(q.key)" data-bind-class="({ active: selectable &amp;&amp; intent?.activeQuestion === index })"><button data-if="(selectable &amp;&amp; intent)" data-bind-disabled="(intent.generating)" class="outline-item" data-bind-aria-current="(intent.activeQuestion === index ? 'step' : undefined)" data-on-click="(emit('select', index))"><span class="outline-number">{{ (index + 1) }}</span><span><strong>{{ (q.label) }}</strong><small data-bind-class="({ answered: !!intent.answers[q.key].trim() })"><template data-component="CheckCircleFilled" data-if="(intent.answers[q.key].trim())"></template>{{ (intent.answers[q.key].trim() ? '已回答' : '待补充') }}</small></span></button><div data-else="" class="outline-item"><span class="outline-number">{{ (index + 1) }}</span><span><strong>{{ (q.label) }}</strong><small data-bind-class="({ answered: !!intent?.answers[q.key].trim() })"><template data-component="CheckCircleFilled" data-if="(intent?.answers[q.key].trim())"></template>{{ (intent?.answers[q.key].trim() ? '已回答' : '待补充') }}</small></span></div></li></ol><div class="summary-context"><h3>PBC 归属</h3><p>{{ (intent ? affiliationOf(intent).label : '尚未归属 PBC') }}</p><p class="muted">归属完成后显示当前 PBC;意图历史内容保留。</p></div><div data-if="(intent?.versions.length)" class="summary-context"><h3>已保留版本</h3><p>{{ (intent.versions.length) }} 个意图版本</p><p class="muted">修改和重新规划会保留历史记录。</p></div></aside>
@@ -0,0 +1,10 @@
1
+ import { useDeliveryView } from "../shared/deliveryView.js";
2
+ import { CheckCircleFilled } from "../../runtime/icons.js";
3
+ import { questions, contexts } from "./data.js";
4
+ import { createComponent } from '../../runtime/dom.js';
5
+ export default createComponent({ name: 'IntentSummary', propKeys: ["intent", "selectable"], template: new URL('./IntentSummary.html', import.meta.url).href, setup(__props, __emit) {
6
+ const { affiliationOf } = useDeliveryView();
7
+ __props;
8
+ const emit = __emit;
9
+ return { useDeliveryView, affiliationOf, CheckCircleFilled, questions, contexts, emit };
10
+ } });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/intents/IntentWorkspace.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <template data-component="Result" data-if="(!intent)" status="403" title="记录不存在或当前身份无权访问"><template data-slot="extra"><template data-component="RouterLink" to="/intents"><template data-component="Button" type="primary">返回意图池</template></template></template></template><template data-else=""><template data-component="IntentSource" data-bind-intent="(intent)"></template><template data-component="IntentHeader" data-bind-intent="(intent)" data-bind-step="(1)"><template data-component="Button" data-if="(store.canClose)" danger="" data-bind-disabled="(intent.generating)" data-on-click="(closing = true)">关闭意图</template><template data-component="Button" data-on-click="(preview = true)">预览意图</template><template data-component="Button" data-on-click="(router.push('/intents'))">返回列表</template></template><template data-component="Alert" data-if="(store.notice)" class="page-alert" type="warning" show-icon="" data-bind-title="(store.notice)"></template><template data-component="Alert" data-if="(!store.canEdit)" class="page-alert" type="info" show-icon="" title="只读查看:当前不能补充、整理或确认意图。"></template><template data-component="Alert" data-if="(intent.replanNote)" class="page-alert" type="info" show-icon="" title="正在重新澄清" data-bind-description="(intent.replanNote)"></template><div class="intent-grid"><section class="panel intent-main"><h2>需求澄清</h2><p class="muted intent-subtitle">按问题补充信息,形成可确认的意图。</p><div class="request-brief"><h3>要解决的问题</h3><p>{{ (intent.request) }}</p><h3 class="brief-outcome">预期结果</h3><p>{{ (intent.outcome) }}</p></div><div data-if="(intent.generating)" class="intent-generating" role="status" aria-live="polite"><h3>正在整理意图…</h3><p class="muted">根据已补充的四项内容生成演示意图。</p><template data-component="Skeleton" active="" data-bind-paragraph="({ rows: 4 })"></template></div><div data-else="" class="clarification-block"><div class="assistant-label"><template data-component="CommentOutlined"></template><span>需求规划助手 · 演示</span><small>第 {{ (intent.activeQuestion + 1) }} 项,共 4 项</small></div><h3 class="question-title">{{ (question.title) }}</h3><p class="muted question-hint">{{ (question.hint) }}</p><template data-component="Button" class="example-answer" data-bind-disabled="(!store.canEdit)" data-on-click="(example)"><template data-component="EditOutlined"></template>{{ (/供热|报修|派单/.test(intent.request) ? '填入供热示例' : '填入回答示例') }}</template><label for="clarification-answer" class="answer-label">我的补充</label><template data-component="Input.TextArea" id="clarification-answer" data-model-value="(answer)" data-bind-rows="(5)" data-bind-maxlength="(2000)" show-count="" data-bind-disabled="(!store.canEdit)" data-bind-placeholder="(question.placeholder)" data-bind-aria-invalid="(!!validation)" data-bind-aria-describedby="(validation ? 'answer-error' : undefined)"></template><p data-if="(validation)" id="answer-error" class="input-error" role="alert">{{ (validation) }}</p></div><template data-component="Alert" data-if="(intent.error)" class="intent-error" type="error" show-icon="" title="意图整理失败" data-bind-description="(intent.error)"><template data-slot="action"><template data-component="Button" data-bind-disabled="(!store.canEdit)" data-on-click="(generate)">重试生成</template></template></template><div class="intent-actions"><span class="muted" role="status"><template data-component="InfoCircleOutlined"></template> 回答保存在当前浏览器</span><template data-component="Button" type="primary" data-bind-loading="(intent.generating)" data-bind-disabled="(!store.canEdit)" data-on-click="(next)">{{ (allDone ? '生成意图' : '保存并继续') }}</template></div><template data-component="IntentDecisions" data-bind-decisions="(intent.decisions)" data-bind-editable="(store.canEdit &amp;&amp; !intent.generating)" data-bind-commit="(saveDecisions)"></template></section><div class="intent-side-stack"><template data-component="IntentSummary" data-bind-intent="(intent)" selectable="" data-on-select="(select)"></template><div class="panel intent-summary"><template data-component="RecordMetadata" data-bind-record="(intent)" compact=""></template></div></div></div><template data-component="IntentClose" data-if="(closing)" data-bind-intent="(intent)" data-on-close="(closing = false)"></template><template data-component="Drawer" data-bind-open="(preview)" title="意图草稿预览" data-bind-size="(720)" data-on-close="(preview = false)"><template data-component="Alert" type="info" show-icon="" title="根据当前已保存的输入展示,未填写的内容保持待补充。"></template><template data-component="IntentDocument" data-bind-value="(intent)"></template></template></template>
@@ -0,0 +1,77 @@
1
+ import IntentSource from "../operations/IntentSource.js";
2
+ import { confirmAction } from "../shell/confirmation.js";
3
+ import { computed, ref, watch, nextTick } from '../../runtime/state.js';
4
+ import { useRoute, useRouter } from "../../runtime/router.js";
5
+ import { Alert, Button, Drawer, Input, Result, Skeleton, message } from "../../runtime/widgets.js";
6
+ import { CommentOutlined, EditOutlined, InfoCircleOutlined } from "../../runtime/icons.js";
7
+ import { useIntents } from "./store.js";
8
+ import { questions, exampleFor } from "./data.js";
9
+ import { completeAnswers } from "./domain.js";
10
+ import IntentHeader from "./IntentHeader.js";
11
+ import IntentSummary from "./IntentSummary.js";
12
+ import IntentDecisions from "./IntentDecisions.js";
13
+ import IntentClose from "./IntentClose.js";
14
+ import RecordMetadata from "../shared/RecordMetadata.js";
15
+ import IntentDocument from "./IntentDocument.js";
16
+ import { createComponent } from '../../runtime/dom.js';
17
+ export default createComponent({ name: 'IntentWorkspace', propKeys: [], template: new URL('./IntentWorkspace.html', import.meta.url).href, setup(__props, __emit) {
18
+ const route = useRoute(), router = useRouter(), store = useIntents(), validation = ref('');
19
+ const closing = ref(false), preview = ref(false);
20
+ const id = computed(() => String(route.params.id)), intent = computed(() => store.get(id.value));
21
+ const question = computed(() => questions[intent.value?.activeQuestion || 0]);
22
+ const answer = computed({ get: () => intent.value?.answers[question.value.key] || '', set: value => { validation.value = ''; try {
23
+ store.answer(id.value, question.value.key, value);
24
+ }
25
+ catch (e) {
26
+ validation.value = e.message;
27
+ } } });
28
+ const allDone = computed(() => !!intent.value && completeAnswers(intent.value.answers));
29
+ watch([id, () => store.canEdit], () => { if (intent.value?.status === 'draft' && store.canEdit) {
30
+ try {
31
+ store.start(id.value);
32
+ }
33
+ catch (e) {
34
+ validation.value = e.message;
35
+ }
36
+ } }, { immediate: true });
37
+ watch(() => intent.value?.status, value => { if (value === 'ready' || value === 'confirmed' || value === 'closed')
38
+ router.replace('/intents/' + id.value); }, { immediate: true });
39
+ function saveDecisions(decisions) { try {
40
+ store.setDecisions(id.value, decisions, intent.value.recordVersion);
41
+ return true;
42
+ }
43
+ catch (e) {
44
+ message.error(e.message);
45
+ return false;
46
+ } }
47
+ function select(index) { validation.value = ''; store.selectQuestion(id.value, index); nextTick(() => document.getElementById('clarification-answer')?.focus()); }
48
+ function example() {
49
+ const fill = () => { answer.value = exampleFor(question.value.key, intent.value?.request || ''); };
50
+ if (answer.value.trim())
51
+ confirmAction({ title: '替换当前回答为示例?', content: '其他澄清回答不受影响。', okText: '填入示例', cancelText: '保留回答', onOk: fill });
52
+ else
53
+ fill();
54
+ }
55
+ async function next() {
56
+ if (!store.canEdit || !intent.value)
57
+ return;
58
+ if (!answer.value.trim()) {
59
+ validation.value = '请先补充当前问题,再继续。';
60
+ document.getElementById('clarification-answer')?.focus();
61
+ return;
62
+ }
63
+ if (allDone.value) {
64
+ await generate();
65
+ return;
66
+ }
67
+ const after = questions.findIndex((q, index) => index > intent.value.activeQuestion && !intent.value.answers[q.key].trim());
68
+ select(after >= 0 ? after : questions.findIndex(q => !intent.value.answers[q.key].trim()));
69
+ }
70
+ async function generate() { try {
71
+ await store.generate(id.value);
72
+ }
73
+ catch (e) {
74
+ message.error(e.message);
75
+ } }
76
+ return { IntentSource, confirmAction, computed, ref, watch, nextTick, useRoute, useRouter, Alert, Button, Drawer, Input, Result, Skeleton, message, CommentOutlined, EditOutlined, InfoCircleOutlined, useIntents, questions, exampleFor, completeAnswers, IntentHeader, IntentSummary, IntentDecisions, IntentClose, RecordMetadata, IntentDocument, route, router, store, validation, closing, preview, id, intent, question, answer, allDone, saveDecisions, select, example, next, generate };
77
+ } });
@@ -0,0 +1,60 @@
1
+ import { newIntent, publishVersion, confirmVersion } from "./domain.js";
2
+ import { actors, formatDate } from "../shared/policy.js";
3
+ export const statusMeta = {
4
+ draft: { label: '草稿', color: 'default' }, clarifying: { label: '待补充', color: 'orange' },
5
+ ready: { label: '待确认', color: 'blue' }, confirmed: { label: '已确认', color: 'green' },
6
+ closed: { label: '已关闭', color: 'default' },
7
+ };
8
+ export const contexts = ['集团意图池 · 尚未立项', '拟归属:供热工单 PBC', '拟归属:知识助手 PBC', '拟归属:EASEL 研发平台'];
9
+ export const heatingExample = {
10
+ title: '供热报修智能分诊与主管确认派单',
11
+ request: '居民报修后,结合设备台账和历史工单给出故障分类与班组建议,由主管确认后派单。', context: contexts[0],
12
+ outcome: '主管能查看有依据的分类与班组建议,确认后完成派单;不确定的报修可以转人工。',
13
+ };
14
+ export const heatingAnswers = {
15
+ audience: '居民或客服提交报修,主管在工作台查看分诊建议并确认,处理班组查看工单进度。',
16
+ process: '系统查询授权资料并形成分类和班组建议;主管确认或调整后派单。信息不足或建议不可靠时转人工处理。',
17
+ boundary: '使用授权的设备台账、历史工单和班组资料;不执行设备控制或参数调整。派单和通知先在测试环境验证。',
18
+ acceptance: '每条建议可查看依据;必须经主管确认后派单;重复操作不重复派单;异常可转人工并记录原因。',
19
+ };
20
+ export const questions = [
21
+ { key: 'audience', label: '使用者与入口', title: '哪些人使用?从哪里发起?', hint: '说明参与的人、使用入口,以及各自需要完成的动作。', placeholder: '例如:居民或客服提交报修,主管在工作台确认建议。' },
22
+ { key: 'process', label: '处理流程', title: '系统给出结果后,谁决定下一步?', hint: '说明主要步骤、人工确认点,以及不确定时如何处理。', placeholder: '从输入到结果,按先后写出处理步骤。' },
23
+ { key: 'boundary', label: '数据与边界', title: '可以使用哪些资料?有哪些限制?', hint: '把可用数据、权限范围、暂不涉及的能力写清楚。', placeholder: '填写数据来源、允许的操作和需要遵守的限制。' },
24
+ { key: 'acceptance', label: '验收标准', title: '怎样判断这项需求已经做好?', hint: '描述能观察、能验证的结果。暂时不确定的指标可以注明待业务方提供。', placeholder: '例如:哪些结果必须可查询,哪些异常必须可恢复。' },
25
+ ];
26
+ export function exampleFor(key, request) {
27
+ if (/供热|报修|派单/.test(request))
28
+ return heatingAnswers[key];
29
+ return { audience: '业务人员从工作台发起,负责人查看和确认结果。', process: '提交信息后整理建议,由负责人确认;信息不足时补充,处理失败时可重试或转人工。',
30
+ boundary: '只读取本项目已授权的数据,不自动修改生产业务记录;具体数据接口由业务方提供。', acceptance: '输入、处理结果和确认记录可以追溯;错误原因明确,重新打开页面可继续未完成的工作。' }[key];
31
+ }
32
+ export function seedIntents() {
33
+ const at = '2026-09-08T10:20:00.000Z';
34
+ const first = newIntent(heatingExample, 'seed-heating', 'INT-20260909-001', at);
35
+ first.status = 'clarifying';
36
+ first.decisions = [{ id: 'decision-1', question: '低置信度建议由谁复核,超时后如何处理?', answer: '' }];
37
+ let knowledge = newIntent({ title: '知识助手增加回答来源引用', request: '员工查询制度时,答案应同时展示原文来源,资料不足时明确提示。', context: contexts[2] }, 'seed-knowledge', 'INT-20260909-002', at);
38
+ knowledge.answers = { audience: '员工在知识助手入口提问,知识管理员维护制度资料。', process: '查询授权资料并返回答案与原文引用;没有可靠依据时提示无法回答。', boundary: '仅查询当前账号有权访问的制度资料,不读取未授权文件。', acceptance: '每个答案可打开来源;过期资料有提示;找不到依据时不编造答案。' };
39
+ Object.assign(knowledge, { tenantId: 'north', owner: actors[5].name, createdById: actors[5].id, createdBy: actors[5].name, createdDept: actors[5].department, updatedBy: actors[5].name });
40
+ knowledge = publishVersion(knowledge, at);
41
+ const inspection = newIntent({ title: '巡检异常上报与转派', request: '巡检人员可以提交异常和照片,由值班负责人判断是否转为维修工单。', context: contexts[0] }, 'seed-inspection', 'INT-20260909-003', at);
42
+ let confirmed = newIntent({ title: '工单处理进度通知', request: '工单状态变化后,为相关业务人员提供可查询的处理进度。', context: contexts[1] }, 'seed-notice', 'INT-20260909-004', at);
43
+ confirmed.answers = { audience: '客服与处理班组在工单工作台查看。', process: '工单状态更新后生成进度记录,业务人员可查询处理过程。', boundary: '先验证测试环境记录,不发送真实居民通知。', acceptance: '状态与工单一致,重复事件不生成重复记录,错误原因可查。' };
44
+ confirmed = confirmVersion(publishVersion(confirmed, at), 1, at);
45
+ const report = newIntent({ title: '班组日报自动汇总', request: '将每天班组处理的工单汇总为日报,班组长补充说明后确认。', context: contexts[1] }, 'seed-report', 'INT-20260909-005', at);
46
+ report.status = 'clarifying';
47
+ report.answers.audience = '班组长每天在工作台查看汇总并补充说明。';
48
+ report.activeQuestion = 1;
49
+ Object.assign(report, { owner: actors[3].name, createdById: actors[3].id, createdBy: actors[3].name, createdDept: actors[3].department, updatedBy: actors[3].name });
50
+ let delivery = newIntent({ ...heatingExample, title: heatingExample.title + ' · 规格演示' }, 'seed-spec-heating', 'INT-20260910-006', at);
51
+ delivery.answers = { ...heatingAnswers };
52
+ delivery = confirmVersion(publishVersion(delivery, at), 1, at);
53
+ const factory = JSON.parse(JSON.stringify(delivery));
54
+ factory.id = 'seed-pbc-create';
55
+ factory.code = 'INT-20260911-PBC';
56
+ factory.title = '供热智能分诊 · 新建系统样例';
57
+ factory.versions.forEach(v => v.title = factory.title);
58
+ return [factory, delivery, first, knowledge, inspection, confirmed, report];
59
+ }
60
+ export const dateText = formatDate;
@@ -0,0 +1,105 @@
1
+ import { actors, metadata, can } from "../shared/policy.js";
2
+ export const questionKeys = ['audience', 'process', 'boundary', 'acceptance'];
3
+ export const emptyAnswers = () => ({ audience: '', process: '', boundary: '', acceptance: '' });
4
+ export const completeAnswers = (answers) => questionKeys.every(key => !!answers[key]?.trim());
5
+ export const lastVersion = (intent) => intent.versions.at(-1);
6
+ export const unresolved = (decisions) => decisions.filter(d => !d.answer.trim());
7
+ export const confirmationBusy = (intent) => ['pending', 'unknown'].includes(intent.confirmation);
8
+ export function assertIntentAccess(intent, actor, action, expected) {
9
+ if (!can(actor, action, intent.tenantId) || intent.isDeleted)
10
+ throw new Error('当前身份没有此操作权限,或记录不在可见范围内。');
11
+ if (expected !== undefined && expected !== intent.recordVersion)
12
+ throw new Error('记录已被更新,请重新打开并核对最新内容。');
13
+ }
14
+ export function assertMutable(intent) {
15
+ if (intent.status === 'closed')
16
+ throw new Error('意图已关闭,保留内容与历史供查阅。');
17
+ if (confirmationBusy(intent))
18
+ throw new Error('确认结果尚未明确,请先核实结果再修改。');
19
+ }
20
+ export function newIntent(input, id, code, at, actor = actors[2]) {
21
+ if (!input.title.trim() || !input.request.trim())
22
+ throw new Error('请填写意图名称和需求描述。');
23
+ return { ...input, outcome: input.outcome || input.request, title: input.title.trim(), request: input.request.trim(), id, code,
24
+ ...metadata(actor, at), owner: actor.name, status: 'draft', answers: emptyAnswers(), decisions: [], activeQuestion: 0,
25
+ versions: [], events: [{ label: '保存意图草稿', at, actor: actor.name }], replanNote: '', generating: false, error: '', confirmation: 'idle' };
26
+ }
27
+ export function publishVersion(intent, at, reason = '根据澄清回答整理') {
28
+ assertMutable(intent);
29
+ if (!completeAnswers(intent.answers) || !intent.outcome?.trim())
30
+ throw new Error('请先补充预期结果与全部澄清事项。');
31
+ if (intent.status === 'confirmed')
32
+ throw new Error('请先通过修改或重新规划创建新的意图版本。');
33
+ const number = (lastVersion(intent)?.number || 0) + 1;
34
+ const version = { title: intent.title, request: intent.request, outcome: intent.outcome, context: intent.context,
35
+ answers: { ...intent.answers }, decisions: intent.decisions.map(d => ({ ...d })), number, createdAt: at, reason };
36
+ return { ...intent, status: 'ready', generating: false, error: '', confirmation: 'idle', pendingConfirmation: undefined, updatedAt: at,
37
+ versions: [...intent.versions, version], events: [...intent.events, { label: '形成意图 v' + number + ',等待确认', at }] };
38
+ }
39
+ export function reviseVersion(intent, input, answers, at, decisions = intent.decisions) {
40
+ assertMutable(intent);
41
+ if (!lastVersion(intent))
42
+ throw new Error('当前还没有可修改的意图版本。');
43
+ if (!input.title.trim() || !input.request.trim())
44
+ throw new Error('意图名称与目标不能为空。');
45
+ return publishVersion({ ...intent, ...input, answers: { ...answers }, decisions: decisions.map(d => ({ ...d })), status: 'clarifying' }, at, '人工修改意图内容或决策登记');
46
+ }
47
+ function checkCandidate(intent, expected) {
48
+ const current = lastVersion(intent);
49
+ if (intent.status !== 'ready' || !current || current.number !== expected)
50
+ throw new Error('当前版本已变化,请重新查看后确认。');
51
+ if (!completeAnswers(intent.answers) || JSON.stringify(intent.answers) !== JSON.stringify(current.answers) ||
52
+ JSON.stringify(intent.decisions) !== JSON.stringify(current.decisions) || intent.outcome !== current.outcome ||
53
+ intent.request !== current.request || intent.title !== current.title || intent.context !== current.context)
54
+ throw new Error('内容已经变化,请先重新整理意图。');
55
+ if (unresolved(current.decisions).length)
56
+ throw new Error('仍有未决问题,请登记结论并形成新版本后确认。');
57
+ return current;
58
+ }
59
+ export function confirmVersion(intent, expected, at, actor = actors[2]) {
60
+ assertIntentAccess(intent, actor, 'intent:confirm');
61
+ const current = checkCandidate(intent, expected);
62
+ const confirmed = { ...current, answers: { ...current.answers }, decisions: current.decisions.map(d => ({ ...d })), confirmedAt: at, confirmedBy: actor.name };
63
+ return { ...intent, status: 'confirmed', confirmation: 'idle', error: '', pendingConfirmation: undefined, updatedAt: at,
64
+ versions: [...intent.versions.slice(0, -1), confirmed], events: [...intent.events, { label: '确认意图 v' + expected, at, actor: actor.name }] };
65
+ }
66
+ export function beginConfirmation(intent, expected, at, actor, requestId) {
67
+ assertIntentAccess(intent, actor, 'intent:confirm');
68
+ assertMutable(intent);
69
+ checkCandidate(intent, expected);
70
+ return { ...intent, confirmation: 'pending', error: '', pendingConfirmation: { requestId, version: expected, actorId: actor.id, actor: actor.name, at } };
71
+ }
72
+ export function closeIntent(intent, reason, at, actor) {
73
+ assertIntentAccess(intent, actor, 'intent:close');
74
+ assertMutable(intent);
75
+ if (intent.status === 'confirmed')
76
+ throw new Error('已确认意图需保留确认基线;归档策略另行确认。');
77
+ if (intent.generating)
78
+ throw new Error('正在整理意图,请等待完成后再关闭。');
79
+ if (!reason.trim())
80
+ throw new Error('请填写关闭原因。');
81
+ return { ...intent, status: 'closed', closedReason: reason.trim(), closedBy: actor.name, closedAt: at,
82
+ events: [...intent.events, { label: '关闭意图:' + reason.trim(), actor: actor.name, at }] };
83
+ }
84
+ export function replanIntent(intent, keys, note, at) {
85
+ assertMutable(intent);
86
+ if (!['ready', 'confirmed'].includes(intent.status))
87
+ throw new Error('请先完成当前澄清。');
88
+ if (!keys.length || keys.some(key => !questionKeys.includes(key)) || !note.trim())
89
+ throw new Error('请选择重新澄清的部分并填写原因。');
90
+ const answers = { ...intent.answers };
91
+ keys.forEach(key => { answers[key] = ''; });
92
+ return { ...intent, answers, status: 'clarifying', activeQuestion: questionKeys.indexOf(keys[0]), error: '', generating: false,
93
+ confirmation: 'idle', pendingConfirmation: undefined, replanNote: note.trim(), updatedAt: at,
94
+ events: [...intent.events, { label: '重新规划:' + note.trim(), at }] };
95
+ }
96
+ export function assertIntentDelete(intent) {
97
+ if (intent.operationLinks?.length)
98
+ throw new Error('意图关联运行异常,必须保留来源与处理记录,不能删除。');
99
+ if (intent.status === 'confirmed' || intent.versions.some(v => v.confirmedAt))
100
+ throw new Error('存在已确认版本,须保留意图与历史,不能删除。');
101
+ if (confirmationBusy(intent) || intent.pendingConfirmation)
102
+ throw new Error('确认处理中或结果待核实,请先核实结果。');
103
+ if (intent.generating)
104
+ throw new Error('正在整理意图,请等待完成后再操作。');
105
+ }
@@ -0,0 +1,212 @@
1
+ import { computed, ref } from '../../runtime/state.js';
2
+ import { defineStore } from "../../runtime/state.js";
3
+ import { useSession } from "../shared/session.js";
4
+ import { seedIntents } from "./data.js";
5
+ import { newIntent, publishVersion, reviseVersion, confirmVersion, beginConfirmation, closeIntent, replanIntent, completeAnswers, questionKeys, assertIntentAccess, assertMutable, assertIntentDelete } from "./domain.js";
6
+ import { assertBatch } from "../shared/listBatch.js";
7
+ const key = 'i3-prototype-antdv-console-intents-prototype-v010';
8
+ const copy = (value) => JSON.parse(JSON.stringify(value));
9
+ export const useIntents = defineStore('intents', () => {
10
+ const session = useSession(), records = ref(seedIntents()), notice = ref(''), scene = ref('normal'), resultMode = ref('success'), resetTick = ref(0);
11
+ const canEdit = computed(() => session.can('intent:edit')), canConfirm = computed(() => session.can('intent:confirm')), canClose = computed(() => session.can('intent:close'));
12
+ let epoch = 0;
13
+ try {
14
+ const raw = localStorage.getItem(key);
15
+ if (raw) {
16
+ const saved = JSON.parse(raw);
17
+ if (saved.schema !== 3 || !Array.isArray(saved.items) || !saved.items.every((i) => i.id && i.tenantId && i.recordVersion &&
18
+ ['draft', 'clarifying', 'ready', 'confirmed', 'closed'].includes(i.status) && Array.isArray(i.versions) && Array.isArray(i.decisions) &&
19
+ i.answers && questionKeys.every(q => typeof i.answers[q] === 'string')))
20
+ throw new Error('Invalid saved data');
21
+ records.value = saved.items.map((i) => ({ ...i, generating: false, confirmation: i.confirmation === 'pending' ? 'unknown' : i.confirmation,
22
+ error: i.generating ? '上次整理被中断,回答已保留。请重试生成。' : i.error }));
23
+ }
24
+ }
25
+ catch {
26
+ notice.value = '本地演示数据无法读取,已加载初始示例。';
27
+ }
28
+ function commit(next) {
29
+ try {
30
+ localStorage.setItem(key, JSON.stringify({ schema: 3, items: next }));
31
+ }
32
+ catch {
33
+ throw new Error('浏览器无法保存演示数据,本次操作未提交。请保留输入后重试。');
34
+ }
35
+ records.value = next;
36
+ notice.value = '';
37
+ }
38
+ function freshRecords() {
39
+ try {
40
+ const raw = localStorage.getItem(key);
41
+ if (!raw)
42
+ return records.value;
43
+ const saved = JSON.parse(raw);
44
+ if (saved.schema !== 3 || !Array.isArray(saved.items))
45
+ throw Error();
46
+ return saved.items;
47
+ }
48
+ catch {
49
+ throw Error('意图数据无法读取,本次未提交。请重新加载核对。');
50
+ }
51
+ }
52
+ function operationCommit(transform) {
53
+ const fresh = freshRecords(), next = transform(copy(fresh));
54
+ commit([next, ...fresh.filter(i => i.id !== next.id)]);
55
+ return next;
56
+ }
57
+ if (typeof window !== 'undefined')
58
+ window.addEventListener('storage', e => { if (e.key === key) {
59
+ try {
60
+ records.value = freshRecords();
61
+ notice.value = '';
62
+ }
63
+ catch {
64
+ notice.value = '其他页面写入的意图无法读取,请刷新核对。';
65
+ }
66
+ } });
67
+ const items = computed(() => records.value.filter(i => !i.isDeleted && session.readable('intent:view', i.tenantId)));
68
+ const get = (id) => items.value.find(i => i.id === id);
69
+ function requireRecord(id, action, expected) {
70
+ session.require(action);
71
+ const i = get(id);
72
+ if (!i)
73
+ throw new Error('记录不存在或当前身份无权访问。');
74
+ assertIntentAccess(i, session.actor, action, expected);
75
+ return i;
76
+ }
77
+ function update(record, actor = session.actor, touch = true) {
78
+ const known = records.value.find(i => i.id === record.id), fresh = freshRecords(), current = fresh.find(i => i.id === record.id);
79
+ if (known && current && known.recordVersion !== current.recordVersion) {
80
+ records.value = fresh;
81
+ throw Error('意图已在其他页面更新,请核对当前版本;输入保留。');
82
+ }
83
+ if (!current)
84
+ throw new Error('记录已不存在。');
85
+ const next = copy(record);
86
+ if (touch) {
87
+ next.recordVersion = current.recordVersion + 1;
88
+ next.updatedAt = new Date().toISOString();
89
+ next.updatedBy = actor.name;
90
+ }
91
+ next.events = next.events.map((e, n) => n >= current.events.length ? { ...e, actor: e.actor || actor.name } : e);
92
+ commit(fresh.map(i => i.id === next.id ? next : i));
93
+ }
94
+ function create(input) {
95
+ session.require('intent:edit', session.actor.tenantId);
96
+ session.writeCheck();
97
+ records.value = freshRecords();
98
+ const at = new Date().toISOString(), id = crypto.randomUUID();
99
+ const max = Math.max(0, ...records.value.map(i => Number(i.code.split('-').at(-1)) || 0)) + 1;
100
+ const code = 'INT-' + at.slice(0, 10).replaceAll('-', '') + '-' + String(max).padStart(3, '0');
101
+ const item = newIntent(input, id, code, at, session.actor);
102
+ commit([item, ...records.value]);
103
+ return item.id;
104
+ }
105
+ function start(id) { const i = requireRecord(id, 'intent:edit'); if (i.status === 'draft')
106
+ update({ ...i, status: 'clarifying' }); }
107
+ function answer(id, q, value) {
108
+ const i = requireRecord(id, 'intent:edit');
109
+ assertMutable(i);
110
+ if (i.generating || i.status !== 'clarifying')
111
+ throw new Error('当前状态不能修改澄清回答。');
112
+ update({ ...i, answers: { ...i.answers, [q]: value }, error: '' });
113
+ }
114
+ function selectQuestion(id, index) { const i = get(id); if (i)
115
+ update({ ...i, activeQuestion: Math.max(0, Math.min(index, 3)) }, session.actor, false); }
116
+ async function generate(id) {
117
+ const i = requireRecord(id, 'intent:edit');
118
+ assertMutable(i);
119
+ if (i.generating || !completeAnswers(i.answers) || !['draft', 'clarifying'].includes(i.status))
120
+ return false;
121
+ session.writeCheck();
122
+ const run = epoch, mode = resultMode.value, actor = copy(session.actor);
123
+ update({ ...i, status: 'clarifying', generating: true, error: '' });
124
+ await new Promise(resolve => setTimeout(resolve, 850));
125
+ if (run !== epoch)
126
+ return false;
127
+ const current = records.value.find(r => r.id === id);
128
+ if (!current)
129
+ return false;
130
+ if (actor.id !== session.actor.id || !session.can('intent:edit', current.tenantId) || mode === 'failure') {
131
+ update({ ...current, generating: false, error: mode === 'failure' ? '整理暂未完成(模拟超时)。回答已保留,可重试。' : '身份或登录状态已变化,整理已中止。重新登录后可重试。' }, actor);
132
+ return false;
133
+ }
134
+ update(publishVersion(current, new Date().toISOString(), current.replanNote ? '重新规划:' + current.replanNote : undefined), actor);
135
+ return true;
136
+ }
137
+ function revise(id, input, answers, decisions, expected) {
138
+ const i = requireRecord(id, 'intent:edit', expected);
139
+ session.writeCheck();
140
+ update(reviseVersion(i, input, answers, new Date().toISOString(), decisions));
141
+ }
142
+ function setDecisions(id, decisions, expected) {
143
+ const i = requireRecord(id, 'intent:edit', expected);
144
+ assertMutable(i);
145
+ session.writeCheck();
146
+ if (i.status === 'confirmed')
147
+ throw new Error('请通过修改意图形成新版本。');
148
+ if (i.generating)
149
+ throw new Error('正在整理,请稍后修改决策登记。');
150
+ if (i.status === 'ready')
151
+ update(reviseVersion(i, i, i.answers, new Date().toISOString(), decisions));
152
+ else
153
+ update({ ...i, decisions: copy(decisions) });
154
+ }
155
+ async function confirm(id, expected, expectedRecord) {
156
+ const i = requireRecord(id, 'intent:confirm', expectedRecord);
157
+ session.writeCheck();
158
+ const actor = copy(session.actor), requestId = crypto.randomUUID(), run = epoch, mode = session.confirmResult;
159
+ update(beginConfirmation(i, expected, new Date().toISOString(), actor, requestId), actor);
160
+ await new Promise(resolve => setTimeout(resolve, 800));
161
+ if (run !== epoch)
162
+ return 'cancelled';
163
+ const current = records.value.find(r => r.id === id);
164
+ if (!current || current.pendingConfirmation?.requestId !== requestId)
165
+ return 'cancelled';
166
+ if (mode === 'failure' || session.actor.id !== actor.id || !session.can('intent:confirm', current.tenantId)) {
167
+ update({ ...current, confirmation: 'failed', pendingConfirmation: undefined, error: mode === 'failure' ? '确认未被接受(模拟服务错误),当前版本仍未确认,可重试。' : '身份、权限或登录状态已变化,本次确认未被接受。' }, actor);
168
+ return 'failed';
169
+ }
170
+ if (mode === 'unknown') {
171
+ update({ ...current, confirmation: 'unknown', pendingConfirmation: { ...current.pendingConfirmation, acceptedAt: new Date().toISOString(), acceptedActor: actor }, error: '' }, actor);
172
+ return 'unknown';
173
+ }
174
+ update(confirmVersion(current, expected, new Date().toISOString(), actor), actor);
175
+ return 'confirmed';
176
+ }
177
+ function reconcile(id) {
178
+ const i = get(id);
179
+ if (!i)
180
+ throw Error('记录不存在或没有查看权限。');
181
+ session.require('intent:view', i.tenantId);
182
+ const pending = i.pendingConfirmation;
183
+ if (i.confirmation !== 'unknown' || !pending)
184
+ throw new Error('当前没有待核实的确认请求。');
185
+ if (!pending.acceptedAt || !pending.acceptedActor) {
186
+ update({ ...i, confirmation: 'failed', pendingConfirmation: undefined, error: '本地模拟服务尚未接受原请求,请核对后重新提交。' });
187
+ return;
188
+ }
189
+ const original = pending.acceptedActor;
190
+ update(confirmVersion(i, pending.version, pending.acceptedAt, original), original);
191
+ }
192
+ function close(id, reason, expected) { const i = requireRecord(id, 'intent:close', expected); session.writeCheck(); update(closeIntent(i, reason, new Date().toISOString(), session.actor)); }
193
+ function replan(id, keys, note, expected) { const i = requireRecord(id, 'intent:edit', expected); session.writeCheck(); update(replanIntent(i, keys, note, new Date().toISOString())); }
194
+ function deletionCheck(i) { assertIntentAccess(i, session.actor, 'intent:delete'); assertIntentDelete(i); }
195
+ function checkRemove(target) {
196
+ session.require('intent:delete');
197
+ assertBatch(items.value, [target], deletionCheck);
198
+ }
199
+ function removeMany(targets) {
200
+ records.value = freshRecords();
201
+ session.require('intent:delete');
202
+ const selected = assertBatch(items.value, targets, deletionCheck);
203
+ session.writeCheck();
204
+ const ids = new Set(selected.map(i => i.id)), at = new Date().toISOString(), batchId = crypto.randomUUID();
205
+ commit(records.value.map(i => ids.has(i.id) ? { ...i, isDeleted: true, recordVersion: i.recordVersion + 1,
206
+ updatedAt: at, updatedBy: session.actor.name,
207
+ events: [...i.events, { label: '逻辑删除意图;批次 ' + batchId + '(' + selected.length + ' 项)', at, actor: session.actor.name }],
208
+ } : i));
209
+ }
210
+ function reset() { epoch++; resetTick.value++; commit(seedIntents()); scene.value = 'normal'; resultMode.value = 'success'; }
211
+ return { operationRecords: freshRecords, operationCommit, items, notice, scene, resultMode, resetTick, canEdit, canConfirm, canClose, get, create, start, answer, selectQuestion, generate, revise, setDecisions, confirm, reconcile, close, replan, checkRemove, removeMany, reset };
212
+ });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/models/AuditPanel.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <section class="panel audit-panel"><h2>模型操作记录</h2><template data-component="Alert" class="form-intro" type="info" show-icon="" title="本地演示记录,不构成正式审计或审批证据。"></template><template data-component="ProTable" data-bind-table="(table)" data-bind-table-container="(false)" data-bind-control="(false)" row-key="id" data-bind-scroll="({ x: 1020 })" data-bind-search="(async () =&gt; { })" data-bind-pagination="({ showTotal: (t) =&gt; `共 ${t} 条`, showSizeChanger: true, pageSizeOptions: [10, 20, 50, 100], hideOnSinglePage: false })"></template></section>
@@ -0,0 +1,18 @@
1
+ import { computed, watch } from '../../runtime/state.js';
2
+ import { Alert } from "../../runtime/widgets.js";
3
+ import { ProTable, useTable } from "../../runtime/widgets.js";
4
+ import { useModels } from "./store.js";
5
+ import { createComponent } from '../../runtime/dom.js';
6
+ export default createComponent({ name: 'AuditPanel', propKeys: [], template: new URL('./AuditPanel.html', import.meta.url).href, setup(__props, __emit) {
7
+ const store = useModels();
8
+ const table = useTable({ pageParam: { current: 1, pageSize: 10, total: store.audit.length }, columns: [
9
+ { title: '操作时间', dataIndex: 'time', width: 166 },
10
+ { title: '操作者', dataIndex: 'actor', width: 170 },
11
+ { title: '模型', dataIndex: 'model', width: 164 },
12
+ { title: '操作', dataIndex: 'action', width: 110 },
13
+ { title: '变更说明', dataIndex: 'detail', width: 410 },
14
+ ] });
15
+ const records = computed(() => store.audit.slice(((table.pageParam.current || 1) - 1) * (table.pageParam.pageSize || 10), (table.pageParam.current || 1) * (table.pageParam.pageSize || 10)));
16
+ watch(records, () => { table.dataSource.value = records.value; table.setPageParam({ total: store.audit.length }); }, { immediate: true });
17
+ return { computed, watch, Alert, ProTable, useTable, useModels, store, table, records };
18
+ } });