@givolt/i3-composer-agent 3.1.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (677) 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-sop.md +3 -3
  9. package/.claude/commands/i3-spec.md +1 -0
  10. package/.claude/commands/i3-test.md +1 -0
  11. package/.claude/commands/i3-webperf.md +1 -0
  12. package/.claude-plugin/marketplace.json +1 -1
  13. package/.claude-plugin/plugin.json +1 -1
  14. package/.codex-plugin/plugin.json +2 -2
  15. package/.gemini/commands/i3-sop.toml +3 -3
  16. package/README.md +44 -43
  17. package/bin/i3-composer-agent.cjs +4 -59
  18. package/bin/install.cjs +6 -14
  19. package/bin/native-layout.cjs +11 -2
  20. package/bin/native-migration.cjs +68 -28
  21. package/bin/retired-custom-fingerprints.json +1597 -0
  22. package/bin/wizard.cjs +2 -13
  23. package/commands/i3-sop.toml +3 -3
  24. package/docs/antigravity-setup.md +3 -1
  25. package/docs/codebuddy-setup.md +19 -76
  26. package/docs/codex-setup.md +10 -4
  27. package/docs/comparison.md +1 -1
  28. package/docs/copilot-cli-setup.md +4 -4
  29. package/docs/cursor-setup.md +1 -1
  30. package/docs/gemini-cli-setup.md +1 -1
  31. package/docs/other-hosts.md +2 -2
  32. package/docs/windsurf-setup.md +2 -2
  33. package/docs/workbuddy-setup.md +9 -16
  34. package/evals/README.md +10 -0
  35. package/evals/cases/i3-code-simplification.json +8 -0
  36. package/evals/cases/i3-documentation-and-adrs.json +4 -0
  37. package/evals/cases/i3-enterprise-sop.json +70 -32
  38. package/evals/cases/i3-frontend-ui-engineering.json +1 -1
  39. package/evals/cases/i3-security-and-hardening.json +4 -0
  40. package/evals/cases/i3-ui-demo.json +2 -2
  41. package/evals/cases/i3-using-agent-skills.json +5 -5
  42. package/evals/plugin/simplify-fires-on-pasted-function/graders/behavior-kept-and-explained.md +7 -0
  43. package/evals/plugin/simplify-fires-on-pasted-function/graders/skill-fired.md +5 -0
  44. package/evals/plugin/simplify-fires-on-pasted-function/prompt.md +30 -0
  45. package/evals/plugin/simplify-stays-quiet-on-make-it-fast/graders/not-fired.md +8 -0
  46. package/evals/plugin/simplify-stays-quiet-on-make-it-fast/prompt.md +20 -0
  47. package/evals/zh-CN/cases/i3-code-simplification.json +8 -0
  48. package/evals/zh-CN/cases/i3-documentation-and-adrs.json +4 -0
  49. package/evals/zh-CN/cases/i3-enterprise-sop.json +77 -31
  50. package/evals/zh-CN/cases/i3-frontend-ui-engineering.json +2 -2
  51. package/evals/zh-CN/cases/i3-security-and-hardening.json +4 -0
  52. package/evals/zh-CN/cases/i3-ui-demo.json +2 -2
  53. package/evals/zh-CN/cases/i3-using-agent-skills.json +6 -6
  54. package/hooks/SDD-CACHE.md +1 -1
  55. package/package.json +13 -102
  56. package/plugin.json +15 -2
  57. package/references/accessibility-checklist.md +4 -4
  58. package/references/performance-checklist.md +5 -4
  59. package/references/testing-patterns.md +2 -1
  60. package/scripts/floor-guard-reference-test.js +32 -0
  61. package/scripts/lib/execution-status.js +44 -0
  62. package/scripts/run-evals-test.js +157 -7
  63. package/scripts/run-evals.js +59 -12
  64. package/scripts/ui-demo-test.js +2 -2
  65. package/scripts/validate-artifact-paths-test.js +14 -0
  66. package/scripts/validate-artifact-paths.js +4 -2
  67. package/skills/i3-api-and-interface-design/SKILL.md +3 -1
  68. package/skills/i3-ci-cd-and-automation/SKILL.md +7 -4
  69. package/skills/i3-code-simplification/SKILL.md +3 -3
  70. package/skills/i3-constraint-driven-development/SKILL.md +4 -4
  71. package/skills/i3-constraint-driven-development/references/floor-guard.md +2 -2
  72. package/skills/i3-context-engineering/SKILL.md +1 -1
  73. package/skills/i3-debugging-and-error-recovery/SKILL.md +1 -1
  74. package/skills/i3-deprecation-and-migration/SKILL.md +6 -1
  75. package/skills/i3-documentation-and-adrs/SKILL.md +3 -2
  76. package/skills/i3-enterprise-sop/SKILL.md +121 -94
  77. package/skills/i3-enterprise-sop/references/engineering-skeleton/directory-standard.md +31 -17
  78. package/skills/i3-enterprise-sop/references/handoff.py +235 -135
  79. package/skills/i3-enterprise-sop/references/read_text.py +60 -0
  80. package/skills/i3-enterprise-sop/references/technical-baseline/baselines/enterprise-application-technical-baseline-v0-0-4.md +47 -47
  81. package/skills/i3-enterprise-sop/references/technical-baseline/readme.md +9 -118
  82. package/skills/i3-enterprise-sop/references/technical-baseline/templates/technical-baseline.md +8 -8
  83. package/skills/i3-enterprise-sop/references/{ad/templates → templates}/ad.md +57 -50
  84. package/skills/i3-enterprise-sop/references/{brd/templates → templates}/brd.md +23 -12
  85. package/skills/i3-enterprise-sop/references/{prd/templates → templates}/prd.md +84 -51
  86. package/skills/i3-enterprise-sop/references/{testcase/templates → templates}/testcase.md +49 -39
  87. package/skills/i3-frontend-ui-engineering/SKILL.md +6 -10
  88. package/skills/i3-idea-refine/SKILL.md +4 -2
  89. package/skills/i3-incremental-implementation/SKILL.md +0 -4
  90. package/skills/i3-performance-optimization/SKILL.md +2 -2
  91. package/skills/i3-security-and-hardening/references/hardening-patterns.md +5 -0
  92. package/skills/i3-source-driven-development/SKILL.md +3 -2
  93. package/skills/i3-spec-driven-development/SKILL.md +1 -1
  94. package/skills/i3-ui-demo/SKILL.md +3 -1
  95. package/skills/i3-ui-demo/references/dependencies.md +1 -1
  96. package/skills/i3-ui-demo/references/resources.md +1 -1
  97. package/skills/i3-ui-demo/scripts/dependencies.cjs +0 -3
  98. package/skills/i3-using-agent-skills/SKILL.md +2 -2
  99. package/.claude/commands/i3-prototype.md +0 -23
  100. package/.gemini/commands/i3-prototype.toml +0 -23
  101. package/commands/i3-prototype.toml +0 -23
  102. package/docs/upstream-repository/AGENTS.md +0 -92
  103. package/docs/upstream-repository/CLAUDE.md +0 -60
  104. package/docs/upstream-repository/CONTRIBUTING.md +0 -137
  105. package/docs/upstream-repository/README.md +0 -8
  106. package/docs/upstream-repository/gitattributes.txt +0 -1
  107. package/docs/upstream-repository/gitignore.txt +0 -10
  108. package/docs/upstream-repository/manifest.json +0 -71
  109. package/docs/upstream-repository/opencode-skills.link +0 -1
  110. package/docs/upstream-repository/skill-gap.yml +0 -80
  111. package/docs/upstream-repository/skills-contributing.md +0 -15
  112. package/docs/upstream-repository/test-plugin-install.yml +0 -167
  113. package/evals/cases/i3-ui-prototype.json +0 -158
  114. package/evals/fixtures/i3-ui-prototype/admin-list/assets/reference.css +0 -3
  115. package/evals/fixtures/i3-ui-prototype/admin-list/assets/reference.js +0 -8
  116. package/evals/fixtures/i3-ui-prototype/admin-list/capability-definition.json +0 -67
  117. package/evals/fixtures/i3-ui-prototype/admin-list/index.html +0 -89
  118. package/evals/fixtures/i3-ui-prototype/admin-list/readme.md +0 -52
  119. package/evals/fixtures/i3-ui-prototype/admin-list/template.json +0 -8
  120. package/evals/fixtures/i3-ui-prototype/business-brief.md +0 -7
  121. package/evals/zh-CN/cases/i3-ui-prototype.json +0 -165
  122. package/hooks/PROTOTYPE.md +0 -31
  123. package/hooks/codebuddy-upstream.cjs +0 -93
  124. package/hooks/i3-prototype.cjs +0 -7
  125. package/hooks/manage.cjs +0 -169
  126. package/scripts/design-provider-discovery-test.js +0 -190
  127. package/scripts/design-provider-test.js +0 -75
  128. package/scripts/enterprise-template-test.js +0 -205
  129. package/scripts/lib/prototype-fixture.cjs +0 -17
  130. package/scripts/prototype-cache-test.js +0 -55
  131. package/scripts/prototype-generation-entry-test.js +0 -6
  132. package/scripts/prototype-generation-evidence-test.js +0 -10
  133. package/scripts/prototype-generation-native-test.js +0 -78
  134. package/scripts/prototype-generation-test.js +0 -99
  135. package/scripts/prototype-inventory-test.js +0 -43
  136. package/scripts/prototype-locations-test.js +0 -79
  137. package/scripts/prototype-project-test.js +0 -183
  138. package/scripts/template-adapter-test.js +0 -155
  139. package/scripts/ui-prototype-binding-recovery-test.js +0 -84
  140. package/scripts/ui-prototype-buddy-lifecycle-test.js +0 -102
  141. package/scripts/ui-prototype-codebuddy-hook-test.js +0 -112
  142. package/scripts/ui-prototype-content-test.js +0 -123
  143. package/scripts/ui-prototype-dependencies-test.js +0 -226
  144. package/scripts/ui-prototype-devtools-test.js +0 -53
  145. package/scripts/ui-prototype-execution-evidence-test.js +0 -62
  146. package/scripts/ui-prototype-execution-gates-test.js +0 -91
  147. package/scripts/ui-prototype-execution-policy-test.js +0 -53
  148. package/scripts/ui-prototype-execution-runtime-test.js +0 -27
  149. package/scripts/ui-prototype-ide-source-test.js +0 -73
  150. package/scripts/ui-prototype-native-test.js +0 -526
  151. package/scripts/ui-prototype-recovery-test.js +0 -81
  152. package/scripts/ui-prototype-registration-test.js +0 -53
  153. package/scripts/ui-prototype-template-test.js +0 -261
  154. package/scripts/ui-prototype-test.js +0 -124
  155. package/scripts/ui-prototype-transcript-auto-test.js +0 -67
  156. package/skills/i3-enterprise-sop/references/ad/assets-manifest.json +0 -86
  157. package/skills/i3-enterprise-sop/references/ad/prompts/01-generate.md +0 -58
  158. package/skills/i3-enterprise-sop/references/ad/prompts/02-review.md +0 -54
  159. package/skills/i3-enterprise-sop/references/ad/prompts/03-revise.md +0 -54
  160. package/skills/i3-enterprise-sop/references/ad/prompts/04-recheck.md +0 -54
  161. package/skills/i3-enterprise-sop/references/ad/readme.md +0 -70
  162. package/skills/i3-enterprise-sop/references/assets-manifest.json +0 -230
  163. package/skills/i3-enterprise-sop/references/brd/assets-manifest.json +0 -83
  164. package/skills/i3-enterprise-sop/references/brd/prompts/01-generate.md +0 -51
  165. package/skills/i3-enterprise-sop/references/brd/prompts/02-review.md +0 -47
  166. package/skills/i3-enterprise-sop/references/brd/prompts/03-revise.md +0 -47
  167. package/skills/i3-enterprise-sop/references/brd/prompts/04-recheck.md +0 -47
  168. package/skills/i3-enterprise-sop/references/brd/readme.md +0 -50
  169. package/skills/i3-enterprise-sop/references/codebuddy-project-guide.md +0 -34
  170. package/skills/i3-enterprise-sop/references/controlled-handoff.md +0 -41
  171. package/skills/i3-enterprise-sop/references/controlled_handoff.py +0 -379
  172. package/skills/i3-enterprise-sop/references/engineering-skeleton/adoption.md +0 -200
  173. package/skills/i3-enterprise-sop/references/engineering-skeleton/catalog.json +0 -17
  174. package/skills/i3-enterprise-sop/references/engineering-skeleton/readme.md +0 -52
  175. package/skills/i3-enterprise-sop/references/handoff-contract.md +0 -196
  176. package/skills/i3-enterprise-sop/references/lifecycle-contract.md +0 -91
  177. package/skills/i3-enterprise-sop/references/plan-handoff.md +0 -73
  178. package/skills/i3-enterprise-sop/references/prd/assets-manifest.json +0 -109
  179. package/skills/i3-enterprise-sop/references/prd/prompts/01-generate.md +0 -64
  180. package/skills/i3-enterprise-sop/references/prd/prompts/02-review.md +0 -49
  181. package/skills/i3-enterprise-sop/references/prd/prompts/03-revise.md +0 -48
  182. package/skills/i3-enterprise-sop/references/prd/prompts/04-recheck.md +0 -47
  183. package/skills/i3-enterprise-sop/references/prd/readme.md +0 -137
  184. package/skills/i3-enterprise-sop/references/prd/template-contracts.md +0 -39
  185. package/skills/i3-enterprise-sop/references/prd/templates/ad.md +0 -17
  186. package/skills/i3-enterprise-sop/references/readme.md +0 -167
  187. package/skills/i3-enterprise-sop/references/recovery-contract.md +0 -65
  188. package/skills/i3-enterprise-sop/references/review-handoff.md +0 -105
  189. package/skills/i3-enterprise-sop/references/selection-handoff.md +0 -55
  190. package/skills/i3-enterprise-sop/references/selection_handoff.py +0 -225
  191. package/skills/i3-enterprise-sop/references/stages.json +0 -271
  192. package/skills/i3-enterprise-sop/references/technical-baseline/assets-manifest.json +0 -84
  193. package/skills/i3-enterprise-sop/references/template-contracts.md +0 -142
  194. package/skills/i3-enterprise-sop/references/testcase/assets-manifest.json +0 -91
  195. package/skills/i3-enterprise-sop/references/testcase/prompts/01-generate.md +0 -53
  196. package/skills/i3-enterprise-sop/references/testcase/prompts/02-review.md +0 -51
  197. package/skills/i3-enterprise-sop/references/testcase/prompts/03-revise.md +0 -49
  198. package/skills/i3-enterprise-sop/references/testcase/prompts/04-recheck.md +0 -51
  199. package/skills/i3-enterprise-sop/references/testcase/readme.md +0 -61
  200. package/skills/i3-enterprise-sop/references/verification/check_execution.py +0 -185
  201. package/skills/i3-enterprise-sop/references/verification/check_native_execution.py +0 -282
  202. package/skills/i3-enterprise-sop/references/verification/check_reads.py +0 -348
  203. package/skills/i3-enterprise-sop/references/verification/readme.md +0 -149
  204. package/skills/i3-enterprise-sop/references/verification/review-output.schema.json +0 -155
  205. package/skills/i3-enterprise-sop/references/verification/review_handoff.py +0 -329
  206. package/skills/i3-ui-prototype/SKILL.md +0 -256
  207. package/skills/i3-ui-prototype/assets/capabilities/generation.json +0 -833
  208. package/skills/i3-ui-prototype/assets/capabilities/management.json +0 -294
  209. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/acceptance.json +0 -51
  210. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/component-map.json +0 -13
  211. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/generation-component-map.json +0 -300
  212. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/index.html +0 -11
  213. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/package-lock.json +0 -2298
  214. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/package.json +0 -22
  215. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/public/prototype-config.json +0 -6
  216. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/App.vue +0 -136
  217. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/components/DeviceEditor.vue +0 -111
  218. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/config.ts +0 -19
  219. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/content.ts +0 -28
  220. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/domain/devices.ts +0 -50
  221. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/domain/theme.ts +0 -25
  222. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/main.ts +0 -18
  223. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/style.css +0 -50
  224. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/useDevices.ts +0 -66
  225. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/tests/devices.test.ts +0 -44
  226. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/tests/theme.test.ts +0 -26
  227. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/tsconfig.json +0 -15
  228. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/vite.config.ts +0 -4
  229. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/profile.json +0 -174
  230. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/readme.md +0 -61
  231. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/index.html +0 -11
  232. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/package-lock.json +0 -2298
  233. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/package.json +0 -22
  234. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/public/prototype-config.json +0 -21
  235. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/App.vue +0 -62
  236. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/PrototypeShell.vue +0 -59
  237. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/config.ts +0 -23
  238. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/domain/presentation.ts +0 -29
  239. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/domain/theme.ts +0 -25
  240. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/main.ts +0 -18
  241. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/style.css +0 -26
  242. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/tests/presentation.test.ts +0 -23
  243. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/tests/theme.test.ts +0 -26
  244. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/tsconfig.json +0 -15
  245. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/vite.config.ts +0 -4
  246. package/skills/i3-ui-prototype/assets/hosts/codebuddy/profile.json +0 -17
  247. package/skills/i3-ui-prototype/assets/optional-skills/host-targets.json +0 -739
  248. package/skills/i3-ui-prototype/assets/optional-skills/sources.json +0 -27
  249. package/skills/i3-ui-prototype/assets/templates/catalog.js +0 -149
  250. package/skills/i3-ui-prototype/assets/templates/catalog.json +0 -149
  251. package/skills/i3-ui-prototype/assets/templates/classic-admin/manifest.json +0 -9
  252. package/skills/i3-ui-prototype/assets/templates/classic-admin/preset.json +0 -6
  253. package/skills/i3-ui-prototype/assets/templates/common/app/app.mjs +0 -89
  254. package/skills/i3-ui-prototype/assets/templates/common/app/config.json +0 -1
  255. package/skills/i3-ui-prototype/assets/templates/common/app/domain.mjs +0 -20
  256. package/skills/i3-ui-prototype/assets/templates/common/app/index.html +0 -17
  257. package/skills/i3-ui-prototype/assets/templates/common/app/serve.cjs +0 -16
  258. package/skills/i3-ui-prototype/assets/templates/common/app/styles.css +0 -670
  259. package/skills/i3-ui-prototype/assets/templates/common/app/tokens.css +0 -19
  260. package/skills/i3-ui-prototype/assets/templates/common/design-system/master.md +0 -20
  261. package/skills/i3-ui-prototype/assets/templates/common/gallery.html +0 -2
  262. package/skills/i3-ui-prototype/assets/templates/common/mocks/applications.json +0 -5
  263. package/skills/i3-ui-prototype/assets/templates/common/requirements-map.json +0 -8
  264. package/skills/i3-ui-prototype/assets/templates/common/serve-gallery.cjs +0 -16
  265. package/skills/i3-ui-prototype/assets/templates/credits.md +0 -17
  266. package/skills/i3-ui-prototype/assets/templates/data-operations/manifest.json +0 -9
  267. package/skills/i3-ui-prototype/assets/templates/data-operations/preset.json +0 -6
  268. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/capability-definition.json +0 -294
  269. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/component-inventory.json +0 -707
  270. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/design-system.md +0 -32
  271. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/generation.json +0 -49
  272. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/index.html +0 -534
  273. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/manifest.json +0 -9
  274. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/offline-build.json +0 -265
  275. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/offline.js +0 -8888
  276. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/origin.json +0 -344
  277. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/preset.json +0 -928
  278. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/app.js +0 -22
  279. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/empty.svg +0 -1
  280. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/reference-styles.json +0 -1
  281. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/result-403.svg +0 -1
  282. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/result-404.svg +0 -1
  283. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets-manifest.json +0 -334
  284. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/baseline.json +0 -173
  285. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/conversion.md +0 -30
  286. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/credits.md +0 -17
  287. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/design-tokens.json +0 -881
  288. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/index.html +0 -28
  289. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/@qin-ui-antdv-next-pro.txt +0 -9
  290. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/ant-design-icons.txt +0 -22
  291. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/antdv-next.txt +0 -21
  292. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/package.json +0 -12
  293. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/browser-routes.json +0 -298
  294. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/coverage.json +0 -180
  295. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/integrity.json +0 -13
  296. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/keyboard.json +0 -11
  297. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/responsive.json +0 -125
  298. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/review.md +0 -51
  299. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/rules.log +0 -150
  300. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-html.png +0 -0
  301. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-original.png +0 -0
  302. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-html.png +0 -0
  303. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-original.png +0 -0
  304. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/models-html.png +0 -0
  305. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/models-original.png +0 -0
  306. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-html.png +0 -0
  307. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-original.png +0 -0
  308. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/selection.json +0 -9
  309. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/visual-comparison.json +0 -342
  310. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/readme.md +0 -73
  311. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/reference.md +0 -59
  312. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/routes.json +0 -178
  313. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/controls.js +0 -99
  314. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/dialogs.js +0 -54
  315. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/dom.js +0 -264
  316. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/forms.js +0 -47
  317. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/icons.js +0 -41
  318. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/layout.js +0 -47
  319. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/router.js +0 -63
  320. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/state.js +0 -90
  321. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/table.js +0 -41
  322. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/widgets.js +0 -8
  323. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.html +0 -3
  324. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.js +0 -36
  325. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.html +0 -2
  326. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.js +0 -51
  327. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.html +0 -3
  328. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.js +0 -48
  329. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/CheckResults.html +0 -2
  330. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/CheckResults.js +0 -6
  331. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.html +0 -2
  332. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.js +0 -13
  333. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/data.js +0 -24
  334. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/domain.js +0 -32
  335. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/registry.js +0 -25
  336. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/store.js +0 -85
  337. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentClose.html +0 -2
  338. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentClose.js +0 -17
  339. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.html +0 -2
  340. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.js +0 -66
  341. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.html +0 -3
  342. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.js +0 -38
  343. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.html +0 -2
  344. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.js +0 -66
  345. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.html +0 -2
  346. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.js +0 -5
  347. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.html +0 -2
  348. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.js +0 -12
  349. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.html +0 -2
  350. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.js +0 -11
  351. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentList.html +0 -2
  352. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentList.js +0 -116
  353. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.html +0 -2
  354. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.js +0 -32
  355. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.html +0 -2
  356. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.js +0 -49
  357. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.html +0 -2
  358. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.js +0 -10
  359. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.html +0 -2
  360. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.js +0 -77
  361. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/data.js +0 -60
  362. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/domain.js +0 -105
  363. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/store.js +0 -212
  364. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/AuditPanel.html +0 -2
  365. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/AuditPanel.js +0 -18
  366. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelDetail.html +0 -2
  367. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelDetail.js +0 -23
  368. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelEditor.html +0 -2
  369. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelEditor.js +0 -78
  370. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelGrant.html +0 -2
  371. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelGrant.js +0 -55
  372. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelReferences.html +0 -2
  373. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelReferences.js +0 -26
  374. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelRelease.html +0 -2
  375. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelRelease.js +0 -38
  376. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelStatus.html +0 -2
  377. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelStatus.js +0 -7
  378. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTable.html +0 -2
  379. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTable.js +0 -72
  380. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTester.html +0 -2
  381. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTester.js +0 -46
  382. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelsPage.html +0 -2
  383. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelsPage.js +0 -52
  384. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/RowActions.html +0 -2
  385. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/RowActions.js +0 -19
  386. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/UsagePanel.html +0 -2
  387. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/UsagePanel.js +0 -30
  388. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/data.js +0 -48
  389. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/domain.js +0 -39
  390. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/store.js +0 -129
  391. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.html +0 -4
  392. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.js +0 -21
  393. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IntentSource.html +0 -2
  394. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IntentSource.js +0 -8
  395. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.html +0 -2
  396. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.js +0 -37
  397. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.html +0 -2
  398. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.js +0 -10
  399. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.html +0 -2
  400. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.js +0 -37
  401. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.html +0 -2
  402. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.js +0 -49
  403. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RunDetail.html +0 -4
  404. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RunDetail.js +0 -22
  405. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.html +0 -2
  406. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.js +0 -9
  407. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/commands.js +0 -82
  408. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/examples.js +0 -47
  409. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/model.js +0 -61
  410. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/repair.js +0 -68
  411. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/store.js +0 -55
  412. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/types.js +0 -1
  413. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/workbench.js +0 -18
  414. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.html +0 -3
  415. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.js +0 -28
  416. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.html +0 -2
  417. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.js +0 -18
  418. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.html +0 -2
  419. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.js +0 -31
  420. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.html +0 -2
  421. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.js +0 -27
  422. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.html +0 -2
  423. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.js +0 -16
  424. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.html +0 -2
  425. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.js +0 -43
  426. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.html +0 -4
  427. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.js +0 -34
  428. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.html +0 -2
  429. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.js +0 -30
  430. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.html +0 -3
  431. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.js +0 -67
  432. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.html +0 -2
  433. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.js +0 -41
  434. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.html +0 -2
  435. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.js +0 -31
  436. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.html +0 -2
  437. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.js +0 -26
  438. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.html +0 -2
  439. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.js +0 -70
  440. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/data.js +0 -8
  441. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/domain.js +0 -62
  442. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/management.js +0 -36
  443. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/managementStore.js +0 -49
  444. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/store.js +0 -132
  445. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/AdminList.html +0 -2
  446. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/AdminList.js +0 -38
  447. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.html +0 -2
  448. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.js +0 -11
  449. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.html +0 -2
  450. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.js +0 -45
  451. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.html +0 -2
  452. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.js +0 -54
  453. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.html +0 -3
  454. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.js +0 -27
  455. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.html +0 -2
  456. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.js +0 -12
  457. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.html +0 -2
  458. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.js +0 -45
  459. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.html +0 -3
  460. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.js +0 -38
  461. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/domain.js +0 -61
  462. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/state.js +0 -51
  463. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/store.js +0 -116
  464. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.html +0 -2
  465. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.js +0 -45
  466. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.html +0 -4
  467. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.js +0 -30
  468. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.html +0 -2
  469. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.js +0 -67
  470. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.html +0 -2
  471. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.js +0 -5
  472. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.html +0 -4
  473. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.js +0 -60
  474. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/commands.js +0 -157
  475. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/model.js +0 -136
  476. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/store.js +0 -76
  477. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.html +0 -3
  478. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.js +0 -26
  479. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.html +0 -2
  480. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.js +0 -14
  481. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.html +0 -2
  482. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.js +0 -113
  483. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.html +0 -3
  484. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.js +0 -62
  485. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/commands.js +0 -97
  486. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/model.js +0 -147
  487. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/store.js +0 -13
  488. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.html +0 -2
  489. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.js +0 -9
  490. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.html +0 -2
  491. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.js +0 -8
  492. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.html +0 -2
  493. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.js +0 -37
  494. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListMore.html +0 -2
  495. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListMore.js +0 -8
  496. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.html +0 -2
  497. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.js +0 -17
  498. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/columns.js +0 -32
  499. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/deliveryGuide.js +0 -49
  500. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/deliveryView.js +0 -12
  501. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/listBatch.js +0 -15
  502. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/listSelection.js +0 -37
  503. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/policy.js +0 -68
  504. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/session.js +0 -44
  505. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.html +0 -2
  506. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.js +0 -25
  507. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.html +0 -2
  508. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.js +0 -53
  509. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.html +0 -10
  510. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.js +0 -30
  511. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ScopePage.html +0 -2
  512. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ScopePage.js +0 -10
  513. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.html +0 -2
  514. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.js +0 -9
  515. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/confirmation.js +0 -3
  516. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/navigation.js +0 -19
  517. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.html +0 -2
  518. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.js +0 -8
  519. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.html +0 -2
  520. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.js +0 -32
  521. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.html +0 -2
  522. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.js +0 -15
  523. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.html +0 -2
  524. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.js +0 -11
  525. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecReview.html +0 -2
  526. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecReview.js +0 -57
  527. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.html +0 -2
  528. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.js +0 -37
  529. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/data.js +0 -20
  530. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/domain.js +0 -55
  531. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/store.js +0 -151
  532. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.html +0 -3
  533. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.js +0 -18
  534. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.html +0 -2
  535. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.js +0 -40
  536. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.html +0 -2
  537. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.js +0 -51
  538. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.html +0 -2
  539. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.js +0 -9
  540. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.html +0 -5
  541. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.js +0 -48
  542. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/domain.js +0 -204
  543. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/exampleSource.js +0 -22
  544. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/registry.js +0 -135
  545. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/store.js +0 -137
  546. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.html +0 -3
  547. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.js +0 -36
  548. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/model.js +0 -56
  549. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/store.js +0 -15
  550. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.html +0 -2
  551. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.js +0 -27
  552. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.html +0 -4
  553. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.js +0 -31
  554. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.html +0 -2
  555. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.js +0 -68
  556. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.html +0 -5
  557. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.js +0 -55
  558. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/data.js +0 -16
  559. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/domain.js +0 -83
  560. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/registry.js +0 -18
  561. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/store.js +0 -61
  562. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/admin.css +0 -60
  563. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/agents.css +0 -46
  564. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/antdv.css +0 -295
  565. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/app.css +0 -102
  566. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/delivery.css +0 -4
  567. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/intents.css +0 -37
  568. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/native.css +0 -22
  569. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/operations.css +0 -2
  570. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/pbc.css +0 -3
  571. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/permissions.css +0 -22
  572. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/pro.css +0 -1
  573. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/releases.css +0 -4
  574. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/reset.css +0 -246
  575. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/reviews.css +0 -8
  576. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/tasks.css +0 -6
  577. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/tokens.css +0 -15
  578. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/workbench.css +0 -61
  579. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/workflows.css +0 -1
  580. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/admin-rules.test.js +0 -96
  581. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/agents.test.js +0 -14
  582. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/intent-state.test.js +0 -37
  583. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/list-batch.test.js +0 -44
  584. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operation-fixtures.js +0 -19
  585. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operation-repair.test.js +0 -14
  586. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operations.test.js +0 -25
  587. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/pbc-management.test.js +0 -17
  588. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/pbc-state.test.js +0 -24
  589. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/permission-config.test.js +0 -23
  590. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/permissions.test.js +0 -24
  591. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/releases.test.js +0 -50
  592. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/reviews.test.js +0 -36
  593. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-forms-router.test.js +0 -28
  594. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-state.test.js +0 -42
  595. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-stores.test.js +0 -16
  596. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/spec-state.test.js +0 -11
  597. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/tasks.test.js +0 -27
  598. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/workbench.test.js +0 -34
  599. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/workflows.test.js +0 -16
  600. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/convert.mjs +0 -168
  601. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/serve.mjs +0 -7
  602. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/styles.mjs +0 -11
  603. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/verify.mjs +0 -24
  604. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/serve.cjs +0 -16
  605. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/template-inventory.json +0 -28791
  606. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/template.json +0 -9
  607. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/usability.css +0 -44
  608. package/skills/i3-ui-prototype/assets/templates/gallery/index.html +0 -40
  609. package/skills/i3-ui-prototype/assets/templates/generation-options.js +0 -42
  610. package/skills/i3-ui-prototype/assets/templates/index.html +0 -3
  611. package/skills/i3-ui-prototype/assets/templates/modern-workspace/manifest.json +0 -9
  612. package/skills/i3-ui-prototype/assets/templates/modern-workspace/preset.json +0 -6
  613. package/skills/i3-ui-prototype/assets/templates/presentation.html +0 -17
  614. package/skills/i3-ui-prototype/assets/templates/serve-gallery.cjs +0 -23
  615. package/skills/i3-ui-prototype/references/artifact-contract.md +0 -66
  616. package/skills/i3-ui-prototype/references/content-template.md +0 -81
  617. package/skills/i3-ui-prototype/references/enterprise-admin.md +0 -44
  618. package/skills/i3-ui-prototype/references/entry-contract.md +0 -71
  619. package/skills/i3-ui-prototype/references/execution-evidence.md +0 -51
  620. package/skills/i3-ui-prototype/references/expert-adapter.md +0 -76
  621. package/skills/i3-ui-prototype/references/framework-contract.md +0 -76
  622. package/skills/i3-ui-prototype/references/generation-contract.md +0 -122
  623. package/skills/i3-ui-prototype/references/interaction-acceptance.md +0 -169
  624. package/skills/i3-ui-prototype/references/legacy-native.md +0 -58
  625. package/skills/i3-ui-prototype/references/optional-skills.md +0 -63
  626. package/skills/i3-ui-prototype/references/project-layout.md +0 -92
  627. package/skills/i3-ui-prototype/references/template-adapters.md +0 -63
  628. package/skills/i3-ui-prototype/references/workflow-contract.md +0 -77
  629. package/skills/i3-ui-prototype/scripts/adapters/easel-html.cjs +0 -30
  630. package/skills/i3-ui-prototype/scripts/adapters/legacy-html.cjs +0 -28
  631. package/skills/i3-ui-prototype/scripts/browser-workspace.cjs +0 -72
  632. package/skills/i3-ui-prototype/scripts/buddy-host.cjs +0 -40
  633. package/skills/i3-ui-prototype/scripts/check-design-provider.cjs +0 -9
  634. package/skills/i3-ui-prototype/scripts/check-prototype.cjs +0 -14
  635. package/skills/i3-ui-prototype/scripts/codebuddy-context.cjs +0 -92
  636. package/skills/i3-ui-prototype/scripts/codebuddy-hook.cjs +0 -298
  637. package/skills/i3-ui-prototype/scripts/codebuddy-ide-source.cjs +0 -69
  638. package/skills/i3-ui-prototype/scripts/codebuddy-registration.cjs +0 -125
  639. package/skills/i3-ui-prototype/scripts/content-template.cjs +0 -98
  640. package/skills/i3-ui-prototype/scripts/design-provider-discovery.cjs +0 -128
  641. package/skills/i3-ui-prototype/scripts/enterprise-template.cjs +0 -104
  642. package/skills/i3-ui-prototype/scripts/execution-assertions.cjs +0 -43
  643. package/skills/i3-ui-prototype/scripts/execution-diagnostics.cjs +0 -91
  644. package/skills/i3-ui-prototype/scripts/execution-evidence.cjs +0 -177
  645. package/skills/i3-ui-prototype/scripts/execution-gates.cjs +0 -216
  646. package/skills/i3-ui-prototype/scripts/execution-policy.cjs +0 -62
  647. package/skills/i3-ui-prototype/scripts/execution-recovery.cjs +0 -58
  648. package/skills/i3-ui-prototype/scripts/execution-runtime.cjs +0 -69
  649. package/skills/i3-ui-prototype/scripts/generation-assets.cjs +0 -18
  650. package/skills/i3-ui-prototype/scripts/generation-contract.cjs +0 -214
  651. package/skills/i3-ui-prototype/scripts/generation-evidence.cjs +0 -50
  652. package/skills/i3-ui-prototype/scripts/generation-replan.cjs +0 -34
  653. package/skills/i3-ui-prototype/scripts/hosts/codebuddy.cjs +0 -21
  654. package/skills/i3-ui-prototype/scripts/init-prototype.cjs +0 -8
  655. package/skills/i3-ui-prototype/scripts/manage-baseline.cjs +0 -11
  656. package/skills/i3-ui-prototype/scripts/native-browser.cjs +0 -785
  657. package/skills/i3-ui-prototype/scripts/native-build.cjs +0 -91
  658. package/skills/i3-ui-prototype/scripts/native-command.cjs +0 -35
  659. package/skills/i3-ui-prototype/scripts/native-delivery.cjs +0 -104
  660. package/skills/i3-ui-prototype/scripts/native-devtools.cjs +0 -92
  661. package/skills/i3-ui-prototype/scripts/native-files.cjs +0 -44
  662. package/skills/i3-ui-prototype/scripts/native-pilot-lib.cjs +0 -290
  663. package/skills/i3-ui-prototype/scripts/native-pilot.cjs +0 -59
  664. package/skills/i3-ui-prototype/scripts/native-tool-name.cjs +0 -5
  665. package/skills/i3-ui-prototype/scripts/native-tool-result.cjs +0 -14
  666. package/skills/i3-ui-prototype/scripts/optional-skill-install.cjs +0 -203
  667. package/skills/i3-ui-prototype/scripts/project-registry.cjs +0 -126
  668. package/skills/i3-ui-prototype/scripts/prototype-dependencies.cjs +0 -103
  669. package/skills/i3-ui-prototype/scripts/prototype-hooks.cjs +0 -94
  670. package/skills/i3-ui-prototype/scripts/prototype-lib.cjs +0 -277
  671. package/skills/i3-ui-prototype/scripts/prototype-locations.cjs +0 -69
  672. package/skills/i3-ui-prototype/scripts/ptc-callbacks.cjs +0 -131
  673. package/skills/i3-ui-prototype/scripts/sync-template.cjs +0 -19
  674. package/skills/i3-ui-prototype/scripts/template-adapters.cjs +0 -89
  675. package/skills/i3-ui-prototype/scripts/template-contract.cjs +0 -407
  676. package/skills/i3-ui-prototype/scripts/template-inventory.cjs +0 -78
  677. 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 };