@givolt/i3-composer-agent 3.0.0 → 3.2.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 (490) hide show
  1. package/.agents/plugins/marketplace.json +1 -1
  2. package/.claude/commands/i3-sop.md +3 -3
  3. package/.claude/commands/i3-ui-demo.md +21 -0
  4. package/.claude-plugin/marketplace.json +1 -1
  5. package/.claude-plugin/plugin.json +1 -1
  6. package/.codex-plugin/plugin.json +2 -2
  7. package/.gemini/commands/i3-sop.toml +3 -3
  8. package/.gemini/commands/i3-ui-demo.toml +21 -0
  9. package/README.md +29 -32
  10. package/bin/i3-composer-agent.cjs +38 -44
  11. package/bin/install.cjs +15 -3
  12. package/bin/native-layout.cjs +2 -1
  13. package/bin/native-migration.cjs +19 -2
  14. package/bin/retired-sop-fingerprints.json +213 -0
  15. package/bin/wizard.cjs +7 -18
  16. package/commands/i3-sop.toml +3 -3
  17. package/commands/i3-ui-demo.toml +21 -0
  18. package/docs/codebuddy-setup.md +20 -23
  19. package/docs/codex-setup.md +2 -2
  20. package/docs/comparison.md +131 -0
  21. package/docs/developer-onboarding.md +143 -0
  22. package/docs/opencode-setup.md +1 -1
  23. package/docs/other-hosts.md +2 -2
  24. package/docs/skill-anatomy.md +211 -0
  25. package/docs/workbuddy-setup.md +7 -10
  26. package/evals/cases/i3-enterprise-sop.json +70 -32
  27. package/evals/cases/i3-ui-demo.json +98 -0
  28. package/evals/fixtures/i3-ui-demo/asset-management.md +25 -0
  29. package/evals/zh-CN/cases/i3-enterprise-sop.json +77 -31
  30. package/evals/zh-CN/cases/i3-ui-demo.json +103 -0
  31. package/hooks/PROTOTYPE.md +16 -8
  32. package/hooks/i3-prototype.cjs +4 -10
  33. package/hooks/manage.cjs +30 -31
  34. package/package.json +20 -5
  35. package/plugin.json +1 -1
  36. package/scripts/ui-demo-dependencies-test.js +228 -0
  37. package/scripts/ui-demo-mcp-test.js +95 -0
  38. package/scripts/ui-demo-test.js +170 -0
  39. package/scripts/ui-prototype-execution-runtime-test.js +1 -1
  40. package/scripts/ui-prototype-native-test.js +25 -3
  41. package/skills/i3-enterprise-sop/SKILL.md +151 -91
  42. package/{references/engineering-skeleton-resources → skills/i3-enterprise-sop/references/engineering-skeleton}/directory-standard.md +29 -15
  43. package/skills/i3-enterprise-sop/references/handoff.py +348 -0
  44. package/skills/i3-enterprise-sop/references/read_text.py +60 -0
  45. package/{references/enterprise-sop-resources/technical-baseline/baselines//344/274/201/344/270/232/345/272/224/347/224/250-/346/212/200/346/234/257/350/247/204/347/272/246_v0.0.2.md → skills/i3-enterprise-sop/references/technical-baseline/baselines/enterprise-application-technical-baseline-v0-0-4.md} +136 -51
  46. package/skills/i3-enterprise-sop/references/technical-baseline/readme.md +23 -0
  47. package/{references/enterprise-sop-resources/technical-baseline/templates/TECHNICAL-BASELINE.md → skills/i3-enterprise-sop/references/technical-baseline/templates/technical-baseline.md} +1 -1
  48. package/{references/enterprise-sop-resources/ad/templates/AD.md → skills/i3-enterprise-sop/references/templates/ad.md} +34 -27
  49. package/{references/enterprise-sop-resources/brd/templates/BRD.md → skills/i3-enterprise-sop/references/templates/brd.md} +21 -10
  50. package/{references/enterprise-sop-resources/prd/templates/PRD.md → skills/i3-enterprise-sop/references/templates/prd.md} +57 -24
  51. package/{references/enterprise-sop-resources/testcase/templates/TestCase.md → skills/i3-enterprise-sop/references/templates/testcase.md} +32 -22
  52. package/skills/i3-ui-demo/SKILL.md +234 -0
  53. package/skills/i3-ui-demo/assets/antdv-build/package-lock.json +3363 -0
  54. package/skills/i3-ui-demo/assets/antdv-build/package.json +28 -0
  55. package/skills/i3-ui-demo/assets/design-source.json +11 -0
  56. package/skills/i3-ui-demo/assets/host-targets.json +739 -0
  57. package/skills/i3-ui-demo/assets/official-files.json +76 -0
  58. package/skills/i3-ui-demo/assets/starter/index.html +11 -0
  59. package/skills/i3-ui-demo/assets/starter/package-lock.json +2299 -0
  60. package/skills/i3-ui-demo/assets/starter/package.json +28 -0
  61. package/skills/i3-ui-demo/assets/starter/provenance.json +14 -0
  62. package/skills/i3-ui-demo/assets/starter/public/prototype-config.json +22 -0
  63. package/skills/i3-ui-demo/assets/starter/src/App.vue +64 -0
  64. package/skills/i3-ui-demo/assets/starter/src/PrototypeShell.vue +59 -0
  65. package/skills/i3-ui-demo/assets/starter/src/config.ts +23 -0
  66. package/skills/i3-ui-demo/assets/starter/src/domain/presentation.ts +30 -0
  67. package/skills/i3-ui-demo/assets/starter/src/domain/theme.ts +25 -0
  68. package/skills/i3-ui-demo/assets/starter/src/main.ts +18 -0
  69. package/skills/i3-ui-demo/assets/starter/src/style.css +26 -0
  70. package/skills/i3-ui-demo/assets/starter/tests/presentation.test.ts +23 -0
  71. package/skills/i3-ui-demo/assets/starter/tests/theme.test.ts +26 -0
  72. package/skills/i3-ui-demo/assets/starter/tsconfig.json +15 -0
  73. package/skills/i3-ui-demo/assets/starter/vite.config.ts +4 -0
  74. package/skills/i3-ui-demo/assets/templates/enterprise-admin/capability-definition.json +1395 -0
  75. package/skills/i3-ui-demo/assets/templates/enterprise-admin/component-inventory.json +707 -0
  76. package/skills/i3-ui-demo/assets/templates/enterprise-admin/design-system.md +26 -0
  77. package/skills/i3-ui-demo/assets/templates/enterprise-admin/generation.json +49 -0
  78. package/skills/i3-ui-demo/assets/templates/enterprise-admin/index.html +534 -0
  79. package/skills/i3-ui-demo/assets/templates/enterprise-admin/manifest.json +9 -0
  80. package/skills/i3-ui-demo/assets/templates/enterprise-admin/offline-build.json +265 -0
  81. package/skills/i3-ui-demo/assets/templates/enterprise-admin/offline.js +8888 -0
  82. package/skills/i3-ui-demo/assets/templates/enterprise-admin/origin.json +344 -0
  83. package/skills/i3-ui-demo/assets/templates/enterprise-admin/preset.json +928 -0
  84. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/app.js +22 -0
  85. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets/empty.svg +1 -0
  86. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets/reference-styles.json +1 -0
  87. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets/result-403.svg +1 -0
  88. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets/result-404.svg +1 -0
  89. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets-manifest.json +334 -0
  90. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/baseline.json +173 -0
  91. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/conversion.md +30 -0
  92. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/credits.md +17 -0
  93. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/design-tokens.json +881 -0
  94. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/index.html +28 -0
  95. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/licenses/@qin-ui-antdv-next-pro.txt +9 -0
  96. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/licenses/ant-design-icons.txt +22 -0
  97. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/licenses/antdv-next.txt +21 -0
  98. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/package.json +12 -0
  99. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/browser-routes.json +298 -0
  100. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/coverage.json +180 -0
  101. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/integrity.json +13 -0
  102. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/keyboard.json +11 -0
  103. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/responsive.json +125 -0
  104. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/review.md +51 -0
  105. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/rules.log +150 -0
  106. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-html.png +0 -0
  107. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-original.png +0 -0
  108. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-html.png +0 -0
  109. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-original.png +0 -0
  110. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/models-html.png +0 -0
  111. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/models-original.png +0 -0
  112. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-html.png +0 -0
  113. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-original.png +0 -0
  114. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/selection.json +9 -0
  115. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/visual-comparison.json +342 -0
  116. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/readme.md +73 -0
  117. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/reference.md +59 -0
  118. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/routes.json +178 -0
  119. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/controls.js +99 -0
  120. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/dialogs.js +54 -0
  121. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/dom.js +264 -0
  122. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/forms.js +47 -0
  123. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/icons.js +41 -0
  124. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/layout.js +47 -0
  125. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/router.js +63 -0
  126. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/state.js +90 -0
  127. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/table.js +41 -0
  128. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/widgets.js +8 -0
  129. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.html +3 -0
  130. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.js +36 -0
  131. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.html +2 -0
  132. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.js +51 -0
  133. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.html +3 -0
  134. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.js +48 -0
  135. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/CheckResults.html +2 -0
  136. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/CheckResults.js +6 -0
  137. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.html +2 -0
  138. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.js +13 -0
  139. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/data.js +24 -0
  140. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/domain.js +32 -0
  141. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/registry.js +25 -0
  142. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/store.js +85 -0
  143. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentClose.html +2 -0
  144. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentClose.js +17 -0
  145. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.html +2 -0
  146. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.js +66 -0
  147. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.html +3 -0
  148. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.js +38 -0
  149. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.html +2 -0
  150. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.js +66 -0
  151. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.html +2 -0
  152. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.js +5 -0
  153. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.html +2 -0
  154. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.js +12 -0
  155. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.html +2 -0
  156. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.js +11 -0
  157. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentList.html +2 -0
  158. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentList.js +116 -0
  159. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.html +2 -0
  160. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.js +32 -0
  161. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.html +2 -0
  162. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.js +49 -0
  163. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.html +2 -0
  164. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.js +10 -0
  165. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.html +2 -0
  166. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.js +77 -0
  167. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/data.js +60 -0
  168. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/domain.js +105 -0
  169. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/store.js +212 -0
  170. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/AuditPanel.html +2 -0
  171. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/AuditPanel.js +18 -0
  172. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelDetail.html +2 -0
  173. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelDetail.js +23 -0
  174. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelEditor.html +2 -0
  175. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelEditor.js +78 -0
  176. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelGrant.html +2 -0
  177. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelGrant.js +55 -0
  178. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelReferences.html +2 -0
  179. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelReferences.js +26 -0
  180. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelRelease.html +2 -0
  181. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelRelease.js +38 -0
  182. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelStatus.html +2 -0
  183. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelStatus.js +7 -0
  184. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelTable.html +2 -0
  185. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelTable.js +72 -0
  186. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelTester.html +2 -0
  187. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelTester.js +46 -0
  188. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelsPage.html +2 -0
  189. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelsPage.js +52 -0
  190. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/RowActions.html +2 -0
  191. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/RowActions.js +19 -0
  192. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/UsagePanel.html +2 -0
  193. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/UsagePanel.js +30 -0
  194. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/data.js +48 -0
  195. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/domain.js +39 -0
  196. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/store.js +129 -0
  197. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.html +4 -0
  198. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.js +21 -0
  199. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/IntentSource.html +2 -0
  200. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/IntentSource.js +8 -0
  201. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.html +2 -0
  202. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.js +37 -0
  203. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.html +2 -0
  204. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.js +10 -0
  205. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.html +2 -0
  206. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.js +37 -0
  207. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.html +2 -0
  208. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.js +49 -0
  209. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/RunDetail.html +4 -0
  210. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/RunDetail.js +22 -0
  211. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.html +2 -0
  212. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.js +9 -0
  213. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/commands.js +82 -0
  214. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/examples.js +47 -0
  215. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/model.js +61 -0
  216. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/repair.js +68 -0
  217. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/store.js +55 -0
  218. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/types.js +1 -0
  219. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/workbench.js +18 -0
  220. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.html +3 -0
  221. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.js +28 -0
  222. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.html +2 -0
  223. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.js +18 -0
  224. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.html +2 -0
  225. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.js +31 -0
  226. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.html +2 -0
  227. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.js +27 -0
  228. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.html +2 -0
  229. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.js +16 -0
  230. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.html +2 -0
  231. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.js +43 -0
  232. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.html +4 -0
  233. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.js +34 -0
  234. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.html +2 -0
  235. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.js +30 -0
  236. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.html +3 -0
  237. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.js +67 -0
  238. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.html +2 -0
  239. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.js +41 -0
  240. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.html +2 -0
  241. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.js +31 -0
  242. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.html +2 -0
  243. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.js +26 -0
  244. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.html +2 -0
  245. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.js +70 -0
  246. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/data.js +8 -0
  247. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/domain.js +62 -0
  248. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/management.js +36 -0
  249. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/managementStore.js +49 -0
  250. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/store.js +132 -0
  251. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/AdminList.html +2 -0
  252. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/AdminList.js +38 -0
  253. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.html +2 -0
  254. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.js +11 -0
  255. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.html +2 -0
  256. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.js +45 -0
  257. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.html +2 -0
  258. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.js +54 -0
  259. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.html +3 -0
  260. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.js +27 -0
  261. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.html +2 -0
  262. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.js +12 -0
  263. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.html +2 -0
  264. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.js +45 -0
  265. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.html +3 -0
  266. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.js +38 -0
  267. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/domain.js +61 -0
  268. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/state.js +51 -0
  269. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/store.js +116 -0
  270. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.html +2 -0
  271. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.js +45 -0
  272. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.html +4 -0
  273. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.js +30 -0
  274. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.html +2 -0
  275. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.js +67 -0
  276. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.html +2 -0
  277. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.js +5 -0
  278. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.html +4 -0
  279. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.js +60 -0
  280. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/commands.js +157 -0
  281. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/model.js +136 -0
  282. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/store.js +76 -0
  283. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.html +3 -0
  284. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.js +26 -0
  285. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.html +2 -0
  286. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.js +14 -0
  287. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.html +2 -0
  288. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.js +113 -0
  289. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.html +3 -0
  290. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.js +62 -0
  291. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/commands.js +97 -0
  292. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/model.js +147 -0
  293. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/store.js +13 -0
  294. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.html +2 -0
  295. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.js +9 -0
  296. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.html +2 -0
  297. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.js +8 -0
  298. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.html +2 -0
  299. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.js +37 -0
  300. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListMore.html +2 -0
  301. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListMore.js +8 -0
  302. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.html +2 -0
  303. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.js +17 -0
  304. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/columns.js +32 -0
  305. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/deliveryGuide.js +49 -0
  306. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/deliveryView.js +12 -0
  307. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/listBatch.js +15 -0
  308. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/listSelection.js +37 -0
  309. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/policy.js +68 -0
  310. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/session.js +44 -0
  311. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.html +2 -0
  312. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.js +25 -0
  313. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.html +2 -0
  314. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.js +53 -0
  315. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.html +10 -0
  316. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.js +30 -0
  317. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ScopePage.html +2 -0
  318. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ScopePage.js +10 -0
  319. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.html +2 -0
  320. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.js +9 -0
  321. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/confirmation.js +3 -0
  322. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/navigation.js +19 -0
  323. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.html +2 -0
  324. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.js +8 -0
  325. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.html +2 -0
  326. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.js +32 -0
  327. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.html +2 -0
  328. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.js +15 -0
  329. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.html +2 -0
  330. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.js +11 -0
  331. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecReview.html +2 -0
  332. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecReview.js +57 -0
  333. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.html +2 -0
  334. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.js +37 -0
  335. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/data.js +20 -0
  336. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/domain.js +55 -0
  337. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/store.js +151 -0
  338. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.html +3 -0
  339. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.js +18 -0
  340. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.html +2 -0
  341. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.js +40 -0
  342. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.html +2 -0
  343. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.js +51 -0
  344. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.html +2 -0
  345. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.js +9 -0
  346. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.html +5 -0
  347. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.js +48 -0
  348. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/domain.js +204 -0
  349. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/exampleSource.js +22 -0
  350. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/registry.js +135 -0
  351. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/store.js +137 -0
  352. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.html +3 -0
  353. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.js +36 -0
  354. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workbench/model.js +56 -0
  355. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workbench/store.js +15 -0
  356. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.html +2 -0
  357. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.js +27 -0
  358. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.html +4 -0
  359. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.js +31 -0
  360. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.html +2 -0
  361. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.js +68 -0
  362. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.html +5 -0
  363. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.js +55 -0
  364. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/data.js +16 -0
  365. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/domain.js +83 -0
  366. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/registry.js +18 -0
  367. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/store.js +61 -0
  368. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/admin.css +60 -0
  369. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/agents.css +46 -0
  370. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/antdv.css +295 -0
  371. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/app.css +102 -0
  372. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/delivery.css +4 -0
  373. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/intents.css +37 -0
  374. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/native.css +22 -0
  375. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/operations.css +2 -0
  376. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/pbc.css +3 -0
  377. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/permissions.css +22 -0
  378. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/pro.css +1 -0
  379. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/releases.css +4 -0
  380. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/reset.css +246 -0
  381. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/reviews.css +8 -0
  382. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/tasks.css +6 -0
  383. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/tokens.css +15 -0
  384. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/workbench.css +61 -0
  385. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/workflows.css +1 -0
  386. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/admin-rules.test.js +96 -0
  387. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/agents.test.js +14 -0
  388. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/intent-state.test.js +37 -0
  389. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/list-batch.test.js +44 -0
  390. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/operation-fixtures.js +19 -0
  391. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/operation-repair.test.js +14 -0
  392. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/operations.test.js +25 -0
  393. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/pbc-management.test.js +17 -0
  394. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/pbc-state.test.js +24 -0
  395. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/permission-config.test.js +23 -0
  396. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/permissions.test.js +24 -0
  397. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/releases.test.js +50 -0
  398. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/reviews.test.js +36 -0
  399. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/runtime-forms-router.test.js +28 -0
  400. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/runtime-state.test.js +42 -0
  401. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/runtime-stores.test.js +16 -0
  402. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/spec-state.test.js +11 -0
  403. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/tasks.test.js +27 -0
  404. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/workbench.test.js +34 -0
  405. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/workflows.test.js +16 -0
  406. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tools/convert.mjs +168 -0
  407. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tools/serve.mjs +7 -0
  408. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tools/styles.mjs +11 -0
  409. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tools/verify.mjs +24 -0
  410. package/skills/i3-ui-demo/assets/templates/enterprise-admin/serve.cjs +16 -0
  411. package/skills/i3-ui-demo/assets/templates/enterprise-admin/template-inventory.json +28791 -0
  412. package/skills/i3-ui-demo/assets/templates/enterprise-admin/template.json +9 -0
  413. package/skills/i3-ui-demo/assets/templates/enterprise-admin/usability.css +44 -0
  414. package/skills/i3-ui-demo/assets/templates.json +10 -0
  415. package/skills/i3-ui-demo/assets/versions.json +20 -0
  416. package/skills/i3-ui-demo/readme.md +350 -0
  417. package/skills/i3-ui-demo/references/browser.md +71 -0
  418. package/skills/i3-ui-demo/references/dependencies.md +67 -0
  419. package/skills/i3-ui-demo/references/resources.md +142 -0
  420. package/skills/i3-ui-demo/scripts/dependencies.cjs +364 -0
  421. package/skills/i3-ui-demo/scripts/design-install.cjs +105 -0
  422. package/skills/i3-ui-demo/scripts/design-provider.cjs +57 -0
  423. package/skills/i3-ui-demo/scripts/locations.cjs +52 -0
  424. package/skills/i3-ui-demo/scripts/mcp.cjs +112 -0
  425. package/skills/i3-ui-demo/scripts/provider-discovery.cjs +131 -0
  426. package/skills/i3-ui-demo/scripts/resources.cjs +283 -0
  427. package/skills/i3-ui-prototype/SKILL.md +1 -1
  428. package/skills/i3-ui-prototype/references/execution-evidence.md +12 -56
  429. package/skills/i3-ui-prototype/scripts/codebuddy-registration.cjs +1 -1
  430. package/skills/i3-ui-prototype/scripts/execution-runtime.cjs +5 -2
  431. package/skills/i3-ui-prototype/scripts/hosts/codebuddy.cjs +3 -2
  432. package/skills/i3-ui-prototype/scripts/native-delivery.cjs +2 -2
  433. package/skills/i3-ui-prototype/scripts/prototype-hooks.cjs +23 -20
  434. package/docs/ui-prototype-native/MAIN-SESSION-REPORT.md +0 -66
  435. package/docs/ui-prototype-native/USAGE.md +0 -93
  436. package/references/engineering-skeleton-resources/README.md +0 -52
  437. package/references/engineering-skeleton-resources/adoption.md +0 -200
  438. package/references/engineering-skeleton-resources/catalog.json +0 -17
  439. package/references/enterprise-sop-resources/README.md +0 -165
  440. package/references/enterprise-sop-resources/ad/README.md +0 -70
  441. package/references/enterprise-sop-resources/ad/assets-manifest.json +0 -106
  442. package/references/enterprise-sop-resources/ad/prompts/01-generate.md +0 -58
  443. package/references/enterprise-sop-resources/ad/prompts/02-review.md +0 -54
  444. package/references/enterprise-sop-resources/ad/prompts/03-revise.md +0 -54
  445. package/references/enterprise-sop-resources/ad/prompts/04-recheck.md +0 -54
  446. package/references/enterprise-sop-resources/assets-manifest.json +0 -199
  447. package/references/enterprise-sop-resources/brd/README.md +0 -50
  448. package/references/enterprise-sop-resources/brd/assets-manifest.json +0 -94
  449. package/references/enterprise-sop-resources/brd/prompts/01-generate.md +0 -51
  450. package/references/enterprise-sop-resources/brd/prompts/02-review.md +0 -47
  451. package/references/enterprise-sop-resources/brd/prompts/03-revise.md +0 -47
  452. package/references/enterprise-sop-resources/brd/prompts/04-recheck.md +0 -47
  453. package/references/enterprise-sop-resources/codebuddy-project-guide.md +0 -34
  454. package/references/enterprise-sop-resources/controlled-handoff.md +0 -41
  455. package/references/enterprise-sop-resources/controlled_handoff.py +0 -334
  456. package/references/enterprise-sop-resources/handoff-contract.md +0 -196
  457. package/references/enterprise-sop-resources/handoff.py +0 -277
  458. package/references/enterprise-sop-resources/lifecycle-contract.md +0 -91
  459. package/references/enterprise-sop-resources/plan-handoff.md +0 -73
  460. package/references/enterprise-sop-resources/prd/README.md +0 -137
  461. package/references/enterprise-sop-resources/prd/assets-manifest.json +0 -115
  462. package/references/enterprise-sop-resources/prd/prompts/01-generate.md +0 -64
  463. package/references/enterprise-sop-resources/prd/prompts/02-review.md +0 -49
  464. package/references/enterprise-sop-resources/prd/prompts/03-revise.md +0 -48
  465. package/references/enterprise-sop-resources/prd/prompts/04-recheck.md +0 -47
  466. package/references/enterprise-sop-resources/prd/template-contracts.md +0 -39
  467. package/references/enterprise-sop-resources/prd/templates/AD.md +0 -17
  468. package/references/enterprise-sop-resources/recovery-contract.md +0 -65
  469. package/references/enterprise-sop-resources/review-handoff.md +0 -105
  470. package/references/enterprise-sop-resources/selection-handoff.md +0 -55
  471. package/references/enterprise-sop-resources/selection_handoff.py +0 -225
  472. package/references/enterprise-sop-resources/stages.json +0 -262
  473. package/references/enterprise-sop-resources/technical-baseline/README.md +0 -132
  474. package/references/enterprise-sop-resources/technical-baseline/assets-manifest.json +0 -101
  475. package/references/enterprise-sop-resources/technical-baseline/baselines/PROVENANCE.md +0 -40
  476. package/references/enterprise-sop-resources/technical-baseline/references/engineering-directory-v0.2.0/adoption.md +0 -112
  477. package/references/enterprise-sop-resources/technical-baseline/references/engineering-directory-v0.2.0/directory-standard.md +0 -119
  478. package/references/enterprise-sop-resources/template-contracts.md +0 -142
  479. package/references/enterprise-sop-resources/testcase/README.md +0 -61
  480. package/references/enterprise-sop-resources/testcase/assets-manifest.json +0 -111
  481. package/references/enterprise-sop-resources/testcase/prompts/01-generate.md +0 -53
  482. package/references/enterprise-sop-resources/testcase/prompts/02-review.md +0 -51
  483. package/references/enterprise-sop-resources/testcase/prompts/03-revise.md +0 -49
  484. package/references/enterprise-sop-resources/testcase/prompts/04-recheck.md +0 -51
  485. package/references/enterprise-sop-resources/verification/README.md +0 -149
  486. package/references/enterprise-sop-resources/verification/check_execution.py +0 -185
  487. package/references/enterprise-sop-resources/verification/check_native_execution.py +0 -282
  488. package/references/enterprise-sop-resources/verification/check_reads.py +0 -348
  489. package/references/enterprise-sop-resources/verification/review-output.schema.json +0 -155
  490. package/references/enterprise-sop-resources/verification/review_handoff.py +0 -329
@@ -0,0 +1,32 @@
1
+ export const duties = [{ value: 'planner', label: '需求规划' }, { value: 'designer', label: '方案设计' }, { value: 'coder', label: '研发编码' }, { value: 'tester', label: '测试验证' }, { value: 'reviewer', label: '质量评审' }, { value: 'ops', label: '运行运维' }, { value: 'security', label: '安全检查' }];
2
+ export function validateBasics(a) {
3
+ if (!a.name.trim() || a.name.length > 60)
4
+ throw Error('请填写 1–60 字的 Agent 名称。');
5
+ if (!/^[a-z][a-z0-9-]{2,47}$/.test(a.code))
6
+ throw Error('标识须为 3–48 位小写字母、数字或短横线,并以字母开头。');
7
+ if (!a.pbcId || !a.project || !duties.some(d => d.value === a.duty))
8
+ throw Error('请选择项目和 Agent 职责。');
9
+ if (!Number.isInteger(a.memoryLimit) || a.memoryLimit < 1 || a.memoryLimit > 200 || !Number.isInteger(a.toolLimit) || a.toolLimit < 1 || a.toolLimit > 50)
10
+ throw Error('请检查记忆消息数(1–200)和工具调用上限(1–50)。');
11
+ }
12
+ export function checkConfiguration(a, models, resources) {
13
+ const m = models.find(m => m.id === a.modelRef), prompt = resources.find(r => r.id === a.promptRef && r.kind === 'prompt');
14
+ const usable = (r) => !!r && r.state === 'ready' && (r.tenantIds.includes('*') || r.tenantIds.includes(a.tenantId));
15
+ const skills = a.skillRefs.map(id => resources.find(r => r.id === id && r.kind === 'skill'));
16
+ const tools = a.tools.map(t => resources.find(r => r.id === t.ref && r.kind === 'tool' && r.type === t.type));
17
+ return [
18
+ { key: 'model', label: '模型可用性', ok: !!m && !m.deleted && m.enabled && !!m.version && m.kind === 'chat', detail: !m ? '请选择模型' : m.deleted ? '模型已被删除' : !m.version ? '模型尚未发布' : !m.enabled ? '模型已停用' : m.kind !== 'chat' ? '向量模型不能作为 Agent 的对话模型' : '使用已发布配置 v' + m.version },
19
+ { key: 'grant', label: '模型使用授权', ok: !!m?.authorized, detail: m?.authorized ? '租户、项目与 Agent 使用授权匹配' : '当前租户、项目、Agent 的模型使用授权不完整;保存后可由有权成员在模型管理中配置' },
20
+ { key: 'prompt', label: '提示词预设', ok: usable(prompt), detail: usable(prompt) ? prompt.name + ' · ' + prompt.version : '请选择可用且在授权范围内的提示词预设' },
21
+ { key: 'skills', label: '技能引用', ok: skills.every(usable), detail: skills.every(usable) ? skills.length + ' 项技能可用;可不绑定技能' : '存在停用、失效或超出范围的技能' },
22
+ { key: 'tools', label: '工具白名单', ok: tools.every(r => usable(r) && !!r.allow?.length && !r.allow.includes('*')) && new Set(a.tools.map(t => t.type + ':' + t.ref)).size === a.tools.length, detail: tools.every(r => usable(r) && !!r.allow?.length && !r.allow.includes('*')) ? '仅允许已选工具声明的操作;未绑定工具不能调用' : '存在无效工具、类型不匹配或过宽的白名单' },
23
+ { key: 'capability', label: '工具调用能力', ok: !a.tools.length || !!m?.capabilities.includes('工具调用'), detail: !a.tools.length ? '未绑定工具,无需工具调用能力' : m?.capabilities.includes('工具调用') ? '模型支持工具调用' : '所选模型不支持工具调用,请更换模型或移除工具' },
24
+ { key: 'limits', label: '运行边界', ok: Number.isInteger(a.memoryLimit) && a.memoryLimit > 0 && a.memoryLimit <= 200 && Number.isInteger(a.toolLimit) && a.toolLimit > 0 && a.toolLimit <= 50, detail: '记忆窗口 ' + a.memoryLimit + ' 条;单次连续工具调用上限 ' + a.toolLimit + ' 次' },
25
+ ];
26
+ }
27
+ export function assertRemovable(a) {
28
+ if (a.enabled)
29
+ throw Error('请先停用 Agent,再删除。');
30
+ if (a.references.length)
31
+ throw Error('仍被 ' + a.references.length + ' 个流程或任务引用,请先处理引用。');
32
+ }
@@ -0,0 +1,25 @@
1
+ import { ref } from '../../runtime/state.js';
2
+ import { seedAgents } from "./data.js";
3
+ export const registryKey = 'i3-prototype-antdv-agents-v010';
4
+ let initial = { schema: 1, records: seedAgents(), audit: [] };
5
+ try {
6
+ const saved = JSON.parse(localStorage.getItem(registryKey) || 'null');
7
+ if (saved?.schema === 1 && saved.records?.every((a) => a.id && a.recordVersion && Array.isArray(a.tools)) && Array.isArray(saved.audit))
8
+ initial = saved;
9
+ }
10
+ catch { /* Local prototype can be reset. */ }
11
+ export const agentRecords = ref(initial.records), agentAudit = ref(initial.audit);
12
+ export const modelAgentEntries = () => agentRecords.value.filter(a => !a.isDeleted).map(a => ({ value: a.grantKey, label: a.name, projects: [a.project] }));
13
+ export const modelProjectEntries = () => agentRecords.value.filter(a => !a.isDeleted).map(a => ({ value: a.project, tenantId: a.tenantId }));
14
+ export const modelAgentLabel = (key) => agentRecords.value.find(a => a.grantKey === key)?.name || key;
15
+ export const agentModelReferences = (modelId) => agentRecords.value.filter(a => !a.isDeleted && a.modelRef === modelId).map(a => ({ name: a.name, kind: 'Agent', version: '记录 v' + a.recordVersion }));
16
+ export function commitAgents(records, audit) {
17
+ try {
18
+ localStorage.setItem(registryKey, JSON.stringify({ schema: 1, records, audit }));
19
+ }
20
+ catch {
21
+ throw Error('浏览器无法保存 Agent,本次操作未提交,请保留输入后重试。');
22
+ }
23
+ agentRecords.value = records;
24
+ agentAudit.value = audit;
25
+ }
@@ -0,0 +1,85 @@
1
+ import { stateOf } from "../pbc/management.js";
2
+ import { taskAgentReferences } from "../tasks/registry.js";
3
+ import { workflowAgentReferences } from "../workflows/registry.js";
4
+ import { defineStore } from "../../runtime/state.js";
5
+ import { computed, ref } from '../../runtime/state.js';
6
+ import { useModels } from "../models/store.js";
7
+ import { usePbcs } from "../pbc/store.js";
8
+ import { useSession } from "../shared/session.js";
9
+ import { metadata } from "../shared/policy.js";
10
+ import { assertBatch } from "../shared/listBatch.js";
11
+ import { resourceCatalog, seedAgents } from "./data.js";
12
+ import { checkConfiguration, validateBasics, assertRemovable } from "./domain.js";
13
+ import { agentRecords, agentAudit, commitAgents } from "./registry.js";
14
+ const clone = (x) => JSON.parse(JSON.stringify(x));
15
+ export const useAgents = defineStore('agents', () => {
16
+ const session = useSession(), models = useModels(), pbcs = usePbcs(), scene = ref('normal');
17
+ const records = computed(() => agentRecords.value.filter(a => !a.isDeleted && session.can('agent:view', a.tenantId, a.pbcId)).map(a => ({ ...a, references: [...a.references, ...workflowAgentReferences(a.id), ...taskAgentReferences(a.id)] })));
18
+ const projects = computed(() => pbcs.items.filter(p => stateOf(p) === 'active' && session.can('agent:edit', p.tenantId, p.id)));
19
+ const resources = computed(() => resourceCatalog.filter(r => r.tenantIds.includes('*') || session.actor.grants.some(g => g.actions.includes('agent:view') && (g.tenantIds.includes('*') || r.tenantIds.some(t => g.tenantIds.includes(t))))));
20
+ const item = (id) => records.value.find(a => a.id === id);
21
+ const choices = (a) => models.agentChoices(a.tenantId, a.project, a.grantKey);
22
+ const checks = (a) => { const p = pbcs.items.find(p => p.id === a.pbcId && p.tenantId === a.tenantId), ok = !!p && stateOf(p) === 'active'; return [{ key: 'pbc', label: '所属 PBC 状态', ok, detail: ok ? 'PBC 可继续使用' : 'PBC 已归档或不可访问,不能启用新的配置' }, ...checkConfiguration(a, choices(a), resources.value)]; };
23
+ const audit = (a) => session.can('agent:audit', a.tenantId, a.pbcId) ? agentAudit.value.filter(e => e.agentId === a.id) : [];
24
+ function commit(next, affected, action, detail) {
25
+ const at = new Date().toISOString();
26
+ commitAgents(next, [...affected.map(a => ({ id: crypto.randomUUID(), agentId: a.id, name: a.name, actor: session.actor.name, at, action, detail, tenantId: a.tenantId, pbcId: a.pbcId })), ...agentAudit.value]);
27
+ }
28
+ function current(id, action, expected) {
29
+ const a = agentRecords.value.find(a => a.id === id && !a.isDeleted);
30
+ if (!a)
31
+ throw Error('Agent 不存在或无权访问。');
32
+ session.require(action, a.tenantId, a.pbcId);
33
+ session.require('agent:view', a.tenantId, a.pbcId);
34
+ if (a.recordVersion !== expected)
35
+ throw Error('记录已被更新,请重新打开并核对。');
36
+ return a;
37
+ }
38
+ function blank() {
39
+ const p = projects.value[0], id = crypto.randomUUID();
40
+ return { ...metadata(session.actor, new Date().toISOString(), p?.tenantId || session.actor.tenantId), id, name: '', code: '', description: '', duty: 'planner', pbcId: p?.id || '', project: p?.resourceKey || p?.name || '', grantKey: id, modelRef: '', promptRef: '', skillRefs: [], tools: [], memoryLimit: 40, toolLimit: 10, enabled: false, references: [] };
41
+ }
42
+ function save(input, isNew) {
43
+ session.require('agent:view', input.tenantId, input.pbcId);
44
+ session.require('agent:edit', input.tenantId, input.pbcId);
45
+ validateBasics(input);
46
+ const p = projects.value.find(p => p.id === input.pbcId && p.tenantId === input.tenantId);
47
+ if (!p || (p.resourceKey || p.name) !== input.project)
48
+ throw Error('项目已失效或不在可配置范围。');
49
+ if (agentRecords.value.some(a => !a.isDeleted && a.id !== input.id && a.tenantId === input.tenantId && a.code === input.code))
50
+ throw Error('该租户下的 Agent 标识已存在。');
51
+ const old = isNew ? undefined : current(input.id, 'agent:edit', input.recordVersion);
52
+ if (old?.enabled)
53
+ throw Error('请先停用 Agent,再编辑配置。');
54
+ if (old && (input.code !== old.code || input.pbcId !== old.pbcId || input.tenantId !== old.tenantId))
55
+ throw Error('已有 Agent 的标识和所属项目不可修改。');
56
+ const at = new Date().toISOString();
57
+ const a = { ...clone(input), ...(old ? { ...metadata(session.actor, at, old.tenantId), createdById: old.createdById, createdBy: old.createdBy, createdDept: old.createdDept, createdAt: old.createdAt, recordVersion: old.recordVersion + 1 } : metadata(session.actor, at, input.tenantId)), enabled: false, grantKey: old?.grantKey || input.id, references: old?.references || [] };
58
+ session.writeCheck();
59
+ commit(isNew ? [a, ...agentRecords.value] : agentRecords.value.map(r => r.id === a.id ? a : r), [a], isNew ? '创建 Agent' : '保存配置', '保存为停用配置;记录 v' + a.recordVersion);
60
+ scene.value = 'normal';
61
+ return a.id;
62
+ }
63
+ function toggle(id, expected) {
64
+ const old = current(id, 'agent:status', expected);
65
+ if (!old.enabled && checks(old).some(c => !c.ok))
66
+ throw Error('存在配置或授权问题,请处理检查结果后启用。');
67
+ const a = { ...old, enabled: !old.enabled, recordVersion: old.recordVersion + 1, updatedBy: session.actor.name, updatedAt: new Date().toISOString() };
68
+ session.writeCheck();
69
+ commit(agentRecords.value.map(r => r.id === id ? a : r), [a], a.enabled ? '启用 Agent' : '停用 Agent', '记录 v' + a.recordVersion + ';在途任务生效规则待正式实现');
70
+ }
71
+ function check(id, expected) {
72
+ const a = current(id, 'agent:check', expected), result = checks(a);
73
+ commit(agentRecords.value, [a], '检查配置', result.filter(c => !c.ok).length + ' 项待处理;仅本地引用与配置检查');
74
+ return result;
75
+ }
76
+ function checkRemove(target) { const a = current(target.id, 'agent:delete', target.recordVersion); assertRemovable({ ...a, references: [...a.references, ...workflowAgentReferences(a.id), ...taskAgentReferences(a.id)] }); }
77
+ function removeMany(targets) {
78
+ const selected = assertBatch(agentRecords.value, targets, a => { session.require('agent:view', a.tenantId, a.pbcId); session.require('agent:delete', a.tenantId, a.pbcId); assertRemovable({ ...a, references: [...a.references, ...workflowAgentReferences(a.id), ...taskAgentReferences(a.id)] }); });
79
+ const ids = new Set(selected.map(a => a.id)), at = new Date().toISOString();
80
+ session.writeCheck();
81
+ commit(agentRecords.value.map(a => ids.has(a.id) ? { ...a, isDeleted: true, updatedBy: session.actor.name, updatedAt: at, recordVersion: a.recordVersion + 1 } : a), selected, '删除 Agent', '逻辑删除;本批 ' + selected.length + ' 项');
82
+ }
83
+ function reset() { commitAgents(seedAgents(), []); scene.value = 'normal'; }
84
+ return { records, projects, resources, scene, item, choices, checks, audit, blank, save, toggle, check, checkRemove, removeMany, reset };
85
+ });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/intents/IntentClose.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <template data-component="Modal" data-bind-open="(true)" title="关闭未确认意图" ok-text="确认关闭" cancel-text="继续保留" data-bind-ok-button-props="({ danger: true, disabled: !store.canClose })" data-bind-mask="({ closable: false })" data-on-ok="(submit)" data-on-cancel="(emit('close'))"><template data-component="Alert" class="form-intro" type="warning" show-icon="" data-bind-title="(intent.title)" description="关闭后停止澄清和确认,保留原文、版本与操作记录;本轮不提供重新打开。"></template><label for="close-intent-reason">关闭原因</label><template data-component="Input.TextArea" id="close-intent-reason" data-model-value="(reason)" data-bind-rows="(4)" data-bind-maxlength="(500)" placeholder="说明为何不再继续这条意图"></template><template data-component="Alert" data-if="(error)" class="intent-error" type="error" data-bind-title="(error)" show-icon=""></template></template>
@@ -0,0 +1,17 @@
1
+ import { ref } from '../../runtime/state.js';
2
+ import { Alert, Input, Modal, message } from "../../runtime/widgets.js";
3
+ import { useIntents } from "./store.js";
4
+ import { createComponent } from '../../runtime/dom.js';
5
+ export default createComponent({ name: 'IntentClose', propKeys: ["intent"], template: new URL('./IntentClose.html', import.meta.url).href, setup(__props, __emit) {
6
+ const props = __props, emit = __emit;
7
+ const store = useIntents(), reason = ref(''), error = ref(''), expected = props.intent.recordVersion;
8
+ function submit() { try {
9
+ store.close(props.intent.id, reason.value, expected);
10
+ message.success('意图已关闭,内容与历史保留');
11
+ emit('close');
12
+ }
13
+ catch (e) {
14
+ error.value = e.message;
15
+ } }
16
+ return { ref, Alert, Input, Modal, message, useIntents, props, emit, store, reason, error, expected, submit };
17
+ } });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/intents/IntentCreate.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <template data-component="IntentHeader" data-bind-step="(0)"><template data-component="Button" data-bind-disabled="(!store.canEdit)" data-bind-loading="(saving)" data-on-click="(save(false))">保存草稿</template></template><template data-component="Alert" data-if="(!store.canEdit)" type="info" show-icon="" class="page-alert" title="当前为只读成员,不能发起意图。"></template><div class="intent-grid"><section class="panel intent-main"><div class="section-heading"><h2>描述业务目标</h2><template data-component="Button" data-bind-disabled="(!store.canEdit)" data-on-click="(example)"><template data-component="EditOutlined"></template>填入供热示例</template></div><p class="muted form-intro">先说清楚你想做什么,接下来逐项补充使用者、处理流程和验收标准。</p><template data-component="ProForm" name="intent-create" data-bind-form="(form)" layout="vertical" data-bind-disabled="(!store.canEdit || saving)" class="intent-form"></template><div class="intent-actions"><span class="muted">{{ (dirty ? '有尚未保存的输入' : '保存后可随时回来继续') }}</span><template data-component="Space"><template data-component="Button" data-bind-disabled="(!store.canEdit)" data-bind-loading="(saving)" data-on-click="(save(false))">保存草稿</template><template data-component="Button" type="primary" data-bind-disabled="(!store.canEdit)" data-bind-loading="(saving)" data-on-click="(save(true))">开始澄清</template></template></div></section><template data-component="IntentSummary"></template></div>
@@ -0,0 +1,66 @@
1
+ import { confirmAction } from "../shell/confirmation.js";
2
+ import { computed, onBeforeUnmount, onMounted, ref } from '../../runtime/state.js';
3
+ import { onBeforeRouteLeave, useRouter } from "../../runtime/router.js";
4
+ import { Alert, Button, Space, message } from "../../runtime/widgets.js";
5
+ import { EditOutlined } from "../../runtime/icons.js";
6
+ import { ProForm, useForm } from "../../runtime/widgets.js";
7
+ import { contexts, heatingExample } from "./data.js";
8
+ import { useIntents } from "./store.js";
9
+ import IntentHeader from "./IntentHeader.js";
10
+ import IntentSummary from "./IntentSummary.js";
11
+ import { createComponent } from '../../runtime/dom.js';
12
+ export default createComponent({ name: 'IntentCreate', propKeys: [], template: new URL('./IntentCreate.html', import.meta.url).href, setup(__props, __emit) {
13
+ const store = useIntents(), router = useRouter(), saved = ref(false), saving = ref(false);
14
+ const initialReset = store.resetTick;
15
+ const initial = { title: '', request: '', outcome: '', context: contexts[0] };
16
+ const form = useForm({ ...initial }, [
17
+ { path: 'title', label: '意图名称', component: 'input', placeholder: '用一句话概括要解决的问题', span: 24, maxlength: 80, showCount: true, rules: [{ required: true, whitespace: true, message: '请输入意图名称' }] },
18
+ { path: 'request', label: '我的需求', component: 'textarea', placeholder: '描述业务目标、当前问题,以及你期待的结果。', span: 24, autoSize: { minRows: 6, maxRows: 10 }, maxlength: 2000, showCount: true, rules: [{ required: true, whitespace: true, message: '请描述你的需求' }] },
19
+ { path: 'outcome', label: '预期结果', component: 'textarea', placeholder: '完成后,用户能得到什么可观察的结果?', span: 24, autoSize: { minRows: 3, maxRows: 6 }, maxlength: 1000, rules: [{ required: true, whitespace: true, message: '请填写预期结果' }] },
20
+ { path: 'context', label: '拟归属', component: 'select', options: contexts.map(value => ({ label: value, value })), allowClear: false, span: 24, extra: '尚未确定所属 PBC 时,可先保存在意图池。拟归属不会变更当前租户。' },
21
+ ]);
22
+ const dirty = computed(() => !saved.value && store.resetTick === initialReset && JSON.stringify(form.formData) !== JSON.stringify(initial));
23
+ function example() {
24
+ if (!store.canEdit)
25
+ return;
26
+ const fill = () => form.setFormData({ ...heatingExample });
27
+ if (dirty.value)
28
+ confirmAction({ title: '替换当前输入为示例?', content: '只替换本页尚未保存的内容。', okText: '填入示例', cancelText: '保留输入', onOk: fill });
29
+ else
30
+ fill();
31
+ }
32
+ async function save(start) {
33
+ if (!store.canEdit)
34
+ return;
35
+ try {
36
+ await form.formRef.value?.validate();
37
+ }
38
+ catch {
39
+ return;
40
+ }
41
+ saving.value = true;
42
+ try {
43
+ const id = store.create({ ...form.formData });
44
+ if (start)
45
+ store.start(id);
46
+ saved.value = true;
47
+ store.scene = 'normal';
48
+ message.success(start ? '已保存,开始补充需求' : '草稿已保存');
49
+ await router.push(start ? '/intents/' + id + '/workspace' : '/intents');
50
+ }
51
+ catch (e) {
52
+ message.error(e.message);
53
+ }
54
+ finally {
55
+ saving.value = false;
56
+ }
57
+ }
58
+ onBeforeRouteLeave(() => !dirty.value || new Promise(resolve => confirmAction({ title: '离开前尚有内容未保存', content: '可继续填写并保存草稿,或放弃本次输入。', okText: '放弃并离开', cancelText: '继续填写', onOk: () => resolve(true), onCancel: () => resolve(false) })));
59
+ function beforeUnload(event) { if (dirty.value) {
60
+ event.preventDefault();
61
+ event.returnValue = '';
62
+ } }
63
+ onMounted(() => window.addEventListener('beforeunload', beforeUnload));
64
+ onBeforeUnmount(() => window.removeEventListener('beforeunload', beforeUnload));
65
+ return { confirmAction, computed, onBeforeUnmount, onMounted, ref, onBeforeRouteLeave, useRouter, Alert, Button, Space, message, EditOutlined, ProForm, useForm, contexts, heatingExample, useIntents, IntentHeader, IntentSummary, store, router, saved, saving, initialReset, initial, form, dirty, example, save, beforeUnload };
66
+ } });
@@ -0,0 +1,3 @@
1
+ <!-- 来源:src/intents/IntentDecisions.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <section class="decision-register" aria-label="决策登记"><div class="section-heading"><h2>未决问题与决策登记</h2><template data-component="Tag" data-bind-color="(decisions.some(d =&gt; !d.answer) ? 'orange' : 'green')">{{ (decisions.filter(d =&gt; !d.answer).length) }} 项待确认</template></div><p class="muted">澄清回答与未决问题分别核对。{{ (newVersion ? '保存变更会形成新的意图版本。' : '仍有未决问题时,意图不能确认。') }}</p><template data-component="Empty" data-if="(!decisions.length)" data-bind-image="(Empty.PRESENTED_IMAGE_SIMPLE)" description="暂无登记的未决问题,请确认没有遗漏。"></template><div data-each="d in (decisions)" data-bind-key="(d.id)" class="decision-row"><div class="section-heading"><strong>{{ (d.question) }}</strong><template data-component="Tag" data-bind-color="(d.answer ? 'green' : 'orange')">{{ (d.answer ? '已登记结论' : '待确认') }}</template></div><p data-if="(d.answer)">{{ (d.answer) }}</p><small data-if="(d.resolvedAt)" class="muted">{{ (d.resolvedBy) }} · {{ (formatDate(d.resolvedAt)) }}</small><template data-if="(selected === d.id)"><label data-bind-for="('conclusion-' + d.id)">决策结论</label><template data-component="Input.TextArea" data-bind-id="('conclusion-' + d.id)" data-model-value="(conclusion)" data-bind-maxlength="(1000)" data-bind-rows="(3)"></template><div class="decision-actions"><template data-component="Button" data-on-click="(selected = '')">取消</template><template data-component="Button" type="primary" data-on-click="(resolve)">保存结论</template></div></template><template data-component="Button" data-else-if="(editable)" type="link" data-on-click="selected = d.id;
3
+ conclusion = d.answer;">{{ (d.answer ? '修订结论' : '登记结论') }}</template></div><div data-if="(editable)" class="decision-add"><label for="new-decision">补充待确认问题</label><template data-component="Input.TextArea" id="new-decision" data-model-value="(question)" data-bind-maxlength="(500)" data-bind-rows="(2)" placeholder="例如:超时后由哪个岗位复核?"></template><template data-component="Button" data-on-click="(add)">登记问题</template></div><template data-component="Alert" data-if="(error)" type="error" data-bind-title="(error)" show-icon=""></template></section>
@@ -0,0 +1,38 @@
1
+ import { ref } from '../../runtime/state.js';
2
+ import { Alert, Button, Empty, Input, Tag } from "../../runtime/widgets.js";
3
+ import { useSession } from "../shared/session.js";
4
+ import { formatDate } from "../shared/policy.js";
5
+ import { createComponent } from '../../runtime/dom.js';
6
+ export default createComponent({ name: 'IntentDecisions', propKeys: ["decisions", "editable", "newVersion", "commit"], template: new URL('./IntentDecisions.html', import.meta.url).href, setup(__props, __emit) {
7
+ const props = __props;
8
+ const emit = __emit, session = useSession();
9
+ const question = ref(''), selected = ref(''), conclusion = ref(''), error = ref('');
10
+ function dispatch(decisions) { if (props.commit)
11
+ return props.commit(decisions); emit('change', decisions); return true; }
12
+ function add() {
13
+ if (!props.editable)
14
+ return;
15
+ if (!question.value.trim()) {
16
+ error.value = '请填写需要确认的问题。';
17
+ return;
18
+ }
19
+ if (!dispatch([...props.decisions, { id: crypto.randomUUID(), question: question.value.trim(), answer: '' }]))
20
+ return;
21
+ question.value = '';
22
+ error.value = '';
23
+ }
24
+ function resolve() {
25
+ if (!props.editable)
26
+ return;
27
+ if (!conclusion.value.trim()) {
28
+ error.value = '请填写明确结论。';
29
+ return;
30
+ }
31
+ if (!dispatch(props.decisions.map(d => d.id === selected.value ? { ...d, answer: conclusion.value.trim(), resolvedBy: session.actor.name, resolvedAt: new Date().toISOString() } : d)))
32
+ return;
33
+ selected.value = '';
34
+ conclusion.value = '';
35
+ error.value = '';
36
+ }
37
+ return { ref, Alert, Button, Empty, Input, Tag, useSession, formatDate, props, emit, session, question, selected, conclusion, error, dispatch, add, resolve };
38
+ } });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/intents/IntentDetail.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <template data-component="Result" data-if="(!intent)" status="403" title="记录不存在或当前身份无权访问"><template data-slot="extra"><template data-component="Button" type="primary" data-on-click="(router.push('/intents'))">返回意图池</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="(intent.status === 'confirmed' ? 3 : 2)"><template data-component="Space" wrap=""><template data-component="Button" data-if="(store.canClose &amp;&amp; !closed &amp;&amp; intent.status !== 'confirmed')" danger="" data-bind-disabled="(busy)" data-on-click="(closing = true)">关闭意图</template><template data-component="Button" data-on-click="(history = true)"><template data-component="HistoryOutlined"></template>版本记录</template></template></template><template data-component="Alert" data-if="(store.notice || error)" class="page-alert" type="error" show-icon="" data-bind-title="(error || store.notice)"></template><template data-component="Alert" data-if="(intent.confirmation === 'pending')" class="page-alert" type="info" show-icon="" title="正在提交确认,请稍候…"></template><template data-component="Alert" data-if="(intent.confirmation === 'unknown')" class="page-alert" type="warning" show-icon="" title="确认结果待核实,请勿重复提交" description="本演示模拟确认请求已被接受、响应丢失。先核实这一次请求的结果,再决定后续操作。"><template data-slot="action"><template data-component="Button" data-bind-disabled="(!canConfirm)" data-on-click="(reconcile)">核实确认结果</template></template></template><template data-component="Alert" data-if="(intent.confirmation === 'failed')" class="page-alert" type="error" show-icon="" data-bind-title="(intent.error)"></template><template data-component="Alert" data-if="(intent.status === 'confirmed')" class="page-alert" type="success" show-icon="" data-bind-title="('意图 v' + version?.number + ' 已确认')" description="进入需求规格工作区,完善需求与验收后确认版本。"><template data-slot="action"><template data-component="Button" data-bind-disabled="(!session.can('spec:view', intent.tenantId))" data-on-click="(router.push('/intents/' + intent.id + '/spec'))">查看需求规格</template></template></template><template data-component="Alert" data-if="(closed)" class="page-alert" type="warning" show-icon="" title="意图已关闭" data-bind-description="(intent.closedBy + ' · ' + dateText(intent.closedAt) + ';原因:' + intent.closedReason)"></template><template data-component="Alert" data-if="(!canConfirm &amp;&amp; intent.status === 'ready')" class="page-alert" type="info" show-icon="" title="当前没有意图确认权限" description="未决问题为零仍需确认权限。请在独立的权限管理中配置当前租户的“确认意图”权限,或联系业务管理员。"></template><template data-component="Alert" data-if="(intent.status === 'ready' &amp;&amp; unresolved(intent.decisions).length)" class="page-alert" type="warning" show-icon="" data-bind-title="('还有 ' + unresolved(intent.decisions).length + ' 项决策未处理,暂不能确认意图')" description="在下方决策登记填写结论并保存为新版本,再确认。"></template><div class="intent-grid"><section class="panel intent-main"><div class="section-heading"><h2>意图内容</h2><template data-component="Tag" color="blue" data-bind-bordered="(false)">{{ (version ? 'v' + version.number : '未形成版本') }}</template></div><template data-component="IntentDocument" data-bind-value="(version || intent)"></template><template data-component="IntentDecisions" data-bind-decisions="(intent.decisions)" data-bind-editable="(store.canEdit &amp;&amp; !closed &amp;&amp; !busy &amp;&amp; intent.status !== 'confirmed')" data-bind-new-version="(!!version)" data-bind-commit="(saveDecisions)"></template><div data-if="(!closed)" class="intent-actions"><span class="muted">{{ (unresolved(intent.decisions).length ? '请先处理未决问题' : '内容变更将形成新版本') }}</span><template data-component="Space" wrap=""><template data-component="Button" data-bind-disabled="(!store.canEdit || busy)" data-on-click="(replan = true)">重新规划</template><template data-component="Button" data-bind-disabled="(!store.canEdit || busy)" data-on-click="(edit = true)">修改</template><template data-component="Button" data-if="(intent.status === 'ready')" type="primary" data-bind-loading="(intent.confirmation === 'pending')" data-bind-disabled="(!canConfirm || busy || !!unresolved(intent.decisions).length)" data-on-click="(confirm)">{{ (intent.confirmation === 'failed' ? '重试确认' : '确认意图') }}</template></template></div></section><aside class="panel intent-summary" aria-label="确认信息"><h2>确认信息</h2><dl class="intent-info"><dt>当前版本</dt><dd>{{ (version ? '意图 v' + version.number : '草稿') }}</dd><dt>PBC 归属</dt><dd>{{ (affiliationOf(intent).label) }}</dd><dt>发起人</dt><dd>{{ (intent.owner) }}</dd></dl><div class="summary-context"><h3>{{ (version?.confirmedAt ? '确认记录' : '确认前请核对') }}</h3><p data-if="(version?.confirmedAt)"><template data-component="CheckCircleOutlined" class="answered"></template> {{ (version.confirmedBy) }} · {{ (dateText(version.confirmedAt)) }}</p><ul data-else="" class="confirmation-checks"><li>问题、预期结果与范围一致</li><li>未决问题已有明确结论</li><li>以有权身份确认当前版本</li></ul></div><div class="summary-context"><template data-component="RecordMetadata" data-bind-record="(intent)" compact=""></template></div></aside></div><template data-component="IntentRevision" data-if="(edit)" data-bind-intent="(intent)" data-on-close="(edit = false)"></template><template data-component="IntentReplan" data-if="(replan)" data-bind-intent="(intent)" data-on-close="(replan = false)"></template><template data-component="IntentHistory" data-if="(history)" data-bind-intent="(intent)" data-on-close="(history = false)"></template><template data-component="IntentClose" data-if="(closing)" data-bind-intent="(intent)" data-on-close="(closing = false)"></template></template>
@@ -0,0 +1,66 @@
1
+ import IntentSource from "../operations/IntentSource.js";
2
+ import { useDeliveryView } from "../shared/deliveryView.js";
3
+ import { confirmAction } from "../shell/confirmation.js";
4
+ import { computed, ref, watch } from '../../runtime/state.js';
5
+ import { useRoute, useRouter } from "../../runtime/router.js";
6
+ import { Alert, Button, Result, Space, Tag, message } from "../../runtime/widgets.js";
7
+ import { HistoryOutlined, CheckCircleOutlined } from "../../runtime/icons.js";
8
+ import { useIntents } from "./store.js";
9
+ import { lastVersion, unresolved, confirmationBusy } from "./domain.js";
10
+ import { dateText } from "./data.js";
11
+ import IntentHeader from "./IntentHeader.js";
12
+ import IntentDocument from "./IntentDocument.js";
13
+ import IntentRevision from "./IntentRevision.js";
14
+ import IntentReplan from "./IntentReplan.js";
15
+ import IntentHistory from "./IntentHistory.js";
16
+ import IntentDecisions from "./IntentDecisions.js";
17
+ import IntentClose from "./IntentClose.js";
18
+ import RecordMetadata from "../shared/RecordMetadata.js";
19
+ import { useSession } from "../shared/session.js";
20
+ import { createComponent } from '../../runtime/dom.js';
21
+ export default createComponent({ name: 'IntentDetail', propKeys: [], template: new URL('./IntentDetail.html', import.meta.url).href, setup(__props, __emit) {
22
+ const { affiliationOf } = useDeliveryView();
23
+ const session = useSession();
24
+ const route = useRoute(), router = useRouter(), store = useIntents(), edit = ref(false), replan = ref(false), history = ref(false), closing = ref(false), error = ref('');
25
+ const intent = computed(() => store.get(String(route.params.id))), version = computed(() => intent.value && lastVersion(intent.value));
26
+ const busy = computed(() => !!intent.value && confirmationBusy(intent.value)), closed = computed(() => intent.value?.status === 'closed');
27
+ watch(() => intent.value?.status, status => { if (status === 'draft' || status === 'clarifying')
28
+ router.replace('/intents/' + intent.value.id + '/workspace'); }, { immediate: true });
29
+ const canConfirm = computed(() => !!intent.value && session.can('intent:confirm', intent.value.tenantId));
30
+ function confirm() {
31
+ if (!intent.value || !version.value || !canConfirm || busy.value)
32
+ return;
33
+ const id = intent.value.id, number = version.value.number, expected = intent.value.recordVersion;
34
+ confirmAction({ title: '确认意图 v' + number + '?', content: '确认当前展示的问题、预期结果、范围和决策结论。确认记录绑定此版本及当前身份;本轮不创建 PBC 或启动开发。', okText: '确认此版本', cancelText: '继续查看', onOk: async () => {
35
+ try {
36
+ const result = await store.confirm(id, number, expected);
37
+ if (result === 'confirmed')
38
+ message.success('意图 v' + number + ' 已确认');
39
+ else if (result === 'unknown')
40
+ message.warning('响应未收到,请先核实确认结果');
41
+ }
42
+ catch (e) {
43
+ error.value = e.message;
44
+ }
45
+ } });
46
+ }
47
+ function saveDecisions(decisions) { if (!intent.value)
48
+ return false; try {
49
+ store.setDecisions(intent.value.id, decisions, intent.value.recordVersion);
50
+ error.value = '';
51
+ return true;
52
+ }
53
+ catch (e) {
54
+ error.value = e.message;
55
+ return false;
56
+ } }
57
+ function reconcile() { try {
58
+ store.reconcile(intent.value.id);
59
+ message.success('已核实:该版本确认成功,未重复提交');
60
+ error.value = '';
61
+ }
62
+ catch (e) {
63
+ error.value = e.message;
64
+ } }
65
+ return { IntentSource, useDeliveryView, affiliationOf, confirmAction, computed, ref, watch, useRoute, useRouter, Alert, Button, Result, Space, Tag, message, HistoryOutlined, CheckCircleOutlined, useIntents, lastVersion, unresolved, confirmationBusy, dateText, IntentHeader, IntentDocument, IntentRevision, IntentReplan, IntentHistory, IntentDecisions, IntentClose, RecordMetadata, useSession, session, route, router, store, edit, replan, history, closing, error, intent, version, busy, closed, canConfirm, confirm, saveDecisions, reconcile };
66
+ } });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/intents/IntentDocument.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <div class="intent-document"><section><h3>1. 要解决的问题</h3><p>{{ (value.request) }}</p></section><section><h3>2. 预期结果</h3><p>{{ (value.outcome || '待补充') }}</p><h4>验收标准</h4><p>{{ (value.answers.acceptance || '待补充') }}</p></section><section><h3>3. 影响的用户与系统</h3><p>{{ (value.answers.audience || '待补充') }}</p><h4>处理流程与系统边界</h4><p>{{ (value.answers.process || '待补充') }}</p></section><section><h3>4. 约束与限制</h3><p>{{ (value.answers.boundary || '待补充') }}</p></section><section><h3>5. 未决问题</h3><p data-if="(!value.decisions?.length)">暂无登记的未决问题。</p><div data-each="d in (value.decisions || [])" data-bind-key="(d.id)" class="document-decision"><strong>{{ (d.question) }}</strong><p>{{ (d.answer || '待确认,阻断意图确认') }}</p></div></section></div>
@@ -0,0 +1,5 @@
1
+ import { createComponent } from '../../runtime/dom.js';
2
+ export default createComponent({ name: 'IntentDocument', propKeys: ["value"], template: new URL('./IntentDocument.html', import.meta.url).href, setup(__props, __emit) {
3
+ __props;
4
+ return {};
5
+ } });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/intents/IntentHeader.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <template data-component="RouterLink" to="/intents" class="text-button intent-back"><template data-component="LeftOutlined"></template>返回意图池</template><div class="page-heading intent-heading"><div><h1>{{ (intent?.title || '发起意图') }}</h1><p data-if="(intent)" class="intent-meta"><span class="mono">{{ (intent.code) }}</span><template data-component="Tag" data-bind-color="(statusMeta[intent.status].color)" data-bind-bordered="(false)">{{ (statusMeta[intent.status].label) }}</template><span>{{ (affiliationOf(intent).label) }}</span></p><p data-else="">描述你想解决的问题,先把业务目标说清楚。</p></div><div class="intent-header-actions"><slot><template data-component="Button" data-on-click="(router.push('/intents'))">返回列表</template></slot></div></div><template data-component="Steps" class="intent-steps" title-placement="vertical" data-bind-current="(step)" data-bind-items="([{ title: '发起需求' }, { title: '澄清范围' }, { title: '确认意图' }])"></template>
@@ -0,0 +1,12 @@
1
+ import { useDeliveryView } from "../shared/deliveryView.js";
2
+ import { Button, Tag, Steps } from "../../runtime/widgets.js";
3
+ import { LeftOutlined } from "../../runtime/icons.js";
4
+ import { useRouter } from "../../runtime/router.js";
5
+ import { statusMeta } from "./data.js";
6
+ import { createComponent } from '../../runtime/dom.js';
7
+ export default createComponent({ name: 'IntentHeader', propKeys: ["intent", "step"], template: new URL('./IntentHeader.html', import.meta.url).href, setup(__props, __emit) {
8
+ const { affiliationOf } = useDeliveryView();
9
+ __props;
10
+ const router = useRouter();
11
+ return { useDeliveryView, affiliationOf, Button, Tag, Steps, LeftOutlined, useRouter, statusMeta, router };
12
+ } });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/intents/IntentHistory.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <template data-component="Drawer" data-bind-open="(true)" title="版本与操作记录" data-bind-size="(720)" data-on-close="(emit('close'))"><template data-component="Tabs" data-model-active-key="(tab)" data-bind-items="([{ key: 'versions', label: '意图版本' }, { key: 'events', label: '操作记录' }])"></template><template data-if="(tab === 'versions')"><div class="version-toolbar"><label for="intent-history-version">版本</label><template data-component="Select" id="intent-history-version" data-model-value="(number)" data-bind-options="(intent.versions.map(v =&gt; ({ label: '意图 v' + v.number, value: v.number })))"></template><template data-component="Tag" data-if="(version)" data-bind-color="(version.confirmedAt ? 'green' : 'default')">{{ (version.confirmedAt ? '已确认版本' : '未确认版本') }}</template></div><template data-if="(version)"><template data-component="Alert" type="info" show-icon="" data-bind-title="(version.title)" data-bind-description="(version.reason + ' · ' + dateText(version.createdAt))"></template><p data-if="(version.confirmedAt)" class="version-confirmed">{{ (version.confirmedBy) }} · {{ (dateText(version.confirmedAt)) }} 确认</p><template data-component="IntentDocument" data-bind-value="(version)"></template></template></template><ol data-else="" class="intent-events"><li data-each="(event, index) in ([...intent.events].reverse())" data-bind-key="(index)"><p>{{ (event.label) }}</p><span class="muted">{{ (event.actor || intent.createdBy) }} · {{ (dateText(event.at)) }}</span></li></ol></template>
@@ -0,0 +1,11 @@
1
+ import { computed, ref } from '../../runtime/state.js';
2
+ import { Alert, Drawer, Select, Tabs, Tag } from "../../runtime/widgets.js";
3
+ import { dateText } from "./data.js";
4
+ import IntentDocument from "./IntentDocument.js";
5
+ import { createComponent } from '../../runtime/dom.js';
6
+ export default createComponent({ name: 'IntentHistory', propKeys: ["intent"], template: new URL('./IntentHistory.html', import.meta.url).href, setup(__props, __emit) {
7
+ const props = __props, emit = __emit;
8
+ const tab = ref(props.intent.versions.length ? 'versions' : 'events'), number = ref(props.intent.versions.at(-1)?.number);
9
+ const version = computed(() => props.intent.versions.find(v => v.number === number.value));
10
+ return { computed, ref, Alert, Drawer, Select, Tabs, Tag, dateText, IntentDocument, props, emit, tab, number, version };
11
+ } });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/intents/IntentList.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <div class="page-heading"><div><h1>意图与需求</h1><p>从业务问题开始,形成可以核对和确认的意图。</p></div><template data-component="Button" type="primary" data-bind-disabled="(!store.canEdit)" data-on-click="(router.push('/intents/new'))"><template data-component="PlusOutlined"></template>发起意图</template></div><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="Tabs" data-model-active-key="(tab)" data-bind-items="(tabs)" class="model-tabs"></template><section class="filter-panel panel" aria-label="意图筛选"><template data-component="ProForm" name="intent-search" data-bind-form="(form)" class="filter-form" data-bind-grid="({ gutter: 24 })" data-on-keydown.enter.prevent="(search)"></template><div class="filter-actions"><template data-component="Button" data-on-click="(search)">查询</template><template data-component="Button" data-on-click="(reset)">重置</template></div></section><section class="panel model-table-panel" aria-label="意图池列表"><template data-component="Result" data-if="(store.scene === 'error')" status="warning" title="意图池加载失败"><template data-slot="extra"><template data-component="Button" type="primary" data-on-click="(retry)">重试</template></template></template><template data-component="ProTable" data-else="" data-bind-table="(table)" data-bind-search="(async () =&gt; { })" data-bind-control="(false)" data-bind-table-container="(false)" data-bind-loading="(loading)" data-bind-row-selection="(selection.rowSelection.value)" row-key="id" size="middle" data-bind-scroll="({ x: 'max-content' })" data-bind-pagination="({ showTotal: (n) =&gt; '共 ' + n + ' 条', showSizeChanger: true, pageSizeOptions: [10, 20, 50, 100] })" data-bind-locale="({ emptyText: h(Empty, { description: store.scene === 'empty' ? '还没有意图,从一个业务目标开始' : '没有符合条件的意图' }, { default: () =&gt; h(Button, { disabled: store.scene === 'empty' &amp;&amp; !store.canEdit, onClick: store.scene === 'empty' ? () =&gt; router.push('/intents/new') : reset }, () =&gt; store.scene === 'empty' ? '发起第一个意图' : '清除筛选') }) })"><template data-slot="button-bar"><div class="list-heading"><h2>意图池 · {{ (visible.length) }}</h2><template data-component="ListBatchBar" data-bind-count="(selection.keys.value.length)" data-bind-allowed="(session.can('intent:delete'))" data-on-remove="(batchDelete)" data-on-clear="(selection.clear)"></template></div></template><template data-slot="toolbar"><div class="table-tools"><template data-component="Select" data-model-value="(scope)" aria-label="意图可见范围" data-bind-options="([{ label: '全部可见', value: 'visible' }, { label: '我发起的', value: 'mine' }])"></template><template data-component="Select" data-model-value="(sort)" aria-label="意图排序" data-bind-options="([{ label: '创建时间倒序', value: 'created' }, { label: '修改时间倒序', value: 'updated' }, { label: '名称排序', value: 'name' }])"></template><template data-component="ColumnSettings" data-bind-preferences="(prefs)"></template><template data-component="Button" aria-label="刷新意图池" data-bind-loading="(loading)" data-on-click="(refresh)"><template data-component="ReloadOutlined"></template></template></div> <template data-component="IntentHistory" data-if="(selected &amp;&amp; overlay === 'history')" data-bind-intent="(selected)" data-on-close="(overlay = '')"></template><template data-component="IntentRevision" data-if="(selected &amp;&amp; overlay === 'edit')" data-bind-intent="(selected)" data-on-close="(overlay = '')"></template><template data-component="IntentReplan" data-if="(selected &amp;&amp; overlay === 'replan')" data-bind-intent="(selected)" data-on-close="(replanned)"></template><template data-component="ListDeleteDialog" data-if="(deleteTargets.length)" data-model-targets="(deleteTargets)" label="意图" data-bind-check="(store.checkRemove)" data-bind-submit="(store.removeMany)" data-on-close="(deleteTargets = [])" data-on-deleted="(deleted)"></template></template></template></section><p class="intent-list-note muted">“全部可见”受当前身份与租户范围限制。删除移出列表并保留操作痕迹,已确认版本受保护。</p><template data-component="IntentClose" data-if="(closing)" data-bind-intent="(closing)" data-on-close="(closingId = '')"></template>
@@ -0,0 +1,116 @@
1
+ import { useDeliveryView } from "../shared/deliveryView.js";
2
+ import { computed, ref, watch, onMounted } from '../../runtime/state.js';
3
+ import { h } from '../../runtime/dom.js';
4
+ import { useRouter } from "../../runtime/router.js";
5
+ import { Alert, Button, Empty, Result, Tabs, Tag, Select } from "../../runtime/widgets.js";
6
+ import { PlusOutlined, ReloadOutlined } from "../../runtime/icons.js";
7
+ import { ProForm, ProTable, useForm, useTable } from "../../runtime/widgets.js";
8
+ import { useIntents } from "./store.js";
9
+ import { useSession } from "../shared/session.js";
10
+ import { tenantLabel } from "../shared/policy.js";
11
+ import { useColumns } from "../shared/columns.js";
12
+ import ColumnSettings from "../shared/ColumnSettings.js";
13
+ import { useListSelection } from "../shared/listSelection.js";
14
+ import ListBatchBar from "../shared/ListBatchBar.js";
15
+ import ListDeleteDialog from "../shared/ListDeleteDialog.js";
16
+ import ListMore from "../shared/ListMore.js";
17
+ import IntentHistory from "./IntentHistory.js";
18
+ import IntentRevision from "./IntentRevision.js";
19
+ import IntentReplan from "./IntentReplan.js";
20
+ import IntentClose from "./IntentClose.js";
21
+ import { contexts, statusMeta, dateText } from "./data.js";
22
+ import { lastVersion, questionKeys, confirmationBusy } from "./domain.js";
23
+ import { createComponent } from '../../runtime/dom.js';
24
+ export default createComponent({ name: 'IntentList', propKeys: [], template: new URL('./IntentList.html', import.meta.url).href, setup(__props, __emit) {
25
+ const { affiliationOf } = useDeliveryView();
26
+ const store = useIntents(), session = useSession(), router = useRouter(), tab = ref('all'), loading = ref(false), scope = ref('visible'), sort = ref('created');
27
+ const closingId = ref(''), closing = computed(() => store.get(closingId.value));
28
+ const selectedId = ref(''), overlay = ref(''), selected = computed(() => store.get(selectedId.value)), deleteTargets = ref([]);
29
+ function menuItems(i) {
30
+ return [
31
+ { key: 'detail', label: '查看详情' },
32
+ { key: 'edit', label: ['draft', 'clarifying'].includes(i.status) ? '编辑与澄清' : '修改意图', disabled: !session.can('intent:edit', i.tenantId) || i.status === 'closed' || confirmationBusy(i) || i.generating },
33
+ { key: 'history', label: '版本与操作记录' },
34
+ { key: 'spec', label: '需求规格', disabled: i.status !== 'confirmed' || !session.can('spec:view', i.tenantId) },
35
+ { key: 'replan', label: '重新规划', disabled: !session.can('intent:edit', i.tenantId) || !['ready', 'confirmed'].includes(i.status) || confirmationBusy(i) || i.generating },
36
+ { type: 'divider' },
37
+ { key: 'close', label: '关闭意图', disabled: !session.can('intent:close', i.tenantId) || ['confirmed', 'closed'].includes(i.status) || confirmationBusy(i) || i.generating },
38
+ { key: 'delete', label: '删除意图', danger: true, disabled: !session.can('intent:delete', i.tenantId) },
39
+ ];
40
+ }
41
+ function rowAction(action, i) {
42
+ if (action === 'spec') {
43
+ router.push('/intents/' + i.id + '/spec');
44
+ return;
45
+ }
46
+ if (action === 'detail' || (action === 'edit' && ['draft', 'clarifying'].includes(i.status))) {
47
+ open(i);
48
+ return;
49
+ }
50
+ if (action === 'close') {
51
+ closingId.value = i.id;
52
+ return;
53
+ }
54
+ if (action === 'delete') {
55
+ deleteTargets.value = [{ id: i.id, name: i.title, recordVersion: i.recordVersion }];
56
+ return;
57
+ }
58
+ selectedId.value = i.id;
59
+ overlay.value = action;
60
+ }
61
+ function replanned() { overlay.value = ''; if (selected.value?.status === 'clarifying')
62
+ open(selected.value); }
63
+ const applied = ref({ keyword: '', context: '' });
64
+ const form = useForm({ keyword: '', context: '' }, [
65
+ { path: 'keyword', label: '意图名称', component: 'input', placeholder: '搜索名称或编号', span: 12, xs: 24, md: 12 },
66
+ { path: 'context', label: 'PBC 归属', component: 'select', placeholder: '全部归属', options: contexts.map(value => ({ label: value, value })), span: 12, xs: 24, md: 12 },
67
+ ]);
68
+ watch(() => store.items.map(i => affiliationOf(i)), values => { const field = form.fields.value.find(f => f.path === 'context'); if (field && field.component === 'select')
69
+ field.options = Array.from(new Map(values.map(v => [v.key, { label: v.label, value: v.key }])).values()); }, { immediate: true, deep: true });
70
+ const visible = computed(() => store.scene === 'empty' ? [] : store.items.filter(i => (scope.value !== 'mine' || i.createdById === session.actor.id) && (tab.value === 'all' || i.status === tab.value) &&
71
+ (!applied.value.context || affiliationOf(i).key === applied.value.context) && (!applied.value.keyword.trim() || (i.title + i.code).toLowerCase().includes(applied.value.keyword.trim().toLowerCase())))
72
+ .sort((a, b) => sort.value === 'name' ? a.title.localeCompare(b.title, 'zh-CN') : ((sort.value === 'created' ? b.createdAt : b.updatedAt).localeCompare(sort.value === 'created' ? a.createdAt : a.updatedAt) || a.id.localeCompare(b.id))));
73
+ const tabs = computed(() => [{ key: 'all', label: '全部状态' }, ...Object.entries(statusMeta).map(([key, meta]) => ({ key, label: meta.label }))]);
74
+ function open(i) { router.push('/intents/' + i.id + (['draft', 'clarifying'].includes(i.status) ? '/workspace' : '')); }
75
+ const render = (f) => (_, i) => f(i);
76
+ const prefs = useColumns('intents', [
77
+ { key: 'title', label: '意图', locked: true }, { key: 'status', label: '状态', defaultVisible: true }, { key: 'context', label: 'PBC 归属', defaultVisible: true },
78
+ { key: 'version', label: '澄清 / 版本', defaultVisible: true }, { key: 'createdBy', label: '创建人', defaultVisible: true }, { key: 'createdAt', label: '创建时间', defaultVisible: true },
79
+ { key: 'createdDept', label: '创建部门' }, { key: 'tenant', label: '所属租户' }, { key: 'updatedBy', label: '修改人' }, { key: 'updatedAt', label: '修改时间' }, { key: 'actions', label: '操作', locked: true },
80
+ ]);
81
+ const table = useTable({ pageParam: { current: 1, pageSize: 10, total: 0 }, columns: [
82
+ { title: '意图', key: 'title', dataIndex: 'title', width: 300, render: render(i => h('div', { class: 'model-name-cell' }, [h('button', { class: 'text-button model-link', onClick: () => open(i) }, i.title), h('span', { class: 'mono muted' }, i.code)])) },
83
+ { title: '状态', key: 'status', width: 120, render: render(i => h(Tag, { color: confirmationBusy(i) ? 'orange' : statusMeta[i.status].color, bordered: false }, () => confirmationBusy(i) ? '确认待核实' : statusMeta[i.status].label)) },
84
+ { title: 'PBC 归属', key: 'context', width: 240, render: render(i => h('span', affiliationOf(i).label)) },
85
+ { title: '澄清 / 版本', key: 'version', width: 130, render: render(i => h('span', { class: 'muted' }, i.versions.length ? '意图 v' + lastVersion(i)?.number : questionKeys.filter(q => i.answers[q].trim()).length + ' / 4 项已补充')) },
86
+ { title: '创建人', key: 'createdBy', dataIndex: 'createdBy', width: 100 },
87
+ { title: '创建时间', key: 'createdAt', dataIndex: 'createdAt', width: 180, render: (v) => dateText(String(v)) },
88
+ { title: '创建部门', key: 'createdDept', dataIndex: 'createdDept', width: 140 },
89
+ { title: '所属租户', key: 'tenant', dataIndex: 'tenantId', width: 140, render: (v) => tenantLabel(String(v)) },
90
+ { title: '修改人', key: 'updatedBy', dataIndex: 'updatedBy', width: 100 },
91
+ { title: '修改时间', key: 'updatedAt', dataIndex: 'updatedAt', width: 180, render: (v) => dateText(String(v)) },
92
+ { title: '操作', key: 'actions', width: 190, fixed: 'right', render: render(i => h('div', { class: 'row-actions' }, [
93
+ h(Button, { type: 'text', class: 'link-button', onClick: () => open(i) }, () => ['draft', 'clarifying'].includes(i.status) && store.canEdit ? '继续完善' : '查看详情'),
94
+ h(ListMore, { name: i.title, items: menuItems(i), onAction: (action) => rowAction(action, i) }),
95
+ ])) },
96
+ ] });
97
+ const selection = useListSelection(table.dataSource, computed(() => JSON.stringify([applied.value, tab.value, scope.value, sort.value, session.key, store.scene, table.pageParam.current, table.pageParam.pageSize])), computed(() => session.can('intent:delete')), i => i.title);
98
+ function batchDelete() { deleteTargets.value = selection.selected.value.map(i => ({ id: i.id, name: i.title, recordVersion: i.recordVersion })); }
99
+ function deleted() { deleteTargets.value = []; selection.clear(); }
100
+ const catalog = new Map(table.columns.value.map(c => [c.key, c]));
101
+ watch(prefs.keys, keys => { table.columns.value = keys.map(k => catalog.get(k)).filter(Boolean); }, { immediate: true });
102
+ watch([visible, () => table.pageParam.current, () => table.pageParam.pageSize], () => {
103
+ const size = table.pageParam.pageSize || 10, max = Math.max(1, Math.ceil(visible.value.length / size));
104
+ if ((table.pageParam.current || 1) > max)
105
+ table.setPageParam({ current: max });
106
+ const start = ((table.pageParam.current || 1) - 1) * size;
107
+ table.dataSource.value = visible.value.slice(start, start + size);
108
+ table.setPageParam({ total: visible.value.length });
109
+ }, { immediate: true });
110
+ function search() { applied.value = { keyword: form.formData.keyword || '', context: form.formData.context || '' }; table.setPageParam({ current: 1 }); }
111
+ function reset() { form.setFormData({ keyword: '', context: '' }); tab.value = 'all'; scope.value = 'visible'; search(); }
112
+ async function refresh() { selection.clear(); loading.value = true; await new Promise(r => setTimeout(r, 300)); loading.value = false; }
113
+ function retry() { store.scene = 'normal'; refresh(); }
114
+ onMounted(refresh);
115
+ return { useDeliveryView, affiliationOf, computed, ref, watch, onMounted, h, useRouter, Alert, Button, Empty, Result, Tabs, Tag, Select, PlusOutlined, ReloadOutlined, ProForm, ProTable, useForm, useTable, useIntents, useSession, tenantLabel, useColumns, ColumnSettings, useListSelection, ListBatchBar, ListDeleteDialog, ListMore, IntentHistory, IntentRevision, IntentReplan, IntentClose, contexts, statusMeta, dateText, lastVersion, questionKeys, confirmationBusy, store, session, router, tab, loading, scope, sort, closingId, closing, selectedId, overlay, selected, deleteTargets, menuItems, rowAction, replanned, applied, form, visible, tabs, open, render, prefs, table, selection, batchDelete, deleted, catalog, search, reset, refresh, retry };
116
+ } });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/intents/IntentReplan.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <template data-component="Modal" data-bind-open="(true)" title="重新规划" data-bind-width="(600)" ok-text="返回澄清" cancel-text="取消" data-bind-mask="({ closable: false })" data-bind-ok-button-props="({ disabled: !store.canEdit })" data-on-cancel="(emit('close'))" data-on-ok="(save)"><template data-component="Alert" class="form-intro" type="info" show-icon="" title="保留当前意图和确认记录" description="仅清空选中的澄清回答,其他内容保留。补充后再整理为新版本并确认。"></template><template data-component="ProForm" name="intent-replan" data-bind-form="(form)" layout="vertical" data-bind-disabled="(!store.canEdit)"></template></template>