@givolt/i3-composer-agent 3.2.1 → 4.0.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 (611) hide show
  1. package/.agents/plugins/marketplace.json +1 -1
  2. package/.claude/commands/i3-build.md +1 -0
  3. package/.claude/commands/i3-code-simplify.md +1 -0
  4. package/.claude/commands/i3-constraints.md +1 -0
  5. package/.claude/commands/i3-plan.md +1 -0
  6. package/.claude/commands/i3-review.md +1 -0
  7. package/.claude/commands/i3-ship.md +1 -0
  8. package/.claude/commands/i3-spec.md +1 -0
  9. package/.claude/commands/i3-test.md +1 -0
  10. package/.claude/commands/i3-webperf.md +1 -0
  11. package/.claude-plugin/marketplace.json +1 -1
  12. package/.claude-plugin/plugin.json +1 -1
  13. package/.codex-plugin/plugin.json +2 -2
  14. package/README.md +31 -25
  15. package/bin/i3-composer-agent.cjs +4 -59
  16. package/bin/install.cjs +6 -14
  17. package/bin/native-layout.cjs +11 -2
  18. package/bin/native-migration.cjs +68 -28
  19. package/bin/retired-custom-fingerprints.json +1597 -0
  20. package/bin/wizard.cjs +2 -13
  21. package/docs/antigravity-setup.md +3 -1
  22. package/docs/codebuddy-setup.md +19 -76
  23. package/docs/codex-setup.md +10 -4
  24. package/docs/comparison.md +1 -1
  25. package/docs/copilot-cli-setup.md +4 -4
  26. package/docs/cursor-setup.md +1 -1
  27. package/docs/gemini-cli-setup.md +1 -1
  28. package/docs/other-hosts.md +2 -2
  29. package/docs/windsurf-setup.md +2 -2
  30. package/docs/workbuddy-setup.md +9 -16
  31. package/evals/README.md +10 -0
  32. package/evals/cases/i3-code-simplification.json +8 -0
  33. package/evals/cases/i3-documentation-and-adrs.json +4 -0
  34. package/evals/cases/i3-enterprise-sop.json +1 -1
  35. package/evals/cases/i3-frontend-ui-engineering.json +1 -1
  36. package/evals/cases/i3-security-and-hardening.json +4 -0
  37. package/evals/cases/i3-ui-demo.json +2 -2
  38. package/evals/cases/i3-using-agent-skills.json +5 -5
  39. package/evals/plugin/simplify-fires-on-pasted-function/graders/behavior-kept-and-explained.md +7 -0
  40. package/evals/plugin/simplify-fires-on-pasted-function/graders/skill-fired.md +5 -0
  41. package/evals/plugin/simplify-fires-on-pasted-function/prompt.md +30 -0
  42. package/evals/plugin/simplify-stays-quiet-on-make-it-fast/graders/not-fired.md +8 -0
  43. package/evals/plugin/simplify-stays-quiet-on-make-it-fast/prompt.md +20 -0
  44. package/evals/zh-CN/cases/i3-code-simplification.json +8 -0
  45. package/evals/zh-CN/cases/i3-documentation-and-adrs.json +4 -0
  46. package/evals/zh-CN/cases/i3-enterprise-sop.json +1 -1
  47. package/evals/zh-CN/cases/i3-frontend-ui-engineering.json +2 -2
  48. package/evals/zh-CN/cases/i3-security-and-hardening.json +4 -0
  49. package/evals/zh-CN/cases/i3-ui-demo.json +2 -2
  50. package/evals/zh-CN/cases/i3-using-agent-skills.json +6 -6
  51. package/hooks/SDD-CACHE.md +1 -1
  52. package/package.json +13 -80
  53. package/plugin.json +15 -2
  54. package/references/accessibility-checklist.md +4 -4
  55. package/references/performance-checklist.md +5 -4
  56. package/references/testing-patterns.md +2 -1
  57. package/scripts/floor-guard-reference-test.js +32 -0
  58. package/scripts/lib/execution-status.js +44 -0
  59. package/scripts/run-evals-test.js +157 -7
  60. package/scripts/run-evals.js +59 -12
  61. package/scripts/ui-demo-test.js +2 -2
  62. package/scripts/validate-artifact-paths-test.js +14 -0
  63. package/scripts/validate-artifact-paths.js +4 -2
  64. package/skills/i3-api-and-interface-design/SKILL.md +3 -1
  65. package/skills/i3-ci-cd-and-automation/SKILL.md +7 -4
  66. package/skills/i3-code-simplification/SKILL.md +3 -3
  67. package/skills/i3-constraint-driven-development/SKILL.md +4 -4
  68. package/skills/i3-constraint-driven-development/references/floor-guard.md +2 -2
  69. package/skills/i3-context-engineering/SKILL.md +1 -1
  70. package/skills/i3-debugging-and-error-recovery/SKILL.md +1 -1
  71. package/skills/i3-deprecation-and-migration/SKILL.md +6 -1
  72. package/skills/i3-documentation-and-adrs/SKILL.md +3 -2
  73. package/skills/i3-enterprise-sop/SKILL.md +37 -70
  74. package/skills/i3-enterprise-sop/references/engineering-skeleton/directory-standard.md +7 -7
  75. package/skills/i3-enterprise-sop/references/handoff.py +149 -120
  76. package/skills/i3-enterprise-sop/references/technical-baseline/baselines/enterprise-application-technical-baseline-v0-0-4.md +24 -24
  77. package/skills/i3-enterprise-sop/references/technical-baseline/templates/technical-baseline.md +8 -8
  78. package/skills/i3-enterprise-sop/references/templates/ad.md +31 -31
  79. package/skills/i3-enterprise-sop/references/templates/brd.md +6 -6
  80. package/skills/i3-enterprise-sop/references/templates/prd.md +37 -37
  81. package/skills/i3-enterprise-sop/references/templates/testcase.md +25 -25
  82. package/skills/i3-frontend-ui-engineering/SKILL.md +6 -10
  83. package/skills/i3-idea-refine/SKILL.md +4 -2
  84. package/skills/i3-incremental-implementation/SKILL.md +0 -4
  85. package/skills/i3-performance-optimization/SKILL.md +2 -2
  86. package/skills/i3-security-and-hardening/references/hardening-patterns.md +5 -0
  87. package/skills/i3-source-driven-development/SKILL.md +3 -2
  88. package/skills/i3-spec-driven-development/SKILL.md +1 -1
  89. package/skills/i3-ui-demo/SKILL.md +3 -1
  90. package/skills/i3-ui-demo/references/dependencies.md +1 -1
  91. package/skills/i3-ui-demo/references/resources.md +1 -1
  92. package/skills/i3-ui-demo/scripts/dependencies.cjs +0 -3
  93. package/skills/i3-using-agent-skills/SKILL.md +2 -2
  94. package/.claude/commands/i3-prototype.md +0 -23
  95. package/.gemini/commands/i3-prototype.toml +0 -23
  96. package/commands/i3-prototype.toml +0 -23
  97. package/evals/cases/i3-ui-prototype.json +0 -158
  98. package/evals/fixtures/i3-ui-prototype/admin-list/assets/reference.css +0 -3
  99. package/evals/fixtures/i3-ui-prototype/admin-list/assets/reference.js +0 -8
  100. package/evals/fixtures/i3-ui-prototype/admin-list/capability-definition.json +0 -67
  101. package/evals/fixtures/i3-ui-prototype/admin-list/index.html +0 -89
  102. package/evals/fixtures/i3-ui-prototype/admin-list/readme.md +0 -52
  103. package/evals/fixtures/i3-ui-prototype/admin-list/template.json +0 -8
  104. package/evals/fixtures/i3-ui-prototype/business-brief.md +0 -7
  105. package/evals/zh-CN/cases/i3-ui-prototype.json +0 -165
  106. package/hooks/PROTOTYPE.md +0 -31
  107. package/hooks/codebuddy-upstream.cjs +0 -93
  108. package/hooks/i3-prototype.cjs +0 -7
  109. package/hooks/manage.cjs +0 -169
  110. package/scripts/design-provider-discovery-test.js +0 -190
  111. package/scripts/design-provider-test.js +0 -75
  112. package/scripts/enterprise-template-test.js +0 -205
  113. package/scripts/lib/prototype-fixture.cjs +0 -17
  114. package/scripts/prototype-cache-test.js +0 -55
  115. package/scripts/prototype-generation-entry-test.js +0 -6
  116. package/scripts/prototype-generation-evidence-test.js +0 -10
  117. package/scripts/prototype-generation-native-test.js +0 -78
  118. package/scripts/prototype-generation-test.js +0 -99
  119. package/scripts/prototype-inventory-test.js +0 -43
  120. package/scripts/prototype-locations-test.js +0 -79
  121. package/scripts/prototype-project-test.js +0 -183
  122. package/scripts/template-adapter-test.js +0 -155
  123. package/scripts/ui-prototype-binding-recovery-test.js +0 -84
  124. package/scripts/ui-prototype-buddy-lifecycle-test.js +0 -102
  125. package/scripts/ui-prototype-codebuddy-hook-test.js +0 -112
  126. package/scripts/ui-prototype-content-test.js +0 -123
  127. package/scripts/ui-prototype-dependencies-test.js +0 -226
  128. package/scripts/ui-prototype-devtools-test.js +0 -53
  129. package/scripts/ui-prototype-execution-evidence-test.js +0 -62
  130. package/scripts/ui-prototype-execution-gates-test.js +0 -91
  131. package/scripts/ui-prototype-execution-policy-test.js +0 -53
  132. package/scripts/ui-prototype-execution-runtime-test.js +0 -27
  133. package/scripts/ui-prototype-ide-source-test.js +0 -73
  134. package/scripts/ui-prototype-native-test.js +0 -526
  135. package/scripts/ui-prototype-recovery-test.js +0 -81
  136. package/scripts/ui-prototype-registration-test.js +0 -53
  137. package/scripts/ui-prototype-template-test.js +0 -261
  138. package/scripts/ui-prototype-test.js +0 -124
  139. package/scripts/ui-prototype-transcript-auto-test.js +0 -67
  140. package/skills/i3-ui-prototype/SKILL.md +0 -256
  141. package/skills/i3-ui-prototype/assets/capabilities/generation.json +0 -833
  142. package/skills/i3-ui-prototype/assets/capabilities/management.json +0 -294
  143. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/acceptance.json +0 -51
  144. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/component-map.json +0 -13
  145. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/generation-component-map.json +0 -300
  146. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/index.html +0 -11
  147. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/package-lock.json +0 -2298
  148. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/package.json +0 -22
  149. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/public/prototype-config.json +0 -6
  150. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/App.vue +0 -136
  151. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/components/DeviceEditor.vue +0 -111
  152. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/config.ts +0 -19
  153. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/content.ts +0 -28
  154. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/domain/devices.ts +0 -50
  155. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/domain/theme.ts +0 -25
  156. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/main.ts +0 -18
  157. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/style.css +0 -50
  158. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/useDevices.ts +0 -66
  159. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/tests/devices.test.ts +0 -44
  160. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/tests/theme.test.ts +0 -26
  161. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/tsconfig.json +0 -15
  162. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/vite.config.ts +0 -4
  163. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/profile.json +0 -174
  164. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/readme.md +0 -61
  165. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/index.html +0 -11
  166. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/package-lock.json +0 -2298
  167. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/package.json +0 -22
  168. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/public/prototype-config.json +0 -21
  169. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/App.vue +0 -62
  170. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/PrototypeShell.vue +0 -59
  171. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/config.ts +0 -23
  172. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/domain/presentation.ts +0 -29
  173. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/domain/theme.ts +0 -25
  174. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/main.ts +0 -18
  175. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/style.css +0 -26
  176. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/tests/presentation.test.ts +0 -23
  177. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/tests/theme.test.ts +0 -26
  178. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/tsconfig.json +0 -15
  179. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/vite.config.ts +0 -4
  180. package/skills/i3-ui-prototype/assets/hosts/codebuddy/profile.json +0 -17
  181. package/skills/i3-ui-prototype/assets/optional-skills/host-targets.json +0 -739
  182. package/skills/i3-ui-prototype/assets/optional-skills/sources.json +0 -27
  183. package/skills/i3-ui-prototype/assets/templates/catalog.js +0 -149
  184. package/skills/i3-ui-prototype/assets/templates/catalog.json +0 -149
  185. package/skills/i3-ui-prototype/assets/templates/classic-admin/manifest.json +0 -9
  186. package/skills/i3-ui-prototype/assets/templates/classic-admin/preset.json +0 -6
  187. package/skills/i3-ui-prototype/assets/templates/common/app/app.mjs +0 -89
  188. package/skills/i3-ui-prototype/assets/templates/common/app/config.json +0 -1
  189. package/skills/i3-ui-prototype/assets/templates/common/app/domain.mjs +0 -20
  190. package/skills/i3-ui-prototype/assets/templates/common/app/index.html +0 -17
  191. package/skills/i3-ui-prototype/assets/templates/common/app/serve.cjs +0 -16
  192. package/skills/i3-ui-prototype/assets/templates/common/app/styles.css +0 -670
  193. package/skills/i3-ui-prototype/assets/templates/common/app/tokens.css +0 -19
  194. package/skills/i3-ui-prototype/assets/templates/common/design-system/master.md +0 -20
  195. package/skills/i3-ui-prototype/assets/templates/common/gallery.html +0 -2
  196. package/skills/i3-ui-prototype/assets/templates/common/mocks/applications.json +0 -5
  197. package/skills/i3-ui-prototype/assets/templates/common/requirements-map.json +0 -8
  198. package/skills/i3-ui-prototype/assets/templates/common/serve-gallery.cjs +0 -16
  199. package/skills/i3-ui-prototype/assets/templates/credits.md +0 -17
  200. package/skills/i3-ui-prototype/assets/templates/data-operations/manifest.json +0 -9
  201. package/skills/i3-ui-prototype/assets/templates/data-operations/preset.json +0 -6
  202. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/capability-definition.json +0 -294
  203. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/component-inventory.json +0 -707
  204. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/design-system.md +0 -32
  205. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/generation.json +0 -49
  206. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/index.html +0 -534
  207. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/manifest.json +0 -9
  208. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/offline-build.json +0 -265
  209. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/offline.js +0 -8888
  210. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/origin.json +0 -344
  211. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/preset.json +0 -928
  212. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/app.js +0 -22
  213. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/empty.svg +0 -1
  214. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/reference-styles.json +0 -1
  215. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/result-403.svg +0 -1
  216. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/result-404.svg +0 -1
  217. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets-manifest.json +0 -334
  218. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/baseline.json +0 -173
  219. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/conversion.md +0 -30
  220. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/credits.md +0 -17
  221. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/design-tokens.json +0 -881
  222. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/index.html +0 -28
  223. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/@qin-ui-antdv-next-pro.txt +0 -9
  224. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/ant-design-icons.txt +0 -22
  225. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/antdv-next.txt +0 -21
  226. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/package.json +0 -12
  227. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/browser-routes.json +0 -298
  228. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/coverage.json +0 -180
  229. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/integrity.json +0 -13
  230. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/keyboard.json +0 -11
  231. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/responsive.json +0 -125
  232. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/review.md +0 -51
  233. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/rules.log +0 -150
  234. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-html.png +0 -0
  235. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-original.png +0 -0
  236. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-html.png +0 -0
  237. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-original.png +0 -0
  238. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/models-html.png +0 -0
  239. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/models-original.png +0 -0
  240. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-html.png +0 -0
  241. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-original.png +0 -0
  242. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/selection.json +0 -9
  243. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/visual-comparison.json +0 -342
  244. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/readme.md +0 -73
  245. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/reference.md +0 -59
  246. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/routes.json +0 -178
  247. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/controls.js +0 -99
  248. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/dialogs.js +0 -54
  249. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/dom.js +0 -264
  250. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/forms.js +0 -47
  251. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/icons.js +0 -41
  252. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/layout.js +0 -47
  253. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/router.js +0 -63
  254. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/state.js +0 -90
  255. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/table.js +0 -41
  256. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/widgets.js +0 -8
  257. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.html +0 -3
  258. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.js +0 -36
  259. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.html +0 -2
  260. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.js +0 -51
  261. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.html +0 -3
  262. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.js +0 -48
  263. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/CheckResults.html +0 -2
  264. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/CheckResults.js +0 -6
  265. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.html +0 -2
  266. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.js +0 -13
  267. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/data.js +0 -24
  268. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/domain.js +0 -32
  269. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/registry.js +0 -25
  270. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/store.js +0 -85
  271. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentClose.html +0 -2
  272. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentClose.js +0 -17
  273. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.html +0 -2
  274. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.js +0 -66
  275. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.html +0 -3
  276. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.js +0 -38
  277. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.html +0 -2
  278. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.js +0 -66
  279. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.html +0 -2
  280. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.js +0 -5
  281. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.html +0 -2
  282. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.js +0 -12
  283. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.html +0 -2
  284. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.js +0 -11
  285. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentList.html +0 -2
  286. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentList.js +0 -116
  287. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.html +0 -2
  288. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.js +0 -32
  289. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.html +0 -2
  290. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.js +0 -49
  291. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.html +0 -2
  292. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.js +0 -10
  293. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.html +0 -2
  294. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.js +0 -77
  295. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/data.js +0 -60
  296. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/domain.js +0 -105
  297. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/store.js +0 -212
  298. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/AuditPanel.html +0 -2
  299. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/AuditPanel.js +0 -18
  300. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelDetail.html +0 -2
  301. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelDetail.js +0 -23
  302. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelEditor.html +0 -2
  303. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelEditor.js +0 -78
  304. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelGrant.html +0 -2
  305. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelGrant.js +0 -55
  306. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelReferences.html +0 -2
  307. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelReferences.js +0 -26
  308. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelRelease.html +0 -2
  309. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelRelease.js +0 -38
  310. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelStatus.html +0 -2
  311. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelStatus.js +0 -7
  312. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTable.html +0 -2
  313. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTable.js +0 -72
  314. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTester.html +0 -2
  315. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTester.js +0 -46
  316. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelsPage.html +0 -2
  317. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelsPage.js +0 -52
  318. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/RowActions.html +0 -2
  319. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/RowActions.js +0 -19
  320. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/UsagePanel.html +0 -2
  321. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/UsagePanel.js +0 -30
  322. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/data.js +0 -48
  323. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/domain.js +0 -39
  324. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/store.js +0 -129
  325. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.html +0 -4
  326. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.js +0 -21
  327. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IntentSource.html +0 -2
  328. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IntentSource.js +0 -8
  329. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.html +0 -2
  330. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.js +0 -37
  331. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.html +0 -2
  332. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.js +0 -10
  333. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.html +0 -2
  334. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.js +0 -37
  335. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.html +0 -2
  336. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.js +0 -49
  337. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RunDetail.html +0 -4
  338. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RunDetail.js +0 -22
  339. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.html +0 -2
  340. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.js +0 -9
  341. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/commands.js +0 -82
  342. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/examples.js +0 -47
  343. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/model.js +0 -61
  344. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/repair.js +0 -68
  345. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/store.js +0 -55
  346. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/types.js +0 -1
  347. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/workbench.js +0 -18
  348. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.html +0 -3
  349. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.js +0 -28
  350. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.html +0 -2
  351. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.js +0 -18
  352. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.html +0 -2
  353. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.js +0 -31
  354. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.html +0 -2
  355. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.js +0 -27
  356. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.html +0 -2
  357. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.js +0 -16
  358. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.html +0 -2
  359. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.js +0 -43
  360. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.html +0 -4
  361. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.js +0 -34
  362. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.html +0 -2
  363. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.js +0 -30
  364. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.html +0 -3
  365. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.js +0 -67
  366. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.html +0 -2
  367. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.js +0 -41
  368. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.html +0 -2
  369. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.js +0 -31
  370. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.html +0 -2
  371. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.js +0 -26
  372. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.html +0 -2
  373. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.js +0 -70
  374. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/data.js +0 -8
  375. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/domain.js +0 -62
  376. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/management.js +0 -36
  377. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/managementStore.js +0 -49
  378. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/store.js +0 -132
  379. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/AdminList.html +0 -2
  380. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/AdminList.js +0 -38
  381. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.html +0 -2
  382. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.js +0 -11
  383. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.html +0 -2
  384. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.js +0 -45
  385. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.html +0 -2
  386. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.js +0 -54
  387. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.html +0 -3
  388. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.js +0 -27
  389. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.html +0 -2
  390. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.js +0 -12
  391. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.html +0 -2
  392. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.js +0 -45
  393. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.html +0 -3
  394. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.js +0 -38
  395. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/domain.js +0 -61
  396. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/state.js +0 -51
  397. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/store.js +0 -116
  398. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.html +0 -2
  399. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.js +0 -45
  400. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.html +0 -4
  401. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.js +0 -30
  402. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.html +0 -2
  403. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.js +0 -67
  404. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.html +0 -2
  405. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.js +0 -5
  406. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.html +0 -4
  407. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.js +0 -60
  408. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/commands.js +0 -157
  409. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/model.js +0 -136
  410. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/store.js +0 -76
  411. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.html +0 -3
  412. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.js +0 -26
  413. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.html +0 -2
  414. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.js +0 -14
  415. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.html +0 -2
  416. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.js +0 -113
  417. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.html +0 -3
  418. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.js +0 -62
  419. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/commands.js +0 -97
  420. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/model.js +0 -147
  421. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/store.js +0 -13
  422. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.html +0 -2
  423. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.js +0 -9
  424. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.html +0 -2
  425. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.js +0 -8
  426. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.html +0 -2
  427. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.js +0 -37
  428. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListMore.html +0 -2
  429. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListMore.js +0 -8
  430. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.html +0 -2
  431. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.js +0 -17
  432. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/columns.js +0 -32
  433. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/deliveryGuide.js +0 -49
  434. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/deliveryView.js +0 -12
  435. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/listBatch.js +0 -15
  436. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/listSelection.js +0 -37
  437. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/policy.js +0 -68
  438. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/session.js +0 -44
  439. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.html +0 -2
  440. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.js +0 -25
  441. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.html +0 -2
  442. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.js +0 -53
  443. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.html +0 -10
  444. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.js +0 -30
  445. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ScopePage.html +0 -2
  446. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ScopePage.js +0 -10
  447. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.html +0 -2
  448. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.js +0 -9
  449. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/confirmation.js +0 -3
  450. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/navigation.js +0 -19
  451. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.html +0 -2
  452. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.js +0 -8
  453. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.html +0 -2
  454. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.js +0 -32
  455. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.html +0 -2
  456. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.js +0 -15
  457. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.html +0 -2
  458. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.js +0 -11
  459. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecReview.html +0 -2
  460. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecReview.js +0 -57
  461. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.html +0 -2
  462. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.js +0 -37
  463. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/data.js +0 -20
  464. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/domain.js +0 -55
  465. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/store.js +0 -151
  466. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.html +0 -3
  467. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.js +0 -18
  468. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.html +0 -2
  469. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.js +0 -40
  470. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.html +0 -2
  471. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.js +0 -51
  472. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.html +0 -2
  473. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.js +0 -9
  474. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.html +0 -5
  475. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.js +0 -48
  476. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/domain.js +0 -204
  477. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/exampleSource.js +0 -22
  478. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/registry.js +0 -135
  479. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/store.js +0 -137
  480. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.html +0 -3
  481. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.js +0 -36
  482. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/model.js +0 -56
  483. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/store.js +0 -15
  484. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.html +0 -2
  485. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.js +0 -27
  486. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.html +0 -4
  487. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.js +0 -31
  488. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.html +0 -2
  489. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.js +0 -68
  490. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.html +0 -5
  491. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.js +0 -55
  492. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/data.js +0 -16
  493. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/domain.js +0 -83
  494. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/registry.js +0 -18
  495. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/store.js +0 -61
  496. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/admin.css +0 -60
  497. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/agents.css +0 -46
  498. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/antdv.css +0 -295
  499. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/app.css +0 -102
  500. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/delivery.css +0 -4
  501. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/intents.css +0 -37
  502. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/native.css +0 -22
  503. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/operations.css +0 -2
  504. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/pbc.css +0 -3
  505. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/permissions.css +0 -22
  506. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/pro.css +0 -1
  507. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/releases.css +0 -4
  508. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/reset.css +0 -246
  509. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/reviews.css +0 -8
  510. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/tasks.css +0 -6
  511. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/tokens.css +0 -15
  512. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/workbench.css +0 -61
  513. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/workflows.css +0 -1
  514. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/admin-rules.test.js +0 -96
  515. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/agents.test.js +0 -14
  516. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/intent-state.test.js +0 -37
  517. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/list-batch.test.js +0 -44
  518. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operation-fixtures.js +0 -19
  519. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operation-repair.test.js +0 -14
  520. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operations.test.js +0 -25
  521. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/pbc-management.test.js +0 -17
  522. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/pbc-state.test.js +0 -24
  523. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/permission-config.test.js +0 -23
  524. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/permissions.test.js +0 -24
  525. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/releases.test.js +0 -50
  526. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/reviews.test.js +0 -36
  527. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-forms-router.test.js +0 -28
  528. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-state.test.js +0 -42
  529. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-stores.test.js +0 -16
  530. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/spec-state.test.js +0 -11
  531. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/tasks.test.js +0 -27
  532. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/workbench.test.js +0 -34
  533. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/workflows.test.js +0 -16
  534. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/convert.mjs +0 -168
  535. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/serve.mjs +0 -7
  536. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/styles.mjs +0 -11
  537. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/verify.mjs +0 -24
  538. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/serve.cjs +0 -16
  539. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/template-inventory.json +0 -28791
  540. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/template.json +0 -9
  541. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/usability.css +0 -44
  542. package/skills/i3-ui-prototype/assets/templates/gallery/index.html +0 -40
  543. package/skills/i3-ui-prototype/assets/templates/generation-options.js +0 -42
  544. package/skills/i3-ui-prototype/assets/templates/index.html +0 -3
  545. package/skills/i3-ui-prototype/assets/templates/modern-workspace/manifest.json +0 -9
  546. package/skills/i3-ui-prototype/assets/templates/modern-workspace/preset.json +0 -6
  547. package/skills/i3-ui-prototype/assets/templates/presentation.html +0 -17
  548. package/skills/i3-ui-prototype/assets/templates/serve-gallery.cjs +0 -23
  549. package/skills/i3-ui-prototype/references/artifact-contract.md +0 -66
  550. package/skills/i3-ui-prototype/references/content-template.md +0 -81
  551. package/skills/i3-ui-prototype/references/enterprise-admin.md +0 -44
  552. package/skills/i3-ui-prototype/references/entry-contract.md +0 -71
  553. package/skills/i3-ui-prototype/references/execution-evidence.md +0 -51
  554. package/skills/i3-ui-prototype/references/expert-adapter.md +0 -76
  555. package/skills/i3-ui-prototype/references/framework-contract.md +0 -76
  556. package/skills/i3-ui-prototype/references/generation-contract.md +0 -122
  557. package/skills/i3-ui-prototype/references/interaction-acceptance.md +0 -169
  558. package/skills/i3-ui-prototype/references/legacy-native.md +0 -58
  559. package/skills/i3-ui-prototype/references/optional-skills.md +0 -63
  560. package/skills/i3-ui-prototype/references/project-layout.md +0 -92
  561. package/skills/i3-ui-prototype/references/template-adapters.md +0 -63
  562. package/skills/i3-ui-prototype/references/workflow-contract.md +0 -77
  563. package/skills/i3-ui-prototype/scripts/adapters/easel-html.cjs +0 -30
  564. package/skills/i3-ui-prototype/scripts/adapters/legacy-html.cjs +0 -28
  565. package/skills/i3-ui-prototype/scripts/browser-workspace.cjs +0 -72
  566. package/skills/i3-ui-prototype/scripts/buddy-host.cjs +0 -40
  567. package/skills/i3-ui-prototype/scripts/check-design-provider.cjs +0 -9
  568. package/skills/i3-ui-prototype/scripts/check-prototype.cjs +0 -14
  569. package/skills/i3-ui-prototype/scripts/codebuddy-context.cjs +0 -92
  570. package/skills/i3-ui-prototype/scripts/codebuddy-hook.cjs +0 -298
  571. package/skills/i3-ui-prototype/scripts/codebuddy-ide-source.cjs +0 -69
  572. package/skills/i3-ui-prototype/scripts/codebuddy-registration.cjs +0 -125
  573. package/skills/i3-ui-prototype/scripts/content-template.cjs +0 -98
  574. package/skills/i3-ui-prototype/scripts/design-provider-discovery.cjs +0 -128
  575. package/skills/i3-ui-prototype/scripts/enterprise-template.cjs +0 -104
  576. package/skills/i3-ui-prototype/scripts/execution-assertions.cjs +0 -43
  577. package/skills/i3-ui-prototype/scripts/execution-diagnostics.cjs +0 -91
  578. package/skills/i3-ui-prototype/scripts/execution-evidence.cjs +0 -177
  579. package/skills/i3-ui-prototype/scripts/execution-gates.cjs +0 -216
  580. package/skills/i3-ui-prototype/scripts/execution-policy.cjs +0 -62
  581. package/skills/i3-ui-prototype/scripts/execution-recovery.cjs +0 -58
  582. package/skills/i3-ui-prototype/scripts/execution-runtime.cjs +0 -69
  583. package/skills/i3-ui-prototype/scripts/generation-assets.cjs +0 -18
  584. package/skills/i3-ui-prototype/scripts/generation-contract.cjs +0 -214
  585. package/skills/i3-ui-prototype/scripts/generation-evidence.cjs +0 -50
  586. package/skills/i3-ui-prototype/scripts/generation-replan.cjs +0 -34
  587. package/skills/i3-ui-prototype/scripts/hosts/codebuddy.cjs +0 -21
  588. package/skills/i3-ui-prototype/scripts/init-prototype.cjs +0 -8
  589. package/skills/i3-ui-prototype/scripts/manage-baseline.cjs +0 -11
  590. package/skills/i3-ui-prototype/scripts/native-browser.cjs +0 -785
  591. package/skills/i3-ui-prototype/scripts/native-build.cjs +0 -91
  592. package/skills/i3-ui-prototype/scripts/native-command.cjs +0 -35
  593. package/skills/i3-ui-prototype/scripts/native-delivery.cjs +0 -104
  594. package/skills/i3-ui-prototype/scripts/native-devtools.cjs +0 -92
  595. package/skills/i3-ui-prototype/scripts/native-files.cjs +0 -44
  596. package/skills/i3-ui-prototype/scripts/native-pilot-lib.cjs +0 -290
  597. package/skills/i3-ui-prototype/scripts/native-pilot.cjs +0 -59
  598. package/skills/i3-ui-prototype/scripts/native-tool-name.cjs +0 -5
  599. package/skills/i3-ui-prototype/scripts/native-tool-result.cjs +0 -14
  600. package/skills/i3-ui-prototype/scripts/optional-skill-install.cjs +0 -203
  601. package/skills/i3-ui-prototype/scripts/project-registry.cjs +0 -126
  602. package/skills/i3-ui-prototype/scripts/prototype-dependencies.cjs +0 -103
  603. package/skills/i3-ui-prototype/scripts/prototype-hooks.cjs +0 -94
  604. package/skills/i3-ui-prototype/scripts/prototype-lib.cjs +0 -277
  605. package/skills/i3-ui-prototype/scripts/prototype-locations.cjs +0 -69
  606. package/skills/i3-ui-prototype/scripts/ptc-callbacks.cjs +0 -131
  607. package/skills/i3-ui-prototype/scripts/sync-template.cjs +0 -19
  608. package/skills/i3-ui-prototype/scripts/template-adapters.cjs +0 -89
  609. package/skills/i3-ui-prototype/scripts/template-contract.cjs +0 -407
  610. package/skills/i3-ui-prototype/scripts/template-inventory.cjs +0 -78
  611. package/skills/i3-ui-prototype/scripts/validate-result.cjs +0 -117
@@ -1,526 +0,0 @@
1
- 'use strict';
2
- const test = require('node:test');
3
- const assert = require('node:assert/strict');
4
- const fs = require('node:fs');
5
- const os = require('node:os');
6
- const path = require('node:path');
7
- const crypto = require('node:crypto');
8
- const legacyFixture = require('./lib/prototype-fixture.cjs');
9
- const installationFile = path.join(__dirname, 'lib/installation.js');
10
- const skillsDirectory = fs.existsSync(installationFile) ? require(installationFile).loadInstallation().skillsDirectory : path.resolve(__dirname, '../skills');
11
- const lib = require(path.join(skillsDirectory, 'i3-ui-prototype/scripts/native-pilot-lib.cjs'));
12
- function project(t) { const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'native-prototype-')); t.after(() => fs.rmSync(dir, { recursive:true, force:true })); return dir; }
13
- test('analysis is read-only even if no prototype exists', t => {
14
- const dir=project(t); const before=fs.readdirSync(dir);
15
- assert.equal(lib.analyze({project:dir}).operation,'analyze');
16
- assert.deepEqual(fs.readdirSync(dir),before);
17
- });
18
- test('theme requires a sourced optional capability and fixes its generated configuration and acceptance', t => {
19
- const dir=project(t),template=legacyFixture.prepareTemplate(require(path.join(skillsDirectory,'i3-ui-prototype/scripts/template-contract.cjs')), {project:dir}),contract=require(path.join(skillsDirectory,'i3-ui-prototype/scripts/template-contract.cjs'));
20
- const plain=lib.createPrototype({project:dir,id:'plain',templateRoot:template.directory,expertMode:'template'}).directory;
21
- assert.equal(JSON.parse(fs.readFileSync(path.join(plain,'app/public/prototype-config.json'))).theme,undefined);
22
- const plainBefore=lib.manifest(plain),plainAcceptance=JSON.parse(fs.readFileSync(path.join(plain,'inputs/acceptance.json')));
23
- assert.equal(plainAcceptance.requiredScenarios.length+plainAcceptance.frameworkScenarios.length,20);
24
- const file=path.join(template.directory,'index.html');fs.writeFileSync(file,fs.readFileSync(file,'utf8').replace(/<!-- OPTIONAL_FOUR_THEMES:[\s\S]*?(<aside[\s\S]*?<\/aside>)\s*-->/,'$1'));contract.syncTemplate(template.directory);
25
- assert.throws(()=>lib.createPrototype({project:dir,id:'unsourced-theme',templateRoot:template.directory,expertMode:'template'}),/theme.*source|主题.*来源/i);
26
- const scope={schemaVersion:1,requirements:[{id:'THEME-1',text:'四种命名主题,默认明亮',source:{type:'user',reference:'theme-request',statement:'明亮、暗黑、清新、科技'},capabilities:[{pageId:'devices',regionId:'device-list',capabilityId:'theme'}]}],exemptions:[]};
27
- write(dir,'scope.json',scope);
28
- const themed=lib.createPrototype({project:dir,id:'themed',templateRoot:template.directory,expertMode:'template',scope:path.join(dir,'scope.json')}).directory;
29
- const config=JSON.parse(fs.readFileSync(path.join(themed,'app/public/prototype-config.json')));
30
- assert.deepEqual(config.theme,{defaultTheme:'light',presets:['light','dark','fresh','tech']});
31
- const browser=require(path.join(skillsDirectory,'i3-ui-prototype/scripts/native-browser.cjs'));
32
- assert.deepEqual(browser.themePlan(themed),{source:'inputs/capabilities.json',bindingId:'devices/device-list/theme',defaultTheme:'light',presets:['light','dark','fresh','tech']});
33
- assert.equal(browser.themePlan(plain),null);
34
- assert.equal(lib.inspect(themed).status,'passed');
35
- const themedAcceptance=JSON.parse(fs.readFileSync(path.join(themed,'inputs/acceptance.json')));
36
- assert.equal(themedAcceptance.requiredScenarios.filter(id=>id.includes('/theme/')).length,3);
37
- assert.equal(themedAcceptance.requiredScenarios.length+themedAcceptance.frameworkScenarios.length,23);
38
- assert.deepEqual(themedAcceptance.requiredScenarios.filter(id=>!id.includes('/theme/')),plainAcceptance.requiredScenarios,'The four-theme opt-in cannot remove baseline scenarios');
39
- assert.deepEqual(themedAcceptance.browserReview.observations,['dom','screenshot','console','network','accessibility','performance']);
40
- assert.equal(lib.manifest(plain).digest,plainBefore.digest,'New theme inputs must not mutate an existing unbound instance');
41
- assert.equal(lib.inspect(plain).status,'passed');
42
- config.theme.defaultTheme='dark';write(themed,'app/public/prototype-config.json',config);assert.equal(lib.inspect(themed).status,'failed','runtime configuration cannot override the fixed binding');
43
- });
44
- test('analysis leaves host execution unverified unless explicitly declared and rejects invalid modes without writes', t => {
45
- const dir=project(t),before=fs.readdirSync(dir);
46
- const unknown=lib.analyze({project:dir});
47
- assert.equal(unknown.execution,null,'the script cannot infer independent host invocation');
48
- assert.equal(unknown.executionEvidence,'unverified');
49
- for(const execution of ['inline','delegated']) {
50
- const result=lib.analyze({project:dir,execution});
51
- assert.equal(result.execution,execution);assert.equal(result.executionEvidence,'caller-declared');
52
- assert.equal(result.readOnly,true);assert.deepEqual(result.sideEffects,[]);
53
- }
54
- for(const execution of ['agent',true,null,''])assert.throws(()=>lib.analyze({project:dir,execution}),/execution|inline|delegated/);
55
- assert.deepEqual(fs.readdirSync(dir),before);
56
- });
57
- test('new fixed content projection acceptance cannot be dropped while legacy inputs retain their original list', t => {
58
- const dir=project(t),template=legacyFixture.prepareTemplate(require(path.join(skillsDirectory,'i3-ui-prototype/scripts/template-contract.cjs')), {project:dir});
59
- const root=lib.createPrototype({project:dir,id:'projection-guard',templateRoot:template.directory,expertMode:'template'}).directory;
60
- const acceptance=JSON.parse(fs.readFileSync(path.join(root,'inputs/acceptance.json'))),framework=JSON.parse(fs.readFileSync(path.join(root,'inputs/framework.json')));
61
- acceptance.frameworkScenarios=acceptance.frameworkScenarios.filter(id=>id!=='template-content-projection');write(root,'inputs/acceptance.json',acceptance);
62
- let current=lib.manifest(root);
63
- assert.throws(()=>lib.revise(root,{revision:'r002',expectedRevision:'r001',expectedDigest:current.digest,acceptInputs:true}),/template-content-projection/);
64
- framework.acceptance.scenarios=framework.acceptance.scenarios.filter(scenario=>scenario.id!=='template-content-projection');write(root,'inputs/framework.json',framework);
65
- current=lib.manifest(root);
66
- lib.revise(root,{revision:'r002',expectedRevision:'r001',expectedDigest:current.digest,acceptInputs:true});
67
- assert.equal(lib.inspect(root).status,'passed','An older fixed framework snapshot is not implicitly given a new scenario');
68
- });
69
- test('browser pagination expectations come from fixed instance bindings and retain legacy fixed semantics', t => {
70
- const dir=project(t),template=legacyFixture.prepareTemplate(require(path.join(skillsDirectory,'i3-ui-prototype/scripts/template-contract.cjs')), {project:dir});
71
- const browser=require(path.join(skillsDirectory,'i3-ui-prototype/scripts/native-browser.cjs'));
72
- const fixed=lib.createPrototype({project:dir,id:'fixed-devices',templateRoot:template.directory,expertMode:'template'}).directory;
73
- assert.deepEqual(browser.paginationPlan(fixed),{source:'inputs/capabilities.json',bindingId:'devices/device-list/pagination',mode:'fixed',defaultPageSize:10,pageSizeOptions:[10]});
74
- const html=path.join(template.directory,'index.html');
75
- fs.writeFileSync(html,fs.readFileSync(html,'utf8').replace('"fixedPageSize":10,"minimumTestPages":3','"mode":"adjustable","defaultPageSize":10,"pageSizeOptions":[10,20,50],"minimumTestPages":3'));
76
- require(path.join(skillsDirectory,'i3-ui-prototype/scripts/template-contract.cjs')).syncTemplate(template.directory);
77
- const adjustable=lib.createPrototype({project:dir,id:'adjustable-devices',templateRoot:template.directory,expertMode:'template'}).directory;
78
- assert.equal(lib.inspect(adjustable).status,'passed');
79
- const config=path.join(adjustable,'app/public/prototype-config.json'),data=JSON.parse(fs.readFileSync(config));
80
- data.pagination={mode:'fixed',fixedPageSize:99};fs.writeFileSync(config,JSON.stringify(data));
81
- assert.deepEqual(browser.paginationPlan(adjustable),{source:'inputs/capabilities.json',bindingId:'devices/device-list/pagination',mode:'adjustable',defaultPageSize:10,pageSizeOptions:[10,20,50]},'page runtime self-report cannot change the acceptance contract');
82
- });
83
- test('pagination focus regression is enabled only by the fixed framework snapshot', t => {
84
- const dir=project(t),browser=require(path.join(skillsDirectory,'i3-ui-prototype/scripts/native-browser.cjs'));
85
- write(dir,'inputs/framework.json',{acceptance:{paginationFocusGuard:true}});assert.equal(browser.paginationFocusPlan(dir),true);
86
- write(dir,'inputs/framework.json',{acceptance:{}});assert.equal(browser.paginationFocusPlan(dir),false,'Legacy snapshots do not gain a new guard');
87
- for(const value of [false,'true',1]){write(dir,'inputs/framework.json',{acceptance:{paginationFocusGuard:value}});assert.throws(()=>browser.paginationFocusPlan(dir),/focus guard/);}
88
- });
89
- test('native candidate fixes inputs and excludes runtime progress from its identity', t => {
90
- const dir=project(t); const template=legacyFixture.prepareTemplate(require(path.join(skillsDirectory,'i3-ui-prototype/scripts/template-contract.cjs')), {project:dir});
91
- const created=lib.createPrototype({project:dir,id:'devices',templateRoot:template.directory,expertMode:'template'});
92
- assert.equal(created.status,'created'); const candidate=lib.manifest(created.directory);
93
- assert.equal(lib.inspect(created.directory).status,'passed');
94
- fs.writeFileSync(path.join(created.directory,'execution.json'),JSON.stringify({owner:'other-progress',status:'running'}));
95
- fs.mkdirSync(path.join(created.directory,'qa'),{recursive:true}); fs.writeFileSync(path.join(created.directory,'qa','progress.log'),'testing');
96
- assert.equal(lib.manifest(created.directory).digest,candidate.digest);
97
- fs.appendFileSync(path.join(template.directory,'index.html'),'\n<!-- future template -->');
98
- assert.equal(lib.manifest(created.directory).digest,candidate.digest);
99
- fs.appendFileSync(path.join(created.directory,'app','src','App.vue'),'\n<!-- user change -->');
100
- assert.notEqual(lib.manifest(created.directory).digest,candidate.digest);
101
- });
102
- test('a stale revision cannot overwrite a candidate and revise preserves actual source edits', t => {
103
- const dir=project(t); const template=legacyFixture.prepareTemplate(require(path.join(skillsDirectory,'i3-ui-prototype/scripts/template-contract.cjs')), {project:dir});
104
- const created=lib.createPrototype({project:dir,id:'devices',templateRoot:template.directory,expertMode:'template'});
105
- const initial=lib.manifest(created.directory);
106
- fs.appendFileSync(path.join(created.directory,'app','src','App.vue'),'\n<!-- keep me -->');
107
- assert.throws(()=>lib.revise(created.directory,{revision:'r002',expectedRevision:'r001',expectedDigest:initial.digest}),/changed|stale|冲突|变化/);
108
- const current=lib.manifest(created.directory);
109
- lib.revise(created.directory,{revision:'r002',expectedRevision:'r001',expectedDigest:current.digest});
110
- assert.match(fs.readFileSync(path.join(created.directory,'app','src','App.vue'),'utf8'),/keep me/);
111
- assert.equal(lib.manifest(created.directory).revision,'r002');
112
- });
113
- test('required capability deletion and input mutation cannot reuse the old contract', t => {
114
- const dir=project(t); const template=legacyFixture.prepareTemplate(require(path.join(skillsDirectory,'i3-ui-prototype/scripts/template-contract.cjs')), {project:dir});
115
- const created=lib.createPrototype({project:dir,id:'devices',templateRoot:template.directory,expertMode:'template'});
116
- const initial=lib.manifest(created.directory);
117
- const file=path.join(created.directory,'inputs','capabilities.json'); const data=JSON.parse(fs.readFileSync(file));
118
- data.bindings=data.bindings.filter(binding=>binding.capabilityId!=='pagination'); fs.writeFileSync(file,JSON.stringify(data));
119
- assert.notEqual(lib.manifest(created.directory).digest,initial.digest);
120
- assert.equal(lib.inspect(created.directory).status,'failed');
121
- });
122
- test('build manifests verify bytes, and a build for an old candidate is rejected', t => {
123
- const dir=project(t); const template=legacyFixture.prepareTemplate(require(path.join(skillsDirectory,'i3-ui-prototype/scripts/template-contract.cjs')), {project:dir});
124
- const created=lib.createPrototype({project:dir,id:'devices',templateRoot:template.directory,expertMode:'template'});
125
- assert.equal(lib.inspect(created.directory,{acceptance:true}).status,'failed');
126
- assert.throws(()=>lib.verifyBuild(created.directory,'missing'),/build|构建|ENOENT/);
127
- assert.throws(()=>lib.confirmBaseline(created.directory,{revision:'r001',digest:lib.manifest(created.directory).digest}),/confirmation|确认|reviewer/);
128
- });
129
-
130
- // These are synthetic guard fixtures, never runtime or user-acceptance evidence.
131
- const hash = bytes => crypto.createHash('sha256').update(bytes).digest('hex');
132
- function write(directory, relative, value) {
133
- const file=path.join(directory,relative); fs.mkdirSync(path.dirname(file),{recursive:true});
134
- fs.writeFileSync(file,Buffer.isBuffer(value)||typeof value==='string'?value:JSON.stringify(value));
135
- }
136
- function candidate(t,extra={}) {
137
- const root=project(t); const template=legacyFixture.prepareTemplate(require(path.join(skillsDirectory,'i3-ui-prototype/scripts/template-contract.cjs')), {project:root});
138
- const options={project:root,id:'devices',templateRoot:template.directory,expertMode:'template',...extra};
139
- if(options.executionPolicy){
140
- write(root,'scope.json',{schemaVersion:1,requirements:[{id:'AUDIT-RETIREMENT-1',text:'Synthetic fixed business coverage',source:{type:'prd',reference:'unit-fixture',statement:'Synthetic contract fixture, not browser acceptance'}}],exemptions:[],openQuestions:[]});options.scope=path.join(root,'scope.json');
141
- const A=require(path.join(skillsDirectory,'i3-ui-prototype/scripts/execution-assertions.cjs'));
142
- const assertions=A.template(options);for(const scenario of assertions.scenarios)scenario.checks=[{method:'evaluate_script',pointer:'/observed',operator:'equals',expected:true}];
143
- write(root,'assertions.json',assertions);options.executionAssertions=path.join(root,'assertions.json');options.host='codebuddy';
144
- }
145
- return lib.createPrototype(options).directory;
146
- }
147
- function syntheticBuild(directory,{embedded=true}={}) {
148
- const current=lib.manifest(directory);
149
- const bytes={
150
- 'index.html':Buffer.from('<!doctype html><script type="module" src="/assets/app.js"></script><link rel="stylesheet" href="/assets/app.css">'),
151
- 'assets/app.js':Buffer.from(`window.__PROTOTYPE_META__={candidateId:${JSON.stringify(embedded?current.digest:'previous-candidate')}};`),
152
- 'assets/app.css':Buffer.from('body{color:#123}'),
153
- 'prototype-config.json':fs.readFileSync(path.join(directory,'app/public/prototype-config.json')),
154
- };
155
- const files=Object.fromEntries(Object.entries(bytes).sort(([a],[b])=>a.localeCompare(b)).map(([name,value])=>[name,hash(value)]));
156
- const buildDigest=hash(JSON.stringify(files)),buildId=`b-${buildDigest.slice(0,20)}`;
157
- for(const [name,value]of Object.entries(bytes))write(directory,`builds/${buildId}/site/${name}`,value);
158
- write(directory,`builds/${buildId}/manifest.json`,{schemaVersion:1,buildId,buildDigest,candidateDigest:current.digest,inputDigest:current.inputDigest,revision:current.revision,files,source:'synthetic-unit-fixture',checks:{typecheck:'synthetic contract fixture; not executed',test:'synthetic contract fixture; not executed',build:'synthetic contract fixture; not executed'}});
159
- return {current,buildId,buildDigest,files};
160
- }
161
- function syntheticReport(directory,build=syntheticBuild(directory)) {
162
- const png=Buffer.from('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+ip1sAAAAASUVORK5CYII=','base64');
163
- write(directory,'qa/fixtures/a.png',png);write(directory,'qa/fixtures/b.png',png);
164
- write(directory,'qa/fixtures/trace.zip',Buffer.concat([Buffer.from([0x50,0x4b,0x05,0x06]),Buffer.alloc(18)]));
165
- const acceptance=JSON.parse(fs.readFileSync(path.join(directory,'inputs/acceptance.json')));
166
- const previewBaseURL='http://127.0.0.1:4173/';
167
- write(directory,'last-build.json',{buildId:build.buildId,buildDigest:build.buildDigest,candidateDigest:build.current.digest});
168
- if(acceptance.browserReview){
169
- const devtools=require(path.join(skillsDirectory,'i3-ui-prototype/scripts/native-devtools.cjs')),observations={};
170
- for(const kind of devtools.KINDS){const evidence=`qa/fixtures/devtools-${kind}.${kind==='screenshot'?'png':kind==='performance'?'json':'txt'}`;write(directory,evidence,kind==='screenshot'?png:kind==='performance'?{traceEvents:[{name:'synthetic-contract-fixture',ts:1}]}:`Synthetic ${kind} fixture; not executed`);observations[kind]={status:'passed',summary:'Synthetic guard fixture only; not actual browser acceptance',evidence};}
171
- devtools.record(directory,{schemaVersion:1,status:'passed',revision:build.current.revision,candidateDigest:build.current.digest,buildId:build.buildId,buildDigest:build.buildDigest,executor:'synthetic-unit-fixture',startedAt:'2026-10-17T00:00:00.000Z',completedAt:'2026-10-17T00:00:01.000Z',previewBaseURL,skill:{name:acceptance.browserReview.skill,toolCallId:'synthetic-skill',evidence:'Synthetic fixture; no host invocation'},mcp:{name:'chrome-devtools-mcp',version:'1.11.0',evidence:'Synthetic fixture; no host invocation',calls:['evaluate_script','take_screenshot','list_console_messages','list_network_requests','take_snapshot','performance_start_trace','performance_stop_trace'].map((method,index)=>({tool:`mcp__chrome_devtools__${method}`,toolCallId:`synthetic-${index}`}))},observations,openItems:[]},lib);
172
- }
173
- return {id:'synthetic-guard-fixture',status:'passed',candidateDigest:build.current.digest,revision:build.current.revision,buildId:build.buildId,buildDigest:build.buildDigest,executor:'unit-fixture',tool:'unit-fixture',source:'synthetic-unit-fixture',startedAt:'2026-10-17T00:00:00.000Z',completedAt:'2026-10-17T00:00:01.000Z',consoleErrors:[],journeys:[...acceptance.requiredScenarios,...acceptance.frameworkScenarios].map(id=>({id,status:'passed'})),screenshots:['qa/fixtures/a.png','qa/fixtures/b.png'],trace:'qa/fixtures/trace.zip',viewports:[1440,768],previewBaseURL,observedResources:Object.entries(build.files).map(([name,sha256])=>({path:name,url:new URL(name==='index.html'?'':name,previewBaseURL).href,status:200,sha256,resourceType:name==='index.html'?'document':name.endsWith('.js')?'script':name.endsWith('.css')?'stylesheet':'fetch'}))};
174
- }
175
-
176
- for(const executionPolicy of ['buddy-ab-v2','codebuddy-ab-v1'])test(`${executionPolicy}: normal browser record and finalize need no retired Hook binding`,t=>{
177
- const directory=candidate(t,{executionPolicy});
178
- assert.equal(fs.existsSync(path.join(directory,'qa/execution-context.json')),false);
179
- assert.throws(()=>lib.finalize(directory),/acceptance|verified|验收/i,'Retiring audit must not accept missing business evidence');
180
- const report=syntheticReport(directory);lib.recordRun(directory,report);
181
- const delivery=lib.finalize(directory);
182
- assert.equal(delivery.status,'complete');assert.equal(delivery.invocationVerification,'unverified');assert.equal(delivery.checks.execution,undefined);
183
- assert.equal(delivery.checks.devtoolsReview,'current');assert.equal(lib.state(directory).delivery.status,'current');
184
- assert.equal(fs.existsSync(path.join(directory,'qa/execution-context.json')),false);
185
- assert.equal(fs.existsSync(path.join(directory,'qa/execution-evidence.json')),false);
186
- assert.equal(lib.state(directory).execution.auditHook,'retired');
187
- const evidence=path.join(directory,'qa/fixtures/devtools-dom.txt');fs.appendFileSync(evidence,'edited');
188
- assert.throws(()=>lib.finalize(directory),/DevTools review required/,'Stale browser evidence still blocks finalization');
189
- });
190
-
191
- test('new policy blocks finalization and human baseline when DevTools review is missing or stale',t=>{
192
- const directory=candidate(t),report=syntheticReport(directory);lib.recordRun(directory,report);
193
- const current=lib.manifest(directory),file=path.join(directory,'qa/devtools-review.json'),valid=fs.readFileSync(file);
194
- fs.rmSync(file);assert.equal(lib.state(directory).nextAction,'devtools-review');assert.throws(()=>lib.finalize(directory),/DevTools review required/);
195
- assert.throws(()=>lib.confirmBaseline(directory,{revision:current.revision,digest:current.digest,reviewer:'synthetic-fixture',statement:'Synthetic approval fixture only',source:'unit-test'}),/DevTools review required/);
196
- assert.equal(fs.existsSync(path.join(directory,'qa/delivery.json')),false);fs.writeFileSync(file,valid);
197
- const delivery=lib.finalize(directory);assert.equal(delivery.checks.devtoolsReview,'current');assert.equal(lib.state(directory).delivery.status,'current');
198
- fs.appendFileSync(path.join(directory,'qa/fixtures/devtools-dom.txt'),'changed artifact');assert.equal(lib.state(directory).delivery.status,'stale');assert.throws(()=>lib.finalize(directory),/DevTools review required/);
199
- });
200
-
201
- test('old fixed inputs without browserReview retain their delivery contract',t=>{
202
- const directory=candidate(t),acceptance=JSON.parse(fs.readFileSync(path.join(directory,'inputs/acceptance.json')));delete acceptance.browserReview;write(directory,'inputs/acceptance.json',acceptance);
203
- const framework=JSON.parse(fs.readFileSync(path.join(directory,'inputs/framework.json')));delete framework.acceptance.browserReview;write(directory,'inputs/framework.json',framework);
204
- const edited=lib.manifest(directory);lib.revise(directory,{revision:'r002',expectedRevision:edited.revision,expectedDigest:edited.digest,acceptInputs:true});
205
- const report=syntheticReport(directory);lib.recordRun(directory,report);
206
- assert.equal(lib.state(directory).devtoolsReview.status,'not-required');const result=lib.finalize(directory);assert.equal(result.status,'complete');assert.equal(result.devtoolsReview,undefined);
207
- });
208
- test('required DevTools policy cannot disappear from only the derived acceptance input',t=>{
209
- const directory=candidate(t),acceptance=JSON.parse(fs.readFileSync(path.join(directory,'inputs/acceptance.json')));delete acceptance.browserReview;write(directory,'inputs/acceptance.json',acceptance);
210
- const current=lib.manifest(directory);assert.throws(()=>lib.revise(directory,{revision:'r002',expectedRevision:current.revision,expectedDigest:current.digest,acceptInputs:true}),/DevTools|browser review/i);assert.equal(lib.manifest(directory).revision,'r001');
211
- });
212
- test('a finalized receipt becomes stale if its valid browser report bytes change',t=>{
213
- const directory=candidate(t),report=syntheticReport(directory);lib.recordRun(directory,report);lib.finalize(directory);
214
- const file=path.join(directory,'qa/runs',report.id,'report.json'),changed=JSON.parse(fs.readFileSync(file));changed.executor='different-synthetic-executor';write(directory,path.relative(directory,file),changed);
215
- assert.equal(lib.state(directory).browser.status,'current','the edited report remains structurally valid');
216
- assert.equal(lib.state(directory).delivery.status,'stale','the saved receipt binds the exact report bytes');
217
- });
218
-
219
- test('professional review requires recorded decisions and verifies adopted guidance; zero adoption remains valid', t => {
220
- const directory=candidate(t),meta=JSON.parse(fs.readFileSync(path.join(directory,'prototype.json')));
221
- meta.expertMode='professional';write(directory,'prototype.json',meta);
222
- const query={query:'error summary validation',source:'synthetic-unit-provider',resultDigest:hash('fixture-result')};
223
- const advice={provider:{availability:'available',digest:hash('provider')},queries:[query],records:[],status:'reviewed'};
224
- write(directory,'qa/design-advice.json',advice);write(directory,'design-system/decisions.json',{reviewStatus:'reviewed',records:[]});
225
- assert.equal(lib.inspect(directory,{acceptance:true,report:syntheticReport(directory)}).status,'failed','empty decisions must not pass as reviewed');
226
- const rejected={query:query.query,resultIdentity:'fixture result',decision:'rejected',rationale:'Already covered by the native form contract',verification:'No additional implementation required'};
227
- advice.records=[rejected];write(directory,'qa/design-advice.json',advice);
228
- assert.equal(lib.inspect(directory,{acceptance:true,report:syntheticReport(directory)}).status,'failed','QA alone cannot change design decisions');
229
- write(directory,'design-system/decisions.json',{reviewStatus:'reviewed',records:[rejected]});
230
- assert.equal(lib.inspect(directory,{acceptance:true,report:syntheticReport(directory)}).status,'passed');
231
- lib.recordRun(directory,syntheticReport(directory));
232
- assert.equal(JSON.parse(fs.readFileSync(path.join(directory,'prototype.json'))).expert.status,'reviewed','zero adoption must remain reviewed after real report validation');
233
- const adopted={...rejected,decision:'adopted',implementation:'app/src/App.vue'};
234
- advice.records=[adopted];write(directory,'qa/design-advice.json',advice);write(directory,'design-system/decisions.json',{reviewStatus:'reviewed',records:[adopted]});
235
- assert.equal(lib.inspect(directory,{acceptance:true,report:syntheticReport(directory)}).status,'failed','adoption needs a real verified scenario');
236
- });
237
-
238
- test('failed staging releases the project lock so a repaired directory can be retried', t => {
239
- const root=project(t);legacyFixture.prepareTemplate(require(path.join(skillsDirectory,'i3-ui-prototype/scripts/template-contract.cjs')), {project:root});
240
- fs.writeFileSync(path.join(root,'prototypes'),'blocking file');
241
- assert.throws(()=>lib.createPrototype({project:root,id:'devices',templateRoot:path.join(root,'ui-templates/admin-list'),expertMode:'template'}),/EEXIST/);
242
- assert.equal(fs.existsSync(path.join(root,'.i3-ui-prototypes.lock')),false);
243
- fs.rmSync(path.join(root,'prototypes'));
244
- assert.equal(lib.createPrototype({project:root,id:'devices',templateRoot:path.join(root,'ui-templates/admin-list'),expertMode:'template'}).status,'created');
245
- });
246
-
247
- test('all source resources participate while only explicit root caches are excluded', t => {
248
- const directory=candidate(t);
249
- for(const relative of ['app/src/copy.log','app/src/dist/label.txt','app/public/coverage/text.txt'])write(directory,relative,'first');
250
- const before=lib.manifest(directory);
251
- for(const relative of ['app/src/copy.log','app/src/dist/label.txt','app/public/coverage/text.txt'])assert.ok(Object.hasOwn(before.files,relative),relative);
252
- write(directory,'app/src/copy.log','changed');assert.notEqual(lib.manifest(directory).digest,before.digest);
253
- const source=lib.manifest(directory).digest;
254
- write(directory,'app/node_modules/fake.js','dependency cache');write(directory,'app/dist/output.js','build output');
255
- assert.equal(lib.manifest(directory).digest,source);
256
- });
257
-
258
- test('requirements map references actual pages and rejects unknown page identities', t => {
259
- const directory=candidate(t),file=path.join(directory,'requirements-map.json');
260
- const map=JSON.parse(fs.readFileSync(file));
261
- assert.deepEqual(map.requirements[0].pages,['devices']);
262
- map.requirements[0].pages=['missing-page'];fs.writeFileSync(file,JSON.stringify(map));
263
- assert.equal(lib.inspect(directory).status,'failed');
264
- });
265
-
266
- test('a build claiming current metadata must actually embed its candidate identity in JavaScript', t => {
267
- const directory=candidate(t),build=syntheticBuild(directory,{embedded:false});
268
- assert.throws(()=>lib.verifyBuild(directory,build.buildId),/embed|candidate|identity|标识/);
269
- });
270
-
271
- test('browser guard rejects missing, stale or mismatched resource observations before publishing', t => {
272
- const directory=candidate(t),report=syntheticReport(directory);
273
- assert.equal(lib.inspect(directory,{acceptance:true,report}).status,'passed');
274
- lib.recordRun(directory,report);
275
- const latest=fs.readFileSync(path.join(directory,'qa/latest.json'),'utf8');
276
- const badReports=[
277
- {...report,id:'missing-observations',observedResources:[]},
278
- {...report,id:'missing-stylesheet',observedResources:report.observedResources.filter(entry=>!entry.path.endsWith('.css'))},
279
- {...report,id:'wrong-bytes',observedResources:report.observedResources.map((entry,index)=>index?entry:{...entry,sha256:'0'.repeat(64)})},
280
- {...report,id:'other-server',observedResources:report.observedResources.map(entry=>({...entry,url:entry.url.replace(':4173',':9999')}))},
281
- {...report,id:'bad-status',observedResources:report.observedResources.map(entry=>({...entry,status:304}))},
282
- {...report,id:'wrong-request-type',observedResources:report.observedResources.map(entry=>entry.path.endsWith('.js')?{...entry,resourceType:'fetch'}:entry)},
283
- {...report,id:'bad-time',startedAt:'invented'},
284
- ];
285
- for(const bad of badReports){assert.throws(()=>lib.recordRun(directory,bad));assert.equal(fs.readFileSync(path.join(directory,'qa/latest.json'),'utf8'),latest);assert.equal(fs.existsSync(path.join(directory,`qa/runs/${bad.id}/report.json`)),false);}
286
- });
287
-
288
- test('nonempty text is refused as PNG or trace evidence', t => {
289
- const directory=candidate(t),report=syntheticReport(directory);
290
- fs.writeFileSync(path.join(directory,report.screenshots[0]),'not a PNG');
291
- assert.throws(()=>lib.recordRun(directory,report),/PNG|screenshot/);
292
- const valid=syntheticReport(directory);
293
- fs.writeFileSync(path.join(directory,valid.trace),'not a ZIP');
294
- assert.throws(()=>lib.recordRun(directory,valid),/ZIP|trace/);
295
- });
296
-
297
- test('failed baseline staging leaves no partial revision and can be retried', t => {
298
- const directory=candidate(t),report=syntheticReport(directory);lib.recordRun(directory,report);
299
- const current=lib.manifest(directory),confirmation={revision:current.revision,digest:current.digest,reviewer:'synthetic-fixture',statement:'Synthetic unit test only; not actual human acceptance',source:'unit-test'};
300
- const original=fs.copyFileSync;
301
- try{fs.copyFileSync=()=>{throw new Error('simulated copy failure');};assert.throws(()=>lib.confirmBaseline(directory,confirmation),/simulated copy failure/);}finally{fs.copyFileSync=original;}
302
- assert.equal(fs.existsSync(path.join(directory,'baselines/r001')),false);
303
- assert.equal(lib.confirmBaseline(directory,confirmation).digest,current.digest);
304
- assert.equal(lib.compareBaseline(directory).status,'unchanged');
305
- });
306
-
307
- test('editing and syncing HTML projects supported content into new prototypes without mutating old ones', t => {
308
- const root=project(t),template=legacyFixture.prepareTemplate(require(path.join(skillsDirectory,'i3-ui-prototype/scripts/template-contract.cjs')), {project:root});
309
- const first=lib.createPrototype({project:root,id:'first',templateRoot:template.directory,expertMode:'template'});
310
- const configFile=path.join(first.directory,'app/public/prototype-config.json');
311
- const original=fs.readFileSync(configFile,'utf8');
312
- assert.equal(JSON.parse(original).content.fields.name.label,'设备名称');
313
- const htmlFile=path.join(template.directory,'index.html');
314
- fs.writeFileSync(htmlFile,fs.readFileSync(htmlFile,'utf8')
315
- .replace('<h1>设备管理</h1>','<h1>资产台账</h1>')
316
- .replace('data-field-id="device-name">设备名称','data-field-id="device-name">资产名称')
317
- .replace('data-action-id="query" type="button">查询','data-action-id="query" type="button">检索'));
318
- require(path.join(skillsDirectory,'i3-ui-prototype/scripts/template-contract.cjs')).syncTemplate(template.directory);
319
- const second=lib.createPrototype({project:root,id:'second',templateRoot:template.directory,expertMode:'template'});
320
- const updated=JSON.parse(fs.readFileSync(path.join(second.directory,'app/public/prototype-config.json')));
321
- assert.equal(updated.title,'资产台账');
322
- assert.equal(updated.content.fields.name.label,'资产名称');
323
- assert.equal(updated.content.actions.query,'检索');
324
- assert.equal(fs.readFileSync(configFile,'utf8'),original);
325
- assert.equal(lib.inspect(first.directory).status,'passed');
326
- });
327
-
328
- test('unsupported template fields require explicit framework adaptation instead of silently disappearing', t => {
329
- const root=project(t),template=legacyFixture.prepareTemplate(require(path.join(skillsDirectory,'i3-ui-prototype/scripts/template-contract.cjs')), {project:root}),htmlFile=path.join(template.directory,'index.html');
330
- fs.writeFileSync(htmlFile,fs.readFileSync(htmlFile,'utf8').replace('data-field-id="device-status">状态</th>','data-field-id="device-status">状态</th><th data-field-id="device-owner">负责人</th>'));
331
- require(path.join(skillsDirectory,'i3-ui-prototype/scripts/template-contract.cjs')).syncTemplate(template.directory);
332
- assert.throws(()=>lib.createPrototype({project:root,id:'unsupported',templateRoot:template.directory,expertMode:'template'}),/unsupported|adaptation|适配/i);
333
- assert.equal(fs.existsSync(path.join(root,'prototypes/unsupported')),false);
334
- });
335
-
336
- test('HTML cannot silently remove the required name field validation in the pilot projection', t => {
337
- const root=project(t),template=legacyFixture.prepareTemplate(require(path.join(skillsDirectory,'i3-ui-prototype/scripts/template-contract.cjs')), {project:root}),htmlFile=path.join(template.directory,'index.html');
338
- fs.writeFileSync(htmlFile,fs.readFileSync(htmlFile,'utf8').replace('value="一号循环泵" required','value="一号循环泵"'));
339
- require(path.join(skillsDirectory,'i3-ui-prototype/scripts/template-contract.cjs')).syncTemplate(template.directory);
340
- assert.throws(()=>lib.createPrototype({project:root,id:'no-validation',templateRoot:template.directory,expertMode:'template'}),/required|必填|adaptation/i);
341
- });
342
-
343
- test('a changed fixed input requires explicit acceptance and failed acceptance does not advance revision', t => {
344
- const directory=candidate(t),scopeFile=path.join(directory,'inputs/scope.json');
345
- const scope=JSON.parse(fs.readFileSync(scopeFile));scope.openQuestions=['Explicitly added review question'];fs.writeFileSync(scopeFile,JSON.stringify(scope));
346
- const current=lib.manifest(directory),options={revision:'r002',expectedRevision:'r001',expectedDigest:current.digest};
347
- assert.throws(()=>lib.revise(directory,options),/input|contract|输入/i);
348
- assert.equal(lib.manifest(directory).revision,'r001');
349
- const updated=lib.revise(directory,{...options,acceptInputs:true});
350
- assert.equal(updated.revision,'r002');assert.equal(lib.inspect(directory).status,'passed');
351
- const file=path.join(directory,'inputs/capabilities.json'),capabilities=JSON.parse(fs.readFileSync(file));
352
- capabilities.bindings=capabilities.bindings.filter(binding=>binding.capabilityId!=='pagination');fs.writeFileSync(file,JSON.stringify(capabilities));
353
- const invalid=lib.manifest(directory);
354
- assert.throws(()=>lib.revise(directory,{revision:'r003',expectedRevision:'r002',expectedDigest:invalid.digest,acceptInputs:true}),/binding|capability|pagination/i);
355
- assert.equal(lib.manifest(directory).revision,'r002');
356
- });
357
-
358
- test('CLI check rejects a stale generated index without updating it', async t => {
359
- const root=project(t),template=legacyFixture.prepareTemplate(require(path.join(skillsDirectory,'i3-ui-prototype/scripts/template-contract.cjs')), {project:root}),file=path.join(template.directory,'capabilities.generated.json');
360
- const before=fs.readFileSync(file,'utf8');fs.appendFileSync(path.join(template.directory,'index.html'),'\n<!-- edit -->');
361
- const cli=require(path.join(skillsDirectory,'i3-ui-prototype/scripts/native-pilot.cjs'));
362
- await assert.rejects(cli.main(['sync-template',template.directory,'--check']),/stale|不同步/);
363
- assert.equal(fs.readFileSync(file,'utf8'),before);
364
- });
365
-
366
- test('an explicit title is projected to the visible page and unsupported frameworks write nothing', t => {
367
- const root=project(t);legacyFixture.prepareTemplate(require(path.join(skillsDirectory,'i3-ui-prototype/scripts/template-contract.cjs')), {project:root});
368
- assert.throws(()=>lib.createPrototype({project:root,id:'wrong',framework:'react-material-ui',expertMode:'template'}),/framework|框架|unsupported/i);
369
- assert.equal(fs.existsSync(path.join(root,'prototypes')),false);assert.equal(fs.existsSync(path.join(root,'.i3-ui-prototypes.json')),false);
370
- const {directory}=lib.createPrototype({project:root,id:'titled',templateRoot:path.join(root,'ui-templates/admin-list'),title:'明确指定的新标题',expertMode:'template'});
371
- const config=JSON.parse(fs.readFileSync(path.join(directory,'app/public/prototype-config.json')));
372
- assert.equal(config.title,'明确指定的新标题');assert.equal(config.content.pageTitle,config.title);
373
- });
374
-
375
- test('ordinary revise can start repair of broken user code without accepting changed contracts', t => {
376
- const directory=candidate(t);fs.rmSync(path.join(directory,'app/src/App.vue'));
377
- const current=lib.manifest(directory);
378
- assert.equal(lib.revise(directory,{revision:'r002',expectedRevision:current.revision,expectedDigest:current.digest}).revision,'r002');
379
- assert.equal(lib.inspect(directory).status,'failed');
380
- });
381
-
382
- test('a failing real npm test prevents the build command and fixed build publication', t => {
383
- const directory=candidate(t,{executionPolicy:'buddy-ab-v2'}),app=path.join(directory,'app'),file=path.join(app,'package.json');
384
- const pkg=JSON.parse(fs.readFileSync(file));
385
- pkg.scripts={typecheck:'node -e "process.exit(0)"',test:'node -e "process.exit(3)"',build:'node build-test.cjs'};
386
- fs.writeFileSync(file,JSON.stringify(pkg));
387
- fs.writeFileSync(path.join(app,'build-test.cjs'),'require("node:fs").writeFileSync("build-ran.txt","unexpected build execution");\n');
388
- fs.mkdirSync(path.join(app,'node_modules/vite'),{recursive:true});
389
- assert.throws(()=>lib.build(directory),/npm test failed/);
390
- assert.equal(fs.existsSync(path.join(app,'build-ran.txt')),false);
391
- assert.equal(fs.existsSync(path.join(directory,'last-build.json')),false);
392
- assert.equal(fs.existsSync(path.join(directory,'builds')),false);
393
- });
394
-
395
- test('a build manifest missing its required test step cannot be reused for acceptance', t => {
396
- const directory=candidate(t),build=syntheticBuild(directory),file=path.join(directory,`builds/${build.buildId}/manifest.json`);
397
- const data=JSON.parse(fs.readFileSync(file));delete data.checks.test;fs.writeFileSync(file,JSON.stringify(data));
398
- assert.throws(()=>lib.verifyBuild(directory,build.buildId),/test|check|步骤/);
399
- });
400
-
401
- test('state is a read-only compact handoff with exact current commands', async t => {
402
- const directory=candidate(t),before=lib.manifest(directory);
403
- const tree=()=>Object.fromEntries(require(path.join(skillsDirectory,'i3-ui-prototype/scripts/native-files.cjs')).walk(directory).map(file=>[file,hash(fs.readFileSync(path.join(directory,file)))]));
404
- const snapshot=tree();
405
- const result=lib.state(directory);
406
- assert.equal(result.candidateDigest,before.digest);
407
- assert.equal(result.inputDigest,before.inputDigest);
408
- assert.equal(result.revision,'r001');
409
- assert.equal(result.design.status,'skipped');
410
- assert.equal(result.build.status,'not-run');
411
- assert.equal(result.browser.status,'not-run');
412
- assert.equal(result.nextAction,'build');
413
- assert.ok(result.scopes.requirements.length);
414
- assert.ok(result.commands.revise.argv.includes(before.digest));
415
- assert.ok(result.commands.browser.argv.includes('browser'));
416
- assert.deepEqual(tree(),snapshot,'state must not write progress, directories or host memory');
417
- const cli=require(path.join(skillsDirectory,'i3-ui-prototype/scripts/native-pilot.cjs'));
418
- assert.equal((await cli.main(['state',directory])).candidateDigest,before.digest);
419
- });
420
-
421
- test('state identifies pending professional review without inventing decisions', t => {
422
- const directory=candidate(t),meta=JSON.parse(fs.readFileSync(path.join(directory,'prototype.json')));
423
- meta.expertMode='professional';write(directory,'prototype.json',meta);
424
- write(directory,'qa/design-advice.json',{provider:{availability:'available',digest:hash('fixture-provider')},queries:[],records:[],status:'pending'});
425
- write(directory,'design-system/decisions.json',{reviewStatus:'pending',records:[]});
426
- assert.equal(lib.state(directory).design.status,'pending');
427
- assert.equal(lib.state(directory).nextAction,'review-design');
428
- assert.throws(()=>lib.finalize(directory),/acceptance|验收/i);
429
- assert.equal(JSON.parse(fs.readFileSync(path.join(directory,'qa/design-advice.json'))).status,'pending');
430
- });
431
-
432
- test('finalize refuses unverified candidates and preserves user handoff on failure', t => {
433
- const directory=candidate(t),file=path.join(directory,'HANDOFF.md'),before=fs.readFileSync(file,'utf8');
434
- assert.throws(()=>lib.finalize(directory),/acceptance|verified|验收/i);
435
- assert.equal(fs.readFileSync(file,'utf8'),before);
436
- assert.equal(fs.existsSync(path.join(directory,'.prototype-write.lock')),false);
437
- });
438
-
439
- test('finalize summarizes verified guard fixtures without changing identity or human approval', t => {
440
- const directory=candidate(t),report=syntheticReport(directory);lib.recordRun(directory,report);
441
- write(directory,'last-build.json',{buildId:report.buildId,buildDigest:report.buildDigest,candidateDigest:report.candidateDigest});
442
- const before=lib.manifest(directory),file=path.join(directory,'HANDOFF.md');
443
- fs.appendFileSync(file,'\nUSER_HANDOFF_NOTE: preserve this paragraph\n');
444
- const result=lib.finalize(directory,{expectedRevision:before.revision,expectedDigest:before.digest});
445
- assert.equal(result.status,'complete');assert.equal(result.candidateDigest,before.digest);
446
- assert.equal(result.review,'pending-review');assert.equal(result.verification,'passed');
447
- assert.equal(JSON.parse(fs.readFileSync(path.join(directory,'qa/delivery.json'))).candidateDigest,before.digest);
448
- assert.equal(lib.state(directory).delivery.status,'current');
449
- assert.equal(lib.state(directory).nextAction,'return-result');
450
- assert.match(fs.readFileSync(file,'utf8'),/USER_HANDOFF_NOTE/);
451
- assert.equal(lib.manifest(directory).digest,before.digest);
452
- const text=fs.readFileSync(file,'utf8');lib.finalize(directory);
453
- assert.equal(fs.readFileSync(file,'utf8'),text,'repeat finalize must not duplicate generated handoff');
454
- assert.equal(fs.existsSync(path.join(directory,'baseline.json')),false);
455
- fs.appendFileSync(path.join(directory,'app/src/App.vue'),'\n<!-- new user edit -->');
456
- const changed=lib.state(directory);
457
- assert.equal(changed.delivery.status,'stale');assert.equal(changed.nextAction,'build');
458
- assert.throws(()=>lib.finalize(directory),/acceptance|stale|验收/i);
459
- });
460
-
461
- test('browser and final handoff cannot write while another candidate owner is active', async t => {
462
- const directory=candidate(t),report=syntheticReport(directory);lib.recordRun(directory,report);
463
- const current=lib.manifest(directory);lib.claim(directory,{owner:'active-owner',expectedRevision:current.revision,expectedDigest:current.digest});
464
- try {
465
- assert.throws(()=>lib.finalize(directory),/EEXIST|owner|writing|锁/i);
466
- const browser=require(path.join(skillsDirectory,'i3-ui-prototype/scripts/native-browser.cjs'));
467
- await assert.rejects(browser.main(directory,{playwrightModule:'definitely-unavailable'}),/EEXIST|owner|writing|锁/i);
468
- } finally { lib.release(directory,'active-owner'); }
469
- });
470
-
471
- test('installed browser resolves only an existing project or explicit Playwright provider', t => {
472
- const directory=candidate(t),browser=require(path.join(skillsDirectory,'i3-ui-prototype/scripts/native-browser.cjs'));
473
- assert.throws(()=>browser.resolvePlaywright(directory,{playwrightModule:path.join(directory,'absent-provider')}),/Playwright|provider|模块/i);
474
- const provider=path.join(directory,'app/node_modules/playwright');
475
- write(provider,'package.json',{name:'playwright',version:'0.0.0-resolution-unit-fixture',main:'index.js'});
476
- write(provider,'index.js','throw new Error("Resolution must not execute this unit fixture");');
477
- assert.equal(browser.resolvePlaywright(directory).packageRoot,fs.realpathSync(provider));
478
- assert.equal(browser.resolvePlaywright(directory,{playwrightModule:provider}).version,'0.0.0-resolution-unit-fixture');
479
- const projectRoot=path.resolve(directory,'../..'),tools=path.join(projectRoot,'.prototype-tools/node_modules/playwright');
480
- write(tools,'package.json',{name:'playwright',version:'0.0.0-tools-unit-fixture',main:'index.js'});
481
- write(tools,'index.js','throw new Error("Resolution only; never execute the fixture");');
482
- assert.equal(browser.resolvePlaywright(directory).packageRoot,fs.realpathSync(tools));
483
- const currentTools=path.join(projectRoot,'.codebuddy/tools/i3-prototype/playwright/node_modules/playwright');
484
- write(currentTools,'package.json',{name:'playwright',version:'0.0.0-current-tools-unit-fixture',main:'index.js'});
485
- write(currentTools,'index.js','throw new Error("Resolution only; never execute the fixture");');
486
- assert.equal(browser.resolvePlaywright(directory,{host:'codebuddy'}).packageRoot,fs.realpathSync(currentTools));
487
- fs.rmSync(path.join(projectRoot,'.codebuddy/tools'),{recursive:true});
488
- assert.equal(lib.state(directory).commands.browser.argv.includes(fs.realpathSync(tools)),true,'state prints the discovered project tool provider');
489
- assert.equal(browser.resolvePlaywright(directory,{playwrightModule:provider}).packageRoot,fs.realpathSync(provider),'explicit provider wins');
490
- fs.rmSync(tools,{recursive:true});fs.rmSync(provider,{recursive:true});
491
- const projectProvider=path.join(projectRoot,'node_modules/playwright');
492
- write(projectProvider,'package.json',{name:'playwright',version:'0.0.0-project-unit-fixture',main:'index.js'});
493
- write(projectProvider,'index.js','throw new Error("Resolution only; never execute the fixture");');
494
- assert.equal(browser.resolvePlaywright(directory).packageRoot,fs.realpathSync(projectProvider));
495
- });
496
-
497
- test('approval applies only to its confirmed revision and digest after direct user edits', t => {
498
- const directory=candidate(t),first=syntheticReport(directory);lib.recordRun(directory,first);
499
- const approved=lib.manifest(directory);
500
- lib.confirmBaseline(directory,{revision:approved.revision,digest:approved.digest,reviewer:'synthetic-unit-reviewer',statement:'Synthetic approval fixture only, never actual user approval',source:'unit-fixture'});
501
- const baselineFile=path.join(directory,'baseline.json'),baseline=fs.readFileSync(baselineFile,'utf8');
502
- assert.equal(lib.inspect(directory).review,'approved');
503
- write(directory,'last-build.json',{buildId:first.buildId,buildDigest:first.buildDigest,candidateDigest:first.candidateDigest});
504
- assert.equal(lib.finalize(directory).humanConfirmationRequired,false,'a matching existing approval remains valid');
505
- fs.appendFileSync(path.join(directory,'app/src/App.vue'),'\n<!-- direct user edit, same revision -->');
506
- const edited=lib.manifest(directory);assert.equal(edited.revision,approved.revision);assert.notEqual(edited.digest,approved.digest);
507
- const state=lib.state(directory);
508
- assert.equal(state.review.status,'pending-review','the previous human decision cannot approve new bytes');
509
- assert.equal(lib.inspect(directory).review,'pending-review');
510
- assert.equal(JSON.parse(fs.readFileSync(path.join(directory,'prototype.json'))).review.status,'approved','read-only state must preserve the historical stored approval');
511
- const second=syntheticReport(directory);second.id='synthetic-after-user-edit';lib.recordRun(directory,second);
512
- write(directory,'last-build.json',{buildId:second.buildId,buildDigest:second.buildDigest,candidateDigest:second.candidateDigest});
513
- assert.equal(JSON.parse(fs.readFileSync(path.join(directory,'prototype.json'))).review.status,'pending-review','recordRun must not carry approval into the new candidate');
514
- // Compatibility with an artifact already written by the previous runtime:
515
- // fresh QA exists but its stored approval still refers to the old candidate.
516
- const legacy=JSON.parse(fs.readFileSync(path.join(directory,'prototype.json')));
517
- legacy.review={status:'approved',revision:approved.revision,digest:approved.digest};write(directory,'prototype.json',legacy);
518
- const result=lib.finalize(directory);
519
- assert.equal(result.review,'pending-review');assert.equal(result.humanConfirmationRequired,true);
520
- assert.equal(result.candidateDigest,edited.digest);
521
- const incorrectReceipt={...result,review:'approved',humanConfirmationRequired:false};write(directory,'qa/delivery.json',incorrectReceipt);
522
- assert.equal(lib.state(directory).delivery.status,'stale','a receipt made by the old bug is not current');
523
- assert.equal(lib.finalize(directory).humanConfirmationRequired,true);
524
- assert.equal(fs.readFileSync(baselineFile,'utf8'),baseline,'do not move or rewrite the old human baseline');
525
- assert.equal(lib.compareBaseline(directory).status,'changed');
526
- });