@givolt/i3-composer-agent 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (494) hide show
  1. package/.agents/plugins/marketplace.json +1 -1
  2. package/.claude/commands/i3-ui-demo.md +21 -0
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/.claude-plugin/plugin.json +1 -1
  5. package/.codex-plugin/plugin.json +2 -2
  6. package/.gemini/commands/i3-ui-demo.toml +21 -0
  7. package/README.md +10 -8
  8. package/bin/i3-composer-agent.cjs +38 -44
  9. package/bin/install.cjs +15 -3
  10. package/bin/native-layout.cjs +2 -1
  11. package/bin/native-migration.cjs +19 -2
  12. package/bin/retired-sop-fingerprints.json +213 -0
  13. package/bin/wizard.cjs +7 -18
  14. package/commands/i3-ui-demo.toml +21 -0
  15. package/docs/codebuddy-setup.md +20 -23
  16. package/docs/codex-setup.md +2 -2
  17. package/docs/comparison.md +131 -0
  18. package/docs/developer-onboarding.md +143 -0
  19. package/docs/opencode-setup.md +1 -1
  20. package/docs/other-hosts.md +2 -2
  21. package/docs/skill-anatomy.md +211 -0
  22. package/docs/upstream-repository/AGENTS.md +92 -0
  23. package/docs/upstream-repository/CLAUDE.md +60 -0
  24. package/docs/upstream-repository/CONTRIBUTING.md +137 -0
  25. package/docs/upstream-repository/README.md +8 -0
  26. package/docs/upstream-repository/gitattributes.txt +1 -0
  27. package/docs/upstream-repository/gitignore.txt +10 -0
  28. package/docs/upstream-repository/manifest.json +71 -0
  29. package/docs/upstream-repository/opencode-skills.link +1 -0
  30. package/docs/upstream-repository/skill-gap.yml +80 -0
  31. package/docs/upstream-repository/skills-contributing.md +15 -0
  32. package/docs/upstream-repository/test-plugin-install.yml +167 -0
  33. package/docs/workbuddy-setup.md +7 -10
  34. package/evals/cases/i3-ui-demo.json +98 -0
  35. package/evals/fixtures/i3-ui-demo/asset-management.md +25 -0
  36. package/evals/zh-CN/cases/i3-ui-demo.json +103 -0
  37. package/hooks/PROTOTYPE.md +16 -8
  38. package/hooks/i3-prototype.cjs +4 -10
  39. package/hooks/manage.cjs +30 -31
  40. package/package.json +42 -5
  41. package/plugin.json +1 -1
  42. package/scripts/ui-demo-dependencies-test.js +228 -0
  43. package/scripts/ui-demo-mcp-test.js +95 -0
  44. package/scripts/ui-demo-test.js +170 -0
  45. package/scripts/ui-prototype-execution-runtime-test.js +1 -1
  46. package/scripts/ui-prototype-native-test.js +25 -3
  47. package/skills/i3-enterprise-sop/SKILL.md +15 -15
  48. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/ad/assets-manifest.json +9 -29
  49. package/{references/enterprise-sop-resources/ad/README.md → skills/i3-enterprise-sop/references/ad/readme.md} +4 -4
  50. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/assets-manifest.json +64 -33
  51. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/brd/assets-manifest.json +9 -20
  52. package/{references/enterprise-sop-resources/brd/README.md → skills/i3-enterprise-sop/references/brd/readme.md} +4 -4
  53. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/codebuddy-project-guide.md +1 -1
  54. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/controlled_handoff.py +52 -7
  55. package/{references/engineering-skeleton-resources → skills/i3-enterprise-sop/references/engineering-skeleton}/adoption.md +1 -1
  56. package/{references/engineering-skeleton-resources/README.md → skills/i3-enterprise-sop/references/engineering-skeleton/readme.md} +2 -2
  57. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/handoff-contract.md +2 -2
  58. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/lifecycle-contract.md +1 -1
  59. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/plan-handoff.md +3 -3
  60. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/prd/assets-manifest.json +20 -26
  61. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/prd/prompts/01-generate.md +1 -1
  62. package/{references/enterprise-sop-resources/prd/README.md → skills/i3-enterprise-sop/references/prd/readme.md} +4 -4
  63. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/prd/template-contracts.md +3 -3
  64. package/{references/enterprise-sop-resources/prd/templates/AD.md → skills/i3-enterprise-sop/references/prd/templates/ad.md} +1 -1
  65. package/{references/enterprise-sop-resources/prd/templates/PRD.md → skills/i3-enterprise-sop/references/prd/templates/prd.md} +1 -1
  66. package/{references/enterprise-sop-resources/README.md → skills/i3-enterprise-sop/references/readme.md} +14 -12
  67. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/recovery-contract.md +2 -2
  68. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/stages.json +16 -7
  69. package/skills/i3-enterprise-sop/references/technical-baseline/assets-manifest.json +84 -0
  70. package/{references/enterprise-sop-resources/technical-baseline/baselines//344/274/201/344/270/232/345/272/224/347/224/250-/346/212/200/346/234/257/350/247/204/347/272/246_v0.0.2.md → skills/i3-enterprise-sop/references/technical-baseline/baselines/enterprise-application-technical-baseline-v0-0-4.md} +122 -37
  71. package/{references/enterprise-sop-resources/technical-baseline/README.md → skills/i3-enterprise-sop/references/technical-baseline/readme.md} +8 -8
  72. package/{references/enterprise-sop-resources/technical-baseline/templates/TECHNICAL-BASELINE.md → skills/i3-enterprise-sop/references/technical-baseline/templates/technical-baseline.md} +1 -1
  73. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/template-contracts.md +7 -7
  74. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/testcase/assets-manifest.json +9 -29
  75. package/{references/enterprise-sop-resources/testcase/README.md → skills/i3-enterprise-sop/references/testcase/readme.md} +4 -4
  76. package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/verification/review_handoff.py +3 -3
  77. package/skills/i3-ui-demo/SKILL.md +234 -0
  78. package/skills/i3-ui-demo/assets/antdv-build/package-lock.json +3363 -0
  79. package/skills/i3-ui-demo/assets/antdv-build/package.json +28 -0
  80. package/skills/i3-ui-demo/assets/design-source.json +11 -0
  81. package/skills/i3-ui-demo/assets/host-targets.json +739 -0
  82. package/skills/i3-ui-demo/assets/official-files.json +76 -0
  83. package/skills/i3-ui-demo/assets/starter/index.html +11 -0
  84. package/skills/i3-ui-demo/assets/starter/package-lock.json +2299 -0
  85. package/skills/i3-ui-demo/assets/starter/package.json +28 -0
  86. package/skills/i3-ui-demo/assets/starter/provenance.json +14 -0
  87. package/skills/i3-ui-demo/assets/starter/public/prototype-config.json +22 -0
  88. package/skills/i3-ui-demo/assets/starter/src/App.vue +64 -0
  89. package/skills/i3-ui-demo/assets/starter/src/PrototypeShell.vue +59 -0
  90. package/skills/i3-ui-demo/assets/starter/src/config.ts +23 -0
  91. package/skills/i3-ui-demo/assets/starter/src/domain/presentation.ts +30 -0
  92. package/skills/i3-ui-demo/assets/starter/src/domain/theme.ts +25 -0
  93. package/skills/i3-ui-demo/assets/starter/src/main.ts +18 -0
  94. package/skills/i3-ui-demo/assets/starter/src/style.css +26 -0
  95. package/skills/i3-ui-demo/assets/starter/tests/presentation.test.ts +23 -0
  96. package/skills/i3-ui-demo/assets/starter/tests/theme.test.ts +26 -0
  97. package/skills/i3-ui-demo/assets/starter/tsconfig.json +15 -0
  98. package/skills/i3-ui-demo/assets/starter/vite.config.ts +4 -0
  99. package/skills/i3-ui-demo/assets/templates/enterprise-admin/capability-definition.json +1395 -0
  100. package/skills/i3-ui-demo/assets/templates/enterprise-admin/component-inventory.json +707 -0
  101. package/skills/i3-ui-demo/assets/templates/enterprise-admin/design-system.md +26 -0
  102. package/skills/i3-ui-demo/assets/templates/enterprise-admin/generation.json +49 -0
  103. package/skills/i3-ui-demo/assets/templates/enterprise-admin/index.html +534 -0
  104. package/skills/i3-ui-demo/assets/templates/enterprise-admin/manifest.json +9 -0
  105. package/skills/i3-ui-demo/assets/templates/enterprise-admin/offline-build.json +265 -0
  106. package/skills/i3-ui-demo/assets/templates/enterprise-admin/offline.js +8888 -0
  107. package/skills/i3-ui-demo/assets/templates/enterprise-admin/origin.json +344 -0
  108. package/skills/i3-ui-demo/assets/templates/enterprise-admin/preset.json +928 -0
  109. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/app.js +22 -0
  110. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets/empty.svg +1 -0
  111. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets/reference-styles.json +1 -0
  112. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets/result-403.svg +1 -0
  113. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets/result-404.svg +1 -0
  114. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets-manifest.json +334 -0
  115. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/baseline.json +173 -0
  116. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/conversion.md +30 -0
  117. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/credits.md +17 -0
  118. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/design-tokens.json +881 -0
  119. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/index.html +28 -0
  120. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/licenses/@qin-ui-antdv-next-pro.txt +9 -0
  121. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/licenses/ant-design-icons.txt +22 -0
  122. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/licenses/antdv-next.txt +21 -0
  123. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/package.json +12 -0
  124. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/browser-routes.json +298 -0
  125. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/coverage.json +180 -0
  126. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/integrity.json +13 -0
  127. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/keyboard.json +11 -0
  128. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/responsive.json +125 -0
  129. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/review.md +51 -0
  130. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/rules.log +150 -0
  131. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-html.png +0 -0
  132. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-original.png +0 -0
  133. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-html.png +0 -0
  134. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-original.png +0 -0
  135. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/models-html.png +0 -0
  136. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/models-original.png +0 -0
  137. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-html.png +0 -0
  138. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-original.png +0 -0
  139. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/selection.json +9 -0
  140. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/visual-comparison.json +342 -0
  141. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/readme.md +73 -0
  142. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/reference.md +59 -0
  143. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/routes.json +178 -0
  144. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/controls.js +99 -0
  145. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/dialogs.js +54 -0
  146. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/dom.js +264 -0
  147. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/forms.js +47 -0
  148. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/icons.js +41 -0
  149. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/layout.js +47 -0
  150. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/router.js +63 -0
  151. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/state.js +90 -0
  152. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/table.js +41 -0
  153. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/widgets.js +8 -0
  154. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.html +3 -0
  155. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.js +36 -0
  156. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.html +2 -0
  157. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.js +51 -0
  158. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.html +3 -0
  159. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.js +48 -0
  160. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/CheckResults.html +2 -0
  161. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/CheckResults.js +6 -0
  162. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.html +2 -0
  163. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.js +13 -0
  164. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/data.js +24 -0
  165. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/domain.js +32 -0
  166. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/registry.js +25 -0
  167. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/store.js +85 -0
  168. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentClose.html +2 -0
  169. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentClose.js +17 -0
  170. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.html +2 -0
  171. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.js +66 -0
  172. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.html +3 -0
  173. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.js +38 -0
  174. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.html +2 -0
  175. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.js +66 -0
  176. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.html +2 -0
  177. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.js +5 -0
  178. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.html +2 -0
  179. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.js +12 -0
  180. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.html +2 -0
  181. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.js +11 -0
  182. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentList.html +2 -0
  183. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentList.js +116 -0
  184. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.html +2 -0
  185. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.js +32 -0
  186. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.html +2 -0
  187. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.js +49 -0
  188. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.html +2 -0
  189. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.js +10 -0
  190. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.html +2 -0
  191. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.js +77 -0
  192. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/data.js +60 -0
  193. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/domain.js +105 -0
  194. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/store.js +212 -0
  195. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/AuditPanel.html +2 -0
  196. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/AuditPanel.js +18 -0
  197. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelDetail.html +2 -0
  198. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelDetail.js +23 -0
  199. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelEditor.html +2 -0
  200. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelEditor.js +78 -0
  201. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelGrant.html +2 -0
  202. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelGrant.js +55 -0
  203. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelReferences.html +2 -0
  204. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelReferences.js +26 -0
  205. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelRelease.html +2 -0
  206. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelRelease.js +38 -0
  207. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelStatus.html +2 -0
  208. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelStatus.js +7 -0
  209. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelTable.html +2 -0
  210. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelTable.js +72 -0
  211. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelTester.html +2 -0
  212. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelTester.js +46 -0
  213. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelsPage.html +2 -0
  214. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelsPage.js +52 -0
  215. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/RowActions.html +2 -0
  216. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/RowActions.js +19 -0
  217. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/UsagePanel.html +2 -0
  218. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/UsagePanel.js +30 -0
  219. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/data.js +48 -0
  220. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/domain.js +39 -0
  221. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/store.js +129 -0
  222. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.html +4 -0
  223. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.js +21 -0
  224. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/IntentSource.html +2 -0
  225. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/IntentSource.js +8 -0
  226. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.html +2 -0
  227. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.js +37 -0
  228. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.html +2 -0
  229. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.js +10 -0
  230. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.html +2 -0
  231. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.js +37 -0
  232. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.html +2 -0
  233. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.js +49 -0
  234. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/RunDetail.html +4 -0
  235. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/RunDetail.js +22 -0
  236. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.html +2 -0
  237. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.js +9 -0
  238. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/commands.js +82 -0
  239. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/examples.js +47 -0
  240. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/model.js +61 -0
  241. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/repair.js +68 -0
  242. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/store.js +55 -0
  243. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/types.js +1 -0
  244. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/workbench.js +18 -0
  245. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.html +3 -0
  246. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.js +28 -0
  247. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.html +2 -0
  248. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.js +18 -0
  249. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.html +2 -0
  250. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.js +31 -0
  251. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.html +2 -0
  252. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.js +27 -0
  253. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.html +2 -0
  254. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.js +16 -0
  255. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.html +2 -0
  256. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.js +43 -0
  257. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.html +4 -0
  258. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.js +34 -0
  259. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.html +2 -0
  260. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.js +30 -0
  261. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.html +3 -0
  262. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.js +67 -0
  263. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.html +2 -0
  264. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.js +41 -0
  265. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.html +2 -0
  266. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.js +31 -0
  267. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.html +2 -0
  268. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.js +26 -0
  269. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.html +2 -0
  270. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.js +70 -0
  271. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/data.js +8 -0
  272. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/domain.js +62 -0
  273. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/management.js +36 -0
  274. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/managementStore.js +49 -0
  275. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/store.js +132 -0
  276. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/AdminList.html +2 -0
  277. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/AdminList.js +38 -0
  278. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.html +2 -0
  279. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.js +11 -0
  280. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.html +2 -0
  281. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.js +45 -0
  282. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.html +2 -0
  283. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.js +54 -0
  284. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.html +3 -0
  285. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.js +27 -0
  286. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.html +2 -0
  287. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.js +12 -0
  288. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.html +2 -0
  289. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.js +45 -0
  290. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.html +3 -0
  291. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.js +38 -0
  292. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/domain.js +61 -0
  293. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/state.js +51 -0
  294. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/store.js +116 -0
  295. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.html +2 -0
  296. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.js +45 -0
  297. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.html +4 -0
  298. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.js +30 -0
  299. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.html +2 -0
  300. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.js +67 -0
  301. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.html +2 -0
  302. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.js +5 -0
  303. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.html +4 -0
  304. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.js +60 -0
  305. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/commands.js +157 -0
  306. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/model.js +136 -0
  307. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/store.js +76 -0
  308. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.html +3 -0
  309. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.js +26 -0
  310. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.html +2 -0
  311. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.js +14 -0
  312. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.html +2 -0
  313. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.js +113 -0
  314. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.html +3 -0
  315. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.js +62 -0
  316. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/commands.js +97 -0
  317. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/model.js +147 -0
  318. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/store.js +13 -0
  319. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.html +2 -0
  320. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.js +9 -0
  321. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.html +2 -0
  322. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.js +8 -0
  323. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.html +2 -0
  324. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.js +37 -0
  325. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListMore.html +2 -0
  326. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListMore.js +8 -0
  327. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.html +2 -0
  328. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.js +17 -0
  329. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/columns.js +32 -0
  330. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/deliveryGuide.js +49 -0
  331. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/deliveryView.js +12 -0
  332. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/listBatch.js +15 -0
  333. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/listSelection.js +37 -0
  334. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/policy.js +68 -0
  335. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/session.js +44 -0
  336. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.html +2 -0
  337. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.js +25 -0
  338. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.html +2 -0
  339. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.js +53 -0
  340. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.html +10 -0
  341. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.js +30 -0
  342. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ScopePage.html +2 -0
  343. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ScopePage.js +10 -0
  344. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.html +2 -0
  345. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.js +9 -0
  346. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/confirmation.js +3 -0
  347. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/navigation.js +19 -0
  348. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.html +2 -0
  349. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.js +8 -0
  350. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.html +2 -0
  351. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.js +32 -0
  352. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.html +2 -0
  353. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.js +15 -0
  354. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.html +2 -0
  355. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.js +11 -0
  356. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecReview.html +2 -0
  357. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecReview.js +57 -0
  358. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.html +2 -0
  359. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.js +37 -0
  360. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/data.js +20 -0
  361. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/domain.js +55 -0
  362. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/store.js +151 -0
  363. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.html +3 -0
  364. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.js +18 -0
  365. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.html +2 -0
  366. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.js +40 -0
  367. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.html +2 -0
  368. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.js +51 -0
  369. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.html +2 -0
  370. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.js +9 -0
  371. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.html +5 -0
  372. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.js +48 -0
  373. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/domain.js +204 -0
  374. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/exampleSource.js +22 -0
  375. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/registry.js +135 -0
  376. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/store.js +137 -0
  377. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.html +3 -0
  378. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.js +36 -0
  379. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workbench/model.js +56 -0
  380. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workbench/store.js +15 -0
  381. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.html +2 -0
  382. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.js +27 -0
  383. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.html +4 -0
  384. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.js +31 -0
  385. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.html +2 -0
  386. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.js +68 -0
  387. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.html +5 -0
  388. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.js +55 -0
  389. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/data.js +16 -0
  390. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/domain.js +83 -0
  391. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/registry.js +18 -0
  392. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/store.js +61 -0
  393. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/admin.css +60 -0
  394. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/agents.css +46 -0
  395. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/antdv.css +295 -0
  396. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/app.css +102 -0
  397. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/delivery.css +4 -0
  398. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/intents.css +37 -0
  399. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/native.css +22 -0
  400. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/operations.css +2 -0
  401. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/pbc.css +3 -0
  402. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/permissions.css +22 -0
  403. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/pro.css +1 -0
  404. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/releases.css +4 -0
  405. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/reset.css +246 -0
  406. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/reviews.css +8 -0
  407. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/tasks.css +6 -0
  408. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/tokens.css +15 -0
  409. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/workbench.css +61 -0
  410. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/workflows.css +1 -0
  411. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/admin-rules.test.js +96 -0
  412. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/agents.test.js +14 -0
  413. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/intent-state.test.js +37 -0
  414. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/list-batch.test.js +44 -0
  415. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/operation-fixtures.js +19 -0
  416. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/operation-repair.test.js +14 -0
  417. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/operations.test.js +25 -0
  418. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/pbc-management.test.js +17 -0
  419. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/pbc-state.test.js +24 -0
  420. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/permission-config.test.js +23 -0
  421. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/permissions.test.js +24 -0
  422. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/releases.test.js +50 -0
  423. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/reviews.test.js +36 -0
  424. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/runtime-forms-router.test.js +28 -0
  425. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/runtime-state.test.js +42 -0
  426. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/runtime-stores.test.js +16 -0
  427. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/spec-state.test.js +11 -0
  428. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/tasks.test.js +27 -0
  429. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/workbench.test.js +34 -0
  430. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/workflows.test.js +16 -0
  431. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tools/convert.mjs +168 -0
  432. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tools/serve.mjs +7 -0
  433. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tools/styles.mjs +11 -0
  434. package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tools/verify.mjs +24 -0
  435. package/skills/i3-ui-demo/assets/templates/enterprise-admin/serve.cjs +16 -0
  436. package/skills/i3-ui-demo/assets/templates/enterprise-admin/template-inventory.json +28791 -0
  437. package/skills/i3-ui-demo/assets/templates/enterprise-admin/template.json +9 -0
  438. package/skills/i3-ui-demo/assets/templates/enterprise-admin/usability.css +44 -0
  439. package/skills/i3-ui-demo/assets/templates.json +10 -0
  440. package/skills/i3-ui-demo/assets/versions.json +20 -0
  441. package/skills/i3-ui-demo/readme.md +350 -0
  442. package/skills/i3-ui-demo/references/browser.md +71 -0
  443. package/skills/i3-ui-demo/references/dependencies.md +67 -0
  444. package/skills/i3-ui-demo/references/resources.md +142 -0
  445. package/skills/i3-ui-demo/scripts/dependencies.cjs +364 -0
  446. package/skills/i3-ui-demo/scripts/design-install.cjs +105 -0
  447. package/skills/i3-ui-demo/scripts/design-provider.cjs +57 -0
  448. package/skills/i3-ui-demo/scripts/locations.cjs +52 -0
  449. package/skills/i3-ui-demo/scripts/mcp.cjs +112 -0
  450. package/skills/i3-ui-demo/scripts/provider-discovery.cjs +131 -0
  451. package/skills/i3-ui-demo/scripts/resources.cjs +283 -0
  452. package/skills/i3-ui-prototype/SKILL.md +1 -1
  453. package/skills/i3-ui-prototype/references/execution-evidence.md +12 -56
  454. package/skills/i3-ui-prototype/scripts/codebuddy-registration.cjs +1 -1
  455. package/skills/i3-ui-prototype/scripts/execution-runtime.cjs +5 -2
  456. package/skills/i3-ui-prototype/scripts/hosts/codebuddy.cjs +3 -2
  457. package/skills/i3-ui-prototype/scripts/native-delivery.cjs +2 -2
  458. package/skills/i3-ui-prototype/scripts/prototype-hooks.cjs +23 -20
  459. package/docs/ui-prototype-native/MAIN-SESSION-REPORT.md +0 -66
  460. package/docs/ui-prototype-native/USAGE.md +0 -93
  461. package/references/enterprise-sop-resources/technical-baseline/assets-manifest.json +0 -101
  462. package/references/enterprise-sop-resources/technical-baseline/baselines/PROVENANCE.md +0 -40
  463. package/references/enterprise-sop-resources/technical-baseline/references/engineering-directory-v0.2.0/adoption.md +0 -112
  464. package/references/enterprise-sop-resources/technical-baseline/references/engineering-directory-v0.2.0/directory-standard.md +0 -119
  465. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/ad/prompts/01-generate.md +0 -0
  466. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/ad/prompts/02-review.md +0 -0
  467. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/ad/prompts/03-revise.md +0 -0
  468. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/ad/prompts/04-recheck.md +0 -0
  469. /package/{references/enterprise-sop-resources/ad/templates/AD.md → skills/i3-enterprise-sop/references/ad/templates/ad.md} +0 -0
  470. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/brd/prompts/01-generate.md +0 -0
  471. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/brd/prompts/02-review.md +0 -0
  472. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/brd/prompts/03-revise.md +0 -0
  473. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/brd/prompts/04-recheck.md +0 -0
  474. /package/{references/enterprise-sop-resources/brd/templates/BRD.md → skills/i3-enterprise-sop/references/brd/templates/brd.md} +0 -0
  475. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/controlled-handoff.md +0 -0
  476. /package/{references/engineering-skeleton-resources → skills/i3-enterprise-sop/references/engineering-skeleton}/catalog.json +0 -0
  477. /package/{references/engineering-skeleton-resources → skills/i3-enterprise-sop/references/engineering-skeleton}/directory-standard.md +0 -0
  478. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/handoff.py +0 -0
  479. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/prd/prompts/02-review.md +0 -0
  480. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/prd/prompts/03-revise.md +0 -0
  481. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/prd/prompts/04-recheck.md +0 -0
  482. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/review-handoff.md +0 -0
  483. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/selection-handoff.md +0 -0
  484. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/selection_handoff.py +0 -0
  485. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/testcase/prompts/01-generate.md +0 -0
  486. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/testcase/prompts/02-review.md +0 -0
  487. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/testcase/prompts/03-revise.md +0 -0
  488. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/testcase/prompts/04-recheck.md +0 -0
  489. /package/{references/enterprise-sop-resources/testcase/templates/TestCase.md → skills/i3-enterprise-sop/references/testcase/templates/testcase.md} +0 -0
  490. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/verification/check_execution.py +0 -0
  491. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/verification/check_native_execution.py +0 -0
  492. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/verification/check_reads.py +0 -0
  493. /package/{references/enterprise-sop-resources/verification/README.md → skills/i3-enterprise-sop/references/verification/readme.md} +0 -0
  494. /package/{references/enterprise-sop-resources → skills/i3-enterprise-sop/references}/verification/review-output.schema.json +0 -0
package/hooks/manage.cjs CHANGED
@@ -8,14 +8,15 @@ const catalog=[
8
8
  {id:'session-start',name:'Skill 发现与路由',origin:'upstream',files:['session-start.sh'],events:['SessionStart'],dependencies:['bash','jq'],condition:'明确 skill-routing=hook;原生路由使用 native,避免重复注入'},
9
9
  {id:'sdd-cache',name:'官方文档请求缓存',origin:'upstream',files:['sdd-cache-pre.sh','sdd-cache-post.sh'],events:['PreToolUse','PostToolUse'],dependencies:['bash','jq','curl','sha256'],condition:'实际 WebFetch;仅源站 304 复用'},
10
10
  {id:'simplify-ignore',name:'代码块简化保护',origin:'upstream',files:['simplify-ignore.sh'],events:['PreToolUse','PostToolUse','Stop'],dependencies:['bash','jq','sha1'],condition:'使用 simplify-ignore 标记;会在运行期间替换标记块并在 Stop 恢复'},
11
- {id:'prototype',name:'原型执行审计',origin:'i3',events:['SessionStart','UserPromptSubmit','PreToolUse','PostToolUse','Stop'],dependencies:['node'],condition:'CodeBuddy IDE/CLI 与 WorkBuddy;原生回调识别身份和日志,有限补调;真实宿主验收另记'},
12
11
  ];
13
12
  const digest=value=>crypto.createHash('sha256').update(JSON.stringify(value)).digest('hex');
14
13
  const sha=bytes=>crypto.createHash('sha256').update(bytes).digest('hex');
15
14
  const json=value=>JSON.stringify(value,null,2)+'\n';
16
15
  function selection(value,action='check') {
17
- const ids=value===undefined?(['check','list'].includes(action)?catalog.map(x=>x.id):['prototype']):value==='all'?catalog.map(x=>x.id):value.split(',');
18
- assert.ok(ids.length&&ids.every(id=>catalog.some(item=>item.id===id)),'Unknown Hook group; choose session-start,sdd-cache,simplify-ignore,prototype or all');
16
+ if(action==='enable')assert.ok(value!==undefined,'Choose explicit Hook groups before enabling; no groups are enabled by default');
17
+ const ids=value===undefined?(['check','list'].includes(action)?catalog.map(x=>x.id):action==='disable'?['prototype']:[]):value==='all'?catalog.map(x=>x.id):value.split(',');
18
+ assert.ok(ids.every(id=>id==='prototype'||catalog.some(item=>item.id===id)),'Unknown Hook group; choose session-start,sdd-cache,simplify-ignore or all');
19
+ assert.ok(action!=='enable'||!ids.includes('prototype'),'Prototype audit Hooks are retired and cannot be enabled');
19
20
  return [...new Set(ids)];
20
21
  }
21
22
  function quote(value){assert.ok(typeof value==='string'&&!/[\x00\r\n]/.test(value),'Unsafe Hook argument');return "'"+value.replaceAll("'","'\\''")+"'";}
@@ -82,7 +83,7 @@ function executable(name,env=process.env) {
82
83
  }
83
84
  function dependencies(){return Object.fromEntries(['bash','jq','curl','shasum','sha256sum','sha1sum'].map(name=>[name,executable(name)]));}
84
85
  function location(options) {
85
- assert.ok(['codebuddy','workbuddy'].includes(options.host||'codebuddy'),'Unified prototype Hooks support CodeBuddy and WorkBuddy');assert.ok(['project','global'].includes(options.scope),'Specify project or global scope');
86
+ assert.ok(['codebuddy','workbuddy'].includes(options.host||'codebuddy'),'Hook management supports CodeBuddy and WorkBuddy');assert.ok(['project','global'].includes(options.scope),'Specify project or global scope');
86
87
  const project=fs.realpathSync(path.resolve(options.project||'.'));assert.ok(fs.statSync(project).isDirectory(),'Project must be a directory');
87
88
  return {project,base:options.scope==='project'?path.join(project,'.codebuddy'):modules().P.globalBase(options)};
88
89
  }
@@ -103,44 +104,41 @@ function pendingSimplify(base) {
103
104
  }
104
105
  function prepare(options,runtime={}) {
105
106
  const {P,R}=runtime.modules||modules(),{project,base}=runtime.location||location(options),io=R.fileIO,requested=options.action||'keep',ids=selection(options.groups,requested),host=options.host||'codebuddy';
107
+ const action=requested==='default'?'keep':requested;
106
108
  const settingsPath=path.join(base,'settings.json'),recordPath=path.join(base,'state/i3-composer-agent/hooks.json'),prototypePath=path.join(base,'state/i3-prototype/installation.json');
107
- const before=io.read(settingsPath),recordText=io.read(recordPath),record=recordText?JSON.parse(recordText):null,prototypeText=io.read(prototypePath),prototype=prototypeText?JSON.parse(prototypeText):null;
108
- const requestedHosts=[...new Set(options.scope==='project'?(options.agents||[host]).filter(h=>['codebuddy','workbuddy'].includes(h)):[host])];
109
- const disabled=new Set(record?.prototypeDisabledHosts||[]);
110
- if(requested==='enable'&&ids.includes('prototype'))for(const h of requestedHosts)disabled.delete(h);
111
- if(requested==='disable'&&ids.includes('prototype'))for(const h of requestedHosts)disabled.add(h);
112
- const selectedHosts=requested==='default'?requestedHosts.filter(h=>!disabled.has(h)):requestedHosts;
113
- const action=requested==='default'?(selectedHosts.length&&process.platform!=='win32'?'enable':'keep'):requested;
114
- const activeHosts=prototype?.hosts||(prototype?['codebuddy']:[]);
115
- const hosts=action==='disable'?activeHosts.filter(h=>!requestedHosts.includes(h)):[...new Set([...activeHosts,...selectedHosts])].sort();
116
- if(action!=='disable'&&(action!=='keep'||record||prototype))assert.ok(process.platform!=='win32','Buddy Hook quoting on Windows has not been validated; explicit keep remains available');
117
- const product='auto',settings=config(before);
118
- if(action!=='disable'&&(action!=='keep'||record||prototype)) {
109
+ const before=io.read(settingsPath),recordText=io.read(recordPath),record=recordText?JSON.parse(recordText):null,prototypeText=io.read(prototypePath);
110
+ const settings=config(before);
111
+ if(action==='enable') {
112
+ assert.ok(process.platform!=='win32','Buddy Hook quoting on Windows has not been validated');
119
113
  assert.ok(!settings.disableAllHooks&&!settings.allowManagedHooksOnly,'Host policy prevents automatic Hooks; preserve the policy');
114
+ assert.equal(host,'codebuddy','WorkBuddy upstream Hook adapters are not supported');
115
+ for(const id of ids)assert.ok(!unmanaged(settings).some(item=>item.id===id),`Unmanaged ${id} Hook already exists; preserve it and resolve the duplicate before enabling`);
120
116
  }
121
- if(host==='workbuddy')assert.ok(ids.every(id=>id==='prototype')||['check','list','keep'].includes(action),'WorkBuddy currently registers the prototype group only; upstream adapters remain CodeBuddy-specific');
122
- if(action==='enable')for(const id of ids)assert.ok(!unmanaged(settings).some(item=>item.id===id),`Unmanaged ${id} Hook already exists; preserve it and resolve the duplicate before enabling`);
123
117
  if(ids.includes('simplify-ignore')&&['enable','disable'].includes(action)) {
124
118
  for(const candidate of [...new Set([base,path.join(project,'.codebuddy'),P.globalBase?P.globalBase(options):path.join(options.home||os.homedir(),'.codebuddy')])])assert.equal((runtime.pendingSimplify||pendingSimplify)(candidate).length,0,'Simplify protection is still active; finish the session and restore blocks before changing Hooks');
125
119
  }
126
- const prototypeAction=ids.includes('prototype')?(action==='disable'&&hosts.length?'keep':action):'keep';
127
- const prototypeChange=action==='disable'&&!ids.includes('prototype')?{unchanged:true}:P.prepare({...options,project,product,hosts,action:prototypeAction,entryPath:path.join(base,'i3-composer-agent/hooks/i3-prototype.cjs'),entrySource:path.join(__dirname,'i3-prototype.cjs')});
120
+ // Retire the entire prototype group, including shared Buddy registrations.
121
+ // The legacy planner validates exact ownership; unknown/user-modified entries stop here.
122
+ const prototypeChange=P.prepare({...options,project,action:'disable',hosts:[],entryPath:path.join(base,'i3-composer-agent/hooks/i3-prototype.cjs')});
128
123
  const upstream=planUpstream({...options,base,product:record?.product||options.product,action,record,settingsText:prototypeChange.unchanged?before:prototypeChange.afterText,nodePath:process.execPath,
129
124
  hookDirectory:path.join(base,'i3-composer-agent/hooks'),scriptDigest:runtime.scriptDigest||require('./codebuddy-upstream.cjs').bundle(),dependencies:runtime.dependencies||dependencies()});
130
- if(disabled.size)upstream.recordAfter={...(upstream.recordAfter||{schemaVersion:1,owner:OWNER,base,scope:options.scope,product:record?.product||'auto',groups:{}}),prototypeDisabledHosts:[...disabled].sort()};
131
- const changes=[{file:settingsPath,before,after:upstream.afterText},{file:recordPath,before:recordText,after:upstream.recordAfter?json(upstream.recordAfter):null},
132
- {file:prototypePath,before:prototypeText,after:prototypeChange.unchanged?prototypeText:prototypeChange.recordAfter?json(prototypeChange.recordAfter):null}];
133
- return {changes,summary:{host,scope:options.scope,base,product,action,requestedAction:requested,groups:ids,enabledHosts:prototypeChange.unchanged?activeHosts:prototypeChange.recordAfter?.hosts||[],disabledHosts:[...disabled].sort(),changed:changes.some(item=>item.before!==item.after),
134
- enabledGroups:[...Object.keys(upstream.recordAfter?.groups||{}),...((prototypeChange.unchanged?prototype:prototypeChange.recordAfter)?['prototype']:[])],
135
- ...(prototypeChange.summary?.transcript?{transcript:prototypeChange.summary.transcript}:{}),
136
- next:'Desktop: reload; CodeBuddy CLI: review /hooks. Host identity, actual Skill invocation and recovery require native validation.'}};
125
+ const changes=[{file:settingsPath,before,after:upstream.afterText},{file:recordPath,before:recordText,after:upstream.recordAfter?json(upstream.recordAfter):null}];
126
+ if(prototypeText&&!prototypeChange.unchanged) {
127
+ const archive=path.join(base,'state/i3-prototype/history','retired-'+sha(prototypeText)+'.json'),previous=io.read(archive);
128
+ assert.ok(previous===null||previous===prototypeText,'Retired registration history differs; preserve it for review');
129
+ changes.push({file:archive,before:previous,after:prototypeText});
130
+ }
131
+ changes.push({file:prototypePath,before:prototypeText,after:prototypeChange.unchanged?prototypeText:null});
132
+ return {changes,summary:{host,scope:options.scope,base,product:record?.product||options.product||'auto',action,requestedAction:requested,groups:ids.filter(id=>id!=='prototype'),enabledHosts:[],
133
+ changed:changes.some(item=>item.before!==item.after),enabledGroups:Object.keys(upstream.recordAfter?.groups||{}),retiredGroups:['prototype'],prototypeRegistrationRemoved:!!prototypeText&&!prototypeChange.unchanged,
134
+ next:'Prototype audit Hooks are retired. Existing owned callbacks are removed; other Hook groups and user settings are preserved. Reload an affected host after cleanup.'}};
137
135
  }
138
136
  function check(options) {
139
137
  const {P,R}=modules(),{project,base}=location(options),io=R.fileIO,ids=selection(options.groups,options.action||'check'),settingsText=io.read(path.join(base,'settings.json')),settings=config(settingsText),deps=dependencies(),items=[];
140
138
  let record=null,error=null;try{record=require('./codebuddy-upstream.cjs').registration(base);}catch(e){error=e.message;}
141
139
  for(const id of ids) {
142
- const item=catalog.find(x=>x.id===id),entry=path.join(base,'i3-composer-agent/hooks',id==='prototype'?'i3-prototype.cjs':'codebuddy-upstream.cjs');
143
- if(id==='prototype'){try{const result=P.check({...options,project});items.push({...item,...result,...(result.effective===false&&result.status!=='failed'?{status:'shadowed'}:{}),entryPath:entry});}catch(e){items.push({...item,status:'failed',reason:e.message,entryPath:entry});}continue;}
140
+ if(id==='prototype')continue;
141
+ const item=catalog.find(x=>x.id===id),entry=path.join(base,'i3-composer-agent/hooks','codebuddy-upstream.cjs');
144
142
  const missingFiles=[entry,...item.files.map(file=>path.join(base,'i3-composer-agent/hooks',file))].filter(file=>!fs.existsSync(file));
145
143
  const row={...item,entryPath:entry,filesPresent:missingFiles.length===0,missingFiles,status:missingFiles.length?'not-installed':'files-present',invocationVerified:false,nativeValidation:'pending-user'};
146
144
  try{requirements(id,deps);}catch(e){row.dependencyIssue=e.message;}
@@ -154,12 +152,13 @@ function check(options) {
154
152
  }catch(e){row.status='failed';row.reason=e.message;}
155
153
  items.push(row);
156
154
  }
157
- return {host:options.host||'codebuddy',scope:options.scope,base,readOnly:true,changed:false,status:items.some(item=>item.status==='failed')?'failed':'checked',hooks:items,unmanagedHooks:unmanaged(settings),
155
+ const retired=P.check({...options,project});
156
+ return {host:options.host||'codebuddy',scope:options.scope,base,readOnly:true,changed:false,status:items.some(item=>item.status==='failed')||retired.status==='failed'?'failed':'checked',hooks:items,retiredHooks:[{id:'prototype',...retired}],unmanagedHooks:unmanaged(settings),
158
157
  next:'files-present is not enabled; registered is not triggered; triggered is not business acceptance. CLI: review /hooks; IDE: reload.'};
159
158
  }
160
159
  function configure(options){const change=prepare(options);return options.preview?change.summary:apply(change);}
161
160
  function main(argv=process.argv.slice(2)) {
162
- if(argv.includes('--help'))return {usage:'node manage.cjs list|check|enable|disable --host codebuddy|workbuddy --scope project|global --project <directory> [--groups <ids>|all] [--product auto|ide|cli] [--skill-routing hook] [--transcript-root <native-directory>|auto]',hooks:catalog,default:'Installer defaults prototype, preserving explicit disable; management enable/disable default prototype; list/check default all; identity/transcripts auto for new registrations',nativeValidation:'pending-user'};
161
+ if(argv.includes('--help'))return {usage:'node manage.cjs list|check|enable|disable --host codebuddy|workbuddy --scope project|global --project <directory> [--groups <ids>|all] [--product auto|ide|cli] [--skill-routing hook] [--transcript-root <native-directory>|auto]',hooks:catalog,default:'No automatic Hook registration. Enable requires explicit upstream groups; prototype audit is retired and its old registrations are cleaned during upgrades',nativeValidation:'pending-user'};
163
162
  const options={action:argv.shift()||'list',host:'codebuddy',project:process.cwd()};
164
163
  assert.ok(['list','check','enable','disable','keep'].includes(options.action),'Choose list, check, enable or disable');
165
164
  while(argv.length){const arg=argv.shift();assert.ok(arg.startsWith('--')&&argv[0]&&!argv[0].startsWith('--'),'Hook option needs a value');const key=arg.slice(2).replace(/-([a-z])/g,(_,c)=>c.toUpperCase());assert.ok(['host','scope','project','product','productVersion','transcriptRoot','groups','skillRouting'].includes(key),'Unknown Hook option');options[key]=argv.shift();}
package/package.json CHANGED
@@ -56,6 +56,7 @@
56
56
  "evals/cases/i3-source-driven-development.json",
57
57
  "evals/cases/i3-spec-driven-development.json",
58
58
  "evals/cases/i3-test-driven-development.json",
59
+ "evals/cases/i3-ui-demo.json",
59
60
  "evals/cases/i3-ui-prototype.json",
60
61
  "evals/cases/i3-using-agent-skills.json",
61
62
  "evals/fixtures/i3-api-and-interface-design/service-brief.md",
@@ -102,6 +103,7 @@
102
103
  "evals/fixtures/i3-test-driven-development/package.json",
103
104
  "evals/fixtures/i3-test-driven-development/src/split.js",
104
105
  "evals/fixtures/i3-test-driven-development/test/split.test.js",
106
+ "evals/fixtures/i3-ui-demo/asset-management.md",
105
107
  "evals/fixtures/i3-ui-prototype/admin-list/assets/reference.css",
106
108
  "evals/fixtures/i3-ui-prototype/admin-list/assets/reference.js",
107
109
  "evals/fixtures/i3-ui-prototype/admin-list/capability-definition.json",
@@ -156,6 +158,7 @@
156
158
  "evals/zh-CN/cases/i3-source-driven-development.json",
157
159
  "evals/zh-CN/cases/i3-spec-driven-development.json",
158
160
  "evals/zh-CN/cases/i3-test-driven-development.json",
161
+ "evals/zh-CN/cases/i3-ui-demo.json",
159
162
  "evals/zh-CN/cases/i3-ui-prototype.json",
160
163
  "evals/zh-CN/cases/i3-using-agent-skills.json",
161
164
  "docs/adoption-guide.md",
@@ -165,15 +168,27 @@
165
168
  "docs/codebuddy-setup.md",
166
169
  "docs/codex-setup.md",
167
170
  "docs/commandcode-setup.md",
171
+ "docs/comparison.md",
168
172
  "docs/copilot-cli-setup.md",
169
173
  "docs/copilot-setup.md",
170
174
  "docs/cursor-setup.md",
175
+ "docs/developer-onboarding.md",
171
176
  "docs/gemini-cli-setup.md",
172
177
  "docs/getting-started.md",
173
178
  "docs/opencode-setup.md",
174
179
  "docs/other-hosts.md",
175
- "docs/ui-prototype-native/MAIN-SESSION-REPORT.md",
176
- "docs/ui-prototype-native/USAGE.md",
180
+ "docs/skill-anatomy.md",
181
+ "docs/upstream-repository/AGENTS.md",
182
+ "docs/upstream-repository/CLAUDE.md",
183
+ "docs/upstream-repository/CONTRIBUTING.md",
184
+ "docs/upstream-repository/README.md",
185
+ "docs/upstream-repository/gitattributes.txt",
186
+ "docs/upstream-repository/gitignore.txt",
187
+ "docs/upstream-repository/manifest.json",
188
+ "docs/upstream-repository/opencode-skills.link",
189
+ "docs/upstream-repository/skill-gap.yml",
190
+ "docs/upstream-repository/skills-contributing.md",
191
+ "docs/upstream-repository/test-plugin-install.yml",
177
192
  "docs/windsurf-setup.md",
178
193
  "docs/workbuddy-setup.md",
179
194
  "plugin.json",
@@ -198,6 +213,9 @@
198
213
  "scripts/run-evals.js",
199
214
  "scripts/run-regressions.js",
200
215
  "scripts/template-adapter-test.js",
216
+ "scripts/ui-demo-dependencies-test.js",
217
+ "scripts/ui-demo-mcp-test.js",
218
+ "scripts/ui-demo-test.js",
201
219
  "scripts/ui-prototype-binding-recovery-test.js",
202
220
  "scripts/ui-prototype-buddy-lifecycle-test.js",
203
221
  "scripts/ui-prototype-codebuddy-hook-test.js",
@@ -241,6 +259,7 @@
241
259
  "claude-code"
242
260
  ],
243
261
  "i3ComposerAgent": {
262
+ "prototypeAuditHooks": "retired",
244
263
  "pluginFiles": [
245
264
  "bin",
246
265
  "skills",
@@ -279,6 +298,7 @@
279
298
  "evals/cases/i3-source-driven-development.json",
280
299
  "evals/cases/i3-spec-driven-development.json",
281
300
  "evals/cases/i3-test-driven-development.json",
301
+ "evals/cases/i3-ui-demo.json",
282
302
  "evals/cases/i3-ui-prototype.json",
283
303
  "evals/cases/i3-using-agent-skills.json",
284
304
  "evals/fixtures/i3-api-and-interface-design/service-brief.md",
@@ -325,6 +345,7 @@
325
345
  "evals/fixtures/i3-test-driven-development/package.json",
326
346
  "evals/fixtures/i3-test-driven-development/src/split.js",
327
347
  "evals/fixtures/i3-test-driven-development/test/split.test.js",
348
+ "evals/fixtures/i3-ui-demo/asset-management.md",
328
349
  "evals/fixtures/i3-ui-prototype/admin-list/assets/reference.css",
329
350
  "evals/fixtures/i3-ui-prototype/admin-list/assets/reference.js",
330
351
  "evals/fixtures/i3-ui-prototype/admin-list/capability-definition.json",
@@ -379,6 +400,7 @@
379
400
  "evals/zh-CN/cases/i3-source-driven-development.json",
380
401
  "evals/zh-CN/cases/i3-spec-driven-development.json",
381
402
  "evals/zh-CN/cases/i3-test-driven-development.json",
403
+ "evals/zh-CN/cases/i3-ui-demo.json",
382
404
  "evals/zh-CN/cases/i3-ui-prototype.json",
383
405
  "evals/zh-CN/cases/i3-using-agent-skills.json",
384
406
  "docs/adoption-guide.md",
@@ -388,15 +410,27 @@
388
410
  "docs/codebuddy-setup.md",
389
411
  "docs/codex-setup.md",
390
412
  "docs/commandcode-setup.md",
413
+ "docs/comparison.md",
391
414
  "docs/copilot-cli-setup.md",
392
415
  "docs/copilot-setup.md",
393
416
  "docs/cursor-setup.md",
417
+ "docs/developer-onboarding.md",
394
418
  "docs/gemini-cli-setup.md",
395
419
  "docs/getting-started.md",
396
420
  "docs/opencode-setup.md",
397
421
  "docs/other-hosts.md",
398
- "docs/ui-prototype-native/MAIN-SESSION-REPORT.md",
399
- "docs/ui-prototype-native/USAGE.md",
422
+ "docs/skill-anatomy.md",
423
+ "docs/upstream-repository/AGENTS.md",
424
+ "docs/upstream-repository/CLAUDE.md",
425
+ "docs/upstream-repository/CONTRIBUTING.md",
426
+ "docs/upstream-repository/README.md",
427
+ "docs/upstream-repository/gitattributes.txt",
428
+ "docs/upstream-repository/gitignore.txt",
429
+ "docs/upstream-repository/manifest.json",
430
+ "docs/upstream-repository/opencode-skills.link",
431
+ "docs/upstream-repository/skill-gap.yml",
432
+ "docs/upstream-repository/skills-contributing.md",
433
+ "docs/upstream-repository/test-plugin-install.yml",
400
434
  "docs/windsurf-setup.md",
401
435
  "docs/workbuddy-setup.md",
402
436
  "plugin.json",
@@ -422,6 +456,9 @@
422
456
  "scripts/run-evals.js",
423
457
  "scripts/run-regressions.js",
424
458
  "scripts/template-adapter-test.js",
459
+ "scripts/ui-demo-dependencies-test.js",
460
+ "scripts/ui-demo-mcp-test.js",
461
+ "scripts/ui-demo-test.js",
425
462
  "scripts/ui-prototype-binding-recovery-test.js",
426
463
  "scripts/ui-prototype-buddy-lifecycle-test.js",
427
464
  "scripts/ui-prototype-codebuddy-hook-test.js",
@@ -450,7 +487,7 @@
450
487
  "scripts/validate-versions.js"
451
488
  ]
452
489
  },
453
- "version": "3.0.0",
490
+ "version": "3.1.0",
454
491
  "repository": {
455
492
  "type": "git",
456
493
  "url": "https://github.com/49780522/i3-composer-agent.git"
package/plugin.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "i3-composer-agent",
3
- "version": "3.0.0",
3
+ "version": "3.1.0",
4
4
  "description": "覆盖需求、计划、开发、测试、审查与发布的软件工程技能,默认使用简体中文。",
5
5
  "homepage": "https://github.com/49780522/i3-composer-agent",
6
6
  "repository": "https://github.com/49780522/i3-composer-agent"
@@ -0,0 +1,228 @@
1
+ const test = require('node:test');
2
+ const assert = require('node:assert/strict');
3
+ const fs = require('node:fs');
4
+ const os = require('node:os');
5
+ const path = require('node:path');
6
+ const crypto = require('node:crypto');
7
+ const installation = path.join(__dirname, 'lib/installation.js');
8
+ const skills = fs.existsSync(installation) ? require(installation).loadInstallation().skillsDirectory : path.resolve(__dirname, '../skills');
9
+ const deps = require(path.join(skills, 'i3-ui-demo/scripts/dependencies.cjs'));
10
+ const hash = data => crypto.createHash('sha256').update(data).digest('hex');
11
+ function official(t, wrongOutput = false) {
12
+ const base = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'ui-demo-official-'))), root = path.join(base, 'source');
13
+ t.after(() => fs.rmSync(base, { recursive: true, force: true }));
14
+ for (const folder of ['data', 'bin', 'dist']) fs.mkdirSync(path.join(root, folder), { recursive: true });
15
+ const component = { name: 'Table', props: { properties: [{ name: 'rowKey', type: 'string' }], events: [], slots: [], methods: [] } };
16
+ const data = JSON.stringify({ components: [component] }), index = JSON.stringify({ v1: { '1.6': '1.6.0' } });
17
+ fs.writeFileSync(path.join(root, 'data/v1.6.0.json'), data);
18
+ fs.writeFileSync(path.join(root, 'data/versions.json'), index);
19
+ fs.writeFileSync(path.join(root, 'package.json'), JSON.stringify({ name: '@antdv-next/cli', version: '0.0.0-beta.6', bin: { antdv: 'bin/antdv.js' } }));
20
+ const output = { name: 'Table', props: wrongOutput ? [{ name: 'oldVersionProp' }] : component.props.properties, events: [], slots: [], methods: [] };
21
+ const entry = 'process.stdout.write(' + JSON.stringify(JSON.stringify(output)) + ');';
22
+ fs.writeFileSync(path.join(root, 'bin/antdv.js'), entry);
23
+ fs.writeFileSync(path.join(root, 'dist/index.mjs'), '// test executable identity');
24
+ const expected = { package: '@antdv-next/cli', version: '0.0.0-beta.6', commit: 'fixed-test-snapshot', archiveSha256: 'fixed-test-archive', knowledgeVersion: '1.6.0', knowledgeFile: 'data/v1.6.0.json', knowledgeSha256: hash(data), versionIndexSha256: hash(index) };
25
+ fs.writeFileSync(path.join(base, 'UPSTREAM-ORIGIN.json'), JSON.stringify({ commit: expected.commit, archiveSha256: expected.archiveSha256, distSha256: hash(fs.readFileSync(path.join(root, 'dist/index.mjs'))) }));
26
+ return { root, options: { expected, sourceFiles: { 'bin/antdv.js': hash(entry) } } };
27
+ }
28
+
29
+ test('official probing proves actual fixed data and query results without writing', t => {
30
+ const { root, options } = official(t);
31
+ const before = fs.readdirSync(root, { recursive: true });
32
+ const result = deps.inspectOfficial(root, options);
33
+ assert.equal(result.availability, 'available');
34
+ assert.equal(result.knowledgeVersion, '1.6.0');
35
+ assert.equal(result.exactKnowledgeMatch, true);
36
+ assert.equal(result.invocationVerified, false);
37
+ assert.deepEqual(fs.readdirSync(root, { recursive: true }), before);
38
+ });
39
+
40
+ test('version policy compares prereleases numerically and rejects unknown versions', () => {
41
+ assert.equal(deps.versionRelation('2.15.0', '2.15.0'), 'same');
42
+ assert.equal(deps.versionRelation('2.16.0', '2.15.0'), 'higher');
43
+ assert.equal(deps.versionRelation('2.9.0', '2.15.0'), 'lower');
44
+ assert.equal(deps.versionRelation('0.0.0-beta.10', '0.0.0-beta.6'), 'higher');
45
+ assert.equal(deps.versionRelation('0.0.0', '0.0.0-beta.6'), 'higher');
46
+ assert.equal(deps.versionRelation('unversioned', '2.15.0'), 'unknown');
47
+ });
48
+
49
+ test('official snapshot preparation respects the unchanged builder engine requirements', () => {
50
+ for (const version of ['v20.19.5', 'v22.17.1', 'v23.11.0', 'v24.10.0', 'unknown']) assert.equal(deps.supportsBuild(version), false, version);
51
+ for (const version of ['v22.18.0', 'v22.22.0', 'v24.11.0', 'v24.15.0', 'v26.0.0']) assert.equal(deps.supportsBuild(version), true, version);
52
+ });
53
+
54
+ test('a compatible higher official CLI is preserved and still queries the fixed 1.6.0 data', t => {
55
+ const { root, options } = official(t);
56
+ const pkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json')));
57
+ pkg.version = '0.0.0-beta.10';
58
+ fs.writeFileSync(path.join(root, 'package.json'), JSON.stringify(pkg));
59
+ const before = fs.readFileSync(path.join(root, 'package.json'));
60
+ const result = deps.inspectOfficial(root, options);
61
+ assert.equal(result.availability, 'available', result.reason);
62
+ assert.equal(result.versionRelation, 'higher');
63
+ assert.equal(result.snapshot, null, 'A retained old receipt cannot attest the source of a newer CLI');
64
+ assert.equal(result.knowledgeVersion, '1.6.0');
65
+ assert.deepEqual(fs.readFileSync(path.join(root, 'package.json')), before);
66
+ });
67
+
68
+ test('a lower CLI needs upgrading even when it exits successfully', t => {
69
+ const { root, options } = official(t);
70
+ const file = path.join(root, 'package.json'), pkg = JSON.parse(fs.readFileSync(file));
71
+ pkg.version = '0.0.0-beta.1'; fs.writeFileSync(file, JSON.stringify(pkg));
72
+ const result = deps.inspectOfficial(root, options);
73
+ assert.equal(result.availability, 'upgrade-required');
74
+ assert.equal(result.versionRelation, 'lower');
75
+ assert.equal(result.cliVersion, pkg.version);
76
+ });
77
+
78
+ test('a higher CLI cannot pass with stale query output', t => {
79
+ const { root, options } = official(t, true);
80
+ const file = path.join(root, 'package.json'), pkg = JSON.parse(fs.readFileSync(file));
81
+ pkg.version = '0.0.0-beta.10'; fs.writeFileSync(file, JSON.stringify(pkg));
82
+ assert.equal(deps.inspectOfficial(root, options).availability, 'unusable');
83
+ });
84
+
85
+ function design(t, version) {
86
+ const project = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'ui-demo-design-policy-')));
87
+ t.after(() => fs.rmSync(project, { recursive: true, force: true }));
88
+ const root = path.join(project, '.codebuddy/skills/ui-ux-pro-max');
89
+ fs.mkdirSync(path.join(root, 'scripts'), { recursive: true }); fs.mkdirSync(path.join(root, 'data'));
90
+ fs.writeFileSync(path.join(root, 'SKILL.md'), '---\nname: ui-ux-pro-max\n---\nOfficial test provider');
91
+ for (const file of ['core.py', 'design_system.py']) fs.writeFileSync(path.join(root, 'scripts', file), '# fixture\n');
92
+ fs.writeFileSync(path.join(root, 'scripts/search.py'), 'import json, sys\nvalue = {"design_system":{"style":{},"colors":{},"typography":{}}} if "--design-system" in sys.argv else {"domain":"stack","stack":"vue","results":[{"title":"ref"}]} if "--stack" in sys.argv else {"domain":"ux","results":[{"title":"validation"}]}\nprint(json.dumps(value))\n');
93
+ for (const name of ['ux-guidelines', 'styles', 'colors', 'typography', 'products', 'landing', 'ui-reasoning']) fs.writeFileSync(path.join(root, 'data', name + '.csv'), 'title\nvalidation\n');
94
+ fs.writeFileSync(path.join(root, 'UPSTREAM-ORIGIN.json'), JSON.stringify({ packageName: 'ui-ux-pro-max-cli', version }));
95
+ return { project, root, home: path.join(project, 'home'), host: 'codebuddy', env: {}, tool: path.join(project, 'no-cli') };
96
+ }
97
+
98
+ for (const [version, relation, availability] of [['2.15.0', 'same', 'available'], ['2.16.0', 'higher', 'available'], ['2.14.0', 'lower', 'upgrade-required'], ['unknown', 'unknown', 'unusable']]) {
99
+ test(`UI/UX Pro Max ${version} gets ${relation} handling without writes`, t => {
100
+ const options = design(t, version), before = fs.readdirSync(options.root, { recursive: true });
101
+ const checked = deps.check(options);
102
+ assert.equal(checked.design.versionRelation, relation);
103
+ assert.equal(checked.design.availability, availability);
104
+ assert.deepEqual(fs.readdirSync(options.root, { recursive: true }), before);
105
+ assert.equal(fs.existsSync(path.join(options.root, 'scripts/__pycache__')), false);
106
+ });
107
+ }
108
+
109
+ test('higher UI/UX Pro Max must support design-system and Vue queries', t => {
110
+ const options = design(t, '2.16.0');
111
+ fs.writeFileSync(path.join(options.root, 'scripts/search.py'), 'import json, sys\nif "--design-system" in sys.argv: raise SystemExit(1)\nprint(json.dumps({"domain":"ux","results":[{}]}))\n');
112
+ const checked = deps.check(options);
113
+ assert.equal(checked.design.availability, 'unusable');
114
+ assert.throws(() => deps.assertPreparable(checked), /ui-ux-pro-max.*检查未通过/);
115
+ });
116
+
117
+ test('higher UI/UX Pro Max returning unrelated successful JSON is incompatible', t => {
118
+ const options = design(t, '2.16.0');
119
+ fs.writeFileSync(path.join(options.root, 'scripts/search.py'), 'import json, sys\nprint(json.dumps({"status":"unsupported"} if "--design-system" in sys.argv else {"domain":"ux","results":[{}]}))\n');
120
+ assert.equal(deps.check(options).design.availability, 'unusable');
121
+ });
122
+
123
+ test('an unusable provider blocks preparation before any installation writes', async t => {
124
+ const options = design(t, 'unknown'), before = fs.readdirSync(options.project, { recursive: true });
125
+ await assert.rejects(deps.prepare({ ...options, accept: true }), /ui-ux-pro-max.*检查未通过/);
126
+ assert.deepEqual(fs.readdirSync(options.project, { recursive: true }), before);
127
+ });
128
+
129
+ test('Codex dependency inspection never creates a missing config directory', t => {
130
+ const options = design(t, '2.15.0');
131
+ const before = fs.readdirSync(options.project, { recursive: true });
132
+ const checked = deps.check({ ...options, host: 'codex' });
133
+ assert.equal(checked.design.availability, 'missing');
134
+ assert.deepEqual(fs.readdirSync(options.project, { recursive: true }), before);
135
+ assert.equal(fs.existsSync(path.join(options.home, '.codex')), false);
136
+ });
137
+
138
+ test('native provider lookup follows the selected host registry, including Cursor shared project skills', t => {
139
+ const options = design(t, '2.15.0'), location = deps.context({ ...options, host: 'cursor' });
140
+ const root = path.join(location.projectSkills, 'ui-ux-pro-max');
141
+ fs.mkdirSync(path.dirname(root), { recursive: true }); fs.renameSync(options.root, root);
142
+ const checked = deps.check({ ...options, host: 'cursor' });
143
+ assert.equal(checked.design.availability, 'available', checked.design.reason);
144
+ assert.equal(checked.design.root, root);
145
+ assert.equal(checked.design.source, 'project-skill');
146
+ });
147
+
148
+ test('a broken active project Skill cannot be hidden by a healthy global copy', t => {
149
+ const options = design(t, '2.15.0');
150
+ const global = path.join(options.home, '.codebuddy/skills/ui-ux-pro-max');
151
+ fs.mkdirSync(path.dirname(global), { recursive: true }); fs.cpSync(options.root, global, { recursive: true });
152
+ fs.unlinkSync(path.join(options.root, 'scripts/core.py'));
153
+ const checked = deps.check(options);
154
+ assert.equal(checked.design.availability, 'unusable');
155
+ assert.equal(checked.design.root, options.root);
156
+ });
157
+
158
+ test('Codex reuses one registered plugin through read-only metadata without launching its CLI', t => {
159
+ const options = design(t, '2.16.0'), config = path.join(options.home, '.codex');
160
+ const plugin = path.join(config, 'plugins/cache/ui-ux-pro-max-skill/ui-ux-pro-max/2.16.0');
161
+ const root = path.join(plugin, '.claude/skills/ui-ux-pro-max');
162
+ fs.mkdirSync(path.dirname(root), { recursive: true }); fs.renameSync(options.root, root);
163
+ fs.mkdirSync(path.join(plugin, '.claude-plugin'));
164
+ fs.writeFileSync(path.join(plugin, '.claude-plugin/plugin.json'), JSON.stringify({ name: 'ui-ux-pro-max', version: '2.16.0', skills: './.claude/skills/' }));
165
+ fs.writeFileSync(path.join(config, 'config.toml'), '[plugins."ui-ux-pro-max@ui-ux-pro-max-skill"]\nenabled = true\n');
166
+ const before = fs.readdirSync(options.home, { recursive: true });
167
+ const checked = deps.check({ ...options, host: 'codex' });
168
+ assert.equal(checked.design.availability, 'available', checked.design.reason);
169
+ assert.equal(checked.design.versionRelation, 'higher');
170
+ assert.equal(checked.design.root, root);
171
+ assert.deepEqual(fs.readdirSync(options.home, { recursive: true }), before);
172
+ fs.writeFileSync(path.join(config, 'config.toml'), '[plugins."ui-ux-pro-max@ui-ux-pro-max-skill"]\nenabled = false\n');
173
+ assert.equal(deps.check({ ...options, host: 'codex' }).design.availability, 'disabled');
174
+ });
175
+
176
+ test('a requested version and successful exit do not hide stale CLI output', t => {
177
+ const { root, options } = official(t, true);
178
+ const result = deps.inspectOfficial(root, options);
179
+ assert.equal(result.availability, 'unusable');
180
+ assert.match(result.reason, /data|query|match/i);
181
+ });
182
+
183
+ test('official probing rejects missing data, modified source and modified build output', t => {
184
+ for (const file of ['data/v1.6.0.json', 'bin/antdv.js', 'dist/index.mjs']) {
185
+ const { root, options } = official(t);
186
+ fs.writeFileSync(path.join(root, file), 'tampered');
187
+ assert.equal(deps.inspectOfficial(root, options).availability, 'unusable');
188
+ }
189
+ });
190
+
191
+ test('declining required preparation ends the flow with zero project writes', async t => {
192
+ const project = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'ui-demo-decline-')));
193
+ t.after(() => fs.rmSync(project, { recursive: true, force: true }));
194
+ const result = await deps.prepare({ project, host: 'codebuddy', decision: 'decline' });
195
+ assert.equal(result.status, 'declined');
196
+ assert.equal(result.continue, false);
197
+ assert.deepEqual(fs.readdirSync(project), []);
198
+ });
199
+
200
+ test('preparing a design provider preserves an existing Skill before starting installation', async t => {
201
+ const project = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'ui-demo-design-preserve-')));
202
+ t.after(() => fs.rmSync(project, { recursive: true, force: true }));
203
+ const location = deps.context({ project, home: project, host: 'codex', scope: 'project' });
204
+ const destination = path.join(location.skillsDirectory, 'ui-ux-pro-max');
205
+ fs.mkdirSync(destination, { recursive: true });
206
+ fs.writeFileSync(path.join(destination, 'manual.txt'), 'manual edits');
207
+ await assert.rejects(() => deps.prepareDesign(location), /Existing design Skill preserved/);
208
+ assert.equal(fs.readFileSync(path.join(destination, 'manual.txt'), 'utf8'), 'manual edits');
209
+ assert.equal(fs.existsSync(deps.toolDirectory(location)), false);
210
+ });
211
+
212
+ test('design commands point at the final project or global scope, including paths with spaces', t => {
213
+ const base = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'ui-demo-design-path-')));
214
+ t.after(() => fs.rmSync(base, { recursive: true, force: true }));
215
+ for (const scope of ['project', 'global']) {
216
+ const root = path.join(base, scope); fs.mkdirSync(root);
217
+ const old = '.agents/skills/ui-ux-pro-max/scripts/search.py';
218
+ fs.writeFileSync(path.join(root, 'SKILL.md'), `Official instructions retained\npython3 ${old} query\n`);
219
+ fs.writeFileSync(path.join(root, 'UPSTREAM-ORIGIN.json'), JSON.stringify({ version: '2.15.0', pathParameters: { script: old, command: old } }));
220
+ const project = path.join(base, 'business'), destination = path.join(scope === 'global' ? base + '/private home' : project, '.agents/skills/ui-ux-pro-max');
221
+ deps.parameterizeDesign(root, { scope, project }, destination);
222
+ const receipt = JSON.parse(fs.readFileSync(path.join(root, 'UPSTREAM-ORIGIN.json')));
223
+ assert.equal(receipt.pathParameters.script, (scope === 'global' ? path.join(destination, 'scripts/search.py') : old).split(path.sep).join('/'));
224
+ assert.ok(fs.readFileSync(path.join(root, 'SKILL.md'), 'utf8').includes('python3 ' + receipt.pathParameters.command + ' query'));
225
+ assert.ok(fs.readFileSync(path.join(root, 'SKILL.md'), 'utf8').startsWith('Official instructions retained\n'));
226
+ assert.equal(path.isAbsolute(receipt.pathParameters.script), scope === 'global');
227
+ }
228
+ });
@@ -0,0 +1,95 @@
1
+ const test = require('node:test');
2
+ const assert = require('node:assert/strict');
3
+ const fs = require('node:fs');
4
+ const os = require('node:os');
5
+ const path = require('node:path');
6
+ const installation = path.join(__dirname, 'lib/installation.js');
7
+ const skills = fs.existsSync(installation) ? require(installation).loadInstallation().skillsDirectory : path.resolve(__dirname, '../skills');
8
+ const mcp = require(path.join(skills, 'i3-ui-demo/scripts/mcp.cjs'));
9
+ function fixture(t) { const root = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'ui-demo-mcp-'))); t.after(() => fs.rmSync(root, { recursive: true, force: true })); return root; }
10
+
11
+ test('MCP planning is read-only and applying requires an explicit write flag', t => {
12
+ const project = fixture(t);
13
+ const plan = mcp.plan({ project, host: 'codebuddy', scope: 'project' });
14
+ assert.equal(plan.status, 'needs-configuration');
15
+ assert.deepEqual(fs.readdirSync(project), []);
16
+ assert.throws(() => mcp.apply({ project, host: 'codebuddy', scope: 'project', expected: plan.digest }), /write|authorization/);
17
+ assert.deepEqual(fs.readdirSync(project), []);
18
+ });
19
+
20
+ test('CodeBuddy configuration preserves unrelated settings and reuses the first existing priority file', t => {
21
+ const project = fixture(t), file = path.join(project, 'mcp.json');
22
+ fs.writeFileSync(file, JSON.stringify({ mcpServers: { other: { command: 'other-server' } }, retained: { owner: 'user' } }));
23
+ const options = { project, host: 'codebuddy', scope: 'project' }, before = mcp.plan(options);
24
+ assert.equal(before.file, file);
25
+ const result = mcp.apply({ ...options, write: true, expected: before.digest });
26
+ assert.equal(result.connectionVerified, false);
27
+ const after = JSON.parse(fs.readFileSync(file));
28
+ assert.equal(after.mcpServers.other.command, 'other-server');
29
+ assert.deepEqual(after.retained, { owner: 'user' });
30
+ assert.ok(after.mcpServers['chrome-devtools'].args.includes('--isolated'));
31
+ assert.equal(fs.existsSync(path.join(project, '.mcp.json')), false);
32
+ assert.equal(mcp.plan(options).status, 'configured-unverified');
33
+ });
34
+
35
+ test('MCP configuration never overwrites a conflicting server or a concurrent edit', t => {
36
+ const project = fixture(t), file = path.join(project, '.mcp.json');
37
+ fs.writeFileSync(file, JSON.stringify({ mcpServers: { 'chrome-devtools': { command: 'custom' } } }));
38
+ const original = fs.readFileSync(file), options = { project, host: 'codebuddy' };
39
+ assert.equal(mcp.plan(options).status, 'conflict');
40
+ assert.throws(() => mcp.apply({ ...options, write: true, expected: mcp.plan(options).digest }), /conflict/);
41
+ assert.deepEqual(fs.readFileSync(file), original);
42
+ fs.writeFileSync(file, '{}');
43
+ const before = mcp.plan(options);
44
+ fs.writeFileSync(file, '{"later":"user edit"}');
45
+ assert.throws(() => mcp.apply({ ...options, write: true, expected: before.digest }), /changed/);
46
+ assert.equal(fs.readFileSync(file, 'utf8'), '{"later":"user edit"}');
47
+ });
48
+
49
+ test('Codex adds a TOML table while preserving all existing text and distinguishes configuration from connection', t => {
50
+ const project = fixture(t), directory = path.join(project, '.codex'); fs.mkdirSync(directory);
51
+ const file = path.join(directory, 'config.toml'), initial = '# user settings\nmodel = "existing"\n\n[mcp_servers.other]\ncommand = "other"\n';
52
+ fs.writeFileSync(file, initial);
53
+ const options = { project, host: 'codex' }, before = mcp.plan(options);
54
+ const after = mcp.apply({ ...options, write: true, expected: before.digest });
55
+ assert.ok(fs.readFileSync(file, 'utf8').startsWith(initial));
56
+ assert.match(fs.readFileSync(file, 'utf8'), /\[mcp_servers\.chrome-devtools\]/);
57
+ assert.equal(after.status, 'configured-unverified');
58
+ assert.equal(after.connectionVerified, false);
59
+ });
60
+
61
+ test('MCP preparation refuses symlinks and unsupported host guesses without writing', t => {
62
+ const project = fixture(t), outside = fixture(t), target = path.join(outside, 'private.json'); fs.writeFileSync(target, '{}');
63
+ fs.symlinkSync(target, path.join(project, '.mcp.json'));
64
+ assert.throws(() => mcp.plan({ project, host: 'codebuddy' }), /symlink/);
65
+ assert.throws(() => mcp.plan({ project, host: 'unknown-host' }), /host|config/);
66
+ assert.equal(fs.readFileSync(target, 'utf8'), '{}');
67
+ });
68
+
69
+ test('new MCP filesystem access is scoped to the canonical business project, including paths with spaces', t => {
70
+ const root = fixture(t), project = path.join(root, 'business project'); fs.mkdirSync(project);
71
+ for (const host of ['codebuddy', 'codex']) {
72
+ const options = { project, host }, before = mcp.plan(options);
73
+ assert.deepEqual(before.server.args.slice(-2), ['--workspace', fs.realpathSync(project)]);
74
+ mcp.apply({ ...options, write: true, expected: before.digest });
75
+ const content = fs.readFileSync(before.file, 'utf8');
76
+ const args = host === 'codebuddy' ? JSON.parse(content).mcpServers['chrome-devtools'].args
77
+ : JSON.parse(content.match(/^args = (.+)$/m)[1]);
78
+ assert.deepEqual(args.slice(-2), ['--workspace', fs.realpathSync(project)]);
79
+ assert.equal(args.includes('--allowUnrestrictedPaths'), false);
80
+ const original = fs.readFileSync(before.file);
81
+ mcp.apply({ ...options, write: true, expected: mcp.plan(options).digest });
82
+ assert.deepEqual(fs.readFileSync(before.file), original);
83
+ }
84
+ });
85
+
86
+ test('existing real-browser attachment flags require review and are preserved in JSON and TOML', t => {
87
+ for (const flag of ['--autoConnect', '--browserUrl=http://localhost:9222', '--browser-url', '--wsEndpoint', '-u', '-w', '--userDataDir']) {
88
+ const project = fixture(t), file = path.join(project, '.mcp.json');
89
+ fs.writeFileSync(file, JSON.stringify({ mcpServers: { 'chrome-devtools': { command: 'npx', args: ['chrome-devtools-mcp', flag] } } }));
90
+ assert.equal(mcp.plan({ project, host: 'codebuddy' }).status, 'conflict', flag);
91
+ const directory = path.join(project, '.codex'); fs.mkdirSync(directory);
92
+ fs.writeFileSync(path.join(directory, 'config.toml'), `[mcp_servers.chrome-devtools]\ncommand="npx"\nargs=["chrome-devtools-mcp",${JSON.stringify(flag)}]\n`);
93
+ assert.equal(mcp.plan({ project, host: 'codex' }).status, 'conflict', flag);
94
+ }
95
+ });