@givolt/i3-composer-agent 3.2.1 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +38 -71
  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,407 +0,0 @@
1
- 'use strict';
2
- const assert = require('node:assert/strict');
3
- const fs = require('node:fs');
4
- const path = require('node:path');
5
- const crypto = require('node:crypto');
6
-
7
- const ASSETS = path.resolve(__dirname, '../assets');
8
- const INDEX = 'capabilities.generated.json';
9
- const EXTRACTOR_VERSION = '1.1.0';
10
- const ID = /^[a-z][a-z0-9-]{0,63}$/;
11
- const VOID = new Set(['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr']);
12
- const sha = value => crypto.createHash('sha256').update(value).digest('hex');
13
- const canonical = value => JSON.stringify(value);
14
- function readJson(file) { return JSON.parse(fs.readFileSync(file, 'utf8')); }
15
- function identifier(value, label) { if (!ID.test(value || '')) throw new Error(`Invalid identifier / 标识: ${label}: ${value}`); }
16
- function assertNoSymlinks(file) {
17
- let current = path.resolve(file);
18
- while (true) {
19
- // macOS exposes its system temporary directories through these fixed aliases.
20
- const systemAlias = process.platform === 'darwin' && ['/var', '/tmp'].includes(current) && fs.realpathSync(current) === `/private${current}`;
21
- if (fs.existsSync(current) && fs.lstatSync(current).isSymbolicLink() && !systemAlias) throw new Error(`Symlink / 符号链接 is not allowed: ${current}`);
22
- const parent = path.dirname(current);
23
- if (parent === current) break;
24
- current = parent;
25
- }
26
- }
27
- function filesUnder(directory) {
28
- const files = [];
29
- function walk(current, relative = '') {
30
- for (const entry of fs.readdirSync(current, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name, 'en'))) {
31
- if (entry.name === INDEX || entry.name.startsWith(`.${INDEX}.`)) continue;
32
- const file = path.join(current, entry.name);
33
- const name = relative ? `${relative}/${entry.name}` : entry.name;
34
- if (entry.isSymbolicLink()) throw new Error(`Symlink / 符号链接 is not allowed: ${name}`);
35
- if (entry.isDirectory()) walk(file, name);
36
- else if (entry.isFile()) files.push({ path: name, digest: sha(fs.readFileSync(file)) });
37
- else throw new Error(`Unsupported template source: ${name}`);
38
- }
39
- }
40
- assertNoSymlinks(directory);
41
- walk(directory);
42
- return files;
43
- }
44
- function localFile(directory, relative) {
45
- if (typeof relative !== 'string' || !relative || path.isAbsolute(relative) || relative.split(/[\\/]/).includes('..')) throw new Error(`Unsafe template file: ${relative}`);
46
- const target = path.resolve(directory, relative);
47
- assertNoSymlinks(target);
48
- return target;
49
- }
50
- function attributes(tag) {
51
- const values = {};
52
- const expression = /([^\s=<>/]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>]+)))?/g;
53
- const body = tag.replace(/^<\/?[\w:-]+/, '').replace(/\/?\s*>$/, '');
54
- let match;
55
- while ((match = expression.exec(body))) {
56
- const key = match[1].toLowerCase();
57
- if (Object.hasOwn(values, key)) throw new Error(`Duplicate HTML attribute: ${key}`);
58
- values[key] = (match[2] ?? match[3] ?? match[4] ?? '').replace(/&quot;/g, '"').replace(/&#39;|&apos;/g, "'").replace(/&amp;/g, '&');
59
- }
60
- return values;
61
- }
62
- function visibleText(value) {
63
- return value.replace(/&#(x[0-9a-f]+|\d+);/gi, (match,code)=>{
64
- const point=code[0].toLowerCase()==='x'?parseInt(code.slice(1),16):parseInt(code,10);
65
- return point>0&&point<=0x10ffff?String.fromCodePoint(point):match;
66
- }).replace(/&(nbsp|lt|gt|quot|apos|amp);/g,(_,entity)=>({nbsp:' ',lt:'<',gt:'>',quot:'"',apos:"'",amp:'&'})[entity]).replace(/\s+/g,' ').trim();
67
- }
68
- function extractHtml(html, file, result) {
69
- const stack = [];
70
- const labels=new Map(),fieldTargets=[];
71
- function close(frame) {
72
- const text=visibleText(frame.text);
73
- if(frame.name==='h1'&&frame.pageEntry&&!frame.pageEntry.title)frame.pageEntry.title=text;
74
- if(frame.name==='h2'&&frame.regionEntry&&!frame.regionEntry.title)frame.regionEntry.title=text;
75
- if(frame.contentId==='page-description'&&frame.pageEntry)frame.pageEntry.description=text;
76
- for(const item of frame.items)if(text&&!frame.explicitLabel){item.label=text;item.labelSource='text';}
77
- if(frame.name==='label') {
78
- const label=text.replace(/\s*\*\s*$/,'').trim();
79
- if(frame.labelFor)labels.set(frame.labelFor,label);
80
- for(const item of frame.labelFields)if(label&&item.labelSource!=='data-label'){item.label=label;item.labelSource='label';}
81
- }
82
- }
83
- const cleaned = html.replace(/<(script|style)\b([^>]*)>[\s\S]*?<\/\1\s*>/gi, '<$1$2></$1>');
84
- const tokens = cleaned.match(/<!--[\s\S]*?-->|<![^>]*>|<\/?(?:[^'"<>]|"[^"]*"|'[^']*')+>|[^<]+/g) || [];
85
- for (const token of tokens) {
86
- if (token.startsWith('<!')) continue;
87
- if(!token.startsWith('<')) {
88
- for(let i=0;i<stack.length;i++) {
89
- if(stack[i].name==='label'&&stack.slice(i+1).some(frame=>['input','select','textarea','button'].includes(frame.name)))continue;
90
- stack[i].text+=token;
91
- }
92
- continue;
93
- }
94
- const closing = /^<\//.test(token);
95
- const name = /^<\/?\s*([\w:-]+)/.exec(token)?.[1]?.toLowerCase();
96
- if (!name) continue;
97
- if (closing) {
98
- const last = stack.pop();
99
- if (!last || last.name !== name) throw new Error(`Malformed HTML nesting in ${file}: ${name}`);
100
- close(last);
101
- continue;
102
- }
103
- const attr = attributes(token);
104
- if (name === 'script' && attr.type === 'module') throw new Error(`Offline / 离线 template cannot use module scripts: ${file}`);
105
- const resource = ['script', 'img', 'audio', 'video', 'source', 'iframe'].includes(name) ? attr.src : name === 'link' ? attr.href : undefined;
106
- if (resource) {
107
- if (/^(?:[a-z][a-z0-9+.-]*:|\/\/|\/)/i.test(resource)) throw new Error(`Offline / 离线 template requires local resources: ${resource}`);
108
- result.resources.push({ file, path: resource.split(/[?#]/)[0] });
109
- }
110
- const parent = stack.at(-1) || {};
111
- const context = { name, pageId: parent.pageId, regionId: parent.regionId, mode: parent.mode, capabilityId: parent.capabilityId, pageEntry:parent.pageEntry,regionEntry:parent.regionEntry,text:'',items:[],labelFields:[],labelFor:attr.for,contentId:attr['data-content-id'],explicitLabel:attr['data-label'] };
112
- if (attr['data-page-id']) {
113
- identifier(attr['data-page-id'], 'page');
114
- context.pageId = attr['data-page-id']; context.regionId = undefined; context.capabilityId = undefined;
115
- if (result.pages.some(page => page.id === context.pageId)) throw new Error(`Duplicate page identity / 身份: ${context.pageId}`);
116
- context.pageEntry={id:context.pageId,file};context.regionEntry=undefined;
117
- result.pages.push(context.pageEntry);
118
- }
119
- if (attr['data-region-id']) {
120
- identifier(attr['data-region-id'], 'region');
121
- if (!context.pageId) throw new Error(`Region requires page identity: ${file}`);
122
- context.regionId = attr['data-region-id']; context.mode = attr['data-region-mode']; context.capabilityId = undefined;
123
- if (result.regions.some(region => region.pageId === context.pageId && region.id === context.regionId)) throw new Error(`Duplicate region identity / 身份: ${context.pageId}/${context.regionId}`);
124
- context.regionEntry={id:context.regionId,pageId:context.pageId,mode:context.mode,file};
125
- result.regions.push(context.regionEntry);
126
- }
127
- if (attr['data-capability-id']) {
128
- identifier(attr['data-capability-id'], 'capability');
129
- if (!context.pageId || !context.regionId) throw new Error(`Capability requires page and region identity: ${file}`);
130
- context.capabilityId = attr['data-capability-id'];
131
- let parameters;
132
- try { parameters = JSON.parse(attr['data-capability-parameters'] || '{}'); } catch { throw new Error(`Invalid capability parameters: ${context.capabilityId}`); }
133
- result.bindings.push({ id: `${context.pageId}/${context.regionId}/${context.capabilityId}`, pageId: context.pageId, regionId: context.regionId, capabilityId: context.capabilityId, parameters, source: { file } });
134
- }
135
- for (const kind of ['field', 'action']) {
136
- const value = attr[`data-${kind}-id`];
137
- if (!value) continue;
138
- identifier(value, kind);
139
- if (!context.capabilityId) throw new Error(`Unbound ${kind} interaction / 交互: ${value}`);
140
- const items = result[`${kind}s`];
141
- const id = `${context.pageId}/${context.regionId}/${value}`;
142
- if (items.some(item => item.id === id)) throw new Error(`Duplicate ${kind} identity / 身份: ${id}`);
143
- const item={id,pageId:context.pageId,regionId:context.regionId,capabilityId:context.capabilityId,localId:value,tag:name,label:attr['data-label']||attr['aria-label']||attr.placeholder||attr.value||value,labelSource:attr['data-label']?'data-label':attr['aria-label']?'aria-label':'identifier',source:{file}};
144
- if(kind==='field') {
145
- if(Object.hasOwn(attr,'placeholder'))item.placeholder=attr.placeholder;
146
- if(Object.hasOwn(attr,'required'))item.required=true;
147
- if(attr.type)item.inputType=attr.type;
148
- const label=stack.findLast(frame=>frame.name==='label');
149
- if(label)label.labelFields.push(item);
150
- if(attr.id)fieldTargets.push({id:attr.id,item});
151
- }
152
- items.push(item);context.items.push(item);
153
- }
154
- const interactive = ['button', 'input', 'select', 'textarea'].includes(name) || (name === 'a' && attr.href) || ['button', 'checkbox', 'switch', 'textbox'].includes(attr.role) || attr.contenteditable === 'true' || /on(click|change|input)/i.test(Object.keys(attr).join(' '));
155
- if (interactive && !attr['data-field-id'] && !attr['data-action-id']) throw new Error(`Unbound interaction / 交互 in ${file}: ${name}`);
156
- if (!VOID.has(name) && !/\/\s*>$/.test(token)) stack.push(context);
157
- else close(context);
158
- }
159
- if (stack.length) throw new Error(`Unclosed HTML element in ${file}: ${stack.at(-1).name}`);
160
- for(const target of fieldTargets)if(labels.has(target.id)&&target.item.labelSource!=='data-label'){target.item.label=labels.get(target.id);target.item.labelSource='label-for';}
161
- }
162
-
163
- function projectAdminListContent(snapshot) {
164
- const index=snapshot.index;
165
- if(index.pages.length!==1||index.pages[0].id!=='devices')throw new Error('Unsupported admin-list page identity; explicit framework adaptation / 适配 required');
166
- const page=index.pages[0];
167
- const region=id=>index.regions.find(item=>item.pageId===page.id&&item.id===id);
168
- if(!region('device-list')||!region('device-editor')||index.regions.length!==2)throw new Error('Unsupported admin-list region; explicit framework adaptation / 适配 required');
169
- const fieldMap={
170
- 'device-list/device-code':'code','device-list/device-name':'name','device-list/device-category':'category','device-list/device-status':'status',
171
- 'device-list/query-name':'queryName','device-list/query-status':'queryStatus',
172
- 'device-editor/edit-code':'editCode','device-editor/edit-name':'editName','device-editor/edit-category':'editCategory','device-editor/edit-status':'editStatus',
173
- };
174
- const actionMap={
175
- 'device-list/query':'query','device-list/reset-query':'resetQuery','device-list/bulk-disable':'bulkDisable',
176
- 'device-list/previous-page':'previousPage','device-list/next-page':'nextPage',
177
- 'device-editor/edit':'edit','device-editor/save-edit':'save','device-editor/cancel-edit':'cancel',
178
- };
179
- const fields={},actions={};
180
- for(const item of index.fields) {
181
- const key=fieldMap[`${item.regionId}/${item.localId}`];
182
- if(!key) {
183
- const sampleControl=item.regionId==='device-list'&&((item.capabilityId==='selection'&&item.inputType==='checkbox')||(item.capabilityId==='feedback'&&item.localId==='preview-state'));
184
- if(sampleControl)continue;
185
- throw new Error(`Unsupported admin-list field ${item.id}; explicit framework adaptation / 适配 required`);
186
- }
187
- fields[key]={label:item.label,...(item.placeholder!==undefined?{placeholder:item.placeholder}:{}),...(item.required!==undefined?{required:item.required}:{})};
188
- }
189
- for(const item of index.actions) {
190
- const key=actionMap[`${item.regionId}/${item.localId}`];
191
- if(!key)throw new Error(`Unsupported admin-list action ${item.id}; explicit framework adaptation / 适配 required`);
192
- actions[key]=item.label;
193
- }
194
- for(const key of Object.values(fieldMap))if(!fields[key]?.label)throw new Error(`Missing admin-list content field ${key}; explicit adaptation required`);
195
- for(const key of Object.values(actionMap))if(!actions[key])throw new Error(`Missing admin-list content action ${key}; explicit adaptation required`);
196
- if(fields.editName.required!==true)throw new Error('Admin-list editName is required / 名称必填合同冲突; explicit adaptation required');
197
- return {schemaVersion:1,templateDigest:snapshot.digest,pageTitle:page.title||snapshot.id,description:page.description||'',listTitle:region('device-list').title||'',editorTitle:region('device-editor').title||'',fields,actions};
198
- }
199
- function sameBinding(a, b) { return a.pageId === b.pageId && a.regionId === b.regionId && a.capabilityId === b.capabilityId; }
200
- function sourceValid(requirement) {
201
- const source = requirement?.source;
202
- return requirement?.id && requirement?.text && ['prd', 'user', 'scope-change'].includes(source?.type) && typeof source.reference === 'string' && source.reference.trim() && typeof source.statement === 'string' && source.statement.trim();
203
- }
204
- function resolvePaginationParameters(parameters = {}) {
205
- const mode = parameters.mode === undefined ? 'fixed' : parameters.mode;
206
- const positiveInteger = value => Number.isInteger(value) && value > 0;
207
- if (!['fixed', 'adjustable'].includes(mode)) throw new Error('Invalid pagination mode');
208
- if (mode === 'fixed') {
209
- if (!positiveInteger(parameters.fixedPageSize)) throw new Error('Fixed pagination requires a positive integer fixedPageSize');
210
- if (parameters.defaultPageSize !== undefined || parameters.pageSizeOptions !== undefined) throw new Error('Fixed pagination cannot declare adjustable defaults or options');
211
- return { mode, defaultPageSize: parameters.fixedPageSize, pageSizeOptions: [parameters.fixedPageSize] };
212
- }
213
- if (parameters.fixedPageSize !== undefined) throw new Error('Adjustable pagination cannot declare fixedPageSize');
214
- if (!positiveInteger(parameters.defaultPageSize)) throw new Error('Adjustable pagination requires a positive integer defaultPageSize');
215
- const options = parameters.pageSizeOptions;
216
- if (!Array.isArray(options) || options.length < 2 || !options.every(positiveInteger) || new Set(options).size !== options.length) throw new Error('Adjustable pagination requires at least two unique positive integer pageSizeOptions');
217
- if (!options.includes(parameters.defaultPageSize)) throw new Error('Pagination options must include defaultPageSize');
218
- return { mode, defaultPageSize: parameters.defaultPageSize, pageSizeOptions: [...options] };
219
- }
220
- function resolveThemeParameters(parameters = {}) {
221
- const ids=['light','dark','fresh','tech'];
222
- if(parameters.defaultTheme!=='light'||!Array.isArray(parameters.presets)||parameters.presets.length!==4||new Set(parameters.presets).size!==4||!ids.every(id=>parameters.presets.includes(id)))throw new Error('Theme requires default light and the four named presets light/dark/fresh/tech');
223
- return {defaultTheme:'light',presets:[...ids]};
224
- }
225
- function checkCapabilities({ definition, bindings = [], regions = [], scope = {}, decisions = [] } = {}) {
226
- const errors = [], requiredBindings = [], requiredScenarios = [];
227
- const definitions = new Map();
228
- for (const capability of definition?.capabilities || []) {
229
- if (definitions.has(capability.id) || !ID.test(capability.id || '')) errors.push(`Invalid or duplicate capability definition: ${capability.id}`);
230
- definitions.set(capability.id, capability);
231
- }
232
- if (definition?.schemaVersion !== 1 || !definitions.size) errors.push('Missing fixed capability definition');
233
- const regionKeys = new Set();
234
- for (const region of regions) {
235
- const key = `${region.pageId}/${region.id}`;
236
- if (regionKeys.has(key)) errors.push(`Duplicate region identity: ${key}`);
237
- regionKeys.add(key);
238
- if (!definition?.regionModes?.includes(region.mode)) errors.push(`Unknown region mode: ${key}: ${region.mode}`);
239
- }
240
- const bindingMap = new Map();
241
- for (const binding of bindings) {
242
- const key = `${binding.pageId}/${binding.regionId}/${binding.capabilityId}`;
243
- if (binding.id !== key || bindingMap.has(key)) errors.push(`Invalid or duplicate binding identity: ${key}`);
244
- bindingMap.set(key, binding);
245
- if (!regionKeys.has(`${binding.pageId}/${binding.regionId}`)) errors.push(`Binding has unknown region: ${key}`);
246
- const capability = definitions.get(binding.capabilityId);
247
- if (!capability) { errors.push(`Unknown capability / 能力: ${key}`); continue; }
248
- for (const [name, rule] of Object.entries(capability.parameters || {})) {
249
- const value = binding.parameters?.[name];
250
- if (value === undefined && !rule.required) continue;
251
- const regionMode = regions.find(region => region.pageId === binding.pageId && region.id === binding.regionId)?.mode;
252
- const includes = rule.includesByMode?.[regionMode] || rule.includes;
253
- const typeValid = rule.type === 'array' ? Array.isArray(value) : rule.type === 'integer' ? Number.isInteger(value) : typeof value === rule.type;
254
- if (!typeValid || (rule.enum && !rule.enum.includes(value)) || (rule.minimum !== undefined && value < rule.minimum) || (includes && !includes.every(item => value?.includes?.(item)))) errors.push(`Invalid capability parameter: ${key}.${name}`);
255
- }
256
- if (capability.id === 'pagination') {
257
- try { resolvePaginationParameters(binding.parameters); }
258
- catch (error) { errors.push(`Invalid pagination parameters: ${key}: ${error.message}`); }
259
- }
260
- if (capability.id === 'theme') {
261
- try { resolveThemeParameters(binding.parameters); }
262
- catch(error) { errors.push(`Invalid theme parameters: ${key}: ${error.message}`); }
263
- }
264
- }
265
- const decisionMap = new Map();
266
- for (const decision of decisions) {
267
- if (decisionMap.has(decision.bindingId)) errors.push(`Duplicate decision: ${decision.bindingId}`);
268
- decisionMap.set(decision.bindingId, decision);
269
- if (decision.status === 'pending') errors.push(`Pending capability: ${decision.bindingId}`);
270
- else if (!['required', 'applicable', 'not-applicable'].includes(decision.status)) errors.push(`Unknown capability decision: ${decision.bindingId}`);
271
- }
272
- const expected = [];
273
- for (const region of regions) {
274
- for (const capability of definitions.values()) {
275
- if (capability.requirement === 'required' && capability.appliesTo?.includes(region.mode)) expected.push({ pageId: region.pageId, regionId: region.id, capabilityId: capability.id });
276
- }
277
- }
278
- for (const requirement of scope.requirements || []) {
279
- if (!sourceValid(requirement)) errors.push(`Requirement needs explicit source: ${requirement.id || '(missing id)'}`);
280
- for (const capability of requirement.capabilities || []) {
281
- if (!definitions.has(capability.capabilityId) || !regionKeys.has(`${capability.pageId}/${capability.regionId}`)) errors.push(`Unknown scoped capability: ${requirement.id}`);
282
- else if (!expected.some(entry => sameBinding(entry, capability))) expected.push(capability);
283
- }
284
- }
285
- for (const entry of expected) {
286
- const key = `${entry.pageId}/${entry.regionId}/${entry.capabilityId}`;
287
- const decision = decisionMap.get(key);
288
- if (decision?.status === 'not-applicable') {
289
- const exemption = (scope.exemptions || []).find(item => sameBinding(item, entry) && item.requirementId === decision.requirementId && item.reason?.trim());
290
- const requirement = (scope.requirements || []).find(item => item.id === exemption?.requirementId);
291
- if (exemption && sourceValid(requirement)) continue;
292
- errors.push(`Required capability needs explicit scoped exemption: ${key}`);
293
- }
294
- requiredBindings.push(key);
295
- if (!bindingMap.has(key)) errors.push(`Missing required capability: ${key}`);
296
- const capability = definitions.get(entry.capabilityId);
297
- for (const scenario of capability?.scenarios || []) requiredScenarios.push({ ...scenario, id: `${key}/${scenario.id}`, scenarioId: scenario.id, bindingId: key });
298
- }
299
- for (const decision of decisions) if (!expected.some(entry => `${entry.pageId}/${entry.regionId}/${entry.capabilityId}` === decision.bindingId) && !bindingMap.has(decision.bindingId)) errors.push(`Decision has unknown binding: ${decision.bindingId}`);
300
- return { status: errors.length ? 'failed' : 'passed', errors, requiredBindings, requiredScenarios };
301
- }
302
- function syncTemplate(directory, { write = true } = {}) {
303
- directory = path.resolve(directory);
304
- if (write && fs.existsSync(path.join(directory, 'component-inventory.json'))) fs.writeFileSync(path.join(directory, 'template-inventory.json'), JSON.stringify(require('./template-inventory.cjs').scan(directory), null, 2) + '\n');
305
- const files = filesUnder(directory);
306
- const manifest = readJson(localFile(directory, 'template.json'));
307
- identifier(manifest.id, 'template');
308
- const definitionFile = localFile(directory, manifest.definition);
309
- const definition = readJson(definitionFile);
310
- let result;
311
- if (manifest.kind === 'content-reference') result = require('./content-template.cjs').extract(directory, manifest, files);
312
- else {
313
- result = { pages: [], regions: [], bindings: [], fields: [], actions: [], resources: [] };
314
- for (const file of files.filter(entry => /\.html?$/i.test(entry.path))) extractHtml(fs.readFileSync(localFile(directory, file.path), 'utf8'), file.path, result);
315
- for (const resource of result.resources) {
316
- const relative = path.posix.normalize(path.posix.join(path.posix.dirname(resource.file), resource.path));
317
- if (!files.some(file => file.path === relative)) throw new Error(`Offline / 离线 template resource missing: ${relative}`);
318
- }
319
- for (const file of files.filter(entry => /\.(?:html?|js|css)$/i.test(entry.path))) {
320
- const text = fs.readFileSync(localFile(directory, file.path), 'utf8');
321
- if (/\bfetch\s*\(|\bXMLHttpRequest\b|\bimport\s*(?:\(|["'{*])|\bfrom\s*["']|@import\b|url\s*\(\s*["']?(?:https?:|\/\/)/i.test(text)) throw new Error(`Offline / 离线 template cannot use async or remote loads: ${file.path}`);
322
- }
323
- if (!result.pages.length || !result.regions.length) throw new Error('Missing page or region identity / 身份');
324
- if (!files.some(file => file.path === manifest.entry)) throw new Error('Template entry is missing');
325
- }
326
- const checked = checkCapabilities({ definition, ...result, scope: manifest.scope, decisions: manifest.decisions });
327
- if (checked.status !== 'passed') throw new Error(checked.errors.join('\n'));
328
- const htmlFiles = files.filter(file => /\.html?$/i.test(file.path));
329
- const extractorFiles = manifest.kind==='content-reference' ? Object.fromEntries(['template-contract.cjs','content-template.cjs'].map(file=>[file,sha(fs.readFileSync(path.join(__dirname,file)))])) : null;
330
- const extractor = extractorFiles ? { version:'2.0.0', files:extractorFiles, digest:sha(canonical(extractorFiles)) } : { version:EXTRACTOR_VERSION,digest:sha(fs.readFileSync(__filename)) };
331
- const value = { schemaVersion: 1, templateId: manifest.id, version: manifest.version, sourceDigest: sha(canonical(files)), htmlDigest: sha(canonical(htmlFiles)), definitionDigest: sha(fs.readFileSync(definitionFile)), extractor, files, definition, ...result, requiredBindings: checked.requiredBindings, requiredScenarios: checked.requiredScenarios };
332
- const index = { ...value, digest: sha(canonical(value)) };
333
- if (write) {
334
- const temporary = path.join(directory, `.${INDEX}.${process.pid}.tmp`);
335
- try { fs.writeFileSync(temporary, `${JSON.stringify(index, null, 2)}\n`, { flag: 'wx' }); fs.renameSync(temporary, path.join(directory, INDEX)); }
336
- finally { fs.rmSync(temporary, { force: true }); }
337
- }
338
- return index;
339
- }
340
- function templateSnapshot(directory, expected) {
341
- return { schemaVersion: 1, ...(expected.kind ? { kind: expected.kind } : {}), id: expected.templateId, version: expected.version, digest: expected.digest, index: expected, definition: expected.definition, files: expected.files.map(file => ({ path: file.path, encoding: 'base64', content: fs.readFileSync(localFile(directory, file.path)).toString('base64') })) };
342
- }
343
- function loadTemplate(directory) {
344
- directory = path.resolve(directory);
345
- const expected = syncTemplate(directory, { write: false });
346
- const stored = fs.existsSync(path.join(directory, INDEX)) ? readJson(path.join(directory, INDEX)) : null;
347
- if (!stored || canonical(stored) !== canonical(expected)) throw new Error('Template index is stale / 源和索引不同步; run sync-template.cjs');
348
- return templateSnapshot(directory, expected);
349
- }
350
- function loadBundledTemplate(templateId, { templatesRoot = path.join(ASSETS, 'templates') } = {}) {
351
- const catalog = readJson(localFile(templatesRoot, 'catalog.json'));
352
- templateId ||= catalog.defaultTemplate; identifier(templateId, 'template');
353
- const selected = catalog.templates.find(item => item.id === templateId);
354
- assert.ok(selected?.availability === 'available' && selected.contentRoot, `Unsupported or not available native template: ${templateId}`);
355
- const directory = localFile(templatesRoot, selected.contentRoot);
356
- const manifest = readJson(localFile(directory, 'template.json'));
357
- assert.equal(manifest.kind, 'content-reference', 'Native templates require an explicit content-reference manifest');
358
- assert.equal(manifest.id, templateId, 'Template catalog identity differs from its manifest');
359
- return templateSnapshot(directory, syncTemplate(directory, { write: false }));
360
- }
361
- function prepareTemplate({ project, id = 'enterprise-admin' }) {
362
- identifier(id, 'template');
363
- const directory = path.resolve(project, 'ui-templates', id);
364
- assertNoSymlinks(directory);
365
- if (fs.existsSync(directory)) return { directory, created: false, index: loadTemplate(directory).index };
366
- fs.mkdirSync(path.dirname(directory), { recursive: true });
367
- const temporary = path.join(path.dirname(directory), `.${id}.${process.pid}.tmp`);
368
- try {
369
- fs.cpSync(path.join(ASSETS, 'templates/enterprise-admin'), temporary, { recursive: true, errorOnExist: true, force: false });
370
- fs.copyFileSync(path.join(ASSETS, 'capabilities/management.json'), path.join(temporary, 'capability-definition.json'));
371
- const manifest = readJson(path.join(temporary, 'template.json'));
372
- manifest.id = id;
373
- fs.writeFileSync(path.join(temporary, 'template.json'), `${JSON.stringify(manifest, null, 2)}\n`);
374
- const index = syncTemplate(temporary);
375
- if (fs.existsSync(directory)) throw new Error(`Template already exists: ${directory}`);
376
- fs.renameSync(temporary, directory);
377
- return { directory, created: true, index };
378
- } finally { fs.rmSync(temporary, { recursive: true, force: true }); }
379
- }
380
- function checkInstanceCapabilities(inputsRoot) {
381
- try {
382
- const fixed = readJson(localFile(inputsRoot, 'capabilities.json'));
383
- if (fs.existsSync(localFile(inputsRoot, 'template-snapshot.json')) && readJson(localFile(inputsRoot, 'template-snapshot.json')).kind === 'content-reference') return require('./content-template.cjs').checkInputs(inputsRoot, module.exports);
384
- const scopeFile = localFile(inputsRoot, 'scope.json');
385
- const snapshotFile = localFile(inputsRoot, 'template-snapshot.json');
386
- if (fs.existsSync(snapshotFile)) {
387
- const snapshot = readJson(snapshotFile);
388
- if (canonical(fixed.definition) !== canonical(snapshot.definition)) throw new Error('Fixed capability definition differs from template snapshot');
389
- for (const region of snapshot.index.regions) {
390
- if (!fixed.regions.some(entry => entry.pageId === region.pageId && entry.id === region.id && entry.mode === region.mode)) throw new Error(`Fixed template region missing or mode changed: ${region.pageId}/${region.id}`);
391
- }
392
- for (const binding of snapshot.index.bindings) {
393
- if (!fixed.bindings.some(entry => entry.id === binding.id && sameBinding(entry, binding))) throw new Error(`Fixed template binding missing: ${binding.id}`);
394
- }
395
- }
396
- const scope=fs.existsSync(scopeFile) ? readJson(scopeFile) : fixed.scope;
397
- const result=checkCapabilities({ ...fixed, scope });
398
- for(const binding of fixed.bindings.filter(item=>item.capabilityId==='theme')) {
399
- if(binding.id!=='devices/device-list/theme')result.errors.push(`Theme binding needs an explicit native adapter: ${binding.id}`);
400
- if(!(scope?.requirements||[]).some(requirement=>sourceValid(requirement)&&(requirement.capabilities||[]).some(item=>sameBinding(item,binding))))result.errors.push(`Theme binding requires an explicit requirement source: ${binding.id}`);
401
- if(!result.requiredBindings.includes(binding.id))result.errors.push(`Enabled theme must retain its acceptance; remove the explicit binding to disable it: ${binding.id}`);
402
- }
403
- if(result.errors.length)result.status='failed';
404
- return result;
405
- } catch (error) { return { status: 'failed', errors: [error.message], requiredBindings: [], requiredScenarios: [] }; }
406
- }
407
- module.exports = { prepareTemplate, syncTemplate, loadTemplate, loadBundledTemplate, checkCapabilities, checkInstanceCapabilities, projectAdminListContent, resolvePaginationParameters, resolveThemeParameters };
@@ -1,78 +0,0 @@
1
- 'use strict';
2
- const fs = require('node:fs'), path = require('node:path'), crypto = require('node:crypto'), assert = require('node:assert/strict');
3
- const digest = value => crypto.createHash('sha256').update(value).digest('hex');
4
- const ignored = new Set(['template-inventory.json', 'capabilities.generated.json']);
5
- function files(directory, prefix = '') {
6
- return fs.readdirSync(path.join(directory, prefix), { withFileTypes: true }).sort((a,b) => a.name.localeCompare(b.name, 'en')).flatMap(entry => {
7
- const name = prefix ? `${prefix}/${entry.name}` : entry.name;
8
- assert.ok(!entry.isSymbolicLink(), `Refusing template symlink: ${name}`);
9
- if (['.git', 'node_modules'].includes(entry.name) || ignored.has(name)) return [];
10
- return entry.isDirectory() ? files(directory, name) : [name];
11
- });
12
- }
13
- function attributes(text) {
14
- const value = {};
15
- for (const match of text.matchAll(/([^\s=<>/'"`]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>]+)))?/g)) {
16
- assert.ok(!Object.hasOwn(value, match[1]), `Duplicate HTML attribute: ${match[1]}`);
17
- value[match[1]] = match[2] ?? match[3] ?? match[4] ?? '';
18
- }
19
- return value;
20
- }
21
- function scan(directory) {
22
- directory = fs.realpathSync(directory);
23
- const sourceFiles = files(directory), hashes = Object.fromEntries(sourceFiles.map(file => [file, digest(fs.readFileSync(path.join(directory, file)))]));
24
- const html = fs.readFileSync(path.join(directory, 'index.html'), 'utf8');
25
- const policy = JSON.parse(fs.readFileSync(path.join(directory, 'component-inventory.json'), 'utf8'));
26
- return scanResources(hashes, html, policy);
27
- }
28
- function scanResources(hashes, html, policy) {
29
- const routesMatch = html.match(/id="prototype-offline-routes">([\s\S]*?)<\/script>/);
30
- assert.ok(routesMatch, 'Template inventory requires explicit offline routes');
31
- const routes = JSON.parse(routesMatch[1]);
32
- assert.equal(policy.schemaVersion, 1, 'Unsupported component inventory classification');
33
- const fragments = [], components = {}, unknownComponents = new Set(); let eventCount = 0;
34
- for (const match of html.matchAll(/^<template data-source="([^"]+)">\n([\s\S]*?)^<\/template>/gm)) {
35
- const file = match[1], content = match[2], nodes = [];
36
- assert.ok(!fragments.some(fragment => fragment.file === file), `Duplicate HTML fragment: ${file}`);
37
- const cleaned = content.replace(/<!--[\s\S]*?-->/g, text => ' '.repeat(text.length));
38
- for (const token of cleaned.matchAll(/<([a-zA-Z][\w:.-]*)(\s(?:[^"'<>]|"[^"]*"|'[^']*')*)?\s*\/?\s*>/g)) {
39
- const attrs = attributes(token[2] || ''), node = { id: `${file}#${nodes.length + 1}`, tag: token[1], attributes: attrs };
40
- nodes.push(node);
41
- eventCount += Object.keys(attrs).filter(key => key.startsWith('data-on-')).length;
42
- const component = attrs['data-component'];
43
- if (!component) continue;
44
- const classification = policy.components?.[component];
45
- if (!classification) unknownComponents.add(component);
46
- else {
47
- assert.ok(['framework', 'business-reference', 'icon', 'router', 'dynamic'].includes(classification.kind), `Unknown classification: ${component}`);
48
- assert.ok(Array.isArray(classification.capabilities), `Missing semantic classification: ${component}`);
49
- if (classification.source) assert.ok(fragments.some(item => item.file === classification.source) || html.includes(`<template data-source="${classification.source}">`), `Missing component source: ${component}`);
50
- }
51
- components[component] ||= { classification: classification || null, occurrences: [] };
52
- components[component].occurrences.push(node.id);
53
- }
54
- fragments.push({ file, digest: digest(content), nodes });
55
- }
56
- assert.ok(fragments.length, 'Template inventory requires editable fragments');
57
- assert.equal(unknownComponents.size, 0, `Unclassified template components: ${[...unknownComponents].join(', ')}`);
58
- const pages = [...new Set(routes.map(route => route.component).filter(Boolean))].map(component => {
59
- const fragment = 'reference/' + component.replace(/^\.\//, '').replace(/\.js$/, '.html');
60
- assert.ok(fragments.some(item => item.file === fragment), `Route has no editable HTML: ${component}`);
61
- return { component, fragment, routes: routes.filter(route => route.component === component).map(route => route.path) };
62
- });
63
- return { schemaVersion: 1, files: hashes, routes, pages, fragments, components, eventCount, unknownComponents: [] };
64
- }
65
- function verify(directory, inventory) {
66
- assert.deepEqual(scan(directory), inventory, 'Template inventory changed; review every source/component/interaction difference and regenerate the inventory');
67
- return { status: 'passed', files: Object.keys(inventory.files).length, routes: inventory.routes.length, pages: inventory.pages.length, fragments: inventory.fragments.length, components: Object.keys(inventory.components).length, events: inventory.eventCount };
68
- }
69
- function verifySnapshot(snapshot) {
70
- const resources = new Map(snapshot.files.map(file => [file.path, Buffer.from(file.content, 'base64')]));
71
- assert.equal(resources.size, snapshot.files.length, 'Duplicate template snapshot resource');
72
- const hashes = Object.fromEntries([...resources].filter(([file]) => !ignored.has(file)).map(([file, content]) => [file, digest(content)]));
73
- const expected = JSON.parse(resources.get('template-inventory.json').toString('utf8'));
74
- const actual = scanResources(hashes, resources.get('index.html').toString('utf8'), JSON.parse(resources.get('component-inventory.json').toString('utf8')));
75
- assert.deepEqual(actual, expected, 'Template snapshot inventory differs from actual sources/components/events');
76
- return actual;
77
- }
78
- module.exports = { scan, verify, verifySnapshot };
@@ -1,117 +0,0 @@
1
- 'use strict';
2
-
3
- const REQUIRED = ['operation', 'status', 'executionMode', 'prototypeId', 'revision',
4
- 'candidateDigest', 'summary', 'checks', 'delivery', 'openItems'];
5
- const OPERATIONS = ['analyze', 'create', 'revise', 'inspect', 'confirm-baseline'];
6
- const MODES = ['inline', 'delegated'];
7
- const MARKER = 'PROTOTYPE_RESULT_V1';
8
- const object = value => value !== null && typeof value === 'object' && !Array.isArray(value);
9
- const text = value => typeof value === 'string' && value.trim().length > 0;
10
-
11
- function options(args) {
12
- const result = { runtime: 'native' };
13
- for (let index = 0; index < args.length; index++) {
14
- const flag = args[index];
15
- if (flag === '--check-return') { result.checkReturn = true; continue; }
16
- if (!['--expected-operation', '--expected-mode', '--runtime'].includes(flag)) throw new Error(`Unexpected option: ${flag}`);
17
- const value = args[++index];
18
- if (!value || value.startsWith('--')) throw new Error(`${flag} requires a value`);
19
- result[flag.slice(2)] = value;
20
- }
21
- if (!OPERATIONS.includes(result['expected-operation'])) throw new Error('--expected-operation must be analyze, create, revise, inspect or confirm-baseline');
22
- if (!MODES.includes(result['expected-mode'])) throw new Error('--expected-mode must be inline or delegated, from the actual entry handoff');
23
- if (!['native', 'legacy'].includes(result.runtime)) throw new Error('--runtime must be native or legacy, from existing artifact metadata');
24
- return result;
25
- }
26
-
27
- function validate(value, expected) {
28
- if (!object(value)) throw new Error('Result must be a JSON object');
29
- const errors = [];
30
- for (const field of REQUIRED) if (!Object.hasOwn(value, field)) errors.push(`${field}: required field is missing`);
31
- if (!OPERATIONS.includes(value.operation)) errors.push('operation: unsupported operation');
32
- else if (value.operation !== expected['expected-operation']) errors.push(`operation: expected ${expected['expected-operation']}, received ${value.operation}`);
33
- if (!['complete', 'partial', 'blocked'].includes(value.status)) errors.push('status: expected complete, partial or blocked');
34
- if (!MODES.includes(value.executionMode)) errors.push('executionMode: expected inline or delegated');
35
- else if (value.executionMode !== expected['expected-mode']) errors.push(`executionMode: expected ${expected['expected-mode']}, received ${value.executionMode}`);
36
- if (!text(value.summary)) errors.push('summary: a non-empty string is required');
37
- if (!Array.isArray(value.openItems)) errors.push('openItems: an array is required');
38
- else value.openItems.forEach((item, index) => { if (!text(item)) errors.push(`openItems[${index}]: a non-empty string is required`); });
39
-
40
- if (!Array.isArray(value.checks) || value.checks.length === 0) errors.push('checks: a non-empty array is required');
41
- else value.checks.forEach((check, index) => {
42
- const at = `checks[${index}]`;
43
- if (!object(check)) { errors.push(`${at}: an object is required`); return; }
44
- if (!text(check.name)) errors.push(`${at}.name: a non-empty string is required`);
45
- if (!['passed', 'failed', 'not-run'].includes(check.status)) errors.push(`${at}.status: expected passed, failed or not-run (result is not a status alias)`);
46
- if (!text(check.evidence)) errors.push(`${at}.evidence: a non-empty evidence locator or analysis explanation is required`);
47
- });
48
-
49
- for (const field of ['prototypeId', 'revision', 'candidateDigest']) {
50
- if (value[field] !== null && !text(value[field])) errors.push(`${field}: expected null or a non-empty string`);
51
- }
52
- const allPresent = ['prototypeId', 'revision', 'candidateDigest'].every(field => text(value[field]));
53
- if ((value.revision === null) !== (value.candidateDigest === null)) errors.push('identity: revision and candidateDigest must be a pair, without inventing an uncreated version');
54
- if ((text(value.revision) || text(value.candidateDigest)) && !text(value.prototypeId)) errors.push('identity: revision/candidateDigest require prototypeId');
55
- if (text(value.candidateDigest) && !/^[a-f0-9]{64}$/.test(value.candidateDigest)) errors.push('candidateDigest: expected the existing lowercase SHA-256 content digest');
56
- if (value.status === 'complete' && value.operation !== 'analyze' && !allPresent) errors.push('identity: complete create, revise, inspect or confirm-baseline requires prototypeId, revision and candidateDigest');
57
-
58
- if (value.delivery !== null && !text(value.delivery)) errors.push('delivery: expected null or a non-empty path string');
59
- if (value.operation === 'analyze' && value.delivery !== null) errors.push('delivery: analyze must use null and must not write a receipt');
60
- const nativeReceipt = expected.runtime === 'native' && ['create', 'revise'].includes(value.operation);
61
- if (nativeReceipt && value.status === 'complete' && !text(value.delivery)) errors.push('delivery: complete native create/revise requires the current qa/delivery.json path');
62
- if (expected.runtime === 'native' && text(value.delivery)
63
- && (!/(?:^|[\\/])qa[\\/]delivery\.json$/.test(value.delivery) || /[\u0000-\u001f]/.test(value.delivery))) {
64
- errors.push('delivery: native receipt path must end in qa/delivery.json');
65
- }
66
- if (value.status === 'complete' && ['create', 'revise', 'confirm-baseline'].includes(value.operation)
67
- && Array.isArray(value.checks) && value.checks.some(check => !object(check) || check.status !== 'passed')) {
68
- errors.push('checks: complete write operations cannot contain failed or not-run checks');
69
- }
70
- if (errors.length) throw new Error(errors.join('\n- '));
71
- // Keep the established fields in one order while retaining optional context.
72
- return Object.fromEntries([...REQUIRED, ...Object.keys(value).filter(field => !REQUIRED.includes(field)).sort()]
73
- .map(field => [field, value[field]]));
74
- }
75
-
76
- function originalResult(input) {
77
- if (/<\/?(?:tool_call|arg_key|arg_value|function_calls?|invoke)(?:[:>\s])/i.test(input)) {
78
- throw new Error('Original reply contains tool protocol text instead of a final result');
79
- }
80
- // CodeBuddy Code 2.168.2 appends this host note to Agent tool results.
81
- // Accept only that terminal UUID form; other trailing content stays invalid.
82
- const original = input.replace(/\r?\n\r?\n\[Agent ID: agent-[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}\][ \t\r\n]*$/, '');
83
- const lines = original.split(/\r?\n/);
84
- const markers = lines.map((line, index) => line === MARKER ? index : -1).filter(index => index >= 0);
85
- if (markers.length !== 1) throw new Error(`Original reply requires one separate exact marker line ${MARKER}; found ${markers.length}`);
86
- const at = markers[0];
87
- if (!text(lines.slice(0, at).join('\n'))) throw new Error('Original reply requires a separate natural-language outcome before the marker');
88
- let json = lines.slice(at + 1).join('\n').trim();
89
- if (json.startsWith('```')) {
90
- const fenced = json.match(/^```(?:json)?[ \t]*\n([\s\S]*?)\n```[ \t]*$/);
91
- if (!fenced) throw new Error('JSON fence must contain one JSON value with no trailing content');
92
- json = fenced[1];
93
- }
94
- return json;
95
- }
96
-
97
- async function main() {
98
- const expected = options(process.argv.slice(2));
99
- let input = '';
100
- process.stdin.setEncoding('utf8');
101
- for await (const chunk of process.stdin) {
102
- input += chunk;
103
- if (Buffer.byteLength(input, 'utf8') > 1024 * 1024) throw new Error('JSON input exceeds 1 MiB');
104
- }
105
- let value;
106
- try { value = JSON.parse(expected.checkReturn ? originalResult(input) : input); }
107
- catch (error) { throw new Error(`JSON: ${error.message}`); }
108
- const canonical = validate(value, expected);
109
- process.stdout.write(`${MARKER}\n${JSON.stringify(canonical, null, 2)}\n`);
110
- }
111
-
112
- if (require.main === module) main().catch(error => {
113
- process.stderr.write(`Invalid prototype result:\n- ${error.message}\n`);
114
- process.exitCode = 1;
115
- });
116
-
117
- module.exports = { validate, options, REQUIRED, MARKER };