@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,157 @@
1
+ import { can } from "../shared/policy.js";
2
+ import { allowedReason, actionLabels, captureVersion, releaseChecks, signature, versionOf, canReadRelease, releaseRows, terminalStates } from "./model.js";
3
+ export const commandKey = (c) => JSON.stringify([c.action, c.note.trim(), !!c.checked, c.input || null, c.outcome || 'pass']);
4
+ export function applyRelease(t, id, a, c) {
5
+ const r = t.releases?.find(r => r.id === id);
6
+ if (!r || !canReadRelease(t, a))
7
+ throw Error('记录不存在或没有查看权限。');
8
+ const old = t.releases?.flatMap(x => x.receipts.map(receipt => ({ release: x, receipt }))).find(x => x.receipt.id === c.id);
9
+ if (old) {
10
+ if (old.release.id !== id || old.receipt.fingerprint !== commandKey(c))
11
+ throw Error('同一提交编号不能用于不同内容,请查询原结果。');
12
+ return r;
13
+ }
14
+ if (r.recordVersion !== c.expected)
15
+ throw Error('发布单版本已被更新,输入已保留;请核对当前版本再提交。');
16
+ const reason = allowedReason(t, r, a, c.action);
17
+ if (reason)
18
+ throw Error(reason);
19
+ if (['approve', 'return', 'pause', 'resume', 'retry', 'rollback', 'stop'].includes(c.action) && (!c.note.trim() || c.note.length > 2000))
20
+ throw Error('请填写 1–2000 字的操作说明。');
21
+ if (c.action === 'approve' && !c.checked)
22
+ throw Error('请勾选确认已核对本版证据、环境和恢复方案。');
23
+ const v = versionOf(r), at = new Date().toISOString(), outcome = c.outcome || 'pass';
24
+ let detail = c.note.trim() || actionLabels[c.action];
25
+ switch (c.action) {
26
+ case 'edit': {
27
+ if (!c.input)
28
+ throw Error('缺少修订内容。');
29
+ if (!can(a, 'release:edit', t.tenantId, r.pbcId, c.input.environment))
30
+ throw Error('没有新目标环境的编辑权限。');
31
+ if (releaseRows(t).some(x => x.id !== r.id && !terminalStates.includes(x.state) && versionOf(x).environment === c.input.environment))
32
+ throw Error('新环境已有未结束的发布单。');
33
+ r.versions.push(captureVersion(t, a, c.input, v.number + 1));
34
+ r.approval = undefined;
35
+ r.state = 'draft';
36
+ detail = '保存修订版;原检查和授权失效,历史保留。';
37
+ break;
38
+ }
39
+ case 'check':
40
+ v.preflight = { signature: signature(v), at, by: a.name, checks: releaseChecks(t, r) };
41
+ detail = '发布前检查:' + v.preflight.checks.filter(c => !['pass', 'na'].includes(c.status)).length + ' 项材料待补齐。';
42
+ break;
43
+ case 'submit':
44
+ r.state = 'pending';
45
+ detail = '提交本版证据,等待人工授权。';
46
+ break;
47
+ case 'approve':
48
+ r.approval = { actorId: a.id, actor: a.name, at, note: c.note.trim(), version: v.number, signature: signature(v) };
49
+ r.state = 'approved';
50
+ break;
51
+ case 'return':
52
+ r.state = 'returned';
53
+ r.approval = undefined;
54
+ break;
55
+ case 'start':
56
+ r.state = 'deploying';
57
+ r.startedAt = at;
58
+ r.executionEnvironment = v.environment;
59
+ detail = '启动模拟部署;当前新增版本流量仍为 0%。';
60
+ break;
61
+ case 'pause':
62
+ r.previousState = r.state;
63
+ r.state = 'paused';
64
+ break;
65
+ case 'resume':
66
+ r.state = r.previousState;
67
+ r.previousState = undefined;
68
+ break;
69
+ case 'retry':
70
+ r.retries++;
71
+ r.state = r.failedStage;
72
+ r.failedStage = undefined;
73
+ detail += '(第 ' + r.retries + '/2 次重试,仅重试失败步骤)';
74
+ break;
75
+ case 'rollback':
76
+ r.state = 'rollingBack';
77
+ detail += ';目标 ' + v.materials.rollback.version + ',数据库状态需单独核查。';
78
+ break;
79
+ case 'stop':
80
+ r.state = 'stopped';
81
+ r.traffic = 0;
82
+ r.finishedAt = at;
83
+ detail += ';本次版本已撤流,数据库状态未自动还原。';
84
+ break;
85
+ case 'advance': {
86
+ if (outcome === 'fail') {
87
+ r.failedStage = r.state;
88
+ r.state = 'failed';
89
+ detail = '模拟步骤失败;已完成步骤与当前流量保留,请检查后有限重试或恢复。';
90
+ break;
91
+ }
92
+ if (r.state === 'deploying') {
93
+ r.state = 'canary';
94
+ r.traffic = v.traffic;
95
+ detail = '部署成功,人工授权覆盖首次灰度;本次版本接入 ' + v.traffic + '% 流量。';
96
+ }
97
+ else if (r.state === 'canary') {
98
+ const errorRate = 0.2, latency = 420, pass = errorRate <= v.errorLimit && latency <= v.latencyLimit;
99
+ r.observation = { at, errorRate, latency, pass };
100
+ r.state = pass ? 'observing' : 'failed';
101
+ if (!pass)
102
+ r.failedStage = 'canary';
103
+ detail = '灰度观测(模拟):错误率 ' + errorRate + '%,P95 ' + latency + 'ms;' + (pass ? '满足本版阈值,可继续全量' : '不满足阈值,禁止全量') + '。';
104
+ }
105
+ else if (r.state === 'observing') {
106
+ if (!r.observation?.pass)
107
+ throw Error('尚无合格的本次灰度观测,禁止全量。');
108
+ r.state = 'succeeded';
109
+ r.traffic = 100;
110
+ r.finishedAt = at;
111
+ detail = '本次版本已全量(模拟);运行验收另行处理。';
112
+ }
113
+ else {
114
+ r.state = 'rolledBack';
115
+ r.traffic = 0;
116
+ r.finishedAt = at;
117
+ detail = '应用已回滚至 ' + v.materials.rollback.version + '(模拟),本次版本流量 0%;数据库未自动还原,需按迁移方案核查。';
118
+ }
119
+ break;
120
+ }
121
+ case 'verify':
122
+ detail = '已查询原请求 ' + r.unconfirmed + ';回执已落库,未重复执行。';
123
+ r.unconfirmed = undefined;
124
+ break;
125
+ case 'delete':
126
+ r.isDeleted = true;
127
+ detail = '逻辑删除未提交草稿。';
128
+ break;
129
+ }
130
+ r.reason = detail;
131
+ r.updatedBy = a.name;
132
+ r.updatedAt = at;
133
+ r.recordVersion++;
134
+ r.receipts.push({ id: c.id, action: c.action, fingerprint: commandKey(c), actorId: a.id, actor: a.name, at, note: c.note, version: versionOf(r).number, state: r.state });
135
+ r.events.push({ id: c.id, at, actor: a.name, action: actionLabels[c.action], detail, version: versionOf(r).number, traffic: r.traffic });
136
+ if (c.unknown)
137
+ r.unconfirmed = c.id;
138
+ const human = t.stages.find(s => t.binding.flow.body.nodes.find(n => n.id === s.nodeId)?.gate === 'production'), publish = t.stages.find(s => t.binding.flow.body.nodes.find(n => n.id === s.nodeId)?.kind === 'publish');
139
+ if (v.environment === 'production') {
140
+ if (human) {
141
+ human.state = r.approval ? 'done' : 'active';
142
+ human.finishedAt = r.approval?.at;
143
+ human.detail = r.approval ? r.approval.actor + ' 授权发布单 v' + r.approval.version : '本发布版尚待人工授权';
144
+ }
145
+ if (r.startedAt && publish) {
146
+ publish.state = r.state === 'succeeded' ? 'done' : ['failed', 'rolledBack', 'stopped'].includes(r.state) ? 'failed' : 'active';
147
+ publish.startedAt = r.startedAt;
148
+ publish.finishedAt = r.finishedAt;
149
+ publish.attempts = r.receipts.filter(x => ['start', 'retry'].includes(x.action)).length;
150
+ publish.detail = detail;
151
+ t.currentId = publish.nodeId;
152
+ }
153
+ }
154
+ if (r.startedAt)
155
+ t.reason = detail;
156
+ return r;
157
+ }
@@ -0,0 +1,136 @@
1
+ import { can, metadata } from "../shared/policy.js";
2
+ import { clone } from "../tasks/domain.js";
3
+ import { captureQuality, reviewsForTask, refsOf } from "../reviews/model.js";
4
+ export const environments = [{ value: 'staging', label: '预发布环境' }, { value: 'production', label: '生产环境' }];
5
+ export const releaseLabels = { draft: '发布草稿', pending: '待人工授权', returned: '已退回', approved: '已授权 · 待执行', deploying: '部署中', canary: '灰度中', observing: '待全量', succeeded: '发布成功', failed: '发布失败', paused: '已暂停', rollingBack: '回滚中', rolledBack: '已回滚', stopped: '已停止' };
6
+ export const releaseColors = { draft: 'default', pending: 'orange', returned: 'orange', approved: 'cyan', deploying: 'blue', canary: 'blue', observing: 'cyan', succeeded: 'green', failed: 'red', paused: 'default', rollingBack: 'orange', rolledBack: 'default', stopped: 'default' };
7
+ export const versionOf = (r) => r.versions.at(-1);
8
+ export const releaseRows = (t) => t.releases?.filter(r => !r.isDeleted) || [];
9
+ export const releaseNeedsAction = (r) => !!r.unconfirmed || !terminalStates.includes(r.state);
10
+ export const activeRelease = (t) => releaseRows(t).filter(releaseNeedsAction).sort((a, b) => Number(!!b.unconfirmed) - Number(!!a.unconfirmed) || b.updatedAt.localeCompare(a.updatedAt))[0];
11
+ export const currentRelease = (t) => activeRelease(t) || releaseRows(t).at(-1);
12
+ export const hasPendingRelease = (t) => !!activeRelease(t) || !releaseRows(t).some(r => versionOf(r).environment === 'production' && terminalStates.includes(r.state));
13
+ export const environmentLabel = (id) => environments.find(e => e.value === id)?.label || id;
14
+ export const signature = (v) => JSON.stringify([v.number, v.sourceKey, v.version, v.environment, v.materials?.digest, v.config, v.description, v.traffic, v.errorLimit, v.latencyLimit, v.rollbackPlan, v.materials?.rollback]);
15
+ export const sourceKey = (t) => JSON.stringify([t.id, t.binding.spec.number, t.binding.spec.source.version, t.binding.flowId, t.binding.flow.number, t.reworks, t.artifacts.filter(a => a.kind !== 'review').map(a => [a.id, a.versions.at(-1)?.number]), reviewsForTask(t).find(r => r.id === captureQuality(t)?.id)?.decision?.requestId || 'machine']);
16
+ export function qualityReason(t) {
17
+ if (t.isDeleted)
18
+ return '来源任务已删除。';
19
+ if (t.status !== 'ready' || t.pendingDesignReview)
20
+ return '来源尚未完成交付质量检查,请先处理任务。';
21
+ const current = captureQuality(t);
22
+ if (!current || current.checks.some(c => c.required && c.status !== 'pass'))
23
+ return '本轮质量检查或独立验证尚未通过。';
24
+ const review = reviewsForTask(t).find(r => r.id === current.id);
25
+ if (current.humanRequired && review?.decision?.action !== 'confirm')
26
+ return '本轮质量尚待人工确认。';
27
+ return '';
28
+ }
29
+ export function validateInput(input) {
30
+ if (!input.name.trim() || input.name.length > 80)
31
+ throw Error('请填写 1–80 字的发布名称。');
32
+ if (!/^[0-9]+\.[0-9]+\.[0-9]+(?:-[a-zA-Z0-9.]+)?$/.test(input.version))
33
+ throw Error('版本号请使用 1.0.0 或 1.0.0-rc.1 格式。');
34
+ if (!environments.some(e => e.value === input.environment))
35
+ throw Error('请选择有效目标环境。');
36
+ if (!input.config.trim() || input.config.length > 100)
37
+ throw Error('请填写 1–100 字的配置快照标识。');
38
+ if (!Number.isFinite(input.traffic) || input.traffic < 1 || input.traffic > 50)
39
+ throw Error('首次灰度比例为 1–50%。');
40
+ if (!Number.isFinite(input.errorLimit) || input.errorLimit <= 0 || input.errorLimit > 100 || !Number.isFinite(input.latencyLimit) || input.latencyLimit <= 0)
41
+ throw Error('请填写有效的错误率和延迟阈值。');
42
+ if (input.description.length > 2000 || input.rollbackPlan.length > 2000)
43
+ throw Error('发布说明与回退方案分别最多 2000 字。');
44
+ }
45
+ export const canReadRelease = (t, a) => !t.isDeleted && can(a, 'task:view', t.tenantId, t.binding.pbcId) && can(a, 'artifact:view', t.tenantId, t.binding.pbcId);
46
+ export function captureVersion(t, actor, input, number) {
47
+ validateInput(input);
48
+ return { ...clone(input), name: input.name.trim(), number, at: new Date().toISOString(), by: actor.name, sourceKey: sourceKey(t), sourceCode: t.code, specVersion: t.binding.spec.number, flowName: t.binding.flow.body.name, flowVersion: t.binding.flow.number, refs: refsOf(t), materials: t.releaseMaterials?.sourceKey === sourceKey(t) ? clone(t.releaseMaterials) : undefined };
49
+ }
50
+ export const terminalStates = ['succeeded', 'rolledBack', 'stopped'];
51
+ export function createRelease(t, actor, input, id) {
52
+ if (!canReadRelease(t, actor) || !can(actor, 'release:edit', t.tenantId, t.binding.pbcId, input.environment))
53
+ throw Error('没有此任务或目标环境的发布创建权限。');
54
+ const fingerprint = JSON.stringify(input), old = t.releases?.find(r => r.id === id);
55
+ if (old) {
56
+ if (old.receipts[0]?.fingerprint !== fingerprint || old.isDeleted)
57
+ throw Error('同一创建编号不能用于不同内容。');
58
+ return old;
59
+ }
60
+ const reason = qualityReason(t);
61
+ if (reason)
62
+ throw Error(reason);
63
+ if (releaseRows(t).some(r => versionOf(r).environment === input.environment && releaseNeedsAction(r)))
64
+ throw Error('此任务在目标环境已有未结束的发布单,请继续原发布单。');
65
+ const v = captureVersion(t, actor, input, 1), at = v.at;
66
+ const r = { ...metadata(actor, at, t.tenantId), id, code: 'REL-' + id.slice(0, 8).toUpperCase(), taskId: t.id, pbcId: t.binding.pbcId, state: 'draft', versions: [v], traffic: 0, retries: 0, reason: '准备发布材料,尚未提交人工授权。', receipts: [{ id, action: 'create', fingerprint, actorId: actor.id, actor: actor.name, at, note: '创建草稿', version: 1, state: 'draft' }], events: [{ id, at, actor: actor.name, action: '创建草稿', detail: '固定来源版本;尚未执行发布。', version: 1, traffic: 0 }] };
67
+ (t.releases ||= []).push(r);
68
+ return r;
69
+ }
70
+ export const permissionFor = { edit: 'release:edit', check: 'release:edit', submit: 'release:submit', approve: 'release:approve', return: 'release:approve', start: 'release:execute', advance: 'release:execute', pause: 'release:pause', resume: 'release:execute', retry: 'release:execute', rollback: 'release:rollback', stop: 'release:rollback', verify: 'task:view', delete: 'release:delete' };
71
+ export const actionLabels = { edit: '修改发布单', check: '检查发布材料', submit: '提交审核', approve: '授权本次发布', return: '退回修改', start: '开始部署', advance: '推进模拟事件', pause: '暂停发布', resume: '恢复发布', retry: '重试失败步骤', rollback: '回滚至稳定版本', stop: '停止并撤流', verify: '查询原请求回执', delete: '删除草稿' };
72
+ export const releaseUrl = (r, execution = false) => '/releases/' + r.taskId + '/' + r.id + (execution ? '/execution' : '');
73
+ export function releaseChecks(t, r) {
74
+ const v = versionOf(r), m = v.materials;
75
+ const check = (id, name, ok, detail) => ({ id, name, status: ok ? 'pass' : 'missing', detail });
76
+ return [check('source', '来源版本', v.sourceKey === sourceKey(t) && !qualityReason(t), v.sourceKey === sourceKey(t) ? qualityReason(t) || '当前来源与绑定版本一致' : '来源版本已变化,请修订发布单并重新检查。'),
77
+ check('artifact', '提交与制品', !!m?.commit && !!m?.digest, m ? m.commit + ' / ' + m.digest : '缺少独立发布材料;历史质量汇总不代表已构建制品。'),
78
+ ...['merge', 'build', 'functional', 'contract', 'eval', 'security', 'migration'].map((id, i) => { const c = m?.checks.find(c => c.id === id); return c ? clone(c) : { id, name: ['合并记录', '构建', '功能测试', '接口契约', 'AI 评估', '安全检查', '迁移兼容性'][i], status: 'missing', detail: '尚无此分项证据。' }; }),
79
+ check('config', '配置快照', !!m && m.config === v.config, m?.config === v.config ? '配置已绑定本次材料' : '材料配置与发布配置不一致,须补齐新配置的检查证据。'),
80
+ check('plan', '发布与回退方案', !!v.description.trim() && !!v.rollbackPlan.trim(), v.description.trim() && v.rollbackPlan.trim() ? '发布说明与回退方案已填写' : '请填写发布说明与回退方案。'),
81
+ check('rollback-target', '恢复路径', !m?.rollback || m.rollback.environment === v.environment, m?.rollback ? '可回滚 ' + m.rollback.version + '(' + environmentLabel(m.rollback.environment) + ');不承诺数据库自动还原。' : '首次发布无稳定版本;失败时停止并撤流,数据另行恢复。')];
82
+ }
83
+ export function allowedReason(t, r, a, action) {
84
+ if (!canReadRelease(t, a) || r.isDeleted)
85
+ return '没有任务与产物查看权限,或记录已删除。';
86
+ const v = versionOf(r), permission = (['advance', 'resume', 'retry'].includes(action) && (r.state === 'rollingBack' || r.previousState === 'rollingBack' || r.failedStage === 'rollingBack')) ? 'release:rollback' : permissionFor[action];
87
+ if (!can(a, permission, t.tenantId, r.pbcId, v.environment))
88
+ return '没有此 PBC / 目标环境的操作权限,请在权限管理配置。';
89
+ if (action === 'verify')
90
+ return r.unconfirmed ? '' : '当前没有待查询的回执。';
91
+ if (r.unconfirmed)
92
+ return '上次提交响应不明,请先查询原请求回执。';
93
+ if (action === 'delete')
94
+ return r.state === 'draft' && r.receipts.every(x => ['create', 'edit', 'check'].includes(x.action)) && !r.startedAt ? '' : '只可删除未提交、无授权或执行历史的发布草稿。';
95
+ if (action === 'edit')
96
+ return !r.startedAt && ['draft', 'returned', 'pending', 'approved'].includes(r.state) ? '' : '执行开始后版本不能修改,请创建后续发布单。';
97
+ if (action === 'check')
98
+ return ['draft', 'returned'].includes(r.state) ? '' : '请先修订为草稿,再重新检查。';
99
+ if (action === 'return')
100
+ return r.state === 'pending' ? '' : '当前发布单不在待审核状态。';
101
+ if (action === 'pause')
102
+ return ['deploying', 'canary', 'observing', 'rollingBack'].includes(r.state) ? '' : '当前没有可暂停的执行步骤。';
103
+ if (action === 'rollback')
104
+ return r.traffic > 0 && ['canary', 'observing', 'succeeded', 'failed', 'paused'].includes(r.state) && v.materials?.rollback?.environment === v.environment ? '' : '尚无可用的稳定版本回滚目标;首发请停止并撤流。';
105
+ if (action === 'stop')
106
+ return r.startedAt && !['rolledBack', 'stopped'].includes(r.state) ? '' : '当前没有可停止的发布。';
107
+ if (action === 'resume' && r.state !== 'paused')
108
+ return '当前发布未暂停。';
109
+ if (action === 'retry' && (r.state !== 'failed' || !r.failedStage))
110
+ return '当前没有失败步骤。';
111
+ if (action === 'retry' && r.retries >= 2)
112
+ return '已达到本发布单的 2 次重试次数,请停止或人工恢复。';
113
+ if (action === 'advance' && !['deploying', 'canary', 'observing', 'rollingBack'].includes(r.state))
114
+ return '当前没有可推进的步骤。';
115
+ const recovery = r.state === 'rollingBack' || (['retry', 'resume'].includes(action) && (r.failedStage === 'rollingBack' || r.previousState === 'rollingBack'));
116
+ if (recovery)
117
+ return '';
118
+ if (action === 'start' && r.state !== 'approved')
119
+ return '本版本尚未获得人工授权,不能执行发布。';
120
+ if (action === 'submit' && !['draft', 'returned'].includes(r.state))
121
+ return '当前状态不能提交审核。';
122
+ if (action === 'approve' && r.state !== 'pending')
123
+ return '本版本不在待人工授权状态。';
124
+ if (v.sourceKey !== sourceKey(t) || qualityReason(t))
125
+ return '来源或质量版本已经变化,请重新检查并提交发布。';
126
+ const failures = releaseChecks(t, r).filter(c => !['pass', 'na'].includes(c.status));
127
+ if (failures.length)
128
+ return '发布材料或证据尚未齐备:' + failures.map(c => c.name).join('、');
129
+ if (!v.preflight || v.preflight.signature !== signature(v))
130
+ return '请先完成本版本的发布前检查。';
131
+ if (['start', 'advance', 'resume', 'retry'].includes(action) && (!r.approval || r.approval.signature !== signature(v)))
132
+ return '人工授权已失效,请重新核对并授权本版本。';
133
+ return '';
134
+ }
135
+ export function taskReleaseLabel(t, a) { const r = currentRelease(t); return canReadRelease(t, a) && r ? (versionOf(r).environment === 'production' ? '' : environmentLabel(versionOf(r).environment) + ' · ') + (r.unconfirmed ? '结果待核实' : releaseLabels[r.state]) : ''; }
136
+ export function releaseSummary(r) { return r.unconfirmed ? '本次提交结果尚未核实,请查询原请求回执;核实前保留待办,不重复执行。' : environmentLabel(versionOf(r).environment) + ' · ' + r.reason; }
@@ -0,0 +1,76 @@
1
+ import { computed, ref } from '../../runtime/state.js';
2
+ import { defineStore } from "../../runtime/state.js";
3
+ import { useSession } from "../shared/session.js";
4
+ import { usePbcs } from "../pbc/store.js";
5
+ import { metadata } from "../shared/policy.js";
6
+ import { taskRecords, taskReadError, commitTaskChanges, seedTasks } from "../tasks/registry.js";
7
+ import { clone, taskEvent } from "../tasks/domain.js";
8
+ import { applyRelease } from "./commands.js";
9
+ import { allowedReason, canReadRelease, createRelease, sourceKey, qualityReason, releaseRows } from "./model.js";
10
+ export const useReleases = defineStore('releases', () => {
11
+ const session = useSession(), pbcs = usePbcs(), scene = ref('normal'), response = ref('success');
12
+ const tasks = computed(() => taskRecords.value.filter(t => canReadRelease(t, session.actor)));
13
+ const rows = computed(() => tasks.value.flatMap(task => releaseRows(task).map(release => ({ id: release.id, task, release, project: task.binding.project, recordVersion: release.recordVersion }))).sort((a, b) => b.release.updatedAt.localeCompare(a.release.updatedAt)));
14
+ const find = (id) => rows.value.find(r => r.id === id);
15
+ const pbcReason = (t) => { const p = pbcs.catalog.find(p => p.id === t.binding.pbcId); return !p || p.isDeleted || p.state !== 'active' ? 'PBC 不存在或已归档,请先处理 PBC 状态。' : ''; };
16
+ const sourceReason = (t) => pbcReason(t) || qualityReason(t);
17
+ function reason(row, action) { return session.state !== 'active' ? '登录状态已失效,请重新登录。' : (!['rollback', 'stop', 'pause', 'verify', 'delete'].includes(action) ? pbcReason(row.task) : '') || allowedReason(row.task, row.release, session.actor, action); }
18
+ function current(id) { const t = tasks.value.find(t => t.id === id); if (!t)
19
+ throw Error('任务不存在或无权访问。'); return clone(t); }
20
+ function persist(t, expected, action) { t.recordVersion++; t.updatedBy = session.actor.name; t.updatedAt = new Date().toISOString(); taskEvent(t, session.actor.name, action, '发布单、版本证据及操作回执已同步(模拟)。'); commitTaskChanges([t], [{ id: t.id, version: expected }]); }
21
+ function create(taskId, input, id, expected) { session.require('release:edit', undefined, undefined, input.environment); const t = current(taskId); if (t.recordVersion !== expected && !t.releases?.some(r => r.id === id))
22
+ throw Error('来源任务已更新,输入保留,请核对当前版本。'); const reason = sourceReason(t); if (reason)
23
+ throw Error(reason); session.writeCheck(); const prior = t.releases?.find(r => r.id === id), mode = response.value; response.value = 'success'; if (mode === 'failure' && !prior)
24
+ throw Error('创建提交失败,尚未保存;输入已保留。'); const r = createRelease(t, session.actor, input, id); if (!prior) {
25
+ if (mode === 'unknown')
26
+ r.unconfirmed = id;
27
+ persist(t, t.recordVersion, '创建发布草稿');
28
+ } return r; }
29
+ function apply(taskId, id, command) { session.require('task:view'); const t = current(taskId), r = t.releases?.find(r => r.id === id); if (!r)
30
+ throw Error('发布单不存在。'); const replay = r.receipts.some(x => x.id === command.id); if (!replay) {
31
+ const row = find(id);
32
+ const why = reason(row, command.action);
33
+ if (why)
34
+ throw Error(why);
35
+ } session.writeCheck(); const mode = response.value; response.value = 'success'; if (mode === 'failure' && !replay)
36
+ throw Error('提交失败(模拟服务不可用),未执行本次操作;输入保留。'); const result = applyRelease(t, id, session.actor, { ...command, unknown: mode === 'unknown' && command.action !== 'verify' }); if (!replay)
37
+ persist(t, t.recordVersion, '发布:' + command.action); return result; }
38
+ function checkDelete(target) { const row = find(target.id); if (!row)
39
+ throw Error('记录不存在或无权访问。'); if (row.recordVersion !== target.recordVersion)
40
+ throw Error('记录已更新,请重新选择。'); const why = reason(row, 'delete'); if (why)
41
+ throw Error(why); }
42
+ function removeMany(targets) { targets.forEach(checkDelete); session.writeCheck(); const changed = new Map(), expected = []; for (const target of targets) {
43
+ const row = find(target.id);
44
+ let t = changed.get(row.task.id);
45
+ if (!t) {
46
+ t = clone(row.task);
47
+ changed.set(t.id, t);
48
+ expected.push({ id: t.id, version: t.recordVersion });
49
+ }
50
+ applyRelease(t, target.id, session.actor, { id: crypto.randomUUID(), action: 'delete', expected: target.recordVersion, note: '删除未提交草稿' });
51
+ } for (const t of changed.values()) {
52
+ t.recordVersion++;
53
+ t.updatedBy = session.actor.name;
54
+ t.updatedAt = new Date().toISOString();
55
+ taskEvent(t, session.actor.name, '批量删除发布草稿', '仅删除本次选择的未提交草稿;历史记录保留。');
56
+ } commitTaskChanges([...changed.values()], expected); }
57
+ function addExamples() { session.require('task:create', 'heating', 'pbc-0'); session.require('task:operate', 'heating', 'pbc-0'); session.writeCheck(); const changes = []; for (let i = 0; i < 2; i++) {
58
+ const id = 'release-example-' + i;
59
+ if (taskRecords.value.some(t => t.id === id))
60
+ continue;
61
+ const t = clone(seedTasks()[6]);
62
+ t.id = id;
63
+ t.code = 'DEL-RELEASE-00' + (i + 1);
64
+ t.name = i ? '智能分诊 · 稳定版本升级样例' : '智能分诊 · 首次发布样例';
65
+ Object.assign(t, metadata(session.actor, new Date().toISOString(), 'heating'));
66
+ t.owner = session.actor.name;
67
+ t.note = 'PT-06a 独立模拟样例;材料与观测均为预置,不代表真实 CI 或发布。';
68
+ for (const a of t.artifacts)
69
+ for (const v of a.versions)
70
+ v.taskId = id;
71
+ t.releaseMaterials = { sourceKey: sourceKey(t), commit: 'demo-commit-' + i, digest: 'sha256:demo-artifact-' + i, config: 'config-v1', by: '发布材料演示器', at: new Date().toISOString(), migration: i ? 'expand-contract' : 'none', checks: ['merge', 'build', 'functional', 'contract', 'eval', 'security', 'migration'].map((id, j) => ({ id, name: ['合并记录', '构建', '功能测试', '接口契约', 'AI 评估', '安全检查', '迁移兼容性'][j], status: 'pass', detail: '预置模拟证据:' + (id === 'migration' ? (i ? '采用兼容扩展迁移;应用回滚后数据库仍需核查。' : '本次无数据库变更。') : '本版检查通过(未连接真实 CI)。') })), rollback: i ? { version: '0.9.0', digest: 'sha256:demo-stable', config: 'config-stable', environment: 'production' } : undefined };
72
+ changes.push(t);
73
+ } if (changes.length)
74
+ commitTaskChanges(changes, changes.map(t => ({ id: t.id }))); return changes.length; }
75
+ return { session, tasks, rows, find, reason, sourceReason, create, apply, removeMany, checkDelete, addExamples, scene, response, notice: taskReadError };
76
+ });
@@ -0,0 +1,3 @@
1
+ <!-- 来源:src/reviews/ReviewDetail.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <template data-component="Result" data-if="(!row)" status="403" title="评审记录不存在或无权访问"><template data-slot="extra"><template data-component="Button" data-on-click="(router.push('/reviews'))">返回评审列表</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('/reviews'))">← 返回评审列表</template><div class="agent-title"><h1>{{ (row.review.title) }}</h1><template data-component="Tag" data-bind-color="(stateColors[row.status])">{{ (stateLabels[row.status]) }}</template></div><p>{{ (row.task.name) }} · {{ (row.review.code) }}</p></div><template data-component="Space" wrap=""><template data-component="Button" data-on-click="(router.push('/tasks/' + row.task.id))">交付任务</template><template data-component="Button" data-bind-disabled="(!store.session.can('pbc:view', row.task.tenantId, row.task.binding.pbcId))" data-on-click="(router.push('/pbcs/' + row.task.binding.pbcId + '/workspace'))">PBC 工作区</template></template></div><template data-component="Alert" data-if="(error)" type="error" show-icon="" data-bind-title="(error)" class="page-alert"></template><template data-component="Alert" data-if="(row.status === 'superseded')" type="warning" show-icon="" title="此记录依据的版本已经更新" description="历史证据保留,继续处理请进入当前评审。" class="page-alert"><template data-slot="action"><template data-component="Button" data-if="(current)" data-on-click="(router.push(reviewUrl(row.task.id, current.id)))">打开当前评审</template></template></template><template data-component="Alert" data-if="(row.status === 'automatic')" type="success" show-icon="" title="当前质量点按已登记策略由机器检查通过" description="没有增加额外人工批准。生产发布仍需人工授权,当前尚未发布。" class="page-alert"></template><div class="review-detail-grid"><section class="agent-panel"><template data-component="Tabs" data-model-active-key="(tab)" data-bind-items="([{ key: 'evidence', label: '检查与版本证据' }, { key: 'history', label: '处理记录' }, { key: 'metadata', label: '基础信息' }])"></template><template data-component="ReviewEvidence" data-if="(tab === 'evidence')" data-bind-row="(row)"></template><template data-else-if="(tab === 'history')"><h2>本次处理结果</h2><template data-if="(row.review.decision)"><template data-component="Tag" data-bind-color="(stateColors[row.status])">{{ (stateLabels[row.status]) }}</template><p>{{ (row.review.decision.actor) }} · {{ (formatDate(row.review.decision.at)) }}</p><p class="review-text">{{ (row.review.decision.note) }}</p><p data-if="(row.review.decision.impact)" class="review-text">影响说明:{{ (row.review.decision.impact) }}</p><template data-component="Button" data-if="(row.review.decision.nextReviewId)" type="primary" data-on-click="(router.push(reviewUrl(row.task.id, row.review.decision.nextReviewId)))">查看新设计 v{{ (row.review.decision.newVersion) }}</template></template><p data-else="" class="muted">本记录尚无人工作出处理;不会用 Agent 的文字代替人工批准。</p><h3>同一任务的评审历史</h3><ol class="review-history"><li data-each="r in (store.rows.filter(r =&gt; r.task.id === row.task.id))" data-bind-key="(r.id)"><template data-component="Button" type="link" data-on-click="router.push(reviewUrl(r.task.id, r.review.id));
3
+ tab = 'history';">{{ (r.review.code) }} · {{ (r.review.title) }}</template><template data-component="Tag" data-bind-color="(stateColors[r.status])">{{ (stateLabels[r.status]) }}</template><small>{{ (formatDate(r.review.updatedAt)) }} · {{ (r.review.decision?.actor || r.review.verifier) }}</small></li></ol><p class="muted">审批和验证历史只读保留,不适用删除。</p></template><template data-else=""><template data-component="RecordMetadata" data-bind-record="(row.review)"></template><p>所属 PBC:{{ (row.project) }} · {{ (tenantLabel(row.task.tenantId)) }}</p><p>实际处理人:{{ (row.review.decision?.actor || '尚未处理') }} · {{ (formatDate(row.review.decision?.at || '')) }}</p></template></section><aside class="review-aside"><section data-if="(!closed)" class="agent-panel quality-review-actions"><h2>处理当前评审</h2><div data-each="a in ['confirm', 'edit', 'replan']" data-bind-key="(a)"><template data-component="Tooltip" data-bind-title="(store.reason(row, a))"><span><template data-component="Button" block="" data-bind-type="(a === 'confirm' ? 'primary' : 'default')" data-bind-disabled="(!!store.reason(row, a))" data-on-click="(process(a))">{{ (names[a]) }}</template></span></template><small data-if="(store.reason(row, a))" class="muted">{{ (store.reason(row, a)) }}</small></div><p class="review-footnote">处理只作用于本记录的版本。质量确认完成后,仍须进入后续发布授权。</p></section><section class="agent-panel"><h2>本次评审依据</h2><dl class="task-trace"><dt>PBC</dt><dd>{{ (row.project) }}</dd><dt>交付任务</dt><dd>{{ (row.task.code) }}</dd><dt>来源规格</dt><dd>{{ (row.task.binding.spec.source.code) }} · 规格 v{{ (row.task.binding.spec.number) }}<br>{{ (row.task.binding.spec.confirmedBy) }} · {{ (formatDate(row.task.binding.spec.confirmedAt || '')) }}</dd><dt>流程版本</dt><dd>{{ (row.task.binding.flow.body.name) }} · v{{ (row.task.binding.flow.number) }}</dd><dt>独立验证者</dt><dd>{{ (row.review.verifier) }}</dd><dt>验证时间</dt><dd>{{ (formatDate(row.review.verificationAt || '')) }}</dd><dt>分级与适用确认点</dt><dd><template data-component="Tag">{{ (row.review.grade ? row.review.grade + ' 档(已登记样例)' : '任务未登记分级') }}</template><p>{{ (row.review.policyReason) }}</p></dd><dt>处理轮次</dt><dd>第 {{ (row.review.iteration + 1) }} 轮 · 当前已处理 {{ (row.task.reworks) }} / {{ (reviewBudget(row.task)) }} 次(原型上限)</dd></dl><template data-component="Button" data-bind-disabled="(!store.session.can('spec:view', row.task.tenantId))" data-on-click="(router.push('/intents/' + row.task.binding.intentId + '/spec'))">查看当前需求规格</template><p class="muted">当前规格可能有新版本;本记录始终引用上述绑定版本。</p></section><section data-if="(row.review.kind === 'design' &amp;&amp; ['checking', 'blocked'].includes(row.status))" class="agent-panel review-demo"><h2>模拟设计复核</h2><p>仅用于演示针对新设计版本的检查响应。</p><template data-component="Select" data-model-value="(outcome)" aria-label="设计复核演示结果" data-bind-options="([{ value: 'pass', label: '本次复核通过' }, { value: 'fail', label: '本次复核未通过' }])"></template><template data-component="Button" data-bind-disabled="(!store.session.can('task:operate', row.task.tenantId, row.task.binding.pbcId))" data-on-click="(validate)">接收一次模拟复核结果</template></section></aside></div></template>
@@ -0,0 +1,26 @@
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, Select, Tooltip } from "../../runtime/widgets.js";
4
+ import { useReviews } from "./store.js";
5
+ import { stateLabels, stateColors, reviewUrl, actionableReview, reviewBudget } from "./model.js";
6
+ import { formatDate, tenantLabel } from "../shared/policy.js";
7
+ import RecordMetadata from "../shared/RecordMetadata.js";
8
+ import ReviewEvidence from "./ReviewEvidence.js";
9
+ import { createComponent } from '../../runtime/dom.js';
10
+ export default createComponent({ name: 'ReviewDetail', propKeys: [], template: new URL('./ReviewDetail.html', import.meta.url).href, setup(__props, __emit) {
11
+ const store = useReviews(), route = useRoute(), router = useRouter(), tab = ref(String(route.query.tab || 'evidence')), error = ref(''), outcome = ref('pass');
12
+ const row = computed(() => store.find(String(route.params.taskId), String(route.params.reviewId))), current = computed(() => row.value && actionableReview(row.value.task));
13
+ watch(() => route.query.tab, value => tab.value = String(value || 'evidence'));
14
+ const closed = computed(() => row.value && ['approved', 'edited', 'replanned', 'automatic', 'superseded'].includes(row.value.status));
15
+ function process(action) { if (row.value)
16
+ router.push(reviewUrl(row.value.task.id, row.value.review.id) + '/process?action=' + action); }
17
+ function validate() { if (!row.value)
18
+ return; error.value = ''; try {
19
+ store.tasks.reviewValidation(row.value.task.id, row.value.task.recordVersion, row.value.review.id, outcome.value);
20
+ }
21
+ catch (e) {
22
+ error.value = e.message;
23
+ } }
24
+ const names = { confirm: '确认', edit: '修改', replan: '重新规划' };
25
+ return { computed, ref, watch, useRoute, useRouter, Alert, Button, Result, Space, Tabs, Tag, Select, Tooltip, useReviews, stateLabels, stateColors, reviewUrl, actionableReview, reviewBudget, formatDate, tenantLabel, RecordMetadata, ReviewEvidence, store, route, router, tab, error, outcome, row, current, closed, process, validate, names };
26
+ } });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/reviews/ReviewEvidence.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <section class="review-section"><div class="section-heading"><div><h2>检查结果</h2><p>查看汇总与独立验证;未提供的分项证据明确列出。</p></div><template data-component="Tag">绑定当前评审版本</template></div><div class="review-checks"><details data-each="c in (row.review.checks)" data-bind-key="(c.id)" data-bind-open="(c.status === 'fail')"><summary><template data-component="Tag" data-bind-color="(c.status === 'pass' ? 'green' : c.status === 'fail' ? 'red' : c.status === 'pending' ? 'blue' : 'default')">{{ ({ pass: '通过(模拟)', fail: '未通过', pending: '待验证', unavailable: '未提供' }[c.status]) }}</template><strong>{{ (c.name) }}</strong><span data-if="(c.required)" class="muted">本次必需</span></summary><pre>{{ (c.detail) }}</pre></details></div></section><section class="review-section"><div class="section-heading"><div><h2>评审发现</h2><p>每项问题保留检查项编号、严重度、位置和依据。</p></div><template data-component="Select" data-model-value="(dimension)" aria-label="评审发现维度" data-bind-options="([{ value: 'all', label: '全部维度' }, ...dimensions.map(d =&gt; ({ value: d.id, label: d.id + ' · ' + d.label }))])"></template></div><div class="review-dimensions"><button data-each="d in (dimensions)" data-bind-key="(d.id)" data-bind-aria-pressed="(dimension === d.id)" data-on-click="(dimension = dimension === d.id ? 'all' : d.id)"><strong>{{ (d.id) }} <span>{{ (d.label) }}</span></strong><small>{{ (row.review.findings.filter(f =&gt; f.dimension === d.id).length) }} 项登记发现</small></button></div><template data-component="Alert" class="page-alert" type="info" show-icon="" title="维度计数仅表示报告中登记的问题" description="未登记问题不等于该维度已经完成检查。ARC 包含数据结构、迁移安全、租户与审计字段及索引;本地样例没有真实数据库验证。"></template><article data-each="f in (findings)" data-bind-key="(f.id)" class="review-finding"><div><template data-component="Tag" color="red">{{ (f.severity === 'high' ? '严重' : f.severity === 'medium' ? '重要' : '建议') }}</template><span class="mono">{{ (f.id) }}</span><h3>{{ (f.title) }}</h3></div><pre>{{ (f.detail) }}</pre><template data-component="Button" type="link" data-on-click="(router.push('/tasks/' + row.task.id + '/artifacts/' + f.artifactId + '?version=' + f.version))">查看依据:{{ (row.task.artifacts.find(a =&gt; a.id === f.artifactId)?.name) }} v{{ (f.version) }}</template></article><p data-if="(!findings.length)" class="muted">{{ (dimension === 'all' ? '本报告没有登记具体发现,请同时核对上方必需检查。' : '该维度没有登记发现。') }}</p></section><section class="review-section"><div class="section-heading"><div><h2>依据产物与版本差异</h2><p>所有引用指向本次评审的固定版本。</p></div><template data-component="Select" data-model-value="(selected)" aria-label="选择评审依据产物" data-bind-options="(row.review.refs.map(r =&gt; ({ value: r.id, label: r.name + ' · v' + r.version })))" data-bind-placeholder="(refItem?.name)"></template></div><template data-component="Space" wrap="" class="review-ref-links"><template data-component="Button" data-each="r in (row.review.refs)" data-bind-key="(r.id)" size="small" data-on-click="(router.push(artifactUrl(r)))">{{ (r.name) }} v{{ (r.version) }}</template></template><template data-if="(version)"><h3>{{ (refItem?.name) }} · v{{ (version.number) }}</h3><pre class="review-document">{{ (version.content) }}</pre><details data-if="(previous)" class="review-diff"><summary>与 v{{ (previous.number) }} 对比 · 新增/移除内容</summary><pre data-each="(line,i) in (diff)" data-bind-key="(i)" class="task-diff-line" data-bind-class="(line.kind)">{{ (line.kind === 'added' ? '+ ' : '− ') }}{{ (line.text) }}</pre><p data-if="(!diff.length)">正文相同,版本与执行记录仍分别保留。</p></details></template><template data-component="Alert" data-else="" type="warning" show-icon="" title="该版本内容已不可访问,请核对来源,不可据此确认。"></template></section>
@@ -0,0 +1,14 @@
1
+ import { computed, ref } from '../../runtime/state.js';
2
+ import { Button, Select, Space, Tag, Alert } from "../../runtime/widgets.js";
3
+ import { useRouter } from "../../runtime/router.js";
4
+ import { dimensions, evidenceVersion } from "./model.js";
5
+ import { createComponent } from '../../runtime/dom.js';
6
+ export default createComponent({ name: 'ReviewEvidence', propKeys: ["row"], template: new URL('./ReviewEvidence.html', import.meta.url).href, setup(__props, __emit) {
7
+ const props = __props, router = useRouter(), dimension = ref('all'), selected = ref('');
8
+ const findings = computed(() => props.row.review.findings.filter(f => dimension.value === 'all' || f.dimension === dimension.value));
9
+ const refItem = computed(() => props.row.review.refs.find(r => r.id === selected.value) || props.row.review.refs.find(r => r.kind === 'design') || props.row.review.refs[0]);
10
+ const version = computed(() => refItem.value && evidenceVersion(props.row.task, refItem.value)), previous = computed(() => props.row.task.artifacts.find(a => a.id === refItem.value?.id)?.versions.find(v => v.number === (version.value?.number || 1) - 1));
11
+ const diff = computed(() => { const old = previous.value?.content.split('\n') || [], current = version.value?.content.split('\n') || []; return [...old.filter(t => !current.includes(t)).map(text => ({ kind: 'removed', text })), ...current.filter(t => !old.includes(t)).map(text => ({ kind: 'added', text }))]; });
12
+ const artifactUrl = (r) => '/tasks/' + props.row.task.id + '/artifacts/' + r.id + '?version=' + r.version;
13
+ return { computed, ref, Button, Select, Space, Tag, Alert, useRouter, dimensions, evidenceVersion, props, router, dimension, selected, findings, refItem, version, previous, diff, artifactUrl };
14
+ } });
@@ -0,0 +1,2 @@
1
+ <!-- 来源:src/reviews/ReviewProcess.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
2
+ <template data-component="Result" data-if="(!row)" status="403" title="评审记录不存在或无权访问"><template data-slot="extra"><template data-component="Button" data-on-click="(router.push('/reviews'))">返回评审列表</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(reviewUrl(row.task.id, row.review.id)))">← 返回评审证据</template><h1>{{ (result ? '处理结果' : names[action]) }}</h1><p>{{ (row.task.name) }} · {{ (row.review.code) }}</p></div><template data-component="Tag">本地交互原型</template></div><section data-if="(result)" class="agent-panel review-result"><template data-component="Result" status="success" data-bind-title="({ confirm: '本版本评审已确认', edit: '修改已保存,等待重新验证', replan: '规划意见已保存,等待重新验证' }[result.action])" data-bind-sub-title="(result.action === 'confirm' ? (row.review.kind === 'quality' ? '质量确认已记录。生产发布尚未授权,也尚未执行。' : '确认已写入原任务,可以继续后续实现与检查。') : '新设计尚未获得批准。复核与人工确认后,才继续生成代码和新的测试、验证证据。')"></template><dl class="task-trace"><dt>处理人 / 时间</dt><dd>{{ (result.actor) }} · {{ (formatDate(result.at)) }}</dd><dt>本次说明</dt><dd class="review-text">{{ (result.note) }}</dd><template data-if="(result.impact)"><dt>影响说明</dt><dd class="review-text">{{ (result.impact) }}</dd></template><dt>提交编号</dt><dd class="mono">{{ (result.requestId) }}</dd><dt>版本依据</dt><dd>{{ (row.review.refs.map(r =&gt; r.name + ' v' + r.version).join(' · ')) }}</dd></dl><template data-component="Space" wrap=""><template data-component="Button" data-if="(result.nextReviewId)" type="primary" data-on-click="(router.push(reviewUrl(row.task.id, result.nextReviewId)))">查看新设计 v{{ (result.newVersion) }} 的评审</template><template data-component="Button" data-bind-type="(result.nextReviewId ? 'default' : 'primary')" data-on-click="(router.push('/tasks/' + row.task.id))">返回交付任务</template><template data-component="Button" data-on-click="(router.push('/workbench'))">回到工作台</template><template data-component="Button" data-on-click="(router.push(reviewUrl(row.task.id, row.review.id) + '?tab=history'))">查看处理记录</template></template></section><div data-else="" class="review-process-grid"><section class="agent-panel"><template data-component="Alert" data-if="(unknown)" class="page-alert" type="warning" show-icon="" title="提交结果待核实" description="提交响应未能确认。请先查询同一提交编号的结果,避免重复处理。输入和编号已保留。"><template data-slot="action"><template data-component="Button" data-on-click="(verify)">核实本次提交</template></template></template><template data-component="Alert" data-if="(draftNotice)" class="page-alert" type="info" show-icon="" data-bind-title="(draftNotice)"></template><div data-if="(error)" id="review-errors" role="alert" tabindex="-1" class="review-error"><strong>未完成提交</strong><p>{{ (error) }}</p></div><template data-component="Alert" data-if="(reason &amp;&amp; !unknown)" type="warning" show-icon="" data-bind-title="(reason)" class="page-alert"></template><template data-component="Alert" data-if="(row.task.recordVersion !== expected &amp;&amp; !unknown)" type="warning" show-icon="" title="任务记录已有更新" description="已保留输入;请先核对最新证据,旧记录版本不能直接提交。" class="page-alert"><template data-slot="action"><template data-component="Button" data-bind-disabled="(!!reason)" data-on-click="(recheck)">载入当前记录并重新核对</template></template></template><form data-on-submit.prevent="(submit)"><div data-if="(action === 'edit')" class="review-field"><label for="review-content">修改后的设计内容 <span>*</span></label><p id="review-content-help" class="muted">只生成新的设计版本;原设计、代码、报告与验证证据均保留。</p><template data-component="Input.TextArea" id="review-content" data-model-value="(content)" aria-describedby="review-content-help" data-bind-rows="(14)" data-bind-maxlength="(20000)" show-count="" data-bind-disabled="(unknown)"></template></div><div data-if="(action === 'replan')" class="review-field"><label for="review-impact">调整范围与影响 <span>*</span></label><p class="muted">说明要调整的步骤、影响的产物和需要再次验证的内容。原任务绑定的需求规格与流程版本保持可追溯。</p><template data-component="Input.TextArea" id="review-impact" data-model-value="(impact)" data-bind-rows="(5)" data-bind-maxlength="(2000)" show-count="" data-bind-disabled="(unknown)" placeholder="例如:补充重复确认的幂等设计,重新实现派单逻辑并覆盖并发重试测试。"></template></div><div class="review-field"><label for="review-note">{{ (action === 'confirm' ? '确认说明' : action === 'edit' ? '本次修改原因' : '重新规划意见') }} <span>*</span></label><template data-component="Input.TextArea" id="review-note" data-model-value="(note)" data-bind-rows="(4)" data-bind-maxlength="(1000)" show-count="" data-bind-disabled="(unknown)" placeholder="请说明判断依据、处理原因或仍需关注的事项。"></template></div><div data-if="(action === 'confirm')" class="review-field"><template data-component="Checkbox" id="review-checked" data-model-checked="(checked)" data-bind-disabled="(unknown)">我已核对本记录引用的版本、检查结论及适用确认点。</template></div><p class="review-footnote">{{ (action === 'confirm' ? '确认只对本次引用的版本有效;不代替后续生产发布授权。' : '提交后形成新的设计与评审记录,重新验证及确认后才继续实现。') }} 输入暂存在此身份使用的本浏览器。</p><div class="review-submit"><template data-component="Button" data-on-click="(router.push(reviewUrl(row.task.id, row.review.id)))">返回并保留输入</template><template data-component="Button" type="primary" html-type="submit" data-bind-loading="(busy)" data-bind-disabled="(!!reason || unknown || row.task.recordVersion !== expected)">{{ (action === 'confirm' ? '提交确认' : action === 'edit' ? '保存为新设计版本' : '提交规划意见并生成设计建议') }}</template></div></form></section><aside class="agent-panel review-aside"><h2>本次处理对象</h2><p>{{ (row.review.title) }}</p><p>{{ (row.project) }}</p><dl class="task-trace"><dt>绑定需求与流程</dt><dd>{{ (row.task.binding.spec.source.code) }} · 规格 v{{ (row.task.binding.spec.number) }}<br>{{ (row.task.binding.flow.body.name) }} · v{{ (row.task.binding.flow.number) }}</dd><dt>引用产物</dt><dd><p data-each="r in (row.review.refs)" data-bind-key="(r.id)">{{ (r.name) }} · v{{ (r.version) }}</p></dd><dt>处理对象的记录版本</dt><dd>v{{ (expected) }}</dd><dt>提交编号</dt><dd class="mono">{{ (requestId) }}</dd></dl><template data-component="Button" data-on-click="(router.push(reviewUrl(row.task.id, row.review.id)))">重新阅读版本证据</template><p class="muted">返回证据再进入此页,输入会保留。</p></aside></div></template>
@@ -0,0 +1,113 @@
1
+ import { computed, ref, watch, nextTick } from '../../runtime/state.js';
2
+ import { useRoute, useRouter } from "../../runtime/router.js";
3
+ import { Alert, Button, Checkbox, Input, Result, Space, Tag } from "../../runtime/widgets.js";
4
+ import { useReviews } from "./store.js";
5
+ import { reviewUrl } from "./model.js";
6
+ import { latestArtifact } from "../tasks/domain.js";
7
+ import { formatDate } from "../shared/policy.js";
8
+ import { createComponent } from '../../runtime/dom.js';
9
+ export default createComponent({ name: 'ReviewProcess', propKeys: [], template: new URL('./ReviewProcess.html', import.meta.url).href, setup(__props, __emit) {
10
+ const store = useReviews(), route = useRoute(), router = useRouter();
11
+ const row = computed(() => store.find(String(route.params.taskId), String(route.params.reviewId)));
12
+ const action = computed(() => ['edit', 'replan'].includes(String(route.query.action)) ? route.query.action : 'confirm');
13
+ const names = { confirm: '确认评审', edit: '修改设计', replan: '重新规划' };
14
+ const note = ref(''), content = ref(''), impact = ref(''), checked = ref(false), requestId = ref(''), expected = ref(0), error = ref(''), draftNotice = ref(''), unknown = ref(false), busy = ref(false), receipt = ref(), loaded = ref(false);
15
+ const draftKey = computed(() => ['i3-prototype-antdv-review-draft-v012', store.session.actor.id, route.params.taskId, route.params.reviewId, action.value].join(':'));
16
+ const reason = computed(() => row.value ? store.reason(row.value, action.value) : '记录不可访问。');
17
+ const result = computed(() => receipt.value || (!unknown.value ? row.value?.review.decision : undefined));
18
+ function boot() {
19
+ loaded.value = false;
20
+ error.value = '';
21
+ draftNotice.value = '';
22
+ receipt.value = undefined;
23
+ unknown.value = false;
24
+ note.value = '';
25
+ impact.value = '';
26
+ checked.value = false;
27
+ requestId.value = crypto.randomUUID();
28
+ expected.value = row.value?.task.recordVersion || 0;
29
+ content.value = row.value ? (latestArtifact(row.value.task, 'design')?.content || '设计建议(模拟)\n依据规格 v' + row.value.task.binding.spec.number + '\n' + row.value.task.binding.spec.content.requirements) : '';
30
+ try {
31
+ const raw = localStorage.getItem(draftKey.value);
32
+ if (raw) {
33
+ const d = JSON.parse(raw);
34
+ if (typeof d.note === 'string' && typeof d.requestId === 'string' && Number.isInteger(d.expected)) {
35
+ note.value = d.note;
36
+ content.value = typeof d.content === 'string' ? d.content : content.value;
37
+ impact.value = typeof d.impact === 'string' ? d.impact : '';
38
+ checked.value = !!d.checked;
39
+ requestId.value = d.requestId;
40
+ expected.value = d.expected;
41
+ unknown.value = !!d.unknown;
42
+ draftNotice.value = '已恢复此身份在本浏览器保存的输入。提交前请重新核对版本。';
43
+ }
44
+ }
45
+ }
46
+ catch {
47
+ draftNotice.value = '本浏览器无法读取先前输入,请重新填写。';
48
+ }
49
+ loaded.value = true;
50
+ }
51
+ watch(draftKey, boot, { immediate: true });
52
+ watch([note, content, impact, checked, expected, unknown], () => { if (!loaded.value || result.value)
53
+ return; try {
54
+ localStorage.setItem(draftKey.value, JSON.stringify({ note: note.value, content: content.value, impact: impact.value, checked: checked.value, requestId: requestId.value, expected: expected.value, unknown: unknown.value }));
55
+ }
56
+ catch {
57
+ draftNotice.value = '浏览器未能保存草稿;离开页面前请保留输入。';
58
+ } }, { flush: 'sync' });
59
+ async function fail(message, id) { error.value = message; await nextTick(); {
60
+ const target = document.getElementById(id || 'review-errors');
61
+ (target?.querySelector('input') || target)?.focus();
62
+ } }
63
+ function finish(value) { receipt.value = value; unknown.value = false; try {
64
+ localStorage.removeItem(draftKey.value);
65
+ }
66
+ catch { /* The receipt remains in the task record. */ } }
67
+ async function submit() {
68
+ if (!row.value || busy.value || unknown.value)
69
+ return;
70
+ if (!note.value.trim())
71
+ return fail('请填写处理说明。', 'review-note');
72
+ if (action.value === 'confirm' && !checked.value)
73
+ return fail('请先勾选并核对本次绑定的版本与证据。', 'review-checked');
74
+ if (action.value === 'edit' && !content.value.trim())
75
+ return fail('请填写修改后的设计内容。', 'review-content');
76
+ if (action.value === 'replan' && !impact.value.trim())
77
+ return fail('请填写重新规划的影响说明。', 'review-impact');
78
+ error.value = '';
79
+ busy.value = true;
80
+ try {
81
+ const response = store.tasks.review(row.value.task.id, expected.value, row.value.review.id, { action: action.value, note: note.value, content: action.value === 'edit' ? content.value : undefined, impact: action.value === 'replan' ? impact.value : undefined, checked: checked.value, requestId: requestId.value });
82
+ if (response.unknown) {
83
+ unknown.value = true;
84
+ try {
85
+ localStorage.setItem(draftKey.value, JSON.stringify({ note: note.value, content: content.value, impact: impact.value, checked: checked.value, requestId: requestId.value, expected: expected.value, unknown: true }));
86
+ }
87
+ catch { }
88
+ }
89
+ else
90
+ finish(response.receipt);
91
+ }
92
+ catch (e) {
93
+ await fail(e.message);
94
+ }
95
+ finally {
96
+ busy.value = false;
97
+ }
98
+ }
99
+ async function verify() { if (!row.value)
100
+ return; try {
101
+ const value = store.tasks.reviewReceipt(row.value.task.id, requestId.value);
102
+ if (value)
103
+ finish(value);
104
+ else
105
+ await fail('尚未查到此提交结果,保留输入与提交编号,稍后再次核实。');
106
+ }
107
+ catch (e) {
108
+ await fail(e.message);
109
+ } }
110
+ function recheck() { if (!row.value)
111
+ return; expected.value = row.value.task.recordVersion; checked.value = false; error.value = ''; draftNotice.value = '已载入当前记录版本,输入保留。请再次阅读证据后提交。'; }
112
+ return { computed, ref, watch, nextTick, useRoute, useRouter, Alert, Button, Checkbox, Input, Result, Space, Tag, useReviews, reviewUrl, latestArtifact, formatDate, store, route, router, row, action, names, note, content, impact, checked, requestId, expected, error, draftNotice, unknown, busy, receipt, loaded, draftKey, reason, result, boot, fail, finish, submit, verify, recheck };
113
+ } });