@givolt/i3-composer-agent 3.0.0 → 3.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. package/.agents/plugins/marketplace.json +1 -1
  2. package/.claude/commands/i3-sop.md +3 -3
  3. package/.claude/commands/i3-ui-demo.md +21 -0
  4. package/.claude-plugin/marketplace.json +1 -1
  5. package/.claude-plugin/plugin.json +1 -1
  6. package/.codex-plugin/plugin.json +2 -2
  7. package/.gemini/commands/i3-sop.toml +3 -3
  8. package/.gemini/commands/i3-ui-demo.toml +21 -0
  9. package/README.md +29 -32
  10. package/bin/i3-composer-agent.cjs +38 -44
  11. package/bin/install.cjs +15 -3
  12. package/bin/native-layout.cjs +2 -1
  13. package/bin/native-migration.cjs +19 -2
  14. package/bin/retired-sop-fingerprints.json +213 -0
  15. package/bin/wizard.cjs +7 -18
  16. package/commands/i3-sop.toml +3 -3
  17. package/commands/i3-ui-demo.toml +21 -0
  18. package/docs/codebuddy-setup.md +20 -23
  19. package/docs/codex-setup.md +2 -2
  20. package/docs/comparison.md +131 -0
  21. package/docs/developer-onboarding.md +143 -0
  22. package/docs/opencode-setup.md +1 -1
  23. package/docs/other-hosts.md +2 -2
  24. package/docs/skill-anatomy.md +211 -0
  25. package/docs/workbuddy-setup.md +7 -10
  26. package/evals/cases/i3-enterprise-sop.json +70 -32
  27. package/evals/cases/i3-ui-demo.json +98 -0
  28. package/evals/fixtures/i3-ui-demo/asset-management.md +25 -0
  29. package/evals/zh-CN/cases/i3-enterprise-sop.json +77 -31
  30. package/evals/zh-CN/cases/i3-ui-demo.json +103 -0
  31. package/hooks/PROTOTYPE.md +16 -8
  32. package/hooks/i3-prototype.cjs +4 -10
  33. package/hooks/manage.cjs +30 -31
  34. package/package.json +20 -5
  35. package/plugin.json +1 -1
  36. package/scripts/ui-demo-dependencies-test.js +228 -0
  37. package/scripts/ui-demo-mcp-test.js +95 -0
  38. package/scripts/ui-demo-test.js +170 -0
  39. package/scripts/ui-prototype-execution-runtime-test.js +1 -1
  40. package/scripts/ui-prototype-native-test.js +25 -3
  41. package/skills/i3-enterprise-sop/SKILL.md +151 -91
  42. package/{references/engineering-skeleton-resources → skills/i3-enterprise-sop/references/engineering-skeleton}/directory-standard.md +29 -15
  43. package/skills/i3-enterprise-sop/references/handoff.py +348 -0
  44. package/skills/i3-enterprise-sop/references/read_text.py +60 -0
  45. package/{references/enterprise-sop-resources/technical-baseline/baselines//344/274/201/344/270/232/345/272/224/347/224/250-/346/212/200/346/234/257/350/247/204/347/272/246_v0.0.2.md → skills/i3-enterprise-sop/references/technical-baseline/baselines/enterprise-application-technical-baseline-v0-0-4.md} +136 -51
  46. package/skills/i3-enterprise-sop/references/technical-baseline/readme.md +23 -0
  47. package/{references/enterprise-sop-resources/technical-baseline/templates/TECHNICAL-BASELINE.md → skills/i3-enterprise-sop/references/technical-baseline/templates/technical-baseline.md} +1 -1
  48. package/{references/enterprise-sop-resources/ad/templates/AD.md → skills/i3-enterprise-sop/references/templates/ad.md} +34 -27
  49. package/{references/enterprise-sop-resources/brd/templates/BRD.md → skills/i3-enterprise-sop/references/templates/brd.md} +21 -10
  50. package/{references/enterprise-sop-resources/prd/templates/PRD.md → skills/i3-enterprise-sop/references/templates/prd.md} +57 -24
  51. package/{references/enterprise-sop-resources/testcase/templates/TestCase.md → skills/i3-enterprise-sop/references/templates/testcase.md} +32 -22
  52. package/skills/i3-ui-demo/SKILL.md +234 -0
  53. package/skills/i3-ui-demo/assets/antdv-build/package-lock.json +3363 -0
  54. package/skills/i3-ui-demo/assets/antdv-build/package.json +28 -0
  55. package/skills/i3-ui-demo/assets/design-source.json +11 -0
  56. package/skills/i3-ui-demo/assets/host-targets.json +739 -0
  57. package/skills/i3-ui-demo/assets/official-files.json +76 -0
  58. package/skills/i3-ui-demo/assets/starter/index.html +11 -0
  59. package/skills/i3-ui-demo/assets/starter/package-lock.json +2299 -0
  60. package/skills/i3-ui-demo/assets/starter/package.json +28 -0
  61. package/skills/i3-ui-demo/assets/starter/provenance.json +14 -0
  62. package/skills/i3-ui-demo/assets/starter/public/prototype-config.json +22 -0
  63. package/skills/i3-ui-demo/assets/starter/src/App.vue +64 -0
  64. package/skills/i3-ui-demo/assets/starter/src/PrototypeShell.vue +59 -0
  65. package/skills/i3-ui-demo/assets/starter/src/config.ts +23 -0
  66. package/skills/i3-ui-demo/assets/starter/src/domain/presentation.ts +30 -0
  67. package/skills/i3-ui-demo/assets/starter/src/domain/theme.ts +25 -0
  68. package/skills/i3-ui-demo/assets/starter/src/main.ts +18 -0
  69. package/skills/i3-ui-demo/assets/starter/src/style.css +26 -0
  70. package/skills/i3-ui-demo/assets/starter/tests/presentation.test.ts +23 -0
  71. package/skills/i3-ui-demo/assets/starter/tests/theme.test.ts +26 -0
  72. package/skills/i3-ui-demo/assets/starter/tsconfig.json +15 -0
  73. package/skills/i3-ui-demo/assets/starter/vite.config.ts +4 -0
  74. package/skills/i3-ui-demo/assets/templates/enterprise-admin/capability-definition.json +1395 -0
  75. package/skills/i3-ui-demo/assets/templates/enterprise-admin/component-inventory.json +707 -0
  76. package/skills/i3-ui-demo/assets/templates/enterprise-admin/design-system.md +26 -0
  77. package/skills/i3-ui-demo/assets/templates/enterprise-admin/generation.json +49 -0
  78. package/skills/i3-ui-demo/assets/templates/enterprise-admin/index.html +534 -0
  79. package/skills/i3-ui-demo/assets/templates/enterprise-admin/manifest.json +9 -0
  80. package/skills/i3-ui-demo/assets/templates/enterprise-admin/offline-build.json +265 -0
  81. package/skills/i3-ui-demo/assets/templates/enterprise-admin/offline.js +8888 -0
  82. package/skills/i3-ui-demo/assets/templates/enterprise-admin/origin.json +344 -0
  83. package/skills/i3-ui-demo/assets/templates/enterprise-admin/preset.json +928 -0
  84. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/app.js +22 -0
  85. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets/empty.svg +1 -0
  86. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets/reference-styles.json +1 -0
  87. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets/result-403.svg +1 -0
  88. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets/result-404.svg +1 -0
  89. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets-manifest.json +334 -0
  90. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/baseline.json +173 -0
  91. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/conversion.md +30 -0
  92. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/credits.md +17 -0
  93. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/design-tokens.json +881 -0
  94. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/index.html +28 -0
  95. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/licenses/@qin-ui-antdv-next-pro.txt +9 -0
  96. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/licenses/ant-design-icons.txt +22 -0
  97. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/licenses/antdv-next.txt +21 -0
  98. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/package.json +12 -0
  99. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/browser-routes.json +298 -0
  100. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/coverage.json +180 -0
  101. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/integrity.json +13 -0
  102. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/keyboard.json +11 -0
  103. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/responsive.json +125 -0
  104. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/review.md +51 -0
  105. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/rules.log +150 -0
  106. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-html.png +0 -0
  107. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-original.png +0 -0
  108. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-html.png +0 -0
  109. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-original.png +0 -0
  110. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/models-html.png +0 -0
  111. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/models-original.png +0 -0
  112. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-html.png +0 -0
  113. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-original.png +0 -0
  114. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/selection.json +9 -0
  115. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/visual-comparison.json +342 -0
  116. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/readme.md +73 -0
  117. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/reference.md +59 -0
  118. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/routes.json +178 -0
  119. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/controls.js +99 -0
  120. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/dialogs.js +54 -0
  121. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/dom.js +264 -0
  122. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/forms.js +47 -0
  123. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/icons.js +41 -0
  124. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/layout.js +47 -0
  125. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/router.js +63 -0
  126. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/state.js +90 -0
  127. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/table.js +41 -0
  128. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/widgets.js +8 -0
  129. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.html +3 -0
  130. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.js +36 -0
  131. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.html +2 -0
  132. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.js +51 -0
  133. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.html +3 -0
  134. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.js +48 -0
  135. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/CheckResults.html +2 -0
  136. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/CheckResults.js +6 -0
  137. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.html +2 -0
  138. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.js +13 -0
  139. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/data.js +24 -0
  140. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/domain.js +32 -0
  141. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/registry.js +25 -0
  142. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/store.js +85 -0
  143. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentClose.html +2 -0
  144. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentClose.js +17 -0
  145. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.html +2 -0
  146. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.js +66 -0
  147. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.html +3 -0
  148. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.js +38 -0
  149. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.html +2 -0
  150. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.js +66 -0
  151. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.html +2 -0
  152. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.js +5 -0
  153. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.html +2 -0
  154. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.js +12 -0
  155. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.html +2 -0
  156. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.js +11 -0
  157. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentList.html +2 -0
  158. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentList.js +116 -0
  159. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.html +2 -0
  160. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.js +32 -0
  161. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.html +2 -0
  162. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.js +49 -0
  163. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.html +2 -0
  164. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.js +10 -0
  165. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.html +2 -0
  166. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.js +77 -0
  167. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/data.js +60 -0
  168. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/domain.js +105 -0
  169. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/store.js +212 -0
  170. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/AuditPanel.html +2 -0
  171. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/AuditPanel.js +18 -0
  172. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelDetail.html +2 -0
  173. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelDetail.js +23 -0
  174. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelEditor.html +2 -0
  175. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelEditor.js +78 -0
  176. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelGrant.html +2 -0
  177. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelGrant.js +55 -0
  178. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelReferences.html +2 -0
  179. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelReferences.js +26 -0
  180. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelRelease.html +2 -0
  181. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelRelease.js +38 -0
  182. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelStatus.html +2 -0
  183. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelStatus.js +7 -0
  184. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelTable.html +2 -0
  185. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelTable.js +72 -0
  186. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelTester.html +2 -0
  187. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelTester.js +46 -0
  188. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelsPage.html +2 -0
  189. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelsPage.js +52 -0
  190. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/RowActions.html +2 -0
  191. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/RowActions.js +19 -0
  192. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/UsagePanel.html +2 -0
  193. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/UsagePanel.js +30 -0
  194. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/data.js +48 -0
  195. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/domain.js +39 -0
  196. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/store.js +129 -0
  197. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.html +4 -0
  198. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.js +21 -0
  199. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/IntentSource.html +2 -0
  200. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/IntentSource.js +8 -0
  201. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.html +2 -0
  202. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.js +37 -0
  203. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.html +2 -0
  204. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.js +10 -0
  205. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.html +2 -0
  206. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.js +37 -0
  207. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.html +2 -0
  208. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.js +49 -0
  209. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/RunDetail.html +4 -0
  210. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/RunDetail.js +22 -0
  211. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.html +2 -0
  212. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.js +9 -0
  213. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/commands.js +82 -0
  214. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/examples.js +47 -0
  215. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/model.js +61 -0
  216. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/repair.js +68 -0
  217. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/store.js +55 -0
  218. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/types.js +1 -0
  219. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/workbench.js +18 -0
  220. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.html +3 -0
  221. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.js +28 -0
  222. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.html +2 -0
  223. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.js +18 -0
  224. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.html +2 -0
  225. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.js +31 -0
  226. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.html +2 -0
  227. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.js +27 -0
  228. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.html +2 -0
  229. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.js +16 -0
  230. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.html +2 -0
  231. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.js +43 -0
  232. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.html +4 -0
  233. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.js +34 -0
  234. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.html +2 -0
  235. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.js +30 -0
  236. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.html +3 -0
  237. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.js +67 -0
  238. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.html +2 -0
  239. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.js +41 -0
  240. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.html +2 -0
  241. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.js +31 -0
  242. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.html +2 -0
  243. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.js +26 -0
  244. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.html +2 -0
  245. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.js +70 -0
  246. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/data.js +8 -0
  247. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/domain.js +62 -0
  248. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/management.js +36 -0
  249. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/managementStore.js +49 -0
  250. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/store.js +132 -0
  251. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/AdminList.html +2 -0
  252. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/AdminList.js +38 -0
  253. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.html +2 -0
  254. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.js +11 -0
  255. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.html +2 -0
  256. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.js +45 -0
  257. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.html +2 -0
  258. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.js +54 -0
  259. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.html +3 -0
  260. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.js +27 -0
  261. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.html +2 -0
  262. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.js +12 -0
  263. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.html +2 -0
  264. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.js +45 -0
  265. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.html +3 -0
  266. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.js +38 -0
  267. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/domain.js +61 -0
  268. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/state.js +51 -0
  269. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/store.js +116 -0
  270. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.html +2 -0
  271. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.js +45 -0
  272. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.html +4 -0
  273. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.js +30 -0
  274. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.html +2 -0
  275. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.js +67 -0
  276. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.html +2 -0
  277. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.js +5 -0
  278. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.html +4 -0
  279. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.js +60 -0
  280. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/commands.js +157 -0
  281. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/model.js +136 -0
  282. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/store.js +76 -0
  283. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.html +3 -0
  284. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.js +26 -0
  285. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.html +2 -0
  286. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.js +14 -0
  287. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.html +2 -0
  288. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.js +113 -0
  289. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.html +3 -0
  290. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.js +62 -0
  291. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/commands.js +97 -0
  292. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/model.js +147 -0
  293. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/store.js +13 -0
  294. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.html +2 -0
  295. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.js +9 -0
  296. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.html +2 -0
  297. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.js +8 -0
  298. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.html +2 -0
  299. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.js +37 -0
  300. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListMore.html +2 -0
  301. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListMore.js +8 -0
  302. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.html +2 -0
  303. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.js +17 -0
  304. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/columns.js +32 -0
  305. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/deliveryGuide.js +49 -0
  306. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/deliveryView.js +12 -0
  307. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/listBatch.js +15 -0
  308. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/listSelection.js +37 -0
  309. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/policy.js +68 -0
  310. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/session.js +44 -0
  311. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.html +2 -0
  312. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.js +25 -0
  313. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.html +2 -0
  314. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.js +53 -0
  315. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.html +10 -0
  316. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.js +30 -0
  317. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ScopePage.html +2 -0
  318. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ScopePage.js +10 -0
  319. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.html +2 -0
  320. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.js +9 -0
  321. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/confirmation.js +3 -0
  322. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/navigation.js +19 -0
  323. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.html +2 -0
  324. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.js +8 -0
  325. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.html +2 -0
  326. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.js +32 -0
  327. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.html +2 -0
  328. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.js +15 -0
  329. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.html +2 -0
  330. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.js +11 -0
  331. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecReview.html +2 -0
  332. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecReview.js +57 -0
  333. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.html +2 -0
  334. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.js +37 -0
  335. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/data.js +20 -0
  336. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/domain.js +55 -0
  337. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/store.js +151 -0
  338. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.html +3 -0
  339. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.js +18 -0
  340. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.html +2 -0
  341. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.js +40 -0
  342. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.html +2 -0
  343. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.js +51 -0
  344. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.html +2 -0
  345. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.js +9 -0
  346. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.html +5 -0
  347. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.js +48 -0
  348. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/domain.js +204 -0
  349. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/exampleSource.js +22 -0
  350. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/registry.js +135 -0
  351. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/store.js +137 -0
  352. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.html +3 -0
  353. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.js +36 -0
  354. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workbench/model.js +56 -0
  355. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workbench/store.js +15 -0
  356. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.html +2 -0
  357. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.js +27 -0
  358. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.html +4 -0
  359. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.js +31 -0
  360. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.html +2 -0
  361. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.js +68 -0
  362. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.html +5 -0
  363. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.js +55 -0
  364. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/data.js +16 -0
  365. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/domain.js +83 -0
  366. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/registry.js +18 -0
  367. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/store.js +61 -0
  368. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/admin.css +60 -0
  369. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/agents.css +46 -0
  370. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/antdv.css +295 -0
  371. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/app.css +102 -0
  372. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/delivery.css +4 -0
  373. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/intents.css +37 -0
  374. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/native.css +22 -0
  375. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/operations.css +2 -0
  376. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/pbc.css +3 -0
  377. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/permissions.css +22 -0
  378. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/pro.css +1 -0
  379. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/releases.css +4 -0
  380. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/reset.css +246 -0
  381. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/reviews.css +8 -0
  382. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/tasks.css +6 -0
  383. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/tokens.css +15 -0
  384. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/workbench.css +61 -0
  385. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/workflows.css +1 -0
  386. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/admin-rules.test.js +96 -0
  387. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/agents.test.js +14 -0
  388. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/intent-state.test.js +37 -0
  389. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/list-batch.test.js +44 -0
  390. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/operation-fixtures.js +19 -0
  391. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/operation-repair.test.js +14 -0
  392. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/operations.test.js +25 -0
  393. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/pbc-management.test.js +17 -0
  394. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/pbc-state.test.js +24 -0
  395. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/permission-config.test.js +23 -0
  396. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/permissions.test.js +24 -0
  397. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/releases.test.js +50 -0
  398. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/reviews.test.js +36 -0
  399. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/runtime-forms-router.test.js +28 -0
  400. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/runtime-state.test.js +42 -0
  401. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/runtime-stores.test.js +16 -0
  402. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/spec-state.test.js +11 -0
  403. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/tasks.test.js +27 -0
  404. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/workbench.test.js +34 -0
  405. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/workflows.test.js +16 -0
  406. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tools/convert.mjs +168 -0
  407. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tools/serve.mjs +7 -0
  408. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tools/styles.mjs +11 -0
  409. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tools/verify.mjs +24 -0
  410. package/skills/i3-ui-demo/assets/templates/enterprise-admin/serve.cjs +16 -0
  411. package/skills/i3-ui-demo/assets/templates/enterprise-admin/template-inventory.json +28791 -0
  412. package/skills/i3-ui-demo/assets/templates/enterprise-admin/template.json +9 -0
  413. package/skills/i3-ui-demo/assets/templates/enterprise-admin/usability.css +44 -0
  414. package/skills/i3-ui-demo/assets/templates.json +10 -0
  415. package/skills/i3-ui-demo/assets/versions.json +20 -0
  416. package/skills/i3-ui-demo/readme.md +350 -0
  417. package/skills/i3-ui-demo/references/browser.md +71 -0
  418. package/skills/i3-ui-demo/references/dependencies.md +67 -0
  419. package/skills/i3-ui-demo/references/resources.md +142 -0
  420. package/skills/i3-ui-demo/scripts/dependencies.cjs +364 -0
  421. package/skills/i3-ui-demo/scripts/design-install.cjs +105 -0
  422. package/skills/i3-ui-demo/scripts/design-provider.cjs +57 -0
  423. package/skills/i3-ui-demo/scripts/locations.cjs +52 -0
  424. package/skills/i3-ui-demo/scripts/mcp.cjs +112 -0
  425. package/skills/i3-ui-demo/scripts/provider-discovery.cjs +131 -0
  426. package/skills/i3-ui-demo/scripts/resources.cjs +283 -0
  427. package/skills/i3-ui-prototype/SKILL.md +1 -1
  428. package/skills/i3-ui-prototype/references/execution-evidence.md +12 -56
  429. package/skills/i3-ui-prototype/scripts/codebuddy-registration.cjs +1 -1
  430. package/skills/i3-ui-prototype/scripts/execution-runtime.cjs +5 -2
  431. package/skills/i3-ui-prototype/scripts/hosts/codebuddy.cjs +3 -2
  432. package/skills/i3-ui-prototype/scripts/native-delivery.cjs +2 -2
  433. package/skills/i3-ui-prototype/scripts/prototype-hooks.cjs +23 -20
  434. package/docs/ui-prototype-native/MAIN-SESSION-REPORT.md +0 -66
  435. package/docs/ui-prototype-native/USAGE.md +0 -93
  436. package/references/engineering-skeleton-resources/README.md +0 -52
  437. package/references/engineering-skeleton-resources/adoption.md +0 -200
  438. package/references/engineering-skeleton-resources/catalog.json +0 -17
  439. package/references/enterprise-sop-resources/README.md +0 -165
  440. package/references/enterprise-sop-resources/ad/README.md +0 -70
  441. package/references/enterprise-sop-resources/ad/assets-manifest.json +0 -106
  442. package/references/enterprise-sop-resources/ad/prompts/01-generate.md +0 -58
  443. package/references/enterprise-sop-resources/ad/prompts/02-review.md +0 -54
  444. package/references/enterprise-sop-resources/ad/prompts/03-revise.md +0 -54
  445. package/references/enterprise-sop-resources/ad/prompts/04-recheck.md +0 -54
  446. package/references/enterprise-sop-resources/assets-manifest.json +0 -199
  447. package/references/enterprise-sop-resources/brd/README.md +0 -50
  448. package/references/enterprise-sop-resources/brd/assets-manifest.json +0 -94
  449. package/references/enterprise-sop-resources/brd/prompts/01-generate.md +0 -51
  450. package/references/enterprise-sop-resources/brd/prompts/02-review.md +0 -47
  451. package/references/enterprise-sop-resources/brd/prompts/03-revise.md +0 -47
  452. package/references/enterprise-sop-resources/brd/prompts/04-recheck.md +0 -47
  453. package/references/enterprise-sop-resources/codebuddy-project-guide.md +0 -34
  454. package/references/enterprise-sop-resources/controlled-handoff.md +0 -41
  455. package/references/enterprise-sop-resources/controlled_handoff.py +0 -334
  456. package/references/enterprise-sop-resources/handoff-contract.md +0 -196
  457. package/references/enterprise-sop-resources/handoff.py +0 -277
  458. package/references/enterprise-sop-resources/lifecycle-contract.md +0 -91
  459. package/references/enterprise-sop-resources/plan-handoff.md +0 -73
  460. package/references/enterprise-sop-resources/prd/README.md +0 -137
  461. package/references/enterprise-sop-resources/prd/assets-manifest.json +0 -115
  462. package/references/enterprise-sop-resources/prd/prompts/01-generate.md +0 -64
  463. package/references/enterprise-sop-resources/prd/prompts/02-review.md +0 -49
  464. package/references/enterprise-sop-resources/prd/prompts/03-revise.md +0 -48
  465. package/references/enterprise-sop-resources/prd/prompts/04-recheck.md +0 -47
  466. package/references/enterprise-sop-resources/prd/template-contracts.md +0 -39
  467. package/references/enterprise-sop-resources/prd/templates/AD.md +0 -17
  468. package/references/enterprise-sop-resources/recovery-contract.md +0 -65
  469. package/references/enterprise-sop-resources/review-handoff.md +0 -105
  470. package/references/enterprise-sop-resources/selection-handoff.md +0 -55
  471. package/references/enterprise-sop-resources/selection_handoff.py +0 -225
  472. package/references/enterprise-sop-resources/stages.json +0 -262
  473. package/references/enterprise-sop-resources/technical-baseline/README.md +0 -132
  474. package/references/enterprise-sop-resources/technical-baseline/assets-manifest.json +0 -101
  475. package/references/enterprise-sop-resources/technical-baseline/baselines/PROVENANCE.md +0 -40
  476. package/references/enterprise-sop-resources/technical-baseline/references/engineering-directory-v0.2.0/adoption.md +0 -112
  477. package/references/enterprise-sop-resources/technical-baseline/references/engineering-directory-v0.2.0/directory-standard.md +0 -119
  478. package/references/enterprise-sop-resources/template-contracts.md +0 -142
  479. package/references/enterprise-sop-resources/testcase/README.md +0 -61
  480. package/references/enterprise-sop-resources/testcase/assets-manifest.json +0 -111
  481. package/references/enterprise-sop-resources/testcase/prompts/01-generate.md +0 -53
  482. package/references/enterprise-sop-resources/testcase/prompts/02-review.md +0 -51
  483. package/references/enterprise-sop-resources/testcase/prompts/03-revise.md +0 -49
  484. package/references/enterprise-sop-resources/testcase/prompts/04-recheck.md +0 -51
  485. package/references/enterprise-sop-resources/verification/README.md +0 -149
  486. package/references/enterprise-sop-resources/verification/check_execution.py +0 -185
  487. package/references/enterprise-sop-resources/verification/check_native_execution.py +0 -282
  488. package/references/enterprise-sop-resources/verification/check_reads.py +0 -348
  489. package/references/enterprise-sop-resources/verification/review-output.schema.json +0 -155
  490. package/references/enterprise-sop-resources/verification/review_handoff.py +0 -329
@@ -0,0 +1,82 @@
1
+ import { metadata } from "../shared/policy.js";
2
+ import { clone } from "../tasks/domain.js";
3
+ import { runsForTask, operationReason, operationLabels } from "./model.js";
4
+ import { closureReason } from "./repair.js";
5
+ export function applyOperation(t, runId, a, c, context) {
6
+ const original = runsForTask(t).find(r => r.id === runId);
7
+ if (!original)
8
+ throw Error('运行记录不存在。');
9
+ const fingerprint = JSON.stringify([c.action, c.note || '', !!c.checked, c.incidentId, c.outcome || 'pass', c.target]), prior = original.receipts.find(r => r.id === c.id);
10
+ // Authentication and resource permissions still apply to receipt replays.
11
+ const access = operationReason(t, original, a, 'verify');
12
+ if (/权限/.test(access))
13
+ throw Error(access);
14
+ if (prior) {
15
+ if (prior.fingerprint !== fingerprint)
16
+ throw Error('同一请求编号不能提交不同内容。');
17
+ return original;
18
+ }
19
+ if (c.expected !== original.recordVersion)
20
+ throw Error('记录版本已变化,输入已保留;请核对当前版本后再提交。');
21
+ const why = operationReason(t, original, a, c.action, c.incidentId);
22
+ if (why)
23
+ throw Error(why);
24
+ if (c.action.startsWith('triage') && context?.intents.some(i => i.operationLinks?.some(l => l.incidentId === c.incidentId)))
25
+ throw Error('异常已经关联修复需求,请继续原处理链。');
26
+ if ((c.note?.length || 0) > 2000)
27
+ throw Error('处理说明最多 2000 字。');
28
+ if (c.action !== 'verify' && !c.note?.trim())
29
+ throw Error('请填写处理说明。');
30
+ if (['accept', 'rejectAcceptance', 'closeIncident'].includes(c.action) && !c.checked)
31
+ throw Error('请勾选已核对本次版本与证据。');
32
+ const r = clone(original), at = new Date().toISOString(), incident = r.incidents.find(i => i.id === c.incidentId), outcome = c.outcome || 'pass';
33
+ if (c.action === 'observe') {
34
+ const number = (r.observations.at(-1)?.number || 0) + 1;
35
+ r.observations.push({ number, at, by: a.name, sourceSignature: r.source.signature, health: outcome === 'pass' ? 'healthy' : outcome === 'fail' ? 'abnormal' : 'unknown', simulated: true, checks: [
36
+ { id: 'business', name: '业务场景验收', criterion: t.binding.spec.content.acceptance || '按绑定规格的验收标准核对', status: outcome, detail: outcome === 'pass' ? '模拟业务样例验证通过' : '本轮模拟结果:' + ({ fail: '关键业务请求失败', missing: '未取得业务证据', stale: '观测已过期' })[outcome] },
37
+ { id: 'regression', name: '问题回归与关键路径', criterion: '核对本次版本的业务回归证据', status: outcome, detail: '本地演示回归结果;未连接真实监控或 CI。' },
38
+ { id: 'version', name: '制品与配置一致性', criterion: r.source.digest + ' / ' + r.source.config, status: outcome === 'missing' || outcome === 'stale' ? outcome : 'pass', detail: '绑定发布版本 ' + r.source.version }
39
+ ], ...(outcome === 'pass' ? { errorRate: 0.2, p95: 320 } : outcome === 'fail' ? { errorRate: 4.2, p95: 1450 } : {}) });
40
+ if (outcome === 'fail' && !r.incidents.some(i => !i.closed && i.triage?.choice !== 'reject')) {
41
+ const id = r.id + '-incident-' + number;
42
+ r.incidents.push({ ...metadata(a, at, t.tenantId), id, code: 'INC-' + r.source.releaseCode.replace(/^REL-/, '') + '-' + number, title: '智能分诊关键请求失败(模拟)', observedAt: at, evidenceVersion: number, source: clone(r.source), signal: '关键请求错误率 4.2%,P95 1450 ms(样例)', band: '3σ', traceId: 'demo-trace-' + id, logs: [{ at, level: 'ERROR', text: '[模拟日志] 工单分类工具调用超时;部分请求未完成分诊。' }, { at, level: 'WARN', text: '[模拟日志] 依赖响应超过样例观测窗口。' }], reports: [], priorId: r.incidents.at(-1)?.id });
43
+ }
44
+ }
45
+ else if (c.action === 'accept' || c.action === 'rejectAcceptance') {
46
+ r.acceptances.push({ id: c.id, verdict: c.action === 'accept' ? 'pass' : 'fail', evidenceVersion: r.observations.at(-1)?.number || 0, sourceSignature: r.source.signature, note: c.note.trim(), actorId: a.id, actor: a.name, at });
47
+ }
48
+ else if (c.action === 'diagnose' && incident) {
49
+ incident.reports.push({ number: incident.reports.length + 1, at, by: a.name, status: outcome === 'pass' ? 'ready' : 'incomplete', facts: outcome === 'pass' ? [incident.signal, '日志记录工单分类工具调用超时。'] : ['本轮诊断资料获取不完整,保留原始异常证据。'], hypotheses: outcome === 'pass' ? ['依赖调用超时可能导致请求失败,尚未验证根因。'] : [], questions: ['需核查工具服务响应、请求样本与超时配置。'], suggestion: outcome === 'pass' ? '建议分诊后建立修复需求,补充回归样例。' : '补充调查;当前资料不足以判断根因。' });
50
+ }
51
+ else if (c.action.startsWith('triage') && incident) {
52
+ if (!incident.triageHistory)
53
+ incident.triageHistory = incident.triage ? [clone(incident.triage)] : [];
54
+ incident.triage = { choice: c.action === 'triageNow' ? 'now' : c.action === 'triagePlan' ? 'plan' : 'reject', note: c.note.trim(), actor: a.name, actorId: a.id, at, reportVersion: incident.reports.at(-1)?.number || 0 };
55
+ incident.triageHistory.push(clone(incident.triage));
56
+ }
57
+ else if (c.action === 'closeIncident' && incident) {
58
+ if (!context)
59
+ throw Error('缺少修复版本与重新验收证据。');
60
+ const closure = closureReason(r, incident, context.intents, context.tasks, a, c.target);
61
+ if (closure)
62
+ throw Error(closure);
63
+ r.supersededBy = clone(c.target);
64
+ incident.closed = { note: c.note.trim(), actor: a.name, actorId: a.id, at, target: clone(c.target) };
65
+ }
66
+ else if (c.action === 'verify')
67
+ r.unconfirmed = undefined;
68
+ if (incident) {
69
+ incident.recordVersion++;
70
+ incident.updatedAt = at;
71
+ incident.updatedBy = a.name;
72
+ }
73
+ r.recordVersion++;
74
+ r.updatedAt = at;
75
+ r.updatedBy = a.name;
76
+ r.receipts.push({ id: c.id, fingerprint, action: c.action, at });
77
+ r.events.push({ id: c.id, action: operationLabels[c.action], detail: c.action === 'verify' ? '已核实原请求 ' + original.unconfirmed + '(模拟);未重复执行。' : c.note.trim(), actor: a.name, at, incidentId: c.incidentId, evidenceVersion: r.observations.at(-1)?.number });
78
+ if (c.unknown && c.action !== 'verify')
79
+ r.unconfirmed = c.id;
80
+ t.operations = [...(t.operations || []).filter(x => x.id !== runId), clone(r)];
81
+ return r;
82
+ }
@@ -0,0 +1,47 @@
1
+ import { seedTasks } from "../tasks/registry.js";
2
+ import { actors } from "../shared/policy.js";
3
+ import { clone } from "../tasks/domain.js";
4
+ import { createRelease, sourceKey } from "../releases/model.js";
5
+ import { applyRelease } from "../releases/commands.js";
6
+ import { applyOperation } from "./commands.js";
7
+ import { runsForTask } from "./model.js";
8
+ export function operationExamples() {
9
+ const actor = actors[0], tasks = [], links = [];
10
+ function published(index, name, version = '1.0.0') {
11
+ const t = clone(seedTasks()[6]);
12
+ t.id = 'operation-example-' + index;
13
+ t.code = 'DEL-OPS-00' + index;
14
+ t.name = name;
15
+ t.operations = [];
16
+ t.releases = [];
17
+ t.note = '运行评审独立样例:前置确认和发布均为预置模拟,不代表用户批准。';
18
+ for (const a of t.artifacts)
19
+ for (const v of a.versions)
20
+ v.taskId = t.id;
21
+ t.releaseMaterials = { sourceKey: sourceKey(t), commit: 'demo-ops-commit-' + index, digest: 'sha256:demo-ops-' + index, config: 'config-demo-' + version, migration: 'none', checks: ['merge', 'build', 'functional', 'contract', 'eval', 'security', 'migration'].map(id => ({ id, name: id, status: 'pass', detail: '预置模拟证据' })), by: '模拟材料服务', at: new Date().toISOString() };
22
+ const r = createRelease(t, actor, { name, version, environment: 'production', config: t.releaseMaterials.config, description: '独立运行评审样例', traffic: 10, errorLimit: 1, latencyLimit: 800, rollbackPlan: '首发异常时停止并撤流,数据另行核查。' }, 'ops-release-' + index);
23
+ r.code = 'REL-OPS-00' + index;
24
+ for (const [n, action] of ['check', 'submit', 'approve', 'start', 'advance', 'advance', 'advance'].entries())
25
+ applyRelease(t, r.id, actor, { id: r.id + '-preset-' + n, action, expected: r.recordVersion, note: '演示样例预置步骤;不代表真实人工批准。', checked: true });
26
+ tasks.push(t);
27
+ return t;
28
+ }
29
+ function op(t, action, outcome = 'pass') { const r = runsForTask(t)[0]; return applyOperation(t, r.id, actor, { id: t.id + '-' + action + '-' + r.recordVersion, action, expected: r.recordVersion, note: '预置模拟样例,用于核对交互。', checked: true, outcome, incidentId: r.incidents[0]?.id }); }
30
+ const normal = published(1, '工单分诊 · 已验收样例');
31
+ op(normal, 'observe');
32
+ op(normal, 'accept');
33
+ published(2, '巡检摘要 · 待运行证据');
34
+ const abnormal = published(3, '智能分诊 · 新异常');
35
+ op(abnormal, 'observe', 'fail');
36
+ for (let i = 4; i <= 5; i++) {
37
+ const t = published(i, i === 4 ? '智能分诊 · 已关联修复需求' : '智能分诊 · 等待修复验证');
38
+ op(t, 'observe', 'fail');
39
+ op(t, 'diagnose');
40
+ const r = op(t, i === 4 ? 'triagePlan' : 'triageNow');
41
+ links.push({ runId: r.id, incidentId: r.incidents[0].id });
42
+ }
43
+ const fixed = published(6, '智能分诊 · 修复版本待验收', '1.0.1');
44
+ fixed.createdAt = new Date(Date.now() + 1000).toISOString();
45
+ fixed.releases[0].finishedAt = new Date(Date.now() + 2000).toISOString();
46
+ return { tasks, links };
47
+ }
@@ -0,0 +1,61 @@
1
+ import { can, metadata } from "../shared/policy.js";
2
+ import { clone } from "../tasks/domain.js";
3
+ import { releaseRows, versionOf } from "../releases/model.js";
4
+ export function runtimeSource(t, r) {
5
+ const v = versionOf(r);
6
+ const source = { taskId: t.id, taskCode: t.code, releaseId: r.id, releaseCode: r.code, revision: v.number, version: v.version, service: t.name, pbcId: r.pbcId, project: t.binding.project, tenantId: t.tenantId, environment: 'production', digest: v.materials?.digest || '', config: v.config, specVersion: v.specVersion, flowVersion: v.flowVersion, publishedAt: r.finishedAt || r.updatedAt };
7
+ return { ...source, signature: JSON.stringify(source) };
8
+ }
9
+ export function runsForTask(t) {
10
+ const saved = t.operations || [];
11
+ return [...saved, ...releaseRows(t).filter(r => r.state === 'succeeded' && !r.unconfirmed && versionOf(r).environment === 'production' && !saved.some(x => x.source.releaseId === r.id)).map(r => ({
12
+ ...metadata({ id: 'runtime', name: '运行记录服务(模拟)', department: '运行服务' }, r.finishedAt || r.updatedAt, t.tenantId), id: 'run-' + r.id, code: 'RUN-' + r.code.replace(/^REL-/, ''), source: runtimeSource(t, r), observations: [], acceptances: [], incidents: [], receipts: [], events: []
13
+ }))];
14
+ }
15
+ export const canReadRun = (t, a) => !t.isDeleted && can(a, 'operation:view', t.tenantId, t.binding.pbcId, 'production') && can(a, 'task:view', t.tenantId, t.binding.pbcId);
16
+ export const acceptanceLabel = (r) => r.unconfirmed ? '结果待核实' : r.acceptances.at(-1)?.verdict === 'pass' ? '验收通过' : r.acceptances.at(-1)?.verdict === 'fail' ? '验收不通过' : '待验收';
17
+ export const healthLabel = (r) => r.unconfirmed ? '结果待核实' : r.observations.at(-1)?.health === 'healthy' ? '运行正常' : r.observations.at(-1)?.health === 'abnormal' ? '运行异常' : r.observations.at(-1)?.checks.some(c => c.status === 'stale') ? '证据已过期' : '数据待提供';
18
+ export const incidentLabel = (i) => i.closed ? '已关闭' : i.triage?.choice === 'reject' ? '已驳回' : i.triage?.choice === 'now' ? '立即修复' : i.triage?.choice === 'plan' ? '排期修复' : i.reports.at(-1)?.status === 'ready' ? '待分诊' : '待调查';
19
+ export const operationPermissions = { observe: 'operation:observe', accept: 'operation:accept', rejectAcceptance: 'operation:accept', diagnose: 'operation:triage', triageNow: 'operation:triage', triagePlan: 'operation:triage', triageReject: 'operation:triage', closeIncident: 'operation:close', verify: 'operation:view' };
20
+ export const operationLabels = { observe: '获取最新观测', accept: '验收通过', rejectAcceptance: '验收不通过', diagnose: '补充调查', triageNow: '立即修复', triagePlan: '排期修复', triageReject: '驳回异常', closeIncident: '确认修复并关闭', verify: '查询原请求回执' };
21
+ export function sourceReason(t, r) {
22
+ const replacement = r.supersededBy || r.incidents.find(i => i.closed)?.closed?.target;
23
+ if (replacement)
24
+ return '已由修复版本 ' + replacement.version + ' 接替,此运行记录保留为历史证据。';
25
+ const release = releaseRows(t).find(x => x.id === r.source.releaseId);
26
+ if (!release || release.state !== 'succeeded' || release.unconfirmed)
27
+ return '源发布未确认成功或已停止、回滚、撤流,请核对发布记录。';
28
+ if (runtimeSource(t, release).signature !== r.source.signature)
29
+ return '源发布版本已经变化,请核对发布记录。';
30
+ if (releaseRows(t).some(x => x.id !== release.id && versionOf(x).environment === 'production' && ((x.unconfirmed) || (['deploying', 'canary', 'observing', 'rollingBack'].includes(x.state)) || (x.state === 'succeeded' && (x.finishedAt || x.updatedAt) > r.source.publishedAt))))
31
+ return '生产环境存在新发布或未核实状态,此记录保留为历史版本。';
32
+ return '';
33
+ }
34
+ export function operationReason(t, r, a, action, incidentId) {
35
+ if (!canReadRun(t, a) || !can(a, operationPermissions[action], r.tenantId, r.source.pbcId, 'production'))
36
+ return '没有当前 PBC / 生产环境的操作权限,请在权限管理配置。';
37
+ if (action === 'verify')
38
+ return r.unconfirmed ? '' : '当前没有待核实回执。';
39
+ if (r.unconfirmed)
40
+ return '原请求回执尚未核实,请先查询原请求回执。';
41
+ if (['observe', 'accept', 'rejectAcceptance'].includes(action)) {
42
+ const why = sourceReason(t, r);
43
+ if (why)
44
+ return why;
45
+ }
46
+ if (action === 'accept' && (!r.observations.length || r.observations.at(-1).sourceSignature !== r.source.signature || r.observations.at(-1).checks.some(c => c.status !== 'pass')))
47
+ return '当前业务验收与回归证据不完整、失败或已过期,不能通过。';
48
+ if (['accept', 'rejectAcceptance'].includes(action) && r.acceptances.length > 0 && r.acceptances.at(-1)?.evidenceVersion === r.observations.at(-1)?.number)
49
+ return '这版证据已有人工验收结论,请先获取新观测。';
50
+ if (['diagnose', 'triageNow', 'triagePlan', 'triageReject', 'closeIncident'].includes(action)) {
51
+ const incident = r.incidents.find(i => i.id === incidentId);
52
+ if (!incident)
53
+ return '异常记录不存在。';
54
+ if (incident.closed || incident.triage?.choice === 'reject')
55
+ return '异常已经结束,历史记录不可改写。';
56
+ if (['triageNow', 'triagePlan'].includes(action) && incident.reports.at(-1)?.status !== 'ready')
57
+ return '调查证据尚未齐备,请先补充调查。';
58
+ }
59
+ return '';
60
+ }
61
+ export const cloneRun = (r) => clone(r);
@@ -0,0 +1,68 @@
1
+ import { can } from "../shared/policy.js";
2
+ import { clone } from "../tasks/domain.js";
3
+ import { newIntent } from "../intents/domain.js";
4
+ import { canReadRun, runsForTask, sourceReason, operationReason } from "./model.js";
5
+ export const linkedIntent = (items, incidentId) => items.find(i => i.operationLinks?.some(l => l.incidentId === incidentId));
6
+ export function linkRepairIntent(items, task, run, incidentId, actor, c) {
7
+ const incident = run.incidents.find(i => i.id === incidentId);
8
+ if (!incident || !canReadRun(task, actor) || !can(actor, 'operation:link', run.tenantId, run.source.pbcId, 'production') || !can(actor, 'intent:edit', run.tenantId) || !can(actor, 'intent:view', run.tenantId))
9
+ throw Error('没有关联修复需求的权限或异常不存在。');
10
+ const fingerprint = JSON.stringify([incidentId, c.targetId || '', c.note.trim()]), old = linkedIntent(items, incidentId), link = old?.operationLinks?.find(l => l.incidentId === incidentId);
11
+ if (link) {
12
+ if (link.requestId === c.id && link.fingerprint === fingerprint)
13
+ return clone(old);
14
+ throw Error('此异常已经关联需求,请查询并继续原记录。');
15
+ }
16
+ if (run.unconfirmed)
17
+ throw Error('先核实原请求回执。');
18
+ if (incident.closed || !['now', 'plan'].includes(incident.triage?.choice || ''))
19
+ throw Error('请先将异常分诊为立即修复或排期修复。');
20
+ if (c.note.length > 2000)
21
+ throw Error('关联说明最多 2000 字。');
22
+ if (!c.note.trim())
23
+ throw Error('请填写关联说明。');
24
+ const at = new Date().toISOString(), existing = c.targetId ? items.find(i => i.id === c.targetId) : undefined;
25
+ if (c.targetId && !existing)
26
+ throw Error('目标需求不存在。');
27
+ if (existing && (existing.tenantId !== run.tenantId || existing.isDeleted || existing.status === 'closed' || existing.generating || ['pending', 'unknown'].includes(existing.confirmation)))
28
+ throw Error('目标需求不在同一租户、已结束或存在待核实操作。');
29
+ if (existing?.operationLinks?.some(l => l.pbcId !== run.source.pbcId))
30
+ throw Error('目标修复需求属于其他 PBC。');
31
+ const item = existing ? clone(existing) : newIntent({ title: '修复:' + incident.title, request: '处理异常 ' + incident.code + '。\n' + incident.signal + '\n' + c.note.trim(), context: '来源 PBC:' + run.source.project + ';发布版本 ' + run.source.version + ';需澄清修复范围与回归标准。', outcome: '恢复关键业务场景,并以新版本的回归及运行验收证据确认修复。' }, 'repair-' + c.id, 'INT-REPAIR-' + c.id.slice(0, 8).toUpperCase(), at, actor);
32
+ item.tenantId = run.tenantId;
33
+ (item.operationLinks ||= []).push({ runId: run.id, incidentId, incidentCode: incident.code, incidentTitle: incident.title, taskId: task.id, releaseId: run.source.releaseId, tenantId: run.tenantId, pbcId: run.source.pbcId, project: run.source.project, sourceVersion: run.source.version, sourceSignature: run.source.signature, requestId: c.id, fingerprint, unconfirmed: c.unknown, at, actor: actor.name, actorId: actor.id, note: c.note.trim() });
34
+ item.events.push({ label: '关联运行异常 ' + incident.code + ';' + c.note.trim(), at, actor: actor.name });
35
+ if (existing)
36
+ item.recordVersion++;
37
+ item.updatedAt = at;
38
+ item.updatedBy = actor.name;
39
+ return item;
40
+ }
41
+ export function repairCandidates(incident, intents, tasks, actor) {
42
+ const intent = linkedIntent(intents, incident.id);
43
+ if (!intent || intent.isDeleted)
44
+ return [];
45
+ return tasks.filter(t => t.binding.intentId === intent.id && t.createdAt > incident.observedAt && t.tenantId === incident.tenantId && t.binding.pbcId === incident.source.pbcId && canReadRun(t, actor)).flatMap(t => runsForTask(t).filter(r => r.source.publishedAt > incident.observedAt && (r.source.version !== incident.source.version || r.source.digest !== incident.source.digest || r.source.config !== incident.source.config)).map(r => ({ taskId: t.id, releaseId: r.source.releaseId, runId: r.id, version: r.source.version, digest: r.source.digest, config: r.source.config, evidenceVersion: r.observations.at(-1)?.number || 0, runVersion: r.recordVersion, sourceSignature: r.source.signature })));
46
+ }
47
+ export function closureReason(run, incident, intents, tasks, actor, target) {
48
+ const sourceTask = tasks.find(t => t.id === run.source.taskId);
49
+ if (!sourceTask)
50
+ return '来源任务不存在。';
51
+ const why = operationReason(sourceTask, run, actor, 'closeIncident', incident.id);
52
+ if (why)
53
+ return why;
54
+ const intent = linkedIntent(intents, incident.id), link = intent?.operationLinks?.find(l => l.incidentId === incident.id);
55
+ if (!intent || !link || link.unconfirmed)
56
+ return '尚无已核实的修复需求及新修复版本。';
57
+ const candidates = repairCandidates(incident, intents, tasks, actor), current = candidates.find(c => c.runId === target?.runId);
58
+ if (!target || !current)
59
+ return '请选择关联修复需求产生的新生产修复版本。';
60
+ if (JSON.stringify(current) !== JSON.stringify(target))
61
+ return '修复版本或证据已变化,请核对当前版本。';
62
+ const task = tasks.find(t => t.id === target.taskId), r = runsForTask(task).find(r => r.id === target.runId), e = r.observations.at(-1), accept = r.acceptances.at(-1);
63
+ if (r.unconfirmed || sourceReason(task, r))
64
+ return '修复发布或运行结果待核实,或版本已失效。';
65
+ if (!e || e.sourceSignature !== r.source.signature || e.checks.some(c => c.status !== 'pass') || !accept || accept.verdict !== 'pass' || accept.evidenceVersion !== e.number || accept.sourceSignature !== r.source.signature)
66
+ return '修复版本尚缺当前回归证据和人工运行验收通过记录。';
67
+ return '';
68
+ }
@@ -0,0 +1,55 @@
1
+ import { computed, ref } from '../../runtime/state.js';
2
+ import { defineStore } from "../../runtime/state.js";
3
+ import { useSession } from "../shared/session.js";
4
+ import { useIntents } from "../intents/store.js";
5
+ import { usePbcs } from "../pbc/store.js";
6
+ import { taskRecords, taskReadError, refreshTaskRecords, commitTaskChanges } from "../tasks/registry.js";
7
+ import { clone, taskEvent } from "../tasks/domain.js";
8
+ import { canReadRun, runsForTask, operationReason } from "./model.js";
9
+ import { applyOperation } from "./commands.js";
10
+ import { linkRepairIntent, closureReason } from "./repair.js";
11
+ import { operationExamples } from "./examples.js";
12
+ export const useOperations = defineStore('operations', () => {
13
+ const session = useSession(), intents = useIntents(), pbcs = usePbcs(), scene = ref('normal'), response = ref('success');
14
+ const tasks = computed(() => taskRecords.value.filter(t => canReadRun(t, session.actor)));
15
+ const rows = computed(() => tasks.value.flatMap(task => runsForTask(task).map(run => ({ task, run }))).sort((a, b) => b.run.updatedAt.localeCompare(a.run.updatedAt)));
16
+ const find = (id) => rows.value.find(r => r.run.id === id);
17
+ function reason(row, action, incidentId) { if (session.state !== 'active')
18
+ return '登录状态已失效,请重新登录。'; const p = pbcs.catalog.find(p => p.id === row.run.source.pbcId); if (action !== 'verify' && (!p || p.isDeleted || p.state !== 'active'))
19
+ return '来源 PBC 不存在或已归档。'; return operationReason(row.task, row.run, session.actor, action, incidentId); }
20
+ function mode() { session.writeCheck(); const mode = response.value; response.value = 'success'; if (mode === 'failure')
21
+ throw Error('提交失败(模拟服务不可用),本次未保存,输入已保留。'); return mode; }
22
+ function apply(id, c) { refreshTaskRecords(); const row = find(id); if (!row)
23
+ throw Error('记录不存在或无权访问。'); session.require('operation:view', row.run.tenantId, row.run.source.pbcId, 'production'); const replay = row.run.receipts.some(x => x.id === c.id); if (!replay) {
24
+ const why = reason(row, c.action, c.incidentId);
25
+ if (why)
26
+ throw Error(why);
27
+ } const t = clone(row.task), m = mode(), expected = t.recordVersion; const result = applyOperation(t, id, session.actor, { ...c, unknown: m === 'unknown' }, { tasks: taskRecords.value, intents: intents.operationRecords() }); if (!replay) {
28
+ t.recordVersion++;
29
+ t.updatedAt = new Date().toISOString();
30
+ t.updatedBy = session.actor.name;
31
+ taskEvent(t, session.actor.name, '运行记录更新', '观测、验收或异常处理(模拟)');
32
+ commitTaskChanges([t], [{ id: t.id, version: expected }]);
33
+ } return result; }
34
+ function link(id, incidentId, c, expected, targetVersion) { refreshTaskRecords(); const row = find(id); if (!row)
35
+ throw Error('运行记录不存在。'); session.require('operation:link', row.run.tenantId, row.run.source.pbcId, 'production'); if (row.run.recordVersion !== expected)
36
+ throw Error('异常版本已变化,请核对当前记录。'); const m = mode(); return intents.operationCommit(items => { if (c.targetId && !items.some(i => i.operationLinks?.some(l => l.incidentId === incidentId))) {
37
+ const target = items.find(i => i.id === c.targetId);
38
+ if (target?.recordVersion !== targetVersion)
39
+ throw Error('目标需求版本已更新,输入保留,请核对当前版本。');
40
+ const jobs = pbcs.jobs.filter(j => j.intentId === c.targetId && !j.isDeleted);
41
+ if (jobs.some(j => j.pbc.id !== row.run.source.pbcId || j.tenantId !== row.run.tenantId))
42
+ throw Error('目标需求已归属其他 PBC。');
43
+ } return linkRepairIntent(items, row.task, row.run, incidentId, session.actor, { ...c, unknown: m === 'unknown' }); }); }
44
+ function verifyLink(incidentId) { session.require('operation:view'); mode(); return intents.operationCommit(items => { const i = items.find(i => i.operationLinks?.some(l => l.incidentId === incidentId)); if (!i)
45
+ throw Error('原关联请求不存在。'); const l = i.operationLinks.find(l => l.incidentId === incidentId); session.require('operation:view', l.tenantId, l.pbcId, 'production'); session.require('intent:view', l.tenantId); if (!l.unconfirmed)
46
+ return i; l.unconfirmed = false; i.recordVersion++; i.updatedAt = new Date().toISOString(); i.updatedBy = session.actor.name; i.events.push({ label: '核实异常关联原请求 ' + l.requestId + '(模拟)', at: i.updatedAt, actor: session.actor.name }); return i; }); }
47
+ function closeReason(row, incidentId, target) { const i = row.run.incidents.find(i => i.id === incidentId); return reason(row, 'closeIncident', incidentId) || (i ? closureReason(row.run, i, intents.items, taskRecords.value, session.actor, target) : '异常不存在。'); }
48
+ function addExamples() { session.require('operation:observe', 'heating', 'pbc-0', 'production'); session.require('task:create', 'heating', 'pbc-0'); session.require('intent:edit', 'heating'); mode(); const examples = operationExamples(), changes = examples.tasks.filter(t => !taskRecords.value.some(x => x.id === t.id)); if (changes.length)
49
+ commitTaskChanges(changes, changes.map(t => ({ id: t.id }))); for (const source of examples.links) {
50
+ const row = find(source.runId);
51
+ if (!intents.items.some(i => i.operationLinks?.some(l => l.incidentId === source.incidentId)))
52
+ intents.operationCommit(items => linkRepairIntent(items, row.task, row.run, source.incidentId, session.actor, { id: source.incidentId + '-preset', note: '预置模拟关联,用于评审修复追踪。', targetId: 'seed-spec-heating' }));
53
+ } return changes.length; }
54
+ return { session, intents, tasks, rows, find, reason, apply, link, verifyLink, closeReason, scene, response, addExamples, notice: taskReadError };
55
+ });
@@ -0,0 +1,18 @@
1
+ import { can } from "../shared/policy.js";
2
+ import { canReadRun, runsForTask, operationReason, sourceReason, acceptanceLabel, incidentLabel } from "./model.js";
3
+ export function operationTodos(tasks, actor, active) {
4
+ return tasks.filter(t => canReadRun(t, actor)).flatMap(t => runsForTask(t).flatMap(r => {
5
+ const base = { taskId: t.id, group: '运行管理', updatedAt: r.updatedAt, createdBy: r.createdBy, tenantId: r.tenantId, affiliation: r.source.project }, todos = [];
6
+ if (r.unconfirmed || (!sourceReason(t, r) && r.acceptances.at(-1)?.verdict !== 'pass')) {
7
+ const a = r.unconfirmed ? 'verify' : r.observations.at(-1)?.checks.every(c => c.status === 'pass') ? 'accept' : 'observe';
8
+ const allowed = active && !operationReason(t, r, actor, a);
9
+ todos.push({ ...base, id: 'run:' + r.id, code: r.code, title: r.source.service, status: acceptanceLabel(r), reason: r.unconfirmed ? '原请求回执待核实,避免重复操作。' : '核对运行证据后记录人工验收。', path: '/operations?run=' + r.id, action: allowed ? '处理运行验收' : '查看运行记录', allowed });
10
+ }
11
+ if (!r.unconfirmed)
12
+ for (const i of r.incidents.filter(i => !i.closed && i.triage?.choice !== 'reject')) {
13
+ const allowed = active && can(actor, 'operation:triage', r.tenantId, r.source.pbcId, 'production');
14
+ todos.push({ ...base, id: 'incident:' + i.id, code: i.code, title: i.title, status: incidentLabel(i), reason: '保留来源异常,核对调查、修复版本及重新验收。', path: '/operations/' + t.id + '/' + r.id + '/incidents/' + i.id, action: allowed ? '处理异常' : '查看异常', allowed });
15
+ }
16
+ return todos;
17
+ }));
18
+ }
@@ -0,0 +1,3 @@
1
+ <!-- 来源:src/pbc/ManagementTable.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <section class="auth-list" data-bind-aria-label="(pageKey + '列表')"><div class="auth-filters"><template data-component="Input" data-model-value="(query)" data-bind-aria-label="('搜索' + pageKey)" placeholder="搜索名称、标识或负责人" allow-clear=""></template><template data-component="Select" data-model-value="(state)" aria-label="记录状态筛选" data-bind-options="([{ value: 'all', label: '全部状态' }, ...[...new Set(rows.map(r =&gt; r.status))].map(value =&gt; ({ value, label: value }))])"></template><template data-component="Button" data-on-click="query = '';
3
+ state = 'all';">重置</template></div><div class="auth-tools"><template data-component="ListBatchBar" data-if="(!readonly)" data-bind-count="(selection.selected.value.length)" data-bind-allowed="(!!canDelete)" data-on-remove="(emit('remove', selection.selected.value))" data-on-clear="(selection.clear)"></template><p data-else="" class="muted">关联与版本证据只读;删除不适用,业务操作请进入对应详情。</p><template data-component="Space" wrap=""><template data-component="Button" data-on-click="(desc = !desc)">时间{{ (desc ? '倒序' : '正序') }}</template><template data-component="Button" data-bind-loading="(loading)" data-on-click="(refresh)">刷新</template><template data-component="ColumnSettings" data-bind-preferences="(prefs)"></template></template></div><template data-component="Alert" data-if="(scene === 'error')" type="error" show-icon="" title="列表加载失败,已有记录保留。"><template data-slot="action"><template data-component="Button" data-on-click="(refresh)">重试</template></template></template><template data-else=""><template data-component="ProTable" data-bind-table="(table)" data-bind-control="(false)" data-bind-search="(async () =&gt; { })" data-bind-table-container="(false)" row-key="id" data-bind-loading="(loading)" data-bind-row-selection="(readonly ? undefined : selection.rowSelection.value)" data-bind-scroll="({ x: 'max-content' })" data-bind-pagination="({ showTotal: (n) =&gt; '共 ' + n + ' 项', showSizeChanger: true, pageSizeOptions: [5, 10, 20] })"></template><p data-if="(!filtered.length)" class="pbc-empty muted">{{ (readonly ? '暂无符合条件的记录,请调整筛选或核对来源业务。' : '暂无符合条件的记录,可调整筛选或使用页面上方的创建入口。') }}</p></template></section>
@@ -0,0 +1,28 @@
1
+ import { computed, ref, watch } from '../../runtime/state.js';
2
+ import { h } from '../../runtime/dom.js';
3
+ import { Alert, Button, Input, Select, Space, Tag } from "../../runtime/widgets.js";
4
+ import { ProTable, useTable } from "../../runtime/widgets.js";
5
+ import { useColumns } from "../shared/columns.js";
6
+ import { useListSelection } from "../shared/listSelection.js";
7
+ import { useSession } from "../shared/session.js";
8
+ import { formatDate, tenantLabel } from "../shared/policy.js";
9
+ import ColumnSettings from "../shared/ColumnSettings.js";
10
+ import ListMore from "../shared/ListMore.js";
11
+ import ListBatchBar from "../shared/ListBatchBar.js";
12
+ import { createComponent } from '../../runtime/dom.js';
13
+ import { withDefaults } from '../../runtime/state.js';
14
+ export default createComponent({ name: 'ManagementTable', propKeys: ["rows", "pageKey", "contextLabel", "ownerLabel", "readonly", "canDelete", "scene", "more", "primary"], template: new URL('./ManagementTable.html', import.meta.url).href, setup(__props, __emit) {
15
+ const props = withDefaults(__props, { contextLabel: '业务归属', ownerLabel: '负责人', scene: 'normal', primary: '详情' });
16
+ const emit = __emit, session = useSession(), query = ref(''), state = ref('all'), desc = ref(true), loading = ref(false);
17
+ const prefs = useColumns(props.pageKey, [{ key: 'name', label: '名称', locked: true }, { key: 'code', label: '标识' }, { key: 'status', label: '状态', defaultVisible: true }, { key: 'context', label: props.contextLabel, defaultVisible: true }, { key: 'owner', label: props.ownerLabel, defaultVisible: true }, { key: 'createdBy', label: '创建人', defaultVisible: true }, { key: 'createdAt', label: '创建时间', defaultVisible: true }, { key: 'tenantId', label: '所属租户' }, { key: 'createdDept', label: '创建部门' }, { key: 'updatedBy', label: '修改人' }, { key: 'updatedAt', label: '修改时间' }, { key: 'recordVersion', label: '记录版本' }, { key: 'isDeleted', label: '逻辑删除标记' }, { key: 'actions', label: '操作', locked: true }]);
18
+ const table = useTable({ pageParam: { current: 1, pageSize: 5, total: 0 }, columns: prefs.choices.map(c => ({ key: c.key, title: c.label, dataIndex: c.key, width: c.key === 'name' ? 200 : c.key === 'context' ? 180 : c.key === 'code' ? 150 : c.key === 'actions' ? 136 : c.key.endsWith('At') ? 155 : 90, fixed: c.key === 'actions' ? 'right' : undefined, ...(c.key === 'name' ? { render: (_, row) => h('div', [h(Button, { type: 'link', class: 'agent-name', onClick: () => emit('action', 'detail', row) }, () => String(row.name)), h('small', { class: 'agent-code' }, () => String(row.code))]) } : c.key === 'actions' ? { render: (_, row) => { const r = row; return h('div', { class: 'row-actions' }, [h(Button, { type: 'link', onClick: () => emit('action', 'detail', r) }, () => props.primary), h(ListMore, { name: r.name, items: props.more(r), onAction: (key) => emit('action', key, r) })]); } } : c.key === 'status' ? { render: (v) => h(Tag, { color: v === '已归档' ? 'default' : v === '待建工程' ? 'orange' : 'blue' }, () => String(v)) } : c.key === 'tenantId' ? { render: (v) => tenantLabel(String(v)) } : c.key === 'isDeleted' ? { render: (v) => v ? '已删除' : '未删除' } : c.key.endsWith('At') ? { render: (v) => formatDate(String(v)) } : {}) })) });
19
+ const columns = new Map(table.columns.value.map(c => [c.key, c]));
20
+ watch(prefs.keys, keys => table.columns.value = keys.map(k => columns.get(k)).filter(Boolean), { immediate: true });
21
+ const filtered = computed(() => props.scene === 'empty' ? [] : props.rows.filter(r => (r.name + r.code + r.context + r.owner).toLowerCase().includes(query.value.trim().toLowerCase()) && (state.value === 'all' || r.status === state.value)).sort((a, b) => desc.value ? b.createdAt.localeCompare(a.createdAt) : a.createdAt.localeCompare(b.createdAt)));
22
+ watch([filtered, () => table.pageParam.current, () => table.pageParam.pageSize], () => { const size = table.pageParam.pageSize || 5, max = Math.max(1, Math.ceil(filtered.value.length / size)); if ((table.pageParam.current || 1) > max)
23
+ table.setPageParam({ current: max }); const start = ((table.pageParam.current || 1) - 1) * size; table.dataSource.value = filtered.value.slice(start, start + size); table.setPageParam({ total: filtered.value.length }); }, { immediate: true });
24
+ const selection = useListSelection(table.dataSource, computed(() => JSON.stringify([session.key, query.value, state.value, desc.value, table.pageParam.current, table.pageParam.pageSize])), computed(() => !!props.canDelete), r => r.name);
25
+ watch([query, state], () => table.setPageParam({ current: 1 }));
26
+ async function refresh() { selection.clear(); loading.value = true; await new Promise(r => setTimeout(r, 180)); loading.value = false; emit('refresh'); }
27
+ return { computed, ref, watch, h, Alert, Button, Input, Select, Space, Tag, ProTable, useTable, useColumns, useListSelection, useSession, formatDate, tenantLabel, ColumnSettings, ListMore, ListBatchBar, props, emit, session, query, state, desc, loading, prefs, table, columns, filtered, selection, refresh };
28
+ } });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/pbc/PbcCreateEntry.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <template data-component="Modal" data-bind-open="(open)" title="从需求规格创建 PBC" data-on-cancel="(emit('close'))" data-bind-width="(720)"><p>先选择需求,核对规格与归属状态后继续。</p><label for="create-pbc-source" class="pbc-label">需求来源</label><template data-component="Select" id="create-pbc-source" data-model-value="(selected)" aria-label="PBC 创建来源" class="full-width" show-search="" option-filter-prop="label" data-bind-options="(candidates.map(s =&gt; ({ value: s.id, label: s.code + ' · ' + s.title + ' · ' + s.guide.label })))" placeholder="搜索需求名称或编号"></template><p class="muted">显示全部有权查看的需求;其中 {{ (candidates.filter(s =&gt; s.guide.create).length) }} 条当前可创建 PBC。</p><template data-component="Alert" data-if="(!candidates.length)" class="page-alert" type="info" show-icon="" title="暂无可见需求" description="请先发起意图,或联系业务管理员核对数据范围。"></template><section data-if="(source)" class="source-choice" aria-label="所选需求的创建条件"><h3>{{ (source.title) }}</h3><p><span class="mono">{{ (source.code) }}</span> · {{ (tenantLabel(source.tenantId)) }}</p><template data-component="Tag" data-bind-color="(source.guide.create ? 'green' : 'orange')">{{ (source.guide.label) }}</template><template data-component="Alert" data-bind-type="(source.guide.create ? 'success' : 'info')" show-icon="" data-bind-title="(source.guide.reason)" class="page-alert"></template><p class="muted">{{ (source.affiliation.label) }}</p></section><template data-slot="footer"><template data-component="Button" data-on-click="(emit('close'))">取消</template><template data-component="Button" data-if="(source &amp;&amp; !source.guide.create)" data-on-click="(next)">{{ (source.guide.action) }}</template><template data-component="Button" type="primary" data-bind-disabled="(!source?.guide.create)" data-on-click="(next)">继续创建向导</template></template></template>
@@ -0,0 +1,18 @@
1
+ import { computed, ref, watch } from '../../runtime/state.js';
2
+ import { useRouter } from "../../runtime/router.js";
3
+ import { Alert, Button, Modal, Select, Tag } from "../../runtime/widgets.js";
4
+ import { useDeliveryView } from "../shared/deliveryView.js";
5
+ import { tenantLabel } from "../shared/policy.js";
6
+ import { createComponent } from '../../runtime/dom.js';
7
+ export default createComponent({ name: 'PbcCreateEntry', propKeys: ["open"], template: new URL('./PbcCreateEntry.html', import.meta.url).href, setup(__props, __emit) {
8
+ const props = __props, emit = __emit, router = useRouter(), selected = ref('');
9
+ const { candidates } = useDeliveryView();
10
+ const source = computed(() => candidates.value.find(s => s.id === selected.value));
11
+ watch(() => props.open, open => { if (open)
12
+ selected.value = ''; });
13
+ function next() { if (source.value) {
14
+ router.push(source.value.guide.path);
15
+ emit('close');
16
+ } }
17
+ return { computed, ref, watch, useRouter, Alert, Button, Modal, Select, Tag, useDeliveryView, tenantLabel, props, emit, router, selected, candidates, source, next };
18
+ } });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/pbc/PbcDetail.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <template data-component="Result" data-if="(!pbc)" status="403" title="PBC 不存在或无权访问"><template data-slot="extra"><template data-component="Button" data-on-click="(router.push('/pbcs'))">返回 PBC 列表</template></template></template><template data-else=""><div class="page-heading"><div><template data-component="Button" type="link" class="agent-back" data-on-click="(router.push('/pbcs'))">← 返回 PBC 列表</template><h1>{{ (pbc.name) }}</h1><p>{{ (pbc.ebc) }} · {{ (tenantLabel(pbc.tenantId)) }} · 负责人 {{ (pbc.owner) }}</p></div><template data-component="Space" wrap=""><template data-component="Tag">{{ (stateLabel(pbc)) }}</template><template data-component="Button" data-bind-disabled="(!can('pbc:edit') || !active)" data-on-click="(edit = pbc)">编辑资料</template><template data-component="Button" type="primary" data-on-click="(router.push('/pbcs/' + pbc.id + '/workspace'))">进入交付工作区</template></template></div><template data-component="Alert" data-if="(!active)" type="info" show-icon="" title="PBC 已归档,历史记录可查看。" class="page-alert"><template data-slot="action"><template data-component="Button" data-bind-disabled="(!can('pbc:archive'))" data-on-click="(lifecycle = pbc)">恢复使用</template></template></template><template data-component="Tabs" data-model-active-key="(tab)" data-bind-items="([{ key: 'overview', label: 'PBC 概览' }, { key: 'services', label: '服务管理' }, { key: 'metadata', label: '基础信息' }, { key: 'records', label: '操作记录', disabled: !can('pbc:audit') }])"></template><section data-if="(tab === 'overview')" class="pbc-overview"><article class="agent-panel"><h2>业务职责</h2><p class="pbc-description">{{ (pbc.description || '暂未填写职责与边界,可通过编辑资料补充。') }}</p><dl class="task-info-grid"><div><dt>PBC 标识</dt><dd>{{ (pbc.slug) }}</dd></div><div><dt>EBC 业务能力</dt><dd>{{ (pbc.ebc) }}</dd></div><div><dt>服务与方案</dt><dd>{{ (services.length) }} 项 <template data-component="Button" type="link" data-on-click="(tab = 'services')">查看服务</template></dd></div><div><dt>管理状态</dt><dd>{{ (stateLabel(pbc)) }} <template data-component="Button" type="link" data-bind-disabled="(!can('pbc:archive'))" data-on-click="(lifecycle = pbc)">{{ (active ? '归档' : '恢复') }}</template></dd></div></dl><h2>工程信息</h2><dl class="task-info-grid"><div><dt>GitLab Group(规划标识)</dt><dd>{{ (pbc.slug) }}</dd></div><div><dt>业务应用域名(规划)</dt><dd>{{ (pbc.domain) }}</dd></div></dl><template data-component="Alert" type="info" show-icon="" data-bind-title="(pbc.provisioned ? '工程登记为演示数据,未连接真实仓库或运行环境。' : '此记录尚未建立工程。')" description="一个 PBC 可包含多个服务仓库;运行健康、拓扑和环境配置后续接入。"></template></article><aside class="agent-panel"><h2>从这里继续交付</h2><ol class="pbc-next"><li><strong>查看需求与规格</strong><p>追溯每次建设与迭代的目标。</p></li><li><strong>继续交付任务</strong><p>核对当前阶段、等待与返工。</p></li><li><strong>回看版本产物</strong><p>查看任务生成的内容与验证结果。</p></li></ol><template data-component="Button" block="" type="primary" data-on-click="(router.push('/pbcs/' + pbc.id + '/workspace'))">打开工作区</template><p class="muted">质量确认与生产发布将在后续原型包继续衔接。</p></aside></section><template data-if="(tab === 'services')"><div class="section-heading pbc-section"><div><h2>服务与扩展方案</h2><p class="muted">已登记工程保持标识;新增方案经需求、契约及增量交付后建工程。</p></div><template data-component="Button" type="primary" data-bind-disabled="(!can('pbc:service') || !active)" data-on-click="(serviceDialog = {})">新增服务方案</template></div><template data-component="ManagementTable" data-bind-key="(id)" page-key="服务" data-bind-rows="(services)" context-label="工程类型" data-bind-more="(more)" data-bind-can-delete="(can('pbc:service') &amp;&amp; !!active)" data-on-action="(action)" data-on-remove="(remove)"></template><p class="muted pbc-list-note">只删除未建工程的方案;不会删除运行中的服务、仓库或历史产物。</p></template><section data-if="(tab === 'metadata')" class="agent-panel"><template data-component="RecordMetadata" data-bind-record="(pbc)"></template><p>管理状态:{{ (stateLabel(pbc)) }} · 记录版本 {{ (pbc.recordVersion) }} · 逻辑删除标记:{{ (pbc.isDeleted ? '已删除' : '未删除') }}</p></section><section data-if="(tab === 'records')" class="agent-panel"><template data-if="(can('pbc:audit'))"><h2>操作记录</h2><p class="muted">记录只读,删除与批量删除不适用。正式审计将由服务端可靠记录。</p><article data-each="e in (store.eventsFor(id))" data-bind-key="(e.id)" class="pbc-event"><h3>{{ (e.action) }}</h3><p>{{ (e.actor) }} · {{ (formatDate(e.at)) }} · {{ (e.reason) }}</p><details><summary>查看变更前后</summary><div class="pbc-diff"><pre>{{ (e.before) }}</pre><pre>{{ (e.after) }}</pre></div></details></article><p data-if="(!store.eventsFor(id).length)" class="muted">暂无管理操作记录;新建与归属执行记录可在工作区的来源结果中查看。</p></template><template data-component="Result" data-else="" status="403" title="没有查看操作记录的权限"></template></section><template data-component="PbcEditor" data-if="(edit)" data-bind-record="(edit)" data-on-close="(edit = undefined)" data-on-saved="(saved)"></template><template data-component="PbcLifecycle" data-if="(lifecycle)" data-bind-record="(lifecycle)" data-on-close="(lifecycle = undefined)" data-on-saved="(saved)"></template><template data-component="ServiceEditor" data-if="(serviceDialog)" data-bind-pbc="(pbc)" data-bind-service="(serviceDialog.service)" data-bind-readonly="(serviceDialog.readonly)" data-on-close="(serviceDialog = undefined)" data-on-saved="(saved)"></template><template data-component="ListDeleteDialog" data-if="(targets.length)" data-model-targets="(targets)" label="服务方案" data-bind-check="(t =&gt; store.serviceCheck(id, t))" data-bind-submit="(ts =&gt; store.serviceRemove(id, deleteVersion, ts))" data-on-close="(targets = [])" data-on-deleted="(targets = [])"></template></template>
@@ -0,0 +1,31 @@
1
+ import { computed, ref, watch } from '../../runtime/state.js';
2
+ import { useRoute, useRouter } from "../../runtime/router.js";
3
+ import { Alert, Button, Result, Space, Tabs, Tag, message } from "../../runtime/widgets.js";
4
+ import { usePbcManagement } from "./managementStore.js";
5
+ import { useSession } from "../shared/session.js";
6
+ import { formatDate, tenantLabel } from "../shared/policy.js";
7
+ import { stateOf, stateLabel } from "./management.js";
8
+ import { templates } from "./domain.js";
9
+ import ManagementTable from "./ManagementTable.js";
10
+ import PbcEditor from "./PbcEditor.js";
11
+ import PbcLifecycle from "./PbcLifecycle.js";
12
+ import ServiceEditor from "./ServiceEditor.js";
13
+ import RecordMetadata from "../shared/RecordMetadata.js";
14
+ import ListDeleteDialog from "../shared/ListDeleteDialog.js";
15
+ import { createComponent } from '../../runtime/dom.js';
16
+ export default createComponent({ name: 'PbcDetail', propKeys: [], template: new URL('./PbcDetail.html', import.meta.url).href, setup(__props, __emit) {
17
+ const route = useRoute(), router = useRouter(), store = usePbcManagement(), session = useSession(), id = computed(() => String(route.params.id)), pbc = computed(() => store.item(id.value)), tab = ref(String(route.query.tab || 'overview')), edit = ref(), lifecycle = ref(), serviceDialog = ref(), targets = ref([]), deleteVersion = ref(0);
18
+ watch(() => route.query.tab, v => tab.value = String(v || 'overview'));
19
+ watch(tab, v => router.replace({ query: { ...route.query, tab: v } }));
20
+ const can = (a) => !!pbc.value && session.can(a, pbc.value.tenantId, pbc.value.id), active = computed(() => pbc.value && stateOf(pbc.value) === 'active');
21
+ const services = computed(() => pbc.value?.services.filter(s => !s.isDeleted).map(s => ({ ...s, name: s.title, code: s.name, status: s.registered ? '已登记工程' : '待建工程', context: templates.find(t => t.value === s.template)?.label || s.template, owner: pbc.value.owner })) || []);
22
+ function more(r) { return [{ key: 'detail', label: '查看详情' }, { key: 'edit', label: '编辑服务', disabled: !can('pbc:service') || !active.value }, { key: 'delete', label: '删除服务方案', danger: true, disabled: !can('pbc:service') || !active.value }]; }
23
+ function action(key, r) { const s = pbc.value?.services.find(s => s.id === r.id); if (!s)
24
+ return; if (key === 'delete')
25
+ remove([r]);
26
+ else
27
+ serviceDialog.value = { service: s, readonly: key === 'detail' }; }
28
+ function remove(rows) { deleteVersion.value = pbc.value.recordVersion; targets.value = rows; }
29
+ function saved() { edit.value = undefined; lifecycle.value = undefined; serviceDialog.value = undefined; message.success('已保存'); }
30
+ return { computed, ref, watch, useRoute, useRouter, Alert, Button, Result, Space, Tabs, Tag, message, usePbcManagement, useSession, formatDate, tenantLabel, stateOf, stateLabel, templates, ManagementTable, PbcEditor, PbcLifecycle, ServiceEditor, RecordMetadata, ListDeleteDialog, route, router, store, session, id, pbc, tab, edit, lifecycle, serviceDialog, targets, deleteVersion, can, active, services, more, action, remove, saved };
31
+ } });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/pbc/PbcEditor.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <template data-component="Drawer" data-bind-open="(true)" title="编辑 PBC 基础资料" data-bind-size="(680)" data-bind-mask="({ closable: false })" data-on-close="(close)"><template data-component="Alert" data-if="(error)" type="error" show-icon="" data-bind-title="(error)" class="page-alert"></template><p class="muted">{{ (record.slug) }} · 租户与工程标识保持固定。此处保存不改变部署或历史交付快照。</p><template data-component="Form" layout="vertical" data-bind-disabled="(!allowed || busy)"><template data-component="FormItem" label="PBC 名称" required=""><template data-component="Input" data-model-value="(data.name)" aria-label="PBC 名称" data-bind-maxlength="(60)"></template></template><template data-component="FormItem" label="EBC 业务能力" required=""><template data-component="Input" data-model-value="(data.ebc)" aria-label="EBC 业务能力" data-bind-maxlength="(80)"></template></template><template data-component="FormItem" label="负责人" required=""><template data-component="Input" data-model-value="(data.owner)" aria-label="PBC 负责人" data-bind-maxlength="(60)"></template></template><template data-component="FormItem" label="职责与边界"><template data-component="Input.TextArea" data-model-value="(data.description)" aria-label="PBC 职责与边界" data-bind-rows="(4)" data-bind-maxlength="(1000)"></template></template><template data-component="FormItem" label="变更原因" required=""><template data-component="Input.TextArea" data-model-value="(reason)" aria-label="PBC 变更原因" data-bind-maxlength="(500)" data-bind-rows="(3)"></template></template></template><template data-slot="footer"><template data-component="Space"><template data-component="Button" data-on-click="(close)">取消</template><template data-component="Button" type="primary" data-bind-disabled="(!allowed)" data-bind-loading="(busy)" data-on-click="(save)">保存资料</template></template></template></template>
@@ -0,0 +1,27 @@
1
+ import { computed, reactive, ref } from '../../runtime/state.js';
2
+ import { Alert, Button, Drawer, Form, FormItem, Input, Space } from "../../runtime/widgets.js";
3
+ import { usePbcManagement } from "./managementStore.js";
4
+ import { useSession } from "../shared/session.js";
5
+ import { confirmAction } from "../shell/confirmation.js";
6
+ import { createComponent } from '../../runtime/dom.js';
7
+ export default createComponent({ name: 'PbcEditor', propKeys: ["record"], template: new URL('./PbcEditor.html', import.meta.url).href, setup(__props, __emit) {
8
+ const props = __props, emit = __emit, store = usePbcManagement(), session = useSession(), version = props.record.recordVersion;
9
+ const data = reactive({ name: props.record.name, ebc: props.record.ebc, owner: props.record.owner, description: props.record.description || '' }), initial = JSON.stringify(data), reason = ref(''), error = ref(''), busy = ref(false);
10
+ const allowed = computed(() => session.can('pbc:edit', props.record.tenantId, props.record.id));
11
+ function close() { if (JSON.stringify(data) !== initial || reason.value)
12
+ confirmAction({ title: '放弃未保存的修改?', content: '已保存的 PBC 资料保持不变。', okText: '放弃修改', cancelText: '继续编辑', onOk: () => emit('close') });
13
+ else
14
+ emit('close'); }
15
+ function save() { if (busy.value)
16
+ return; busy.value = true; try {
17
+ store.save(props.record.id, version, data, reason.value);
18
+ emit('saved');
19
+ }
20
+ catch (e) {
21
+ error.value = e.message;
22
+ }
23
+ finally {
24
+ busy.value = false;
25
+ } }
26
+ return { computed, reactive, ref, Alert, Button, Drawer, Form, FormItem, Input, Space, usePbcManagement, useSession, confirmAction, props, emit, store, session, version, data, initial, reason, error, busy, allowed, close, save };
27
+ } });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/pbc/PbcLifecycle.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <template data-component="Modal" data-bind-open="(true)" data-bind-title="(verb + ' ' + record.name)" data-bind-mask-closable="(false)" data-on-cancel="(emit('close'))"><template data-component="Alert" show-icon="" type="info" data-bind-title="(verb === '归档' ? '归档后保留历史,停止新增归属与配置。' : '恢复后可继续新增需求归属与配置。')" description="这项管理操作不会停止服务、删除仓库或变更生产环境。"></template><label for="pbc-lifecycle-reason" class="pbc-label">{{ (verb) }}原因</label><template data-component="Input.TextArea" id="pbc-lifecycle-reason" data-model-value="(reason)" aria-label="状态变更原因" data-bind-rows="(3)" data-bind-maxlength="(500)"></template><template data-component="Alert" data-if="(error)" type="error" show-icon="" data-bind-title="(error)" class="page-alert"></template><template data-slot="footer"><template data-component="Button" data-on-click="(emit('close'))">取消</template><template data-component="Button" type="primary" data-on-click="(save)">确认{{ (verb) }}</template></template></template>
@@ -0,0 +1,16 @@
1
+ import { ref } from '../../runtime/state.js';
2
+ import { Alert, Button, Input, Modal } from "../../runtime/widgets.js";
3
+ import { stateOf } from "./management.js";
4
+ import { usePbcManagement } from "./managementStore.js";
5
+ import { createComponent } from '../../runtime/dom.js';
6
+ export default createComponent({ name: 'PbcLifecycle', propKeys: ["record"], template: new URL('./PbcLifecycle.html', import.meta.url).href, setup(__props, __emit) {
7
+ const props = __props, emit = __emit, store = usePbcManagement(), reason = ref(''), error = ref(''), version = props.record.recordVersion, verb = stateOf(props.record) === 'active' ? '归档' : '恢复';
8
+ function save() { try {
9
+ store.archive(props.record.id, version, reason.value);
10
+ emit('saved');
11
+ }
12
+ catch (e) {
13
+ error.value = e.message;
14
+ } }
15
+ return { ref, Alert, Button, Input, Modal, stateOf, usePbcManagement, props, emit, store, reason, error, version, verb, save };
16
+ } });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/pbc/PbcPage.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <template data-component="Result" data-if="(!intent || !spec || !session.readable('pbc:view', intent.tenantId))" status="403" 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="(2)"><template data-component="Button" data-on-click="(router.push('/intents/' + id + '/spec/review'))">查看规格评审</template></template><template data-component="Alert" data-if="(error || store.notice)" type="error" show-icon="" data-bind-title="(error || store.notice)" class="page-alert"></template><template data-component="Alert" data-if="(sourceError)" type="warning" show-icon="" data-bind-title="(sourceError)" class="page-alert"></template><section data-if="(job?.status === 'done')" class="panel delivery-main"><div class="section-heading"><div><h2>PBC 归属已完成,可以发起研发交付</h2><p class="muted">将本次已确认规格交给所选交付流程,查看执行阶段和产物。</p></div><template data-component="Space" wrap=""><template data-component="Button" data-on-click="(router.push('/pbcs/' + job.pbc.id))">打开 PBC 概览</template><template data-component="Button" data-on-click="(router.push('/pbcs/' + job.pbc.id + '/workspace'))">进入交付工作区</template><template data-component="TaskLaunch" data-bind-intent-id="(id)"></template></template></div></section><template data-component="PbcProgress" data-if="(job)" data-bind-job="(job)"></template><template data-else=""><section class="panel delivery-main"><div class="section-heading"><div><h2>关联已有 PBC</h2><p class="muted">为当前需求确定业务归属。优先复用已有业务系统,按授权选择。</p></div><template data-component="Button" data-bind-disabled="(!!sourceError || !session.can('pbc:create', intent.tenantId))" data-on-click="(wizard = true)">创建新 PBC</template></div><template data-component="PbcPicker" data-bind-tenant-id="(intent.tenantId)" data-bind-value="(selected)" data-on-change="(selected = $event)"></template><div class="pbc-link-review"><div><strong>{{ (target ? '已选择:' + target.name : '请选择一个 PBC') }}</strong><p class="muted">来源意图 v{{ (version?.source.version) }} · 规格 v{{ (version?.number) }} · {{ (target?.ebc || '选择后核对 EBC 归属与负责人') }}</p></div><template data-component="Button" type="primary" data-bind-disabled="(!target || !!sourceError || !session.can('pbc:link', intent.tenantId, target?.id))" data-bind-loading="(submitting)" data-on-click="(link)">核对并关联</template></div></section></template><template data-component="PbcWizard" data-if="(wizard &amp;&amp; !job &amp;&amp; !sourceError &amp;&amp; session.can('pbc:create', intent.tenantId))" data-bind-key="(id)" data-bind-intent-id="(id)" data-on-close="(wizard = false)"></template></template>