@givolt/i3-composer-agent 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (494) hide show
  1. package/.agents/plugins/marketplace.json +1 -1
  2. package/.claude/commands/i3-ui-demo.md +21 -0
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/.claude-plugin/plugin.json +1 -1
  5. package/.codex-plugin/plugin.json +2 -2
  6. package/.gemini/commands/i3-ui-demo.toml +21 -0
  7. package/README.md +10 -8
  8. package/bin/i3-composer-agent.cjs +38 -44
  9. package/bin/install.cjs +15 -3
  10. package/bin/native-layout.cjs +2 -1
  11. package/bin/native-migration.cjs +19 -2
  12. package/bin/retired-sop-fingerprints.json +213 -0
  13. package/bin/wizard.cjs +7 -18
  14. package/commands/i3-ui-demo.toml +21 -0
  15. package/docs/codebuddy-setup.md +20 -23
  16. package/docs/codex-setup.md +2 -2
  17. package/docs/comparison.md +131 -0
  18. package/docs/developer-onboarding.md +143 -0
  19. package/docs/opencode-setup.md +1 -1
  20. package/docs/other-hosts.md +2 -2
  21. package/docs/skill-anatomy.md +211 -0
  22. package/docs/upstream-repository/AGENTS.md +92 -0
  23. package/docs/upstream-repository/CLAUDE.md +60 -0
  24. package/docs/upstream-repository/CONTRIBUTING.md +137 -0
  25. package/docs/upstream-repository/README.md +8 -0
  26. package/docs/upstream-repository/gitattributes.txt +1 -0
  27. package/docs/upstream-repository/gitignore.txt +10 -0
  28. package/docs/upstream-repository/manifest.json +71 -0
  29. package/docs/upstream-repository/opencode-skills.link +1 -0
  30. package/docs/upstream-repository/skill-gap.yml +80 -0
  31. package/docs/upstream-repository/skills-contributing.md +15 -0
  32. package/docs/upstream-repository/test-plugin-install.yml +167 -0
  33. package/docs/workbuddy-setup.md +7 -10
  34. package/evals/cases/i3-ui-demo.json +98 -0
  35. package/evals/fixtures/i3-ui-demo/asset-management.md +25 -0
  36. package/evals/zh-CN/cases/i3-ui-demo.json +103 -0
  37. package/hooks/PROTOTYPE.md +16 -8
  38. package/hooks/i3-prototype.cjs +4 -10
  39. package/hooks/manage.cjs +30 -31
  40. package/package.json +42 -5
  41. package/plugin.json +1 -1
  42. package/scripts/ui-demo-dependencies-test.js +228 -0
  43. package/scripts/ui-demo-mcp-test.js +95 -0
  44. package/scripts/ui-demo-test.js +170 -0
  45. package/scripts/ui-prototype-execution-runtime-test.js +1 -1
  46. package/scripts/ui-prototype-native-test.js +25 -3
  47. package/skills/i3-enterprise-sop/SKILL.md +15 -15
  48. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/ad/assets-manifest.json +9 -29
  49. package/{references/enterprise-sop-resources/ad/README.md → skills/i3-enterprise-sop/references/ad/readme.md} +4 -4
  50. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/assets-manifest.json +64 -33
  51. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/brd/assets-manifest.json +9 -20
  52. package/{references/enterprise-sop-resources/brd/README.md → skills/i3-enterprise-sop/references/brd/readme.md} +4 -4
  53. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/codebuddy-project-guide.md +1 -1
  54. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/controlled_handoff.py +52 -7
  55. package/{references/engineering-skeleton-resources → skills/i3-enterprise-sop/references/engineering-skeleton}/adoption.md +1 -1
  56. package/{references/engineering-skeleton-resources/README.md → skills/i3-enterprise-sop/references/engineering-skeleton/readme.md} +2 -2
  57. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/handoff-contract.md +2 -2
  58. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/lifecycle-contract.md +1 -1
  59. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/plan-handoff.md +3 -3
  60. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/prd/assets-manifest.json +20 -26
  61. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/prd/prompts/01-generate.md +1 -1
  62. package/{references/enterprise-sop-resources/prd/README.md → skills/i3-enterprise-sop/references/prd/readme.md} +4 -4
  63. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/prd/template-contracts.md +3 -3
  64. package/{references/enterprise-sop-resources/prd/templates/AD.md → skills/i3-enterprise-sop/references/prd/templates/ad.md} +1 -1
  65. package/{references/enterprise-sop-resources/prd/templates/PRD.md → skills/i3-enterprise-sop/references/prd/templates/prd.md} +1 -1
  66. package/{references/enterprise-sop-resources/README.md → skills/i3-enterprise-sop/references/readme.md} +14 -12
  67. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/recovery-contract.md +2 -2
  68. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/stages.json +16 -7
  69. package/skills/i3-enterprise-sop/references/technical-baseline/assets-manifest.json +84 -0
  70. 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} +122 -37
  71. package/{references/enterprise-sop-resources/technical-baseline/README.md → skills/i3-enterprise-sop/references/technical-baseline/readme.md} +8 -8
  72. package/{references/enterprise-sop-resources/technical-baseline/templates/TECHNICAL-BASELINE.md → skills/i3-enterprise-sop/references/technical-baseline/templates/technical-baseline.md} +1 -1
  73. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/template-contracts.md +7 -7
  74. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/testcase/assets-manifest.json +9 -29
  75. package/{references/enterprise-sop-resources/testcase/README.md → skills/i3-enterprise-sop/references/testcase/readme.md} +4 -4
  76. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/verification/review_handoff.py +3 -3
  77. package/skills/i3-ui-demo/SKILL.md +234 -0
  78. package/skills/i3-ui-demo/assets/antdv-build/package-lock.json +3363 -0
  79. package/skills/i3-ui-demo/assets/antdv-build/package.json +28 -0
  80. package/skills/i3-ui-demo/assets/design-source.json +11 -0
  81. package/skills/i3-ui-demo/assets/host-targets.json +739 -0
  82. package/skills/i3-ui-demo/assets/official-files.json +76 -0
  83. package/skills/i3-ui-demo/assets/starter/index.html +11 -0
  84. package/skills/i3-ui-demo/assets/starter/package-lock.json +2299 -0
  85. package/skills/i3-ui-demo/assets/starter/package.json +28 -0
  86. package/skills/i3-ui-demo/assets/starter/provenance.json +14 -0
  87. package/skills/i3-ui-demo/assets/starter/public/prototype-config.json +22 -0
  88. package/skills/i3-ui-demo/assets/starter/src/App.vue +64 -0
  89. package/skills/i3-ui-demo/assets/starter/src/PrototypeShell.vue +59 -0
  90. package/skills/i3-ui-demo/assets/starter/src/config.ts +23 -0
  91. package/skills/i3-ui-demo/assets/starter/src/domain/presentation.ts +30 -0
  92. package/skills/i3-ui-demo/assets/starter/src/domain/theme.ts +25 -0
  93. package/skills/i3-ui-demo/assets/starter/src/main.ts +18 -0
  94. package/skills/i3-ui-demo/assets/starter/src/style.css +26 -0
  95. package/skills/i3-ui-demo/assets/starter/tests/presentation.test.ts +23 -0
  96. package/skills/i3-ui-demo/assets/starter/tests/theme.test.ts +26 -0
  97. package/skills/i3-ui-demo/assets/starter/tsconfig.json +15 -0
  98. package/skills/i3-ui-demo/assets/starter/vite.config.ts +4 -0
  99. package/skills/i3-ui-demo/assets/templates/enterprise-admin/capability-definition.json +1395 -0
  100. package/skills/i3-ui-demo/assets/templates/enterprise-admin/component-inventory.json +707 -0
  101. package/skills/i3-ui-demo/assets/templates/enterprise-admin/design-system.md +26 -0
  102. package/skills/i3-ui-demo/assets/templates/enterprise-admin/generation.json +49 -0
  103. package/skills/i3-ui-demo/assets/templates/enterprise-admin/index.html +534 -0
  104. package/skills/i3-ui-demo/assets/templates/enterprise-admin/manifest.json +9 -0
  105. package/skills/i3-ui-demo/assets/templates/enterprise-admin/offline-build.json +265 -0
  106. package/skills/i3-ui-demo/assets/templates/enterprise-admin/offline.js +8888 -0
  107. package/skills/i3-ui-demo/assets/templates/enterprise-admin/origin.json +344 -0
  108. package/skills/i3-ui-demo/assets/templates/enterprise-admin/preset.json +928 -0
  109. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/app.js +22 -0
  110. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets/empty.svg +1 -0
  111. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets/reference-styles.json +1 -0
  112. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets/result-403.svg +1 -0
  113. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets/result-404.svg +1 -0
  114. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets-manifest.json +334 -0
  115. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/baseline.json +173 -0
  116. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/conversion.md +30 -0
  117. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/credits.md +17 -0
  118. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/design-tokens.json +881 -0
  119. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/index.html +28 -0
  120. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/licenses/@qin-ui-antdv-next-pro.txt +9 -0
  121. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/licenses/ant-design-icons.txt +22 -0
  122. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/licenses/antdv-next.txt +21 -0
  123. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/package.json +12 -0
  124. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/browser-routes.json +298 -0
  125. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/coverage.json +180 -0
  126. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/integrity.json +13 -0
  127. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/keyboard.json +11 -0
  128. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/responsive.json +125 -0
  129. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/review.md +51 -0
  130. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/rules.log +150 -0
  131. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-html.png +0 -0
  132. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-original.png +0 -0
  133. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-html.png +0 -0
  134. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-original.png +0 -0
  135. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/models-html.png +0 -0
  136. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/models-original.png +0 -0
  137. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-html.png +0 -0
  138. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-original.png +0 -0
  139. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/selection.json +9 -0
  140. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/visual-comparison.json +342 -0
  141. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/readme.md +73 -0
  142. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/reference.md +59 -0
  143. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/routes.json +178 -0
  144. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/controls.js +99 -0
  145. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/dialogs.js +54 -0
  146. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/dom.js +264 -0
  147. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/forms.js +47 -0
  148. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/icons.js +41 -0
  149. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/layout.js +47 -0
  150. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/router.js +63 -0
  151. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/state.js +90 -0
  152. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/table.js +41 -0
  153. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/widgets.js +8 -0
  154. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.html +3 -0
  155. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.js +36 -0
  156. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.html +2 -0
  157. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.js +51 -0
  158. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.html +3 -0
  159. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.js +48 -0
  160. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/CheckResults.html +2 -0
  161. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/CheckResults.js +6 -0
  162. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.html +2 -0
  163. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.js +13 -0
  164. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/data.js +24 -0
  165. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/domain.js +32 -0
  166. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/registry.js +25 -0
  167. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/store.js +85 -0
  168. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentClose.html +2 -0
  169. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentClose.js +17 -0
  170. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.html +2 -0
  171. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.js +66 -0
  172. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.html +3 -0
  173. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.js +38 -0
  174. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.html +2 -0
  175. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.js +66 -0
  176. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.html +2 -0
  177. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.js +5 -0
  178. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.html +2 -0
  179. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.js +12 -0
  180. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.html +2 -0
  181. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.js +11 -0
  182. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentList.html +2 -0
  183. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentList.js +116 -0
  184. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.html +2 -0
  185. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.js +32 -0
  186. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.html +2 -0
  187. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.js +49 -0
  188. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.html +2 -0
  189. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.js +10 -0
  190. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.html +2 -0
  191. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.js +77 -0
  192. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/data.js +60 -0
  193. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/domain.js +105 -0
  194. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/store.js +212 -0
  195. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/AuditPanel.html +2 -0
  196. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/AuditPanel.js +18 -0
  197. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelDetail.html +2 -0
  198. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelDetail.js +23 -0
  199. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelEditor.html +2 -0
  200. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelEditor.js +78 -0
  201. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelGrant.html +2 -0
  202. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelGrant.js +55 -0
  203. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelReferences.html +2 -0
  204. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelReferences.js +26 -0
  205. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelRelease.html +2 -0
  206. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelRelease.js +38 -0
  207. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelStatus.html +2 -0
  208. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelStatus.js +7 -0
  209. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelTable.html +2 -0
  210. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelTable.js +72 -0
  211. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelTester.html +2 -0
  212. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelTester.js +46 -0
  213. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelsPage.html +2 -0
  214. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelsPage.js +52 -0
  215. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/RowActions.html +2 -0
  216. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/RowActions.js +19 -0
  217. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/UsagePanel.html +2 -0
  218. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/UsagePanel.js +30 -0
  219. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/data.js +48 -0
  220. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/domain.js +39 -0
  221. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/store.js +129 -0
  222. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.html +4 -0
  223. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.js +21 -0
  224. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/IntentSource.html +2 -0
  225. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/IntentSource.js +8 -0
  226. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.html +2 -0
  227. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.js +37 -0
  228. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.html +2 -0
  229. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.js +10 -0
  230. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.html +2 -0
  231. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.js +37 -0
  232. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.html +2 -0
  233. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.js +49 -0
  234. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/RunDetail.html +4 -0
  235. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/RunDetail.js +22 -0
  236. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.html +2 -0
  237. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.js +9 -0
  238. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/commands.js +82 -0
  239. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/examples.js +47 -0
  240. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/model.js +61 -0
  241. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/repair.js +68 -0
  242. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/store.js +55 -0
  243. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/types.js +1 -0
  244. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/workbench.js +18 -0
  245. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.html +3 -0
  246. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.js +28 -0
  247. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.html +2 -0
  248. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.js +18 -0
  249. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.html +2 -0
  250. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.js +31 -0
  251. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.html +2 -0
  252. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.js +27 -0
  253. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.html +2 -0
  254. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.js +16 -0
  255. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.html +2 -0
  256. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.js +43 -0
  257. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.html +4 -0
  258. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.js +34 -0
  259. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.html +2 -0
  260. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.js +30 -0
  261. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.html +3 -0
  262. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.js +67 -0
  263. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.html +2 -0
  264. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.js +41 -0
  265. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.html +2 -0
  266. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.js +31 -0
  267. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.html +2 -0
  268. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.js +26 -0
  269. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.html +2 -0
  270. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.js +70 -0
  271. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/data.js +8 -0
  272. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/domain.js +62 -0
  273. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/management.js +36 -0
  274. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/managementStore.js +49 -0
  275. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/store.js +132 -0
  276. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/AdminList.html +2 -0
  277. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/AdminList.js +38 -0
  278. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.html +2 -0
  279. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.js +11 -0
  280. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.html +2 -0
  281. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.js +45 -0
  282. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.html +2 -0
  283. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.js +54 -0
  284. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.html +3 -0
  285. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.js +27 -0
  286. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.html +2 -0
  287. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.js +12 -0
  288. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.html +2 -0
  289. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.js +45 -0
  290. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.html +3 -0
  291. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.js +38 -0
  292. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/domain.js +61 -0
  293. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/state.js +51 -0
  294. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/store.js +116 -0
  295. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.html +2 -0
  296. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.js +45 -0
  297. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.html +4 -0
  298. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.js +30 -0
  299. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.html +2 -0
  300. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.js +67 -0
  301. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.html +2 -0
  302. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.js +5 -0
  303. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.html +4 -0
  304. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.js +60 -0
  305. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/commands.js +157 -0
  306. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/model.js +136 -0
  307. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/store.js +76 -0
  308. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.html +3 -0
  309. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.js +26 -0
  310. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.html +2 -0
  311. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.js +14 -0
  312. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.html +2 -0
  313. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.js +113 -0
  314. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.html +3 -0
  315. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.js +62 -0
  316. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/commands.js +97 -0
  317. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/model.js +147 -0
  318. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/store.js +13 -0
  319. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.html +2 -0
  320. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.js +9 -0
  321. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.html +2 -0
  322. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.js +8 -0
  323. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.html +2 -0
  324. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.js +37 -0
  325. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListMore.html +2 -0
  326. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListMore.js +8 -0
  327. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.html +2 -0
  328. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.js +17 -0
  329. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/columns.js +32 -0
  330. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/deliveryGuide.js +49 -0
  331. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/deliveryView.js +12 -0
  332. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/listBatch.js +15 -0
  333. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/listSelection.js +37 -0
  334. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/policy.js +68 -0
  335. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/session.js +44 -0
  336. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.html +2 -0
  337. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.js +25 -0
  338. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.html +2 -0
  339. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.js +53 -0
  340. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.html +10 -0
  341. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.js +30 -0
  342. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ScopePage.html +2 -0
  343. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ScopePage.js +10 -0
  344. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.html +2 -0
  345. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.js +9 -0
  346. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/confirmation.js +3 -0
  347. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/navigation.js +19 -0
  348. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.html +2 -0
  349. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.js +8 -0
  350. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.html +2 -0
  351. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.js +32 -0
  352. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.html +2 -0
  353. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.js +15 -0
  354. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.html +2 -0
  355. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.js +11 -0
  356. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecReview.html +2 -0
  357. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecReview.js +57 -0
  358. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.html +2 -0
  359. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.js +37 -0
  360. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/data.js +20 -0
  361. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/domain.js +55 -0
  362. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/store.js +151 -0
  363. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.html +3 -0
  364. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.js +18 -0
  365. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.html +2 -0
  366. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.js +40 -0
  367. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.html +2 -0
  368. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.js +51 -0
  369. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.html +2 -0
  370. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.js +9 -0
  371. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.html +5 -0
  372. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.js +48 -0
  373. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/domain.js +204 -0
  374. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/exampleSource.js +22 -0
  375. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/registry.js +135 -0
  376. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/store.js +137 -0
  377. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.html +3 -0
  378. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.js +36 -0
  379. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workbench/model.js +56 -0
  380. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workbench/store.js +15 -0
  381. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.html +2 -0
  382. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.js +27 -0
  383. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.html +4 -0
  384. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.js +31 -0
  385. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.html +2 -0
  386. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.js +68 -0
  387. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.html +5 -0
  388. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.js +55 -0
  389. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/data.js +16 -0
  390. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/domain.js +83 -0
  391. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/registry.js +18 -0
  392. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/store.js +61 -0
  393. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/admin.css +60 -0
  394. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/agents.css +46 -0
  395. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/antdv.css +295 -0
  396. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/app.css +102 -0
  397. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/delivery.css +4 -0
  398. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/intents.css +37 -0
  399. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/native.css +22 -0
  400. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/operations.css +2 -0
  401. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/pbc.css +3 -0
  402. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/permissions.css +22 -0
  403. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/pro.css +1 -0
  404. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/releases.css +4 -0
  405. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/reset.css +246 -0
  406. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/reviews.css +8 -0
  407. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/tasks.css +6 -0
  408. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/tokens.css +15 -0
  409. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/workbench.css +61 -0
  410. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/workflows.css +1 -0
  411. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/admin-rules.test.js +96 -0
  412. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/agents.test.js +14 -0
  413. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/intent-state.test.js +37 -0
  414. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/list-batch.test.js +44 -0
  415. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/operation-fixtures.js +19 -0
  416. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/operation-repair.test.js +14 -0
  417. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/operations.test.js +25 -0
  418. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/pbc-management.test.js +17 -0
  419. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/pbc-state.test.js +24 -0
  420. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/permission-config.test.js +23 -0
  421. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/permissions.test.js +24 -0
  422. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/releases.test.js +50 -0
  423. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/reviews.test.js +36 -0
  424. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/runtime-forms-router.test.js +28 -0
  425. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/runtime-state.test.js +42 -0
  426. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/runtime-stores.test.js +16 -0
  427. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/spec-state.test.js +11 -0
  428. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/tasks.test.js +27 -0
  429. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/workbench.test.js +34 -0
  430. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/workflows.test.js +16 -0
  431. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tools/convert.mjs +168 -0
  432. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tools/serve.mjs +7 -0
  433. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tools/styles.mjs +11 -0
  434. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tools/verify.mjs +24 -0
  435. package/skills/i3-ui-demo/assets/templates/enterprise-admin/serve.cjs +16 -0
  436. package/skills/i3-ui-demo/assets/templates/enterprise-admin/template-inventory.json +28791 -0
  437. package/skills/i3-ui-demo/assets/templates/enterprise-admin/template.json +9 -0
  438. package/skills/i3-ui-demo/assets/templates/enterprise-admin/usability.css +44 -0
  439. package/skills/i3-ui-demo/assets/templates.json +10 -0
  440. package/skills/i3-ui-demo/assets/versions.json +20 -0
  441. package/skills/i3-ui-demo/readme.md +350 -0
  442. package/skills/i3-ui-demo/references/browser.md +71 -0
  443. package/skills/i3-ui-demo/references/dependencies.md +67 -0
  444. package/skills/i3-ui-demo/references/resources.md +142 -0
  445. package/skills/i3-ui-demo/scripts/dependencies.cjs +364 -0
  446. package/skills/i3-ui-demo/scripts/design-install.cjs +105 -0
  447. package/skills/i3-ui-demo/scripts/design-provider.cjs +57 -0
  448. package/skills/i3-ui-demo/scripts/locations.cjs +52 -0
  449. package/skills/i3-ui-demo/scripts/mcp.cjs +112 -0
  450. package/skills/i3-ui-demo/scripts/provider-discovery.cjs +131 -0
  451. package/skills/i3-ui-demo/scripts/resources.cjs +283 -0
  452. package/skills/i3-ui-prototype/SKILL.md +1 -1
  453. package/skills/i3-ui-prototype/references/execution-evidence.md +12 -56
  454. package/skills/i3-ui-prototype/scripts/codebuddy-registration.cjs +1 -1
  455. package/skills/i3-ui-prototype/scripts/execution-runtime.cjs +5 -2
  456. package/skills/i3-ui-prototype/scripts/hosts/codebuddy.cjs +3 -2
  457. package/skills/i3-ui-prototype/scripts/native-delivery.cjs +2 -2
  458. package/skills/i3-ui-prototype/scripts/prototype-hooks.cjs +23 -20
  459. package/docs/ui-prototype-native/MAIN-SESSION-REPORT.md +0 -66
  460. package/docs/ui-prototype-native/USAGE.md +0 -93
  461. package/references/enterprise-sop-resources/technical-baseline/assets-manifest.json +0 -101
  462. package/references/enterprise-sop-resources/technical-baseline/baselines/PROVENANCE.md +0 -40
  463. package/references/enterprise-sop-resources/technical-baseline/references/engineering-directory-v0.2.0/adoption.md +0 -112
  464. package/references/enterprise-sop-resources/technical-baseline/references/engineering-directory-v0.2.0/directory-standard.md +0 -119
  465. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/ad/prompts/01-generate.md +0 -0
  466. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/ad/prompts/02-review.md +0 -0
  467. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/ad/prompts/03-revise.md +0 -0
  468. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/ad/prompts/04-recheck.md +0 -0
  469. /package/{references/enterprise-sop-resources/ad/templates/AD.md → skills/i3-enterprise-sop/references/ad/templates/ad.md} +0 -0
  470. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/brd/prompts/01-generate.md +0 -0
  471. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/brd/prompts/02-review.md +0 -0
  472. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/brd/prompts/03-revise.md +0 -0
  473. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/brd/prompts/04-recheck.md +0 -0
  474. /package/{references/enterprise-sop-resources/brd/templates/BRD.md → skills/i3-enterprise-sop/references/brd/templates/brd.md} +0 -0
  475. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/controlled-handoff.md +0 -0
  476. /package/{references/engineering-skeleton-resources → skills/i3-enterprise-sop/references/engineering-skeleton}/catalog.json +0 -0
  477. /package/{references/engineering-skeleton-resources → skills/i3-enterprise-sop/references/engineering-skeleton}/directory-standard.md +0 -0
  478. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/handoff.py +0 -0
  479. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/prd/prompts/02-review.md +0 -0
  480. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/prd/prompts/03-revise.md +0 -0
  481. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/prd/prompts/04-recheck.md +0 -0
  482. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/review-handoff.md +0 -0
  483. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/selection-handoff.md +0 -0
  484. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/selection_handoff.py +0 -0
  485. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/testcase/prompts/01-generate.md +0 -0
  486. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/testcase/prompts/02-review.md +0 -0
  487. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/testcase/prompts/03-revise.md +0 -0
  488. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/testcase/prompts/04-recheck.md +0 -0
  489. /package/{references/enterprise-sop-resources/testcase/templates/TestCase.md → skills/i3-enterprise-sop/references/testcase/templates/testcase.md} +0 -0
  490. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/verification/check_execution.py +0 -0
  491. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/verification/check_native_execution.py +0 -0
  492. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/verification/check_reads.py +0 -0
  493. /package/{references/enterprise-sop-resources/verification/README.md → skills/i3-enterprise-sop/references/verification/readme.md} +0 -0
  494. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/verification/review-output.schema.json +0 -0
@@ -0,0 +1,37 @@
1
+ import { computed, onMounted, onUpdated, ref, watch } from '../../runtime/state.js';
2
+ import { defineComponent, h } from '../../runtime/dom.js';
3
+ // The installed Checkbox puts aria attributes on its wrapper; label the native input.
4
+ const SelectionLabel = defineComponent({
5
+ props: { node: { type: Object, required: true }, label: { type: String, required: true } },
6
+ setup(props) {
7
+ const element = ref();
8
+ const labelInput = () => element.value?.querySelector('input[type="checkbox"],input[type="radio"]')?.setAttribute('aria-label', props.label);
9
+ onMounted(labelInput);
10
+ onUpdated(labelInput);
11
+ return () => h('span', { ref: element }, [props.node]);
12
+ },
13
+ });
14
+ export const labeledSelection = (node, label) => h(SelectionLabel, { node: node, label });
15
+ export function useListSelection(rows, scope, allowed, name) {
16
+ const keys = ref([]);
17
+ const checkboxLabel = (node, label) => h(SelectionLabel, { node: node, label });
18
+ const clear = () => { keys.value = []; };
19
+ watch(scope, clear, { flush: 'sync' });
20
+ watch(allowed, clear, { flush: 'sync' });
21
+ watch(() => rows.value.map(r => r.id).join('|'), clear, { flush: 'sync' });
22
+ const selected = computed(() => rows.value.filter(r => keys.value.includes(r.id)));
23
+ const rowSelection = computed(() => ({
24
+ selectedRowKeys: keys.value, columnWidth: 48,
25
+ columnTitle: (node) => checkboxLabel(node, '全选当前页'),
26
+ renderCell: (_checked, record, _index, node) => {
27
+ const row = rows.value.find(r => r.id === record.id);
28
+ return checkboxLabel(node, '选择' + (row ? name(row) : '记录'));
29
+ },
30
+ onChange: (values) => { keys.value = allowed.value ? values.map(String).filter(id => rows.value.some(r => r.id === id)) : []; },
31
+ getCheckboxProps: (record) => {
32
+ const row = rows.value.find(r => r.id === record.id);
33
+ return { disabled: !allowed.value || !row };
34
+ },
35
+ }));
36
+ return { keys, selected, rowSelection, clear };
37
+ }
@@ -0,0 +1,68 @@
1
+ const actorSeeds = [
2
+ { id: 'chen', name: '陈敏', role: 'platform', tenantId: 'platform', department: '平台技术部', label: '平台管理员' },
3
+ { id: 'wang', name: '王睿', role: 'reviewer', tenantId: 'platform', department: '平台技术部', label: '配置审核员' },
4
+ { id: 'lin', name: '林晓', role: 'pm', tenantId: 'heating', department: '供热产品部', label: '产品负责人' },
5
+ { id: 'zhou', name: '周晨', role: 'engineer', tenantId: 'heating', department: '供热研发部', label: 'AI 工程师' },
6
+ { id: 'liu', name: '刘宁', role: 'viewer', tenantId: 'heating', department: '供热运营部', label: '只读成员' },
7
+ { id: 'zhao', name: '赵云', role: 'other', tenantId: 'north', department: '能源产品部', label: '北方能源 · 产品负责人' },
8
+ { id: 'guest', name: '访客', role: 'none', tenantId: 'heating', department: '访客', label: '无业务权限成员' },
9
+ ];
10
+ const templates = {
11
+ platform: ['model:view', 'model:edit', 'model:test', 'model:grant', 'model:status', 'model:delete', 'model:audit', 'intent:view', 'intent:edit', 'intent:delete'],
12
+ reviewer: ['model:view', 'model:publish', 'model:audit', 'intent:view'],
13
+ pm: ['model:view', 'intent:view', 'intent:edit', 'intent:confirm', 'intent:close', 'intent:delete'],
14
+ engineer: ['model:view', 'intent:view', 'intent:edit'], viewer: ['model:view', 'intent:view'],
15
+ other: ['model:view', 'intent:view', 'intent:edit', 'intent:confirm', 'intent:close', 'intent:delete'], none: [],
16
+ };
17
+ export const actionGroups = [
18
+ { name: '意图', items: [{ value: 'intent:view', label: '查看意图' }, { value: 'intent:edit', label: '创建/修改意图' }, { value: 'intent:confirm', label: '确认意图' }, { value: 'intent:close', label: '关闭意图' }, { value: 'intent:delete', label: '删除意图' }] },
19
+ { name: '规格', items: [{ value: 'spec:view', label: '查看规格' }, { value: 'spec:generate', label: '生成规格' }, { value: 'spec:edit', label: '修改/重新规划' }, { value: 'spec:confirm', label: '确认规格' }] },
20
+ { name: 'PBC', items: [{ value: 'pbc:view', label: '查看 PBC' }, { value: 'pbc:link', label: '关联已有 PBC' }, { value: 'pbc:create', label: '创建 PBC' }] },
21
+ { name: '模型', items: [{ value: 'model:view', label: '查看模型' }, { value: 'model:edit', label: '接入/编辑模型' }, { value: 'model:test', label: '测试模型' }, { value: 'model:grant', label: '模型使用授权' }, { value: 'model:publish', label: '发布模型配置' }, { value: 'model:status', label: '启停模型' }, { value: 'model:delete', label: '删除模型' }, { value: 'model:audit', label: '模型审计' }] },
22
+ ];
23
+ actionGroups.push({ name: '权限管理', items: [{ value: 'permission:view', label: '查看角色与成员' }, { value: 'permission:roles', label: '维护角色' }, { value: 'permission:grant', label: '配置角色权限' }, { value: 'permission:members', label: '维护成员授权' }, { value: 'permission:delete', label: '删除角色与成员关联' }, { value: 'permission:audit', label: '查看授权记录' }, { value: 'permission:delegate', label: '转授权限管理能力' }] });
24
+ actionGroups.push({ name: 'Agent 注册表', items: [{ value: 'agent:view', label: '查看 Agent' }, { value: 'agent:edit', label: '创建/编辑 Agent' }, { value: 'agent:check', label: '检查 Agent 配置' }, { value: 'agent:status', label: '启停 Agent' }, { value: 'agent:delete', label: '删除 Agent' }, { value: 'agent:audit', label: '查看 Agent 记录' }] });
25
+ templates.platform.push(...actionGroups.at(-1).items.map(i => i.value), 'pbc:view');
26
+ templates.engineer.push('agent:view', 'agent:edit', 'agent:check', 'pbc:view');
27
+ templates.viewer.push('agent:view', 'pbc:view');
28
+ templates.other.push('agent:view', 'pbc:view');
29
+ actionGroups.push({ name: '流程模板', items: [{ value: 'workflow:view', label: '查看流程模板' }, { value: 'workflow:edit', label: '创建/编辑模板' }, { value: 'workflow:use', label: '选择交付模板' }, { value: 'workflow:publish', label: '审核发布模板' }, { value: 'workflow:status', label: '启停模板' }, { value: 'workflow:delete', label: '删除模板' }, { value: 'workflow:audit', label: '查看流程记录' }, { value: 'workflow:approve', label: '交付人工确认' }] });
30
+ templates.platform.push('workflow:view', 'workflow:edit', 'workflow:use', 'workflow:status', 'workflow:delete', 'workflow:audit', 'workflow:approve');
31
+ templates.reviewer.push('workflow:view', 'workflow:publish', 'workflow:audit', 'agent:view', 'pbc:view');
32
+ templates.engineer.push('workflow:view', 'workflow:edit', 'workflow:use');
33
+ templates.viewer.push('workflow:view');
34
+ templates.other.push('workflow:view');
35
+ actionGroups.push({ name: '交付任务与产物', items: [{ value: 'task:view', label: '查看交付任务' }, { value: 'task:create', label: '创建交付任务' }, { value: 'task:edit', label: '修改交付草稿' }, { value: 'task:operate', label: '启动/暂停/恢复/处理任务' }, { value: 'task:takeover', label: '人工接管任务' }, { value: 'task:delete', label: '删除交付草稿' }, { value: 'task:audit', label: '查看交付记录' }, { value: 'artifact:view', label: '查看交付产物' }] });
36
+ templates.platform.push(...actionGroups.at(-1).items.map(i => i.value), 'spec:view');
37
+ templates.engineer.push('task:view', 'task:create', 'task:edit', 'task:operate', 'task:takeover', 'task:delete', 'task:audit', 'artifact:view', 'spec:view');
38
+ templates.reviewer.push('task:view', 'task:audit', 'artifact:view', 'spec:view');
39
+ templates.viewer.push('task:view', 'artifact:view');
40
+ templates.other.push('task:view', 'artifact:view');
41
+ actionGroups.find(g => g.name === 'PBC').items.push({ value: 'pbc:edit', label: '修改 PBC 资料' }, { value: 'pbc:archive', label: '归档/恢复 PBC' }, { value: 'pbc:delete', label: '删除 PBC' }, { value: 'pbc:audit', label: '查看 PBC 记录' }, { value: 'pbc:service', label: '维护服务方案' });
42
+ templates.platform.push('pbc:create', 'pbc:link', 'pbc:edit', 'pbc:archive', 'pbc:delete', 'pbc:audit', 'pbc:service');
43
+ templates.engineer.push('pbc:audit');
44
+ actionGroups.push({ name: '质量与人工确认', items: [{ value: 'review:edit', label: '修改评审设计' }, { value: 'review:replan', label: '重新规划交付' }] });
45
+ templates.platform.push('review:edit', 'review:replan');
46
+ templates.engineer.push('review:edit', 'review:replan');
47
+ actionGroups.push({ name: '发布准备与人工放行', items: [{ value: 'release:edit', label: '创建/编辑/检查发布单' }, { value: 'release:delete', label: '删除发布草稿' }, { value: 'release:submit', label: '提交发布审核' }, { value: 'release:approve', label: '人工授权/退回发布' }, { value: 'release:execute', label: '执行/恢复/重试发布' }, { value: 'release:pause', label: '暂停发布' }, { value: 'release:rollback', label: '回滚/停止并撤流' }] });
48
+ templates.platform.push(...actionGroups.at(-1).items.map(i => i.value));
49
+ templates.engineer.push('release:edit', 'release:delete', 'release:submit', 'release:execute', 'release:pause', 'release:rollback');
50
+ actionGroups.push({ name: '运行验收与异常反馈', items: [{ value: 'operation:view', label: '查看运行与异常' }, { value: 'operation:observe', label: '获取观测/诊断证据' }, { value: 'operation:accept', label: '记录运行验收' }, { value: 'operation:triage', label: '异常分诊' }, { value: 'operation:link', label: '关联/创建修复需求' }, { value: 'operation:close', label: '关闭已复核异常' }] });
51
+ templates.platform.push(...actionGroups.at(-1).items.map(i => i.value));
52
+ templates.engineer.push('operation:view', 'operation:observe', 'operation:triage', 'operation:link');
53
+ templates.viewer.push('operation:view');
54
+ export const allActions = actionGroups.flatMap(g => g.items.map(i => i.value));
55
+ export const actors = actorSeeds.map(a => ({ ...a, grants: [{ id: a.id + '-base', name: a.label, actions: [...(templates[a.role] || [])], tenantIds: a.tenantId === 'platform' ? ['*'] : [a.tenantId] }] }));
56
+ actors.push({ id: 'complete', name: '林晓', role: 'delivery', label: '完整授权演示', tenantId: 'heating', department: '供热产品部', grants: [
57
+ { id: 'delivery', name: '需求与交付', actions: allActions.filter(a => !a.startsWith('model:') && !a.startsWith('permission:')), tenantIds: ['heating'] },
58
+ { id: 'models', name: '平台模型管理', actions: allActions.filter(a => a.startsWith('model:')), tenantIds: ['platform'] },
59
+ ] });
60
+ const matchesScope = (grant, tenantId) => grant.tenantIds.includes('*') || grant.tenantIds.includes(tenantId);
61
+ export const can = (actor, action, tenantId, pbcId, environmentId) => actor.grants.some(g => g.actions.includes(action) && (tenantId === undefined || matchesScope(g, tenantId)) && (!pbcId || !g.pbcIds || g.pbcIds.includes('*') || g.pbcIds.includes(pbcId)) && (!environmentId || !g.environmentIds || g.environmentIds.includes('*') || g.environmentIds.includes(environmentId)));
62
+ export const inScope = (actor, tenantId, action) => actor.grants.some(g => matchesScope(g, tenantId) && (!action || g.actions.includes(action)));
63
+ export const tenants = [{ value: 'heating', label: '供热事业部' }, { value: 'north', label: '北方能源' }];
64
+ export const tenantLabel = (id) => id === 'platform' ? '平台统一管理' : tenants.find(t => t.value === id)?.label || id;
65
+ export function metadata(actor, at, tenantId = actor.tenantId) {
66
+ return { createdById: actor.id, createdBy: actor.name, createdAt: at, createdDept: actor.department, updatedBy: actor.name, updatedAt: at, tenantId, recordVersion: 1, isDeleted: false };
67
+ }
68
+ export const formatDate = (at) => at ? new Date(at).toLocaleString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false }) : '—';
@@ -0,0 +1,44 @@
1
+ import { computed, ref, watch } from '../../runtime/state.js';
2
+ import { defineStore } from "../../runtime/state.js";
3
+ import { authority } from "../permissions/state.js";
4
+ import { resolveActor } from "../permissions/domain.js";
5
+ import { actors, can as check } from "./policy.js";
6
+ // This is a scenario switcher for the isolated prototype, never an auth provider.
7
+ export const useSession = defineStore('session', () => {
8
+ const actorId = ref('chen'), state = ref('active');
9
+ const overrides = ref({}), policyVersion = ref(0);
10
+ try {
11
+ const raw = localStorage.getItem('i3-prototype-antdv-v010-demo-session');
12
+ if (raw) {
13
+ const saved = JSON.parse(raw);
14
+ if (actors.some(a => a.id === saved.actorId))
15
+ actorId.value = saved.actorId;
16
+ if (saved.overrides && typeof saved.overrides === 'object')
17
+ overrides.value = saved.overrides;
18
+ }
19
+ }
20
+ catch { /* Demo settings may be reset safely. */ }
21
+ const nextWrite = ref('success');
22
+ const publishResult = ref('success'), confirmResult = ref('success');
23
+ const actor = computed(() => { const base = actors.find(a => a.id === actorId.value) || actors.at(-1); return resolveActor(base, authority); });
24
+ watch(() => JSON.stringify(actor.value.grants), () => policyVersion.value++, { flush: 'sync' });
25
+ const key = computed(() => actor.value.id + ':' + actor.value.tenantId + ':' + policyVersion.value);
26
+ const can = (action, tenantId, pbcId, environmentId) => state.value === 'active' && check(actor.value, action, tenantId, pbcId, environmentId);
27
+ const readable = (action, tenantId, pbcId, environmentId) => check(actor.value, action, tenantId, pbcId, environmentId);
28
+ function require(action, tenantId, pbcId, environmentId) { if (!can(action, tenantId, pbcId, environmentId))
29
+ throw new Error(state.value === 'active' ? '当前身份没有此操作权限,或资源不在授权范围。' : '登录状态已失效,请重新通过 MaxKey 登录。'); }
30
+ watch([actorId, overrides], () => { try {
31
+ localStorage.setItem('i3-prototype-antdv-v010-demo-session', JSON.stringify({ actorId: actorId.value, overrides: overrides.value }));
32
+ }
33
+ catch { /* This is a local scenario selector, not an authorization service. */ } }, { deep: true });
34
+ function writeCheck() {
35
+ const result = nextWrite.value;
36
+ nextWrite.value = 'success';
37
+ if (result === 'failure')
38
+ throw new Error('保存失败(模拟服务不可用),输入已保留,请重试。');
39
+ if (result === 'conflict')
40
+ throw new Error('记录已被其他人更新(模拟版本冲突),请关闭后重新打开,核对最新内容再提交。');
41
+ }
42
+ function reset() { actorId.value = 'chen'; overrides.value = {}; policyVersion.value++; state.value = 'active'; nextWrite.value = 'success'; publishResult.value = 'success'; confirmResult.value = 'success'; }
43
+ return { actorId, actor, state, key, nextWrite, publishResult, confirmResult, can, readable, require, writeCheck, reset };
44
+ });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/shell/ConfirmationDialog.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <template data-component="Modal" data-bind-open="(!!confirmation)" data-bind-title="(confirmation?.title)" data-bind-width="(480)" data-bind-mask="({ closable: false })" data-bind-closable="(false)" data-on-cancel="(cancel)"><p>{{ (confirmation?.content) }}</p><template data-slot="footer"><template data-component="Space"><template data-component="Button" data-bind-disabled="(busy)" data-on-click="(cancel)">{{ (confirmation?.cancelText) }}</template><template data-component="Button" type="primary" data-bind-danger="(confirmation?.okButtonProps?.danger)" data-bind-loading="(busy)" data-on-click="(accept)">{{ (confirmation?.okText) }}</template></template></template></template>
@@ -0,0 +1,25 @@
1
+ import { ref } from '../../runtime/state.js';
2
+ import { Modal, Button, Space } from "../../runtime/widgets.js";
3
+ import { confirmation } from "./confirmation.js";
4
+ import { createComponent } from '../../runtime/dom.js';
5
+ export default createComponent({ name: 'ConfirmationDialog', propKeys: [], template: new URL('./ConfirmationDialog.html', import.meta.url).href, setup(__props, __emit) {
6
+ const busy = ref(false);
7
+ function cancel() { if (busy.value)
8
+ return; const current = confirmation.value; confirmation.value = undefined; current?.onCancel?.(); }
9
+ async function accept() {
10
+ const current = confirmation.value;
11
+ if (!current || busy.value)
12
+ return;
13
+ busy.value = true;
14
+ try {
15
+ await current.onOk?.();
16
+ if (confirmation.value === current)
17
+ confirmation.value = undefined;
18
+ }
19
+ catch { /* A rejected action leaves the dialog open; its caller shows the error. */ }
20
+ finally {
21
+ busy.value = false;
22
+ }
23
+ }
24
+ return { ref, Modal, Button, Space, confirmation, busy, cancel, accept };
25
+ } });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/shell/ConsoleShell.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <div class="console-shell" data-bind-class="({ collapsed, 'mobile-open': mobileOpen })" data-on-keydown.esc="(closeNav)"><a class="skip-link" href="#main-content" data-on-click.prevent="(focusMain)">跳到页面内容</a><button data-if="(mobileOpen)" class="nav-scrim" aria-label="关闭导航" data-on-click="(mobileOpen = false)"></button><aside class="sidebar" aria-label="平台导航" data-bind-inert="(navHidden)" data-bind-aria-hidden="(navHidden)"><template data-component="RouterLink" to="/workbench" class="brand" data-on-click="(mobileOpen = false)"><strong>EASEL</strong><span>企业级 AI 软件工程平台</span></template><nav class="navigation"><template data-each="item in (visibleNavigation)" data-bind-key="(item.id)"><button data-if="(item.children)" class="nav-row" data-bind-class="({ 'nav-parent-active': item.children.some(c =&gt; c.id === current) })" data-bind-aria-expanded="(expanded[item.id])" data-on-click="(expanded[item.id] = !expanded[item.id])"><template data-component="$dynamic" data-bind-is="(item.icon)"></template><span>{{ (item.label) }}</span><template data-component="UpOutlined" data-if="(expanded[item.id])" class="nav-arrow"></template><template data-component="DownOutlined" data-else="" class="nav-arrow"></template></button><template data-component="RouterLink" data-else="" data-bind-to="(item.id === 'workbench' ? '/workbench' : item.id === 'projects' ? '/pbcs' : item.id === 'tasks' ? '/tasks' : item.id === 'operations' ? '/operations' : item.id === 'release' ? '/releases' : item.id === 'quality' ? '/reviews' : item.id === 'requirements' ? '/intents' : `/module/${item.id}`)" class="nav-row" data-bind-class="({ selected: current === item.id })" data-bind-aria-current="(current === item.id ? 'page' : undefined)" data-on-click="(mobileOpen = false)"><template data-component="$dynamic" data-bind-is="(item.icon)"></template><span>{{ (item.label) }}</span><template data-component="RightOutlined" data-if="(item.id !== 'workbench')" class="nav-arrow"></template></template><template data-if="(item.children &amp;&amp; expanded[item.id])"><template data-component="RouterLink" data-each="child in (item.children)" data-bind-key="(child.id)" data-bind-to="(child.id.startsWith('permission-') ? '/permissions/' + child.id.replace('permission-', '') : child.id === 'workflows' ? '/workflows' : child.id === 'agents' ? '/agents' : child.id === 'models' ? '/models' : `/module/${child.id}`)" class="nav-row nav-child" data-bind-class="({ selected: current === child.id })" data-bind-aria-current="(current === child.id ? 'page' : undefined)" data-on-click="(mobileOpen = false)">{{ (child.label) }}</template></template></template></nav><div class="sidebar-footer"><button class="text-button guide-button" data-on-click="(guide = true)"><template data-component="InfoCircleOutlined"></template> 原型说明</button><span>v0.14</span></div></aside><div class="workspace" data-bind-inert="(narrow &amp;&amp; mobileOpen)"><header class="topbar"><template data-component="Button" type="text" data-nav-toggle="" data-bind-aria-label="(navHidden ? '展开导航' : '收起导航')" data-bind-aria-expanded="(!navHidden)" data-on-click="(toggleMenu)"><template data-component="MenuUnfoldOutlined" data-if="(collapsed)"></template><template data-component="MenuFoldOutlined" data-else=""></template></template><div class="breadcrumb"><span data-if="(isAi)">AI 编排 <span class="crumb-slash">/</span></span><span>{{ (label) }}</span><span data-if="(subLabel)"><span class="crumb-slash">/</span>{{ (subLabel) }}</span></div><div class="topbar-right"><template data-component="Button" type="text" class="demo-settings-button" data-on-click="(guide = true)">演示设置</template><span class="demo-label">{{ (tenantLabel(session.actor.tenantId)) }} · 演示</span><template data-component="Dropdown" data-bind-menu="(roleMenu)" data-bind-trigger="(['click'])"><button class="profile-button" aria-label="切换演示身份"><template data-component="Avatar" data-bind-size="(30)">{{ (session.actor.name.slice(0, 1)) }}</template><span>{{ (session.actor.name) }} · {{ (session.actor.label) }}</span><template data-component="DownOutlined"></template></button></template></div></header><main id="main-content" tabindex="-1"><div data-show="(canView)" data-bind-inert="(!canView)" data-bind-key="(session.key)"><slot></slot></div><template data-component="Result" data-if="(!canView &amp;&amp; session.state === 'active')" status="403" title="没有业务访问权限" sub-title="已登录不代表拥有业务权限。请联系业务管理员分配相应权限;账号和登录设置由 MaxKey 管理。"><template data-slot="extra"><template data-component="Button" data-on-click="(guide = true)">查看权限演示</template></template></template></main><footer class="page-footer"><template data-component="InfoCircleOutlined"></template> 当前为演示环境,配置与测试仅用于交互评审。<button class="text-button" data-on-click="(guide = true)">评审指南</button></footer></div><template data-component="PrototypeGuide" data-bind-open="(guide)" data-on-close="(guide = false)"></template><template data-component="ConfirmationDialog"></template><template data-component="SessionDialog"></template></div>
@@ -0,0 +1,53 @@
1
+ import { computed, ref, onMounted, onBeforeUnmount, nextTick } from '../../runtime/state.js';
2
+ import { useRoute } from "../../runtime/router.js";
3
+ import { Button, Avatar, Dropdown, Result } from "../../runtime/widgets.js";
4
+ import { MenuFoldOutlined, MenuUnfoldOutlined, DownOutlined, UpOutlined, RightOutlined, InfoCircleOutlined } from "../../runtime/icons.js";
5
+ import { navigation, moduleLabel } from "./navigation.js";
6
+ import PrototypeGuide from "./PrototypeGuide.js";
7
+ import ConfirmationDialog from "./ConfirmationDialog.js";
8
+ import { useSession } from "../shared/session.js";
9
+ import { actors, tenantLabel } from "../shared/policy.js";
10
+ import SessionDialog from "./SessionDialog.js";
11
+ import { createComponent } from '../../runtime/dom.js';
12
+ export default createComponent({ name: 'ConsoleShell', propKeys: [], template: new URL('./ConsoleShell.html', import.meta.url).href, setup(__props, __emit) {
13
+ const route = useRoute();
14
+ const session = useSession();
15
+ const visibleNavigation = computed(() => navigation.filter(n => (n.id !== 'operations' || session.can('operation:view')) && (!['quality', 'release'].includes(n.id) || (session.can('task:view') && session.can('artifact:view'))) && (n.id !== 'projects' || session.can('pbc:view')) && (n.id !== 'tasks' || session.can('task:view')) && (n.id !== 'requirements' || session.can('intent:view')) && (n.id !== 'permissions' || session.can('permission:view') || session.can('permission:audit'))).map(n => n.children ? ({ ...n, children: n.children.filter(c => (c.id !== 'models' || session.can('model:view')) && (c.id !== 'agents' || session.can('agent:view')) && (c.id !== 'workflows' || session.can('workflow:view')) && (c.id !== 'permission-records' || session.can('permission:audit')) && (!['permission-roles', 'permission-members'].includes(c.id) || session.can('permission:view'))) }) : n));
16
+ const canView = computed(() => route.path === '/workbench' ? session.state === 'active' : (route.path.startsWith('/reviews') || route.path.startsWith('/releases')) ? (session.can('task:view') && session.can('artifact:view')) : session.can(route.path.startsWith('/operations') ? 'operation:view' : route.path.startsWith('/pbcs') ? 'pbc:view' : route.path.startsWith('/tasks') ? 'task:view' : route.path.startsWith('/workflows') ? 'workflow:view' : route.path.startsWith('/agents') ? 'agent:view' : route.path.startsWith('/permissions') ? (route.path.endsWith('/records') ? 'permission:audit' : 'permission:view') : route.path.startsWith('/models') ? 'model:view' : route.path.endsWith('/pbc') ? 'pbc:view' : route.path.includes('/spec') ? 'spec:view' : 'intent:view'));
17
+ const expanded = ref({ ai: true, permissions: true });
18
+ const collapsed = ref(false), mobileOpen = ref(false), guide = ref(false);
19
+ const narrow = ref(window.innerWidth < 900);
20
+ const navHidden = computed(() => narrow.value ? !mobileOpen.value : collapsed.value);
21
+ function onResize() { narrow.value = window.innerWidth < 900; if (!narrow.value)
22
+ mobileOpen.value = false; }
23
+ function onKeydown(event) { if (event.key === 'Escape')
24
+ closeNav(); }
25
+ onMounted(() => { window.addEventListener('resize', onResize); window.addEventListener('keydown', onKeydown); });
26
+ onBeforeUnmount(() => { window.removeEventListener('resize', onResize); window.removeEventListener('keydown', onKeydown); });
27
+ function focusMain() { document.getElementById('main-content')?.focus(); }
28
+ function closeNav() { if (mobileOpen.value) {
29
+ mobileOpen.value = false;
30
+ nextTick(() => document.querySelector('[data-nav-toggle]')?.focus());
31
+ } }
32
+ const isIntent = computed(() => route.path.startsWith('/intents'));
33
+ const current = computed(() => route.path === '/workbench' ? 'workbench' : route.path.startsWith('/operations') ? 'operations' : route.path.startsWith('/releases') ? 'release' : route.path.startsWith('/reviews') ? 'quality' : route.path.startsWith('/pbcs') ? 'projects' : route.path.startsWith('/tasks') ? 'tasks' : route.path.startsWith('/workflows') ? 'workflows' : route.path.startsWith('/agents') ? 'agents' : route.path.startsWith('/permissions/') ? 'permission-' + route.path.split('/').at(-1) : isIntent.value ? 'requirements' : route.path === '/models' ? 'models' : String(route.params.id));
34
+ const isAi = computed(() => navigation.find(n => n.id === 'ai').children.some(n => n.id === current.value));
35
+ const label = computed(() => moduleLabel(current.value));
36
+ const subLabel = computed(() => route.path.endsWith('/pbc') ? 'PBC 归属' : route.path.includes('/spec') ? '需求规格' : route.path === '/intents/new' ? '发起需求' : route.path.endsWith('/workspace') ? (route.path.startsWith('/pbcs/') ? '交付工作区' : '澄清工作区') : isIntent.value && route.params.id ? '意图详情' : '');
37
+ function toggleMenu() {
38
+ if (!narrow.value) {
39
+ collapsed.value = !collapsed.value;
40
+ return;
41
+ }
42
+ if (mobileOpen.value)
43
+ closeNav();
44
+ else {
45
+ mobileOpen.value = true;
46
+ nextTick(() => document.querySelector('.sidebar [aria-current="page"]')?.focus());
47
+ }
48
+ }
49
+ const roleMenu = computed(() => ({ items: [
50
+ ...actors.map(a => ({ key: a.id, label: a.name + ' · ' + a.label })),
51
+ ], onClick: ({ key }) => { session.actorId = key; } }));
52
+ return { computed, ref, onMounted, onBeforeUnmount, nextTick, useRoute, Button, Avatar, Dropdown, Result, MenuFoldOutlined, MenuUnfoldOutlined, DownOutlined, UpOutlined, RightOutlined, InfoCircleOutlined, navigation, moduleLabel, PrototypeGuide, ConfirmationDialog, useSession, actors, tenantLabel, SessionDialog, route, session, visibleNavigation, canView, expanded, collapsed, mobileOpen, guide, narrow, navHidden, onResize, onKeydown, focusMain, closeNav, isIntent, current, isAi, label, subLabel, toggleMenu, roleMenu };
53
+ } });
@@ -0,0 +1,10 @@
1
+ <!-- 来源:src/shell/PrototypeGuide.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <template data-component="Drawer" data-bind-open="(open)" title="原型说明与评审指南" data-bind-size="(640)" data-on-close="(emit('close'))"><template data-component="Alert" type="info" show-icon="" title="v0.14 · 运行验收与异常反馈" description="运行验收、异常调查分诊与修复跟踪已接回发布、工作台、任务和 PBC。身份、授权、观测与工程交付均为本地模拟,真实服务尚未接入。"></template><section class="drawer-section"><h2>运行验收与异常反馈 · v0.14</h2><p>运行记录 → 业务证据与人工验收 → 异常调查/分诊 → 关联或创建修复需求 → 新发布版本的回归与验收 → 关闭原异常。</p><p>在运行管理页底部载入独立模拟样例;新功能权限通过权限管理配置。旧版数据和端口保留,新版4187的数据按浏览器独立保存。</p><template data-component="Button" data-on-click="router.push('/operations');
3
+ emit('close');">打开运行管理</template></section><section class="drawer-section"><h2>发布准备与人工放行</h2><p>创建发布草稿 → 核对固定版本证据 → 人工授权 → 部署 → 首次灰度 → 观测与全量;失败时有限重试、暂停或恢复。所有执行与材料均为模拟。</p><p>历史任务保留材料缺失;独立样例提供完整模拟证据。既有用户新增发布权限需在权限管理配置,可限定目标环境。</p><template data-component="Button" data-on-click="router.push('/releases');
4
+ emit('close');">打开门禁与发布</template><h3>发布列表状态</h3><template data-component="RadioGroup" data-model-value="(releases.scene)" data-bind-options="(listOutcomes)"></template><h3>下一次发布提交结果</h3><template data-component="RadioGroup" data-model-value="(releases.response)" data-bind-options="(outcomes)"></template></section><section class="drawer-section"><h2>质量与人工确认走读</h2><ol><li>打开评审列表,按PBC和状态筛选;查看更多、显示字段与审批记录删除说明。</li><li>进入有问题的质量评审,查看固定版本,再修改设计或填写重新规划意见。</li><li>提交后进入新设计评审,接收模拟复核结果并确认;回到任务重新实现、检查、独立验证。</li><li>回到工作台查看同一任务待办更新;打开历史评审核对旧报告与处理人。</li></ol><p>既有用户的授权保持。新增“修改评审设计”和“重新规划交付”由权限管理员在独立权限菜单配置;新动作未授权时仍可查看原因。</p><template data-component="Button" type="primary" data-on-click="router.push('/reviews');
5
+ emit('close');">打开质量与评审</template><h3>评审列表状态</h3><template data-component="RadioGroup" data-model-value="(reviews.scene)" data-bind-options="(listOutcomes)"></template><h3>下一次评审提交结果</h3><template data-component="RadioGroup" data-model-value="(session.confirmResult)" data-bind-options="(outcomes)"></template></section><section class="drawer-section"><h2>工作台首版走读</h2><ol><li>切换“与我相关”和“全部授权范围”,核对待办、PBC及交付数量。</li><li>从待办进入规格或任务处理,返回首页查看状态变化。</li><li>新建PBC可查看所有可见需求的前置原因;已归属记录进入原结果。</li><li>查看只读公告与规范提醒;质量评审已接入,发布待办已接入,运行验收与异常待办已接入。</li></ol><p>个人关系按创建人、负责人和可见关联记录识别;演示林晓的两种授权配置属于同一人员,权限仍单独计算。本版使用 4187 独立预览,其他端口保留各自版本与数据。</p><h2>PBC 与项目走读</h2><ol class="review-steps"><li>从 PBC 列表编辑资料,查看基础字段、更多与批量删除预检。</li><li>进入服务管理,新增并修改服务方案,核对已建工程的保护。</li><li>打开交付工作区,从需求规格进入任务与版本产物。</li><li>新建 PBC 选择已确认规格,沿用三步创建向导及失败续接。</li></ol><p class="muted">本版以 PBC 聚合交付工作区;独立项目实体尚待确认。更名保留历史和原型兼容的资源授权引用;正式接口按稳定ID治理。</p><template data-component="Button" type="primary" data-on-click="router.push('/pbcs');
6
+ emit('close');">打开 PBC 管理</template></section><section class="drawer-section"><h2>交付任务走读</h2><ol class="review-steps"><li>发起交付,核对已确认规格、PBC、流程与资源版本。</li><li>打开任务,用阶段详情中的演示控件推进;确认原型后查看产物。</li><li>模拟失败,尝试返工、暂停与人工接管,再刷新查看保留的状态。</li></ol><p class="muted">预置确认与产物均为样例;可继续查看发布、运行验收和修复反馈。</p><template data-component="Button" data-on-click="router.push('/tasks');
7
+ emit('close');">打开交付任务</template><h3>任务列表状态</h3><template data-component="RadioGroup" data-model-value="(tasks.scene)" data-bind-options="(listOutcomes)"></template></section><section class="drawer-section"><h2>研发交付流程走读</h2><ol class="review-steps"><li>查看标准交付模板,选择节点核对 Agent 和产物。</li><li>编辑草稿并修改节点,检查流程后提交审核。</li><li>切换到有发布权限的王睿,审核配置;再核对版本差异与固定版本选择。</li></ol><p class="muted">本地原型不运行 CI、Agent 或 Dapr。预置质量评审 Agent 在本版示例中已启用并取得模型授权。独立审核为待评审交互提案。</p><template data-component="Button" type="primary" data-bind-disabled="(!session.can('workflow:view'))" data-on-click="router.push('/workflows');
8
+ emit('close');">打开流程模板</template><h3>流程列表状态</h3><template data-component="RadioGroup" data-model-value="(workflows.scene)" data-bind-options="(listOutcomes)"></template></section><section class="drawer-section"><h2>Agent 原型走读</h2><ol class="review-steps"><li>在 Agent 注册表查看四要素配置、所属项目与基础字段。</li><li>注册一个 Agent 并保存草稿,检查引用与模型使用授权;通过模型管理补齐授权后启用。</li><li>停用后编辑,再核对批量删除、引用保护及操作记录。</li></ol><template data-component="Button" type="primary" data-bind-disabled="(!session.can('agent:view'))" data-on-click="router.push('/agents');
9
+ emit('close');">打开 Agent 注册表</template><p class="muted">提示词、技能、工具与模板为示例资源,本包没有连接真实 Agent 运行时。</p><h3>Agent 列表状态</h3><template data-component="RadioGroup" data-model-value="(agents.scene)" data-bind-options="(listOutcomes)"></template></section><section class="drawer-section"><h2>权限管理走读</h2><ol class="review-steps"><li>使用陈敏进入独立的「权限管理」,新增角色并配置功能和资源范围。</li><li>在成员授权中,将角色关联给周晨;查看成员的有效权限与来源。</li><li>切换到周晨,进入原有意图/规格页面核对权限;切回陈敏撤权并查看授权记录。</li></ol><template data-component="Button" type="primary" data-bind-disabled="(!session.can('permission:view'))" data-on-click="router.push('/permissions/roles');
10
+ emit('close');">打开权限管理</template><p class="muted">以下身份切换和故障选项仅供原型评审,正式产品不包含这些控件。</p></section><section class="drawer-section"><h2>身份与权限</h2><template data-component="Select" data-model-value="(session.actorId)" aria-label="评审身份" class="full-width" data-bind-options="(actors.map(a =&gt; ({ label: a.name + ' · ' + a.label, value: a.id })))"></template><p class="muted">预置角色只是演示配置;动作与范围决定功能,角色名称不参与授权判断。</p><template data-component="Space" wrap=""><template data-component="Button" data-on-click="(session.state = 'expired')">模拟登录失效</template><template data-component="Button" data-on-click="(session.state = 'anonymous')">模拟未登录</template></template></section><section class="drawer-section"><h2>规格生成与资源</h2><template data-component="RadioGroup" data-model-value="(specs.generation)" data-bind-options="(outcomes.slice(0, 2))"></template><p><template data-component="Switch" data-model-checked="(specs.resource)" aria-label="规格生成资源可用"></template> 规格生成资源可用(模拟)</p><h3>规格确认结果</h3><template data-component="RadioGroup" data-model-value="(specs.confirmation)" data-bind-options="(outcomes)"></template></section><section class="drawer-section"><h2>下一次 PBC 关联 / 创建</h2><template data-component="RadioGroup" data-model-value="(pbcs.mode)" data-bind-options="(outcomes)"></template><p class="muted">创建失败发生在第 3 步;未知结果发生在第 1 步。核实 / 续接沿用原操作编号,已完成步骤保留。</p><h3>PBC 目录</h3><template data-component="RadioGroup" data-model-value="(pbcs.scene)" data-bind-options="(listOutcomes)"></template></section><section class="drawer-section"><h2>权限管理列表</h2><template data-component="RadioGroup" data-model-value="(authority.scene)" data-bind-options="(listOutcomes)"></template></section><section class="drawer-section"><h2>下一次保存 / 提交</h2><template data-component="RadioGroup" data-model-value="(session.nextWrite)" data-bind-options="([{ label: '成功', value: 'success' }, { label: '服务失败', value: 'failure' }, { label: '版本冲突', value: 'conflict' }])"></template><p class="muted">失败或冲突仅作用一次,便于继续重试。</p></section><section class="drawer-section"><h2>原有模型 / 意图列表状态</h2><template data-component="RadioGroup" data-model-value="(scene)" data-bind-options="(listOutcomes)"></template><h3>模型发布结果</h3><template data-component="RadioGroup" data-model-value="(session.publishResult)" data-bind-options="(outcomes.slice(0, 2))"></template><h3>意图确认结果</h3><template data-component="RadioGroup" data-model-value="(session.confirmResult)" data-bind-options="(outcomes)"></template><h3>意图整理结果</h3><template data-component="RadioGroup" data-model-value="(intents.resultMode)" data-bind-options="(outcomes.slice(0, 2))"></template></section><template data-slot="footer"><template data-component="Space"><template data-component="Button" danger="" data-on-click="(reset)">重置演示数据</template><template data-component="Button" type="primary" data-on-click="(emit('close'))">开始体验</template></template></template></template>
@@ -0,0 +1,30 @@
1
+ import { confirmAction } from "./confirmation.js";
2
+ import { computed, ref } from '../../runtime/state.js';
3
+ import { useRoute, useRouter } from "../../runtime/router.js";
4
+ import { Alert, Button, Drawer, RadioGroup, Space, Select, Switch } from "../../runtime/widgets.js";
5
+ import { useModels } from "../models/store.js";
6
+ import { useIntents } from "../intents/store.js";
7
+ import { useSpecs } from "../specs/store.js";
8
+ import { usePbcs } from "../pbc/store.js";
9
+ import { useSession } from "../shared/session.js";
10
+ import { actors } from "../shared/policy.js";
11
+ import { useAuthority } from "../permissions/store.js";
12
+ import { useReleases } from "../releases/store.js";
13
+ import { useReviews } from "../reviews/store.js";
14
+ import { useTasks } from "../tasks/store.js";
15
+ import { useWorkflows } from "../workflows/store.js";
16
+ import { useAgents } from "../agents/store.js";
17
+ import { createComponent } from '../../runtime/dom.js';
18
+ export default createComponent({ name: 'PrototypeGuide', propKeys: ["open"], template: new URL('./PrototypeGuide.html', import.meta.url).href, setup(__props, __emit) {
19
+ __props;
20
+ const emit = __emit, route = useRoute(), router = useRouter(), models = useModels(), intents = useIntents(), specs = useSpecs(), pbcs = usePbcs(), session = useSession(), authority = useAuthority(), agents = useAgents(), workflows = useWorkflows(), tasks = useTasks(), reviews = useReviews(), releases = useReleases();
21
+ const isIntent = computed(() => route.path.startsWith('/intents'));
22
+ const scene = computed({ get: () => isIntent.value ? intents.scene : models.scene, set: value => { if (isIntent.value)
23
+ intents.scene = value;
24
+ else
25
+ models.scene = value; } });
26
+ const outcomes = [{ label: '成功', value: 'success' }, { label: '失败', value: 'failure' }, { label: '结果待核实', value: 'unknown' }];
27
+ const listOutcomes = [{ label: '正常', value: 'normal' }, { label: '空列表', value: 'empty' }, { label: '加载失败', value: 'error' }];
28
+ function reset() { confirmAction({ title: '重置 v0.14 演示数据?', content: '恢复当前 HTML 原型地址的模型、意图、规格、PBC、权限、Agent、流程、任务、发布与运行演示记录。请先保留需要的内容;其他端口的历史版本数据不受影响。', okText: '确认重置', cancelText: '取消', onOk: () => { authority.reset(); session.reset(); models.reset(); intents.reset(); specs.reset(); pbcs.reset(); agents.reset(); workflows.reset(); tasks.reset(); emit('close'); router.push('/workbench'); } }); }
29
+ return { confirmAction, computed, ref, useRoute, useRouter, Alert, Button, Drawer, RadioGroup, Space, Select, Switch, useModels, useIntents, useSpecs, usePbcs, useSession, actors, useAuthority, useReleases, useReviews, useTasks, useWorkflows, useAgents, emit, route, router, models, intents, specs, pbcs, session, authority, agents, workflows, tasks, reviews, releases, isIntent, scene, outcomes, listOutcomes, reset };
30
+ } });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/shell/ScopePage.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <div class="page-heading"><div><h1>{{ (label) }}</h1><p>Console 导航结构预览</p></div></div><section class="panel scope-panel"><template data-component="Empty" data-bind-description="(`${label}将在后续逐功能设计中展开`)"><p class="muted">当前可体验意图发起与澄清,以及模型管理。</p><template data-component="Button" type="primary" data-on-click="(router.push('/intents'))">进入意图池</template></template></section>
@@ -0,0 +1,10 @@
1
+ import { computed } from '../../runtime/state.js';
2
+ import { useRoute, useRouter } from "../../runtime/router.js";
3
+ import { Empty, Button } from "../../runtime/widgets.js";
4
+ import { moduleLabel } from "./navigation.js";
5
+ import { createComponent } from '../../runtime/dom.js';
6
+ export default createComponent({ name: 'ScopePage', propKeys: [], template: new URL('./ScopePage.html', import.meta.url).href, setup(__props, __emit) {
7
+ const route = useRoute(), router = useRouter();
8
+ const label = computed(() => moduleLabel(String(route.params.id)));
9
+ return { computed, useRoute, useRouter, Empty, Button, moduleLabel, route, router, label };
10
+ } });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/shell/SessionDialog.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <template data-component="Modal" data-bind-open="(session.state !== 'active')" data-bind-z-index="(4000)" data-bind-title="(redirected ? 'MaxKey 统一认证 · 演示' : session.state === 'expired' ? '登录状态已失效' : '请先登录')" data-bind-closable="(false)" data-bind-keyboard="(false)" data-bind-mask="({ closable: false })"><p>{{ (redirected ? '实际应用会跳转 MaxKey 完成认证。这里仅模拟登录结果,不收集密码或生成令牌。' : '继续操作前需要通过统一认证。当前页面的未提交输入暂时保留,重新登录后可核对并继续。') }}</p><template data-component="Alert" data-if="(redirected)" type="info" data-bind-title="('模拟以 ' + session.actor.name + ' 登录')"></template><template data-slot="footer"><template data-component="Button" data-if="(!redirected)" type="primary" data-on-click="(redirected = true)">前往 MaxKey 登录</template><template data-component="Button" data-else="" type="primary" data-on-click="(session.state = 'active')">模拟登录成功并返回</template></template></template>
@@ -0,0 +1,9 @@
1
+ import { ref, watch } from '../../runtime/state.js';
2
+ import { Modal, Button, Alert } from "../../runtime/widgets.js";
3
+ import { useSession } from "../shared/session.js";
4
+ import { createComponent } from '../../runtime/dom.js';
5
+ export default createComponent({ name: 'SessionDialog', propKeys: [], template: new URL('./SessionDialog.html', import.meta.url).href, setup(__props, __emit) {
6
+ const session = useSession(), redirected = ref(false);
7
+ watch(() => session.state, () => { redirected.value = false; });
8
+ return { ref, watch, Modal, Button, Alert, useSession, session, redirected };
9
+ } });
@@ -0,0 +1,3 @@
1
+ import { shallowRef } from '../../runtime/state.js';
2
+ export const confirmation = shallowRef();
3
+ export function confirmAction(options) { confirmation.value = options; }
@@ -0,0 +1,19 @@
1
+ import { HomeOutlined, ProjectOutlined, CommentOutlined, AppstoreOutlined, SafetyCertificateOutlined, RocketOutlined, FundProjectionScreenOutlined, AuditOutlined, TeamOutlined, SettingOutlined } from "../../runtime/icons.js";
2
+ export const navigation = [
3
+ { id: 'workbench', label: '工作台', icon: HomeOutlined },
4
+ { id: 'projects', label: 'PBC 与项目', icon: ProjectOutlined },
5
+ { id: 'requirements', label: '意图与需求', icon: CommentOutlined },
6
+ { id: 'ai', label: 'AI 编排', icon: AppstoreOutlined, children: [
7
+ { id: 'models', label: '模型管理' }, { id: 'agents', label: 'Agent 注册表' },
8
+ { id: 'workflows', label: '研发交付流程' }, { id: 'tools', label: '工具与 MCP' }, { id: 'knowledge', label: '知识库' },
9
+ ] },
10
+ { id: 'tasks', label: '交付任务', icon: ProjectOutlined },
11
+ { id: 'quality', label: '质量与评审', icon: SafetyCertificateOutlined },
12
+ { id: 'release', label: '门禁与发布', icon: RocketOutlined },
13
+ { id: 'operations', label: '运行管理', icon: FundProjectionScreenOutlined },
14
+ { id: 'standards', label: '规范与治理', icon: AuditOutlined },
15
+ { id: 'permissions', label: '权限管理', icon: SafetyCertificateOutlined, children: [{ id: 'permission-roles', label: '角色管理' }, { id: 'permission-members', label: '成员授权' }, { id: 'permission-records', label: '授权记录' }] },
16
+ { id: 'organization', label: '组织与审计', icon: TeamOutlined },
17
+ { id: 'settings', label: '系统设置', icon: SettingOutlined },
18
+ ];
19
+ export const moduleLabel = (id) => navigation.flatMap(n => [n, ...(n.children || [])]).find(n => n.id === id)?.label || '模型管理';
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/specs/SpecDocument.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <article class="spec-document" aria-label="需求规格正文"><section data-each="section in (sections)" data-bind-id="('spec-' + section.key)" data-bind-key="(section.key)"><h2>{{ (section.label) }}</h2><p>{{ (version.content[section.key]) }}</p></section><section><h2>决策登记</h2><div data-each="d in (version.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 &amp;&amp; d.reason ? 'green' : 'orange')">{{ (d.answer &amp;&amp; d.reason ? '已明确' : '待处理') }}</template></div><p>结论:{{ (d.answer || '尚未明确') }}<br>理由:{{ (d.reason || '待补充') }}</p><small class="muted">责任方:{{ (d.owner) }}<template data-if="(d.resolvedAt)"> · {{ (d.resolvedBy) }} · {{ (formatDate(d.resolvedAt)) }}</template></small></div></section></article>
@@ -0,0 +1,8 @@
1
+ import { Tag } from "../../runtime/widgets.js";
2
+ import { sections } from "./domain.js";
3
+ import { formatDate } from "../shared/policy.js";
4
+ import { createComponent } from '../../runtime/dom.js';
5
+ export default createComponent({ name: 'SpecDocument', propKeys: ["version"], template: new URL('./SpecDocument.html', import.meta.url).href, setup(__props, __emit) {
6
+ __props;
7
+ return { Tag, sections, formatDate };
8
+ } });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/specs/SpecEdit.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <template data-component="Drawer" data-bind-open="(true)" data-bind-title="(mode === 'content' ? '修改需求规格' : '处理未决事项')" data-bind-size="(860)" data-bind-mask="({ closable: false })" data-on-close="(close)"><template data-component="Alert" type="info" show-icon="" data-bind-title="('保存为规格 v' + (version.number + 1) + ',需重新确认')" description="原版本及其签署记录继续保留。请分别填写每项决策理由,以及表单底部必填的“本次修改原因”;前者解释决策,后者记录本次版本变化。" class="page-alert"></template><template data-component="Alert" data-if="(error)" type="error" show-icon="" data-bind-title="(error)" class="page-alert"></template><template data-if="(mode === 'decisions')"><fieldset data-each="(d,index) in (decisions)" data-bind-key="(d.id)" class="spec-decision-form" data-bind-disabled="(!editable)"><legend>{{ (index + 1) }}. {{ (d.question) }}</legend><p class="muted">责任方:{{ (d.owner) }}</p><template data-component="RadioGroup" data-model-value="(d.answer)" data-bind-aria-label="(d.question)" class="vertical-options" data-bind-options="(d.options.map(value =&gt; ({ label: value, value })))"></template><label data-bind-for="('reason-' + d.id)">决策理由</label><template data-component="Input.TextArea" data-bind-id="('reason-' + d.id)" data-model-value="(d.reason)" data-bind-rows="(2)" data-bind-maxlength="(1500)" placeholder="说明依据、影响与后续处理。"></template></fieldset></template><template data-component="ProForm" data-bind-form="(form)" name="spec-revision" layout="vertical" data-bind-disabled="(!editable)"></template><template data-slot="footer"><template data-component="Alert" data-if="(error)" type="error" show-icon="" data-bind-title="(error)" class="page-alert" role="alert"><template data-slot="action"><template data-component="Button" data-if="(error.startsWith('尚未保存'))" data-on-click="(locateInvalid)">定位缺项</template></template></template><div class="drawer-footer"><span class="muted">保存后保留版本与操作人</span><template data-component="Space"><template data-component="Button" data-on-click="(close)">取消</template><template data-component="Button" type="primary" data-bind-disabled="(!editable)" data-on-click="(save)">保存新版本</template></template></div></template></template>
@@ -0,0 +1,32 @@
1
+ import { computed, ref, nextTick } from '../../runtime/state.js';
2
+ import { Alert, Button, Drawer, Input, RadioGroup, Space } from "../../runtime/widgets.js";
3
+ import { ProForm, useForm } from "../../runtime/widgets.js";
4
+ import { clone, currentVersion, sections, specBusy } from "./domain.js";
5
+ import { useSpecs } from "./store.js";
6
+ import { useSession } from "../shared/session.js";
7
+ import { confirmAction } from "../shell/confirmation.js";
8
+ import { createComponent } from '../../runtime/dom.js';
9
+ export default createComponent({ name: 'SpecEdit', propKeys: ["spec", "mode"], template: new URL('./SpecEdit.html', import.meta.url).href, setup(__props, __emit) {
10
+ const props = __props, emit = __emit, store = useSpecs(), session = useSession();
11
+ const version = currentVersion(props.spec), expected = props.spec.recordVersion, error = ref(''), decisions = ref(clone(version.decisions));
12
+ const form = useForm({ ...clone(version.content), reason: '' });
13
+ form.fields.value = [...(props.mode === 'content' ? sections.map(s => ({ path: s.key, label: s.label, component: 'textarea', span: 24, autoSize: { minRows: 3, maxRows: 10 }, rules: [{ required: true, whitespace: true, message: '请填写' + s.label }] })) : []), { path: 'reason', label: '本次修改原因', component: 'textarea', span: 24, rows: 2, placeholder: '概括这次修改,例如:补充人工复核方案及验收资源,关闭未决事项。', rules: [{ required: true, whitespace: true, message: '请填写修改原因' }] }];
14
+ const editable = computed(() => session.can('spec:edit', props.spec.tenantId) && !specBusy(props.spec));
15
+ function close() { confirmAction({ title: '放弃本次未保存修改?', content: '已保存的规格与确认记录保留。', okText: '放弃修改', cancelText: '继续编辑', onOk: () => emit('close') }); }
16
+ async function locateInvalid() { await nextTick(); const el = document.querySelector('#spec-revision .ant-form-item-has-error textarea, #spec-revision .ant-form-item-has-error input') || document.getElementById('spec-revision_reason'); el?.scrollIntoView({ block: 'center', behavior: 'smooth' }); el?.focus({ preventScroll: true }); }
17
+ async function save() { error.value = ''; try {
18
+ await form.formRef.value?.validate();
19
+ }
20
+ catch {
21
+ error.value = '尚未保存:请补齐标红字段。每项决策理由之外,还需填写“本次修改原因”。输入已保留。';
22
+ await locateInvalid();
23
+ return;
24
+ } try {
25
+ store.revise(props.spec.intentId, form.formData, decisions.value, form.formData.reason, expected);
26
+ emit('close');
27
+ }
28
+ catch (e) {
29
+ error.value = e.message;
30
+ } }
31
+ return { computed, ref, nextTick, Alert, Button, Drawer, Input, RadioGroup, Space, ProForm, useForm, clone, currentVersion, sections, specBusy, useSpecs, useSession, confirmAction, props, emit, store, session, version, expected, error, decisions, form, editable, close, locateInvalid, save };
32
+ } });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/specs/SpecHeader.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <template data-component="Button" type="link" class="intent-back" data-on-click="(router.push('/intents/' + intent.id))">← 返回来源意图</template><div class="page-heading intent-heading"><div><h1>{{ (['需求规格工作区', '规格版本评审', 'PBC 归属'][step]) }}</h1><p class="muted">{{ (intent.title) }}</p><template data-component="Space" wrap=""><template data-component="Tag">{{ (intent.code) }}</template><template data-component="Tag" data-if="(version)" data-bind-color="(version.confirmedAt ? 'green' : 'blue')">规格 v{{ (version.number) }} · {{ (version.confirmedAt ? '已确认' : '待确认') }}</template><span class="muted">来源意图 v{{ (version?.source.version || intent.versions.at(-1)?.number) }}</span></template></div><template data-component="Space" wrap=""><slot></slot></template></div><template data-component="Steps" class="delivery-steps" data-bind-current="(step)" size="small" data-on-change="(navigate)" data-bind-items="([{ title: '生成与完善规格' }, { title: '核对版本并确认', disabled: !version }, { title: '关联或创建 PBC', disabled: !version?.confirmedAt || !session.can('pbc:view', intent.tenantId) }])"></template>
@@ -0,0 +1,15 @@
1
+ import { Button, Space, Steps, Tag } from "../../runtime/widgets.js";
2
+ import { useSession } from "../shared/session.js";
3
+ import { useRouter } from "../../runtime/router.js";
4
+ import { createComponent } from '../../runtime/dom.js';
5
+ export default createComponent({ name: 'SpecHeader', propKeys: ["intent", "version", "step"], template: new URL('./SpecHeader.html', import.meta.url).href, setup(__props, __emit) {
6
+ const props = __props;
7
+ const router = useRouter(), session = useSession();
8
+ function navigate(step) { const root = '/intents/' + props.intent.id; if (step === 0)
9
+ router.push(root + '/spec');
10
+ else if (step === 1 && props.version)
11
+ router.push(root + '/spec/review');
12
+ else if (step === 2 && props.version?.confirmedAt && session.can('pbc:view', props.intent.tenantId))
13
+ router.push(root + '/pbc'); }
14
+ return { Button, Space, Steps, Tag, useSession, useRouter, props, router, session, navigate };
15
+ } });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/specs/SpecHistory.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <template data-component="Drawer" data-bind-open="(true)" title="规格版本与操作记录" data-bind-size="(860)" data-on-close="(emit('close'))"><template data-component="Alert" type="info" show-icon="" title="版本与签署记录只读保存,不适用删除或批量删除。"></template><template data-component="Tabs" data-model-active-key="(tab)" data-bind-items="([{ key: 'versions', label: '历史版本' }, { key: 'events', label: '操作记录' }])"></template><template data-if="(tab === 'versions')"><template data-component="Select" data-model-value="(selected)" aria-label="历史规格版本" class="full-width" data-bind-options="(spec.versions.map(v =&gt; ({ label: '规格 v' + v.number + ' · ' + (v.confirmedAt ? '已确认' : '未确认'), value: v.number })))"></template><template data-if="(version)"><p>{{ (version.reason) }} · {{ (version.createdBy) }} · {{ (formatDate(version.createdAt)) }}</p><p data-if="(version.confirmedAt)" class="version-confirmed">{{ (version.confirmedBy) }} · {{ (formatDate(version.confirmedAt)) }} 确认此版本</p><p data-if="(version.resource)" class="muted">生成来源:{{ (version.resource.agent) }} v{{ (version.resource.agentVersion) }} · {{ (version.resource.name) }} v{{ (version.resource.version) }}</p><template data-component="SpecDocument" data-bind-version="(version)"></template></template></template><ol data-else="" class="intent-events"><li data-each="event in ([...spec.events].reverse())" data-bind-key="(event.id)"><strong>{{ (event.action) }} · v{{ (event.version) }}</strong><p>{{ (event.result) }}</p><small>{{ (event.actor) }} · {{ (formatDate(event.at)) }}</small></li></ol></template>
@@ -0,0 +1,11 @@
1
+ import { computed, ref } from '../../runtime/state.js';
2
+ import { Alert, Drawer, Select, Tabs } from "../../runtime/widgets.js";
3
+ import { currentVersion } from "./domain.js";
4
+ import { formatDate } from "../shared/policy.js";
5
+ import SpecDocument from "./SpecDocument.js";
6
+ import { createComponent } from '../../runtime/dom.js';
7
+ export default createComponent({ name: 'SpecHistory', propKeys: ["spec"], template: new URL('./SpecHistory.html', import.meta.url).href, setup(__props, __emit) {
8
+ const props = __props, emit = __emit, tab = ref('versions'), selected = ref(currentVersion(props.spec)?.number);
9
+ const version = computed(() => props.spec.versions.find(v => v.number === selected.value));
10
+ return { computed, ref, Alert, Drawer, Select, Tabs, currentVersion, formatDate, SpecDocument, props, emit, tab, selected, version };
11
+ } });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/specs/SpecReview.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <template data-component="Result" data-if="(!intent || !spec || !version || !viewed)" title="尚无可评审的规格或无权访问"><template data-slot="extra"><template data-component="Button" data-on-click="(router.push('/intents/' + id + '/spec'))">返回规格工作区</template></template></template><template data-else=""><template data-component="SpecHeader" data-bind-intent="(intent)" data-bind-version="(version)" data-bind-step="(1)"><template data-component="Button" data-on-click="(history = true)">版本与记录</template><template data-component="Button" data-on-click="(router.push('/intents/' + id + '/spec'))">返回工作区</template></template><template data-component="Alert" data-if="(error || spec.error || sourceError)" type="error" show-icon="" data-bind-title="(error || spec.error || sourceError)" class="page-alert"></template><template data-component="Alert" data-if="(spec.confirmation === 'pending')" type="info" show-icon="" title="正在提交确认,请稍候…" class="page-alert"></template><template data-component="Alert" data-if="(spec.confirmation === 'unknown')" type="warning" show-icon="" title="确认响应未收到,请核实原请求结果" data-bind-description="('请求 ' + spec.pending?.id + ';规格 v' + spec.pending?.version)" class="page-alert"><template data-slot="action"><template data-component="Button" data-on-click="(reconcile)">核实确认结果</template></template></template><template data-component="Alert" data-if="(version.confirmedAt)" type="success" show-icon="" data-bind-title="('规格 v' + version.number + ' 已确认')" data-bind-description="(version.confirmedBy + ' · ' + formatDate(version.confirmedAt) + ';确认基线只读保留,修改会形成新版本。')" class="page-alert"></template><template data-component="Alert" data-else-if="(pendingDecisions(version).length)" type="warning" show-icon="" data-bind-title="('还有 ' + pendingDecisions(version).length + ' 项决策需要结论和理由,暂不能确认。')" class="page-alert"><template data-slot="action"><template data-component="Button" data-on-click="(router.push('/intents/' + id + '/spec'))">返回处理</template></template></template><section class="panel delivery-main"><div class="review-toolbar"><div class="version-toolbar"><label for="review-after">查看版本</label><template data-component="Select" id="review-after" data-model-value="(after)" data-bind-options="(spec.versions.map(v =&gt; ({ label: '规格 v' + v.number, value: v.number })))"></template><template data-component="Button" data-bind-disabled="(spec.versions.length &lt; 2)" data-on-click="(compare = !compare)">{{ (compare ? '阅读完整规格' : '对比版本变化') }}</template><template data-if="(compare)"><label for="review-before">对比来源</label><template data-component="Select" id="review-before" data-model-value="(before)" data-bind-options="(spec.versions.filter(v =&gt; v.number !== after).map(v =&gt; ({ label: '规格 v' + v.number, value: v.number })))"></template></template></div><template data-component="Tag" data-if="(after !== version.number)">历史版本 · 只读</template></div><p class="muted">{{ (viewed.reason) }} · {{ (viewed.createdBy) }} · {{ (formatDate(viewed.createdAt)) }} · 来源意图 v{{ (viewed.source.version) }}</p><template data-if="(compare)"><div data-each="d in (diff)" data-bind-key="(d.key)" class="spec-diff"><div class="section-heading"><h2>{{ (d.label) }}</h2><template data-component="Tag" data-bind-color="(d.changed ? 'blue' : 'default')">{{ (d.changed ? '有变化' : '内容相同') }}</template></div><div class="diff-columns"><section><h3>原内容 · v{{ (before) }}</h3><p>{{ (d.before || '无内容') }}</p></section><section data-bind-class="({ 'diff-changed': d.changed })"><h3>当前查看 · v{{ (after) }}</h3><p>{{ (d.after) }}</p></section></div></div><section class="decision-row"><h2>决策变化</h2><div data-each="d in (viewed.decisions)" data-bind-key="(d.id)"><strong>{{ (d.question) }}</strong><p>原结论:{{ (previous?.decisions.find(x =&gt; x.id === d.id)?.answer || '未明确') }} → 新结论:{{ (d.answer || '未明确') }}</p><p>新理由:{{ (d.reason || '待补充') }}</p></div></section></template><template data-component="SpecDocument" data-else="" data-bind-version="(viewed)"></template></section><template data-component="Alert" data-if="(!version.confirmedAt &amp;&amp; blockReason)" type="info" show-icon="" data-bind-title="(blockReason)" class="page-alert"></template><template data-component="Alert" data-if="(version.confirmedAt &amp;&amp; !session.can('pbc:view', spec.tenantId))" type="info" show-icon="" title="规格已确认;继续归属需要当前租户的 PBC 查看及相应创建/关联权限。" class="page-alert"></template><section class="panel review-actions" aria-label="规格评审操作"><span class="muted">当前操作:规格 v{{ (version.number) }} · {{ (session.actor.name) }}</span><template data-component="Space" wrap=""><template data-component="Button" data-bind-disabled="(busy || !!sourceError || !session.can('spec:edit', spec.tenantId))" data-on-click="(edit = true)">修改规格</template><template data-component="Button" data-bind-disabled="(busy || !!sourceError || !session.can('spec:generate', spec.tenantId) || !session.can('spec:edit', spec.tenantId))" data-on-click="(replan = true)">重新规划</template><template data-component="Button" data-if="(!version.confirmedAt)" type="primary" data-bind-disabled="(blocked)" data-bind-loading="(spec.confirmation === 'pending')" data-on-click="(confirm)">确认规格 v{{ (version.number) }}</template><template data-component="Button" data-else="" type="primary" data-bind-disabled="(!!sourceError || !session.can('pbc:view', spec.tenantId))" data-on-click="(router.push('/intents/' + id + '/pbc'))">确定 PBC 归属</template></template></section><template data-component="SpecEdit" data-if="(edit)" data-bind-spec="(spec)" mode="content" data-on-close="(edit = false)"></template><template data-component="SpecHistory" data-if="(history)" data-bind-spec="(spec)" data-on-close="(history = false)"></template><template data-component="Modal" data-model-open="(replan)" title="重新规划规格" ok-text="生成新版本" cancel-text="取消" data-bind-confirm-loading="(spec.generating)" data-on-ok="(regenerate)"><p>重新读取已确认意图,保留旧版本与签署记录。</p><label for="spec-replan-reason">重新规划原因</label><template data-component="Input.TextArea" id="spec-replan-reason" data-model-value="(reason)" data-bind-rows="(4)"></template><template data-component="Alert" data-if="(error)" type="error" data-bind-title="(error)"></template></template></template>