@givolt/i3-composer-agent 2.2.2 → 2.3.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 (447) hide show
  1. package/.agents/plugins/marketplace.json +1 -1
  2. package/.claude/commands/i3-prototype.md +23 -0
  3. package/.claude/commands/i3-review.md +1 -1
  4. package/.claude/commands/i3-ship.md +1 -1
  5. package/.claude-plugin/marketplace.json +1 -1
  6. package/.claude-plugin/plugin.json +1 -1
  7. package/.codex-plugin/plugin.json +2 -2
  8. package/.gemini/commands/i3-prototype.toml +23 -0
  9. package/.gemini/commands/i3-review.toml +1 -1
  10. package/.gemini/commands/i3-ship.toml +1 -1
  11. package/README.md +42 -25
  12. package/agents/code-reviewer.md +1 -1
  13. package/agents/test-engineer.md +1 -1
  14. package/bin/i3-composer-agent.cjs +5 -4
  15. package/bin/install.cjs +22 -10
  16. package/bin/native-command-validation.cjs +8 -13
  17. package/bin/native-layout.cjs +64 -28
  18. package/bin/native-migration.cjs +13 -7
  19. package/bin/native-runtime.cjs +10 -5
  20. package/commands/i3-prototype.toml +23 -0
  21. package/commands/i3-review.toml +1 -1
  22. package/commands/i3-ship.toml +1 -1
  23. package/docs/advanced-per-agent-configuration.md +78 -0
  24. package/docs/agents.md +2 -2
  25. package/docs/codebuddy-setup.md +5 -5
  26. package/docs/codex-setup.md +3 -3
  27. package/docs/copilot-setup.md +4 -0
  28. package/docs/cursor-setup.md +3 -0
  29. package/docs/other-hosts.md +44 -9
  30. package/docs/workbuddy-setup.md +9 -9
  31. package/evals/README.md +28 -16
  32. package/evals/cases/i3-documentation-and-adrs.json +18 -0
  33. package/evals/cases/i3-test-driven-development.json +8 -0
  34. package/evals/cases/i3-ui-prototype.json +49 -0
  35. package/evals/fixtures/i3-documentation-and-adrs/prose-review/README.md +19 -0
  36. package/evals/fixtures/i3-documentation-and-adrs/prose-review/queue.js +32 -0
  37. package/evals/fixtures/i3-ui-prototype/business-brief.md +7 -0
  38. package/evals/plugin/tdd-fires-on-pasted-bug/graders/failing-test-first.md +7 -0
  39. package/evals/plugin/tdd-fires-on-pasted-bug/graders/skill-fired.md +5 -0
  40. package/evals/plugin/tdd-fires-on-pasted-bug/prompt.md +15 -0
  41. package/evals/plugin/tdd-stays-quiet-on-debug/graders/not-fired.md +8 -0
  42. package/evals/plugin/tdd-stays-quiet-on-debug/prompt.md +25 -0
  43. package/evals/zh-CN/cases/i3-documentation-and-adrs.json +19 -0
  44. package/evals/zh-CN/cases/i3-test-driven-development.json +4 -0
  45. package/evals/zh-CN/cases/i3-ui-prototype.json +50 -0
  46. package/hooks/SIMPLIFY-IGNORE.md +3 -2
  47. package/hooks/simplify-ignore-test.sh +93 -1
  48. package/hooks/simplify-ignore.sh +94 -11
  49. package/package.json +63 -18
  50. package/plugin.json +1 -1
  51. package/references/performance-checklist.md +4 -2
  52. package/scripts/enterprise-template-test.js +139 -0
  53. package/scripts/floor-guard-reference-test.js +291 -0
  54. package/scripts/lib/skill-lint-test.js +762 -0
  55. package/scripts/lib/skill-lint.js +62 -8
  56. package/scripts/run-evals-test.js +830 -0
  57. package/scripts/run-evals.js +47 -9
  58. package/scripts/run-regressions.js +19 -0
  59. package/scripts/template-adapter-test.js +155 -0
  60. package/scripts/ui-prototype-test.js +114 -0
  61. package/scripts/validate-artifact-paths-test.js +179 -0
  62. package/scripts/validate-commands-test.js +246 -0
  63. package/scripts/validate-commands.js +6 -16
  64. package/scripts/validate-reference-links-test.js +513 -0
  65. package/scripts/validate-reference-links.js +4 -2
  66. package/scripts/validate-skills.js +26 -3
  67. package/scripts/validate-versions-test.js +32 -0
  68. package/skills/i3-documentation-and-adrs/SKILL.md +9 -0
  69. package/skills/i3-frontend-ui-engineering/SKILL.md +5 -1
  70. package/skills/i3-idea-refine/SKILL.md +20 -5
  71. package/skills/i3-incremental-implementation/SKILL.md +4 -0
  72. package/skills/i3-performance-optimization/SKILL.md +10 -10
  73. package/skills/i3-security-and-hardening/references/hardening-patterns.md +1 -1
  74. package/skills/i3-shipping-and-launch/SKILL.md +6 -0
  75. package/skills/i3-test-driven-development/SKILL.md +3 -3
  76. package/skills/i3-ui-prototype/SKILL.md +119 -0
  77. package/skills/i3-ui-prototype/assets/templates/catalog.json +147 -0
  78. package/skills/i3-ui-prototype/assets/templates/classic-admin/manifest.json +9 -0
  79. package/skills/i3-ui-prototype/assets/templates/classic-admin/preset.json +6 -0
  80. package/skills/i3-ui-prototype/assets/templates/common/app/app.mjs +89 -0
  81. package/skills/i3-ui-prototype/assets/templates/common/app/config.json +1 -0
  82. package/skills/i3-ui-prototype/assets/templates/common/app/domain.mjs +20 -0
  83. package/skills/i3-ui-prototype/assets/templates/common/app/index.html +17 -0
  84. package/skills/i3-ui-prototype/assets/templates/common/app/serve.cjs +16 -0
  85. package/skills/i3-ui-prototype/assets/templates/common/app/styles.css +670 -0
  86. package/skills/i3-ui-prototype/assets/templates/common/app/tokens.css +19 -0
  87. package/skills/i3-ui-prototype/assets/templates/common/design-system/master.md +20 -0
  88. package/skills/i3-ui-prototype/assets/templates/common/gallery.html +2 -0
  89. package/skills/i3-ui-prototype/assets/templates/common/mocks/applications.json +5 -0
  90. package/skills/i3-ui-prototype/assets/templates/common/requirements-map.json +8 -0
  91. package/skills/i3-ui-prototype/assets/templates/common/serve-gallery.cjs +16 -0
  92. package/skills/i3-ui-prototype/assets/templates/credits.md +17 -0
  93. package/skills/i3-ui-prototype/assets/templates/data-operations/manifest.json +9 -0
  94. package/skills/i3-ui-prototype/assets/templates/data-operations/preset.json +6 -0
  95. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/design-system.md +32 -0
  96. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/index.html +29 -0
  97. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/manifest.json +9 -0
  98. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/origin.json +344 -0
  99. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/preset.json +928 -0
  100. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/app.js +22 -0
  101. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/empty.svg +1 -0
  102. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/reference-styles.json +1 -0
  103. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/result-403.svg +1 -0
  104. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/result-404.svg +1 -0
  105. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets-manifest.json +334 -0
  106. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/baseline.json +173 -0
  107. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/conversion.md +30 -0
  108. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/credits.md +17 -0
  109. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/design-tokens.json +881 -0
  110. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/index.html +28 -0
  111. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/@qin-ui-antdv-next-pro.txt +9 -0
  112. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/ant-design-icons.txt +22 -0
  113. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/antdv-next.txt +21 -0
  114. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/package.json +12 -0
  115. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/browser-routes.json +298 -0
  116. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/coverage.json +180 -0
  117. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/integrity.json +13 -0
  118. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/keyboard.json +11 -0
  119. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/responsive.json +125 -0
  120. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/review.md +51 -0
  121. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/rules.log +150 -0
  122. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-html.png +0 -0
  123. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-original.png +0 -0
  124. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-html.png +0 -0
  125. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-original.png +0 -0
  126. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/models-html.png +0 -0
  127. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/models-original.png +0 -0
  128. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-html.png +0 -0
  129. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-original.png +0 -0
  130. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/selection.json +9 -0
  131. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/visual-comparison.json +342 -0
  132. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/readme.md +73 -0
  133. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/reference.md +59 -0
  134. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/routes.json +178 -0
  135. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/controls.js +99 -0
  136. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/dialogs.js +54 -0
  137. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/dom.js +264 -0
  138. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/forms.js +47 -0
  139. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/icons.js +41 -0
  140. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/layout.js +47 -0
  141. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/router.js +63 -0
  142. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/state.js +90 -0
  143. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/table.js +41 -0
  144. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/widgets.js +8 -0
  145. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.html +3 -0
  146. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.js +36 -0
  147. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.html +2 -0
  148. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.js +51 -0
  149. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.html +3 -0
  150. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.js +48 -0
  151. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/CheckResults.html +2 -0
  152. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/CheckResults.js +6 -0
  153. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.html +2 -0
  154. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.js +13 -0
  155. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/data.js +24 -0
  156. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/domain.js +32 -0
  157. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/registry.js +25 -0
  158. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/store.js +85 -0
  159. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentClose.html +2 -0
  160. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentClose.js +17 -0
  161. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.html +2 -0
  162. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.js +66 -0
  163. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.html +3 -0
  164. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.js +38 -0
  165. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.html +2 -0
  166. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.js +66 -0
  167. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.html +2 -0
  168. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.js +5 -0
  169. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.html +2 -0
  170. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.js +12 -0
  171. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.html +2 -0
  172. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.js +11 -0
  173. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentList.html +2 -0
  174. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentList.js +116 -0
  175. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.html +2 -0
  176. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.js +32 -0
  177. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.html +2 -0
  178. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.js +49 -0
  179. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.html +2 -0
  180. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.js +10 -0
  181. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.html +2 -0
  182. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.js +77 -0
  183. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/data.js +60 -0
  184. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/domain.js +105 -0
  185. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/store.js +212 -0
  186. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/AuditPanel.html +2 -0
  187. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/AuditPanel.js +18 -0
  188. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelDetail.html +2 -0
  189. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelDetail.js +23 -0
  190. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelEditor.html +2 -0
  191. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelEditor.js +78 -0
  192. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelGrant.html +2 -0
  193. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelGrant.js +55 -0
  194. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelReferences.html +2 -0
  195. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelReferences.js +26 -0
  196. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelRelease.html +2 -0
  197. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelRelease.js +38 -0
  198. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelStatus.html +2 -0
  199. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelStatus.js +7 -0
  200. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTable.html +2 -0
  201. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTable.js +72 -0
  202. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTester.html +2 -0
  203. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTester.js +46 -0
  204. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelsPage.html +2 -0
  205. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelsPage.js +52 -0
  206. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/RowActions.html +2 -0
  207. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/RowActions.js +19 -0
  208. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/UsagePanel.html +2 -0
  209. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/UsagePanel.js +30 -0
  210. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/data.js +48 -0
  211. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/domain.js +39 -0
  212. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/store.js +129 -0
  213. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.html +4 -0
  214. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.js +21 -0
  215. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IntentSource.html +2 -0
  216. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IntentSource.js +8 -0
  217. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.html +2 -0
  218. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.js +37 -0
  219. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.html +2 -0
  220. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.js +10 -0
  221. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.html +2 -0
  222. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.js +37 -0
  223. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.html +2 -0
  224. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.js +49 -0
  225. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RunDetail.html +4 -0
  226. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RunDetail.js +22 -0
  227. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.html +2 -0
  228. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.js +9 -0
  229. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/commands.js +82 -0
  230. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/examples.js +47 -0
  231. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/model.js +61 -0
  232. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/repair.js +68 -0
  233. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/store.js +55 -0
  234. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/types.js +1 -0
  235. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/workbench.js +18 -0
  236. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.html +3 -0
  237. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.js +28 -0
  238. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.html +2 -0
  239. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.js +18 -0
  240. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.html +2 -0
  241. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.js +31 -0
  242. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.html +2 -0
  243. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.js +27 -0
  244. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.html +2 -0
  245. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.js +16 -0
  246. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.html +2 -0
  247. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.js +43 -0
  248. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.html +4 -0
  249. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.js +34 -0
  250. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.html +2 -0
  251. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.js +30 -0
  252. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.html +3 -0
  253. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.js +67 -0
  254. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.html +2 -0
  255. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.js +41 -0
  256. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.html +2 -0
  257. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.js +31 -0
  258. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.html +2 -0
  259. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.js +26 -0
  260. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.html +2 -0
  261. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.js +70 -0
  262. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/data.js +8 -0
  263. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/domain.js +62 -0
  264. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/management.js +36 -0
  265. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/managementStore.js +49 -0
  266. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/store.js +132 -0
  267. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/AdminList.html +2 -0
  268. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/AdminList.js +38 -0
  269. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.html +2 -0
  270. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.js +11 -0
  271. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.html +2 -0
  272. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.js +45 -0
  273. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.html +2 -0
  274. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.js +54 -0
  275. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.html +3 -0
  276. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.js +27 -0
  277. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.html +2 -0
  278. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.js +12 -0
  279. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.html +2 -0
  280. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.js +45 -0
  281. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.html +3 -0
  282. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.js +38 -0
  283. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/domain.js +61 -0
  284. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/state.js +51 -0
  285. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/store.js +116 -0
  286. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.html +2 -0
  287. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.js +45 -0
  288. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.html +4 -0
  289. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.js +30 -0
  290. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.html +2 -0
  291. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.js +67 -0
  292. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.html +2 -0
  293. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.js +5 -0
  294. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.html +4 -0
  295. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.js +60 -0
  296. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/commands.js +157 -0
  297. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/model.js +136 -0
  298. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/store.js +76 -0
  299. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.html +3 -0
  300. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.js +26 -0
  301. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.html +2 -0
  302. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.js +14 -0
  303. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.html +2 -0
  304. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.js +113 -0
  305. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.html +3 -0
  306. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.js +62 -0
  307. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/commands.js +97 -0
  308. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/model.js +147 -0
  309. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/store.js +13 -0
  310. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.html +2 -0
  311. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.js +9 -0
  312. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.html +2 -0
  313. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.js +8 -0
  314. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.html +2 -0
  315. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.js +37 -0
  316. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListMore.html +2 -0
  317. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListMore.js +8 -0
  318. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.html +2 -0
  319. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.js +17 -0
  320. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/columns.js +32 -0
  321. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/deliveryGuide.js +49 -0
  322. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/deliveryView.js +12 -0
  323. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/listBatch.js +15 -0
  324. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/listSelection.js +37 -0
  325. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/policy.js +68 -0
  326. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/session.js +44 -0
  327. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.html +2 -0
  328. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.js +25 -0
  329. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.html +2 -0
  330. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.js +53 -0
  331. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.html +10 -0
  332. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.js +30 -0
  333. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ScopePage.html +2 -0
  334. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ScopePage.js +10 -0
  335. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.html +2 -0
  336. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.js +9 -0
  337. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/confirmation.js +3 -0
  338. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/navigation.js +19 -0
  339. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.html +2 -0
  340. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.js +8 -0
  341. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.html +2 -0
  342. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.js +32 -0
  343. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.html +2 -0
  344. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.js +15 -0
  345. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.html +2 -0
  346. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.js +11 -0
  347. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecReview.html +2 -0
  348. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecReview.js +57 -0
  349. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.html +2 -0
  350. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.js +37 -0
  351. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/data.js +20 -0
  352. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/domain.js +55 -0
  353. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/store.js +151 -0
  354. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.html +3 -0
  355. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.js +18 -0
  356. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.html +2 -0
  357. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.js +40 -0
  358. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.html +2 -0
  359. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.js +51 -0
  360. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.html +2 -0
  361. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.js +9 -0
  362. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.html +5 -0
  363. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.js +48 -0
  364. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/domain.js +204 -0
  365. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/exampleSource.js +22 -0
  366. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/registry.js +135 -0
  367. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/store.js +137 -0
  368. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.html +3 -0
  369. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.js +36 -0
  370. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/model.js +56 -0
  371. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/store.js +15 -0
  372. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.html +2 -0
  373. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.js +27 -0
  374. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.html +4 -0
  375. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.js +31 -0
  376. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.html +2 -0
  377. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.js +68 -0
  378. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.html +5 -0
  379. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.js +55 -0
  380. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/data.js +16 -0
  381. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/domain.js +83 -0
  382. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/registry.js +18 -0
  383. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/store.js +61 -0
  384. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/admin.css +60 -0
  385. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/agents.css +46 -0
  386. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/antdv.css +295 -0
  387. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/app.css +102 -0
  388. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/delivery.css +4 -0
  389. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/intents.css +37 -0
  390. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/native.css +22 -0
  391. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/operations.css +2 -0
  392. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/pbc.css +3 -0
  393. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/permissions.css +22 -0
  394. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/pro.css +1 -0
  395. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/releases.css +4 -0
  396. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/reset.css +246 -0
  397. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/reviews.css +8 -0
  398. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/tasks.css +6 -0
  399. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/tokens.css +15 -0
  400. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/workbench.css +61 -0
  401. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/workflows.css +1 -0
  402. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/admin-rules.test.js +96 -0
  403. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/agents.test.js +14 -0
  404. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/intent-state.test.js +37 -0
  405. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/list-batch.test.js +44 -0
  406. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operation-fixtures.js +19 -0
  407. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operation-repair.test.js +14 -0
  408. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operations.test.js +25 -0
  409. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/pbc-management.test.js +17 -0
  410. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/pbc-state.test.js +24 -0
  411. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/permission-config.test.js +23 -0
  412. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/permissions.test.js +24 -0
  413. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/releases.test.js +50 -0
  414. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/reviews.test.js +36 -0
  415. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-forms-router.test.js +28 -0
  416. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-state.test.js +42 -0
  417. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-stores.test.js +16 -0
  418. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/spec-state.test.js +11 -0
  419. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/tasks.test.js +27 -0
  420. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/workbench.test.js +34 -0
  421. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/workflows.test.js +16 -0
  422. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/convert.mjs +168 -0
  423. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/serve.mjs +7 -0
  424. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/styles.mjs +11 -0
  425. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/verify.mjs +24 -0
  426. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/serve.cjs +16 -0
  427. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/usability.css +44 -0
  428. package/skills/i3-ui-prototype/assets/templates/gallery/index.html +40 -0
  429. package/skills/i3-ui-prototype/assets/templates/modern-workspace/manifest.json +9 -0
  430. package/skills/i3-ui-prototype/assets/templates/modern-workspace/preset.json +6 -0
  431. package/skills/i3-ui-prototype/assets/templates/serve-gallery.cjs +16 -0
  432. package/skills/i3-ui-prototype/references/artifact-contract.md +41 -0
  433. package/skills/i3-ui-prototype/references/enterprise-admin.md +38 -0
  434. package/skills/i3-ui-prototype/references/expert-adapter.md +42 -0
  435. package/skills/i3-ui-prototype/references/template-adapters.md +57 -0
  436. package/skills/i3-ui-prototype/references/workflow-contract.md +19 -0
  437. package/skills/i3-ui-prototype/scripts/adapters/easel-html.cjs +30 -0
  438. package/skills/i3-ui-prototype/scripts/adapters/legacy-html.cjs +28 -0
  439. package/skills/i3-ui-prototype/scripts/check-design-provider.cjs +9 -0
  440. package/skills/i3-ui-prototype/scripts/check-prototype.cjs +14 -0
  441. package/skills/i3-ui-prototype/scripts/enterprise-template.cjs +88 -0
  442. package/skills/i3-ui-prototype/scripts/init-prototype.cjs +8 -0
  443. package/skills/i3-ui-prototype/scripts/manage-baseline.cjs +11 -0
  444. package/skills/i3-ui-prototype/scripts/prototype-lib.cjs +255 -0
  445. package/skills/i3-ui-prototype/scripts/template-adapters.cjs +89 -0
  446. package/skills/i3-using-agent-skills/SKILL.md +5 -0
  447. package/bin/native-version-validation.cjs +0 -8
package/package.json CHANGED
@@ -55,6 +55,7 @@
55
55
  "evals/cases/i3-source-driven-development.json",
56
56
  "evals/cases/i3-spec-driven-development.json",
57
57
  "evals/cases/i3-test-driven-development.json",
58
+ "evals/cases/i3-ui-prototype.json",
58
59
  "evals/cases/i3-using-agent-skills.json",
59
60
  "evals/fixtures/i3-api-and-interface-design/service-brief.md",
60
61
  "evals/fixtures/i3-browser-testing-with-devtools/README.md",
@@ -72,6 +73,8 @@
72
73
  "evals/fixtures/i3-debugging-and-error-recovery/time-pressure.md",
73
74
  "evals/fixtures/i3-deprecation-and-migration/api-inventory.md",
74
75
  "evals/fixtures/i3-documentation-and-adrs/decision-context.md",
76
+ "evals/fixtures/i3-documentation-and-adrs/prose-review/README.md",
77
+ "evals/fixtures/i3-documentation-and-adrs/prose-review/queue.js",
75
78
  "evals/fixtures/i3-doubt-driven-development/migration-plan.md",
76
79
  "evals/fixtures/i3-frontend-ui-engineering/Button.tsx",
77
80
  "evals/fixtures/i3-frontend-ui-engineering/design-system.md",
@@ -97,6 +100,7 @@
97
100
  "evals/fixtures/i3-test-driven-development/package.json",
98
101
  "evals/fixtures/i3-test-driven-development/src/split.js",
99
102
  "evals/fixtures/i3-test-driven-development/test/split.test.js",
103
+ "evals/fixtures/i3-ui-prototype/business-brief.md",
100
104
  "evals/fixtures/i3-using-agent-skills/incident.md",
101
105
  "evals/fixtures/incremental-implementation-pressure/draft-export.js",
102
106
  "evals/fixtures/incremental-implementation-pressure/scenario.md",
@@ -113,6 +117,11 @@
113
117
  "evals/plugin/code-review-stays-quiet/graders/not-fired.md",
114
118
  "evals/plugin/code-review-stays-quiet/graders/tdd-fired.md",
115
119
  "evals/plugin/code-review-stays-quiet/prompt.md",
120
+ "evals/plugin/tdd-fires-on-pasted-bug/graders/failing-test-first.md",
121
+ "evals/plugin/tdd-fires-on-pasted-bug/graders/skill-fired.md",
122
+ "evals/plugin/tdd-fires-on-pasted-bug/prompt.md",
123
+ "evals/plugin/tdd-stays-quiet-on-debug/graders/not-fired.md",
124
+ "evals/plugin/tdd-stays-quiet-on-debug/prompt.md",
116
125
  "evals/skill-impact.md",
117
126
  "evals/zh-CN/cases/i3-api-and-interface-design.json",
118
127
  "evals/zh-CN/cases/i3-browser-testing-with-devtools.json",
@@ -138,15 +147,10 @@
138
147
  "evals/zh-CN/cases/i3-source-driven-development.json",
139
148
  "evals/zh-CN/cases/i3-spec-driven-development.json",
140
149
  "evals/zh-CN/cases/i3-test-driven-development.json",
150
+ "evals/zh-CN/cases/i3-ui-prototype.json",
141
151
  "evals/zh-CN/cases/i3-using-agent-skills.json",
142
- "scripts/run-evals.js",
143
- "scripts/validate-skills.js",
144
- "scripts/validate-versions.js",
145
- "scripts/validate-commands.js",
146
- "scripts/validate-reference-links.js",
147
- "scripts/validate-artifact-paths.js",
148
- "scripts/lib/skill-lint.js",
149
152
  "docs/adoption-guide.md",
153
+ "docs/advanced-per-agent-configuration.md",
150
154
  "docs/agents.md",
151
155
  "docs/antigravity-setup.md",
152
156
  "docs/codebuddy-setup.md",
@@ -163,12 +167,31 @@
163
167
  "docs/workbuddy-setup.md",
164
168
  "plugin.json",
165
169
  "README.md",
166
- "LICENSE"
170
+ "LICENSE",
171
+ "scripts/enterprise-template-test.js",
172
+ "scripts/floor-guard-reference-test.js",
173
+ "scripts/lib/skill-lint-test.js",
174
+ "scripts/lib/skill-lint.js",
175
+ "scripts/run-evals-test.js",
176
+ "scripts/run-evals.js",
177
+ "scripts/run-regressions.js",
178
+ "scripts/template-adapter-test.js",
179
+ "scripts/ui-prototype-test.js",
180
+ "scripts/validate-artifact-paths-test.js",
181
+ "scripts/validate-artifact-paths.js",
182
+ "scripts/validate-commands-test.js",
183
+ "scripts/validate-commands.js",
184
+ "scripts/validate-reference-links-test.js",
185
+ "scripts/validate-reference-links.js",
186
+ "scripts/validate-skills.js",
187
+ "scripts/validate-versions-test.js",
188
+ "scripts/validate-versions.js"
167
189
  ],
168
190
  "scripts": {
169
191
  "validate": "node scripts/validate-skills.js && node scripts/validate-versions.js && node scripts/validate-commands.js && node scripts/validate-reference-links.js && node scripts/validate-artifact-paths.js",
170
192
  "eval": "node scripts/run-evals.js",
171
- "test": "npm run validate && npm run eval -- --min-rank1 95",
193
+ "test": "npm run validate && npm run eval -- --min-rank1 95 && npm run test:regression",
194
+ "test:regression": "node scripts/run-regressions.js",
172
195
  "prepack": "npm run validate"
173
196
  },
174
197
  "keywords": [
@@ -217,6 +240,7 @@
217
240
  "evals/cases/i3-source-driven-development.json",
218
241
  "evals/cases/i3-spec-driven-development.json",
219
242
  "evals/cases/i3-test-driven-development.json",
243
+ "evals/cases/i3-ui-prototype.json",
220
244
  "evals/cases/i3-using-agent-skills.json",
221
245
  "evals/fixtures/i3-api-and-interface-design/service-brief.md",
222
246
  "evals/fixtures/i3-browser-testing-with-devtools/README.md",
@@ -234,6 +258,8 @@
234
258
  "evals/fixtures/i3-debugging-and-error-recovery/time-pressure.md",
235
259
  "evals/fixtures/i3-deprecation-and-migration/api-inventory.md",
236
260
  "evals/fixtures/i3-documentation-and-adrs/decision-context.md",
261
+ "evals/fixtures/i3-documentation-and-adrs/prose-review/README.md",
262
+ "evals/fixtures/i3-documentation-and-adrs/prose-review/queue.js",
237
263
  "evals/fixtures/i3-doubt-driven-development/migration-plan.md",
238
264
  "evals/fixtures/i3-frontend-ui-engineering/Button.tsx",
239
265
  "evals/fixtures/i3-frontend-ui-engineering/design-system.md",
@@ -259,6 +285,7 @@
259
285
  "evals/fixtures/i3-test-driven-development/package.json",
260
286
  "evals/fixtures/i3-test-driven-development/src/split.js",
261
287
  "evals/fixtures/i3-test-driven-development/test/split.test.js",
288
+ "evals/fixtures/i3-ui-prototype/business-brief.md",
262
289
  "evals/fixtures/i3-using-agent-skills/incident.md",
263
290
  "evals/fixtures/incremental-implementation-pressure/draft-export.js",
264
291
  "evals/fixtures/incremental-implementation-pressure/scenario.md",
@@ -275,6 +302,11 @@
275
302
  "evals/plugin/code-review-stays-quiet/graders/not-fired.md",
276
303
  "evals/plugin/code-review-stays-quiet/graders/tdd-fired.md",
277
304
  "evals/plugin/code-review-stays-quiet/prompt.md",
305
+ "evals/plugin/tdd-fires-on-pasted-bug/graders/failing-test-first.md",
306
+ "evals/plugin/tdd-fires-on-pasted-bug/graders/skill-fired.md",
307
+ "evals/plugin/tdd-fires-on-pasted-bug/prompt.md",
308
+ "evals/plugin/tdd-stays-quiet-on-debug/graders/not-fired.md",
309
+ "evals/plugin/tdd-stays-quiet-on-debug/prompt.md",
278
310
  "evals/skill-impact.md",
279
311
  "evals/zh-CN/cases/i3-api-and-interface-design.json",
280
312
  "evals/zh-CN/cases/i3-browser-testing-with-devtools.json",
@@ -300,15 +332,10 @@
300
332
  "evals/zh-CN/cases/i3-source-driven-development.json",
301
333
  "evals/zh-CN/cases/i3-spec-driven-development.json",
302
334
  "evals/zh-CN/cases/i3-test-driven-development.json",
335
+ "evals/zh-CN/cases/i3-ui-prototype.json",
303
336
  "evals/zh-CN/cases/i3-using-agent-skills.json",
304
- "scripts/run-evals.js",
305
- "scripts/validate-skills.js",
306
- "scripts/validate-versions.js",
307
- "scripts/validate-commands.js",
308
- "scripts/validate-reference-links.js",
309
- "scripts/validate-artifact-paths.js",
310
- "scripts/lib/skill-lint.js",
311
337
  "docs/adoption-guide.md",
338
+ "docs/advanced-per-agent-configuration.md",
312
339
  "docs/agents.md",
313
340
  "docs/antigravity-setup.md",
314
341
  "docs/codebuddy-setup.md",
@@ -326,10 +353,28 @@
326
353
  "plugin.json",
327
354
  "package.json",
328
355
  "README.md",
329
- "LICENSE"
356
+ "LICENSE",
357
+ "scripts/enterprise-template-test.js",
358
+ "scripts/floor-guard-reference-test.js",
359
+ "scripts/lib/skill-lint-test.js",
360
+ "scripts/lib/skill-lint.js",
361
+ "scripts/run-evals-test.js",
362
+ "scripts/run-evals.js",
363
+ "scripts/run-regressions.js",
364
+ "scripts/template-adapter-test.js",
365
+ "scripts/ui-prototype-test.js",
366
+ "scripts/validate-artifact-paths-test.js",
367
+ "scripts/validate-artifact-paths.js",
368
+ "scripts/validate-commands-test.js",
369
+ "scripts/validate-commands.js",
370
+ "scripts/validate-reference-links-test.js",
371
+ "scripts/validate-reference-links.js",
372
+ "scripts/validate-skills.js",
373
+ "scripts/validate-versions-test.js",
374
+ "scripts/validate-versions.js"
330
375
  ]
331
376
  },
332
- "version": "2.2.2",
377
+ "version": "2.3.0",
333
378
  "repository": {
334
379
  "type": "git",
335
380
  "url": "https://github.com/49780522/i3-composer-agent.git"
package/plugin.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "i3-composer-agent",
3
- "version": "2.2.2",
3
+ "version": "2.3.0",
4
4
  "description": "覆盖需求、计划、开发、测试、审查与发布的软件工程技能,默认使用简体中文。",
5
5
  "homepage": "https://github.com/49780522/i3-composer-agent",
6
6
  "repository": "https://github.com/49780522/i3-composer-agent"
@@ -209,14 +209,16 @@ npx vite-bundle-visualizer
209
209
 
210
210
  # Check bundle size
211
211
  npx bundlesize
212
+ ```
212
213
 
213
- # Web Vitals in code
214
+ ```javascript
215
+ // Web Vitals in code
214
216
  import { onLCP, onINP, onCLS } from 'web-vitals';
215
217
  onLCP(console.log);
216
218
  onINP(console.log);
217
219
  onCLS(console.log);
218
220
 
219
- # INP with interaction-level detail (attribution build)
221
+ // INP with interaction-level detail (attribution build)
220
222
  import { onINP } from 'web-vitals/attribution';
221
223
  onINP(({ value, attribution }) => {
222
224
  const { interactionTarget, inputDelay, processingDuration, presentationDelay } = attribution;
@@ -0,0 +1,139 @@
1
+ 'use strict';
2
+ const test = require('node:test');
3
+ const assert = require('node:assert/strict');
4
+ const fs = require('node:fs');
5
+ const path = require('node:path');
6
+ const os = require('node:os');
7
+ const crypto = require('node:crypto');
8
+ const { spawn, spawnSync } = require('node:child_process');
9
+ const install = path.join(__dirname, 'lib/installation.js');
10
+ const skills = fs.existsSync(install) ? require(install).loadInstallation().skillsDirectory : path.resolve(__dirname, '../skills');
11
+ const skill = path.join(skills, 'i3-ui-prototype');
12
+ const lib = require(path.join(skill, 'scripts/prototype-lib.cjs'));
13
+ const read = (root, file) => JSON.parse(fs.readFileSync(path.join(root, file), 'utf8'));
14
+ function project(t) {
15
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), 'enterprise-template-'));
16
+ t.after(() => fs.rmSync(root, { recursive: true, force: true }));
17
+ return root;
18
+ }
19
+ function initialize(t, options = {}) {
20
+ return lib.initPrototype({ project: project(t), id: 'enterprise-demo', expertMode: 'template', purpose: 'template-review', ...options }).directory;
21
+ }
22
+ test('four prototype families expose the EASEL enterprise template and explicitly defer the other three', () => {
23
+ const entries = lib.listTemplates();
24
+ assert.deepEqual(entries.map(x => x.id), ['enterprise-admin', 'ai-workbench', 'digital-twin', 'mobile-app']);
25
+ assert.deepEqual(entries.filter(x => x.availability === 'available').map(x => x.id), ['enterprise-admin']);
26
+ for (const entry of entries.slice(1)) assert.equal(entry.availability, 'planned');
27
+ });
28
+ test('default enterprise initializer preserves the complete EASEL runtime and its review scope', t => {
29
+ const dir = initialize(t), metadata = read(dir, 'prototype.json');
30
+ assert.equal(metadata.template.id, 'enterprise-admin');
31
+ assert.equal(metadata.purpose, 'template-review');
32
+ assert.equal(metadata.review.status, 'pending-review');
33
+ const inspection = lib.checkPrototype(dir);
34
+ assert.equal(inspection.status, 'passed', JSON.stringify(inspection));
35
+ const routes = read(dir, 'app/routes.json').filter(x => x.component && !x.path.startsWith('/module/'));
36
+ assert.equal(routes.length, 37);
37
+ assert.equal(new Set(routes.map(x => x.component)).size, 34);
38
+ for (const file of ['app/runtime/dom.js', 'app/styles/antdv.css', 'app/src/shell/ConsoleShell.html', 'app/licenses/antdv-next.txt', 'design-system/source.json']) {
39
+ assert.ok(fs.existsSync(path.join(dir, file)), file);
40
+ }
41
+ });
42
+ test('planned template families refuse initialization without silently generating a desktop demo', t => {
43
+ const root = project(t);
44
+ for (const template of ['ai-workbench', 'digital-twin', 'mobile-app']) {
45
+ assert.throws(() => lib.initPrototype({ project: root, id: template, template, expertMode: 'template' }), /planned|尚未|待建设/);
46
+ }
47
+ assert.equal(fs.existsSync(path.join(root, 'prototypes')), false);
48
+ });
49
+ test('all imported reference files retain their declared source hashes', () => {
50
+ const origin = read(skill, 'assets/templates/enterprise-admin/origin.json');
51
+ assert.equal(Object.keys(origin.files).length, 326);
52
+ for (const [file, expected] of Object.entries(origin.files)) {
53
+ const contents = fs.readFileSync(path.join(skill, 'assets/templates/enterprise-admin/reference', origin.storagePaths?.[file] || file));
54
+ assert.equal(crypto.createHash('sha256').update(contents).digest('hex'), expected, file);
55
+ }
56
+ });
57
+ test('an unadapted EASEL example cannot pass new-business acceptance', t => {
58
+ const dir = initialize(t, { purpose: 'business-prototype' });
59
+ assert.equal(read(dir, 'prototype.json').business.status, 'needs-adaptation');
60
+ assert.match(lib.checkPrototype(dir, { acceptance: true }).errors.join(' '), /业务|adapt/);
61
+ });
62
+ test('generated enterprise instances isolate their local demo storage and retain the original route behavior', t => {
63
+ const dir = initialize(t);
64
+ const source = fs.readFileSync(path.join(dir, 'app/src/shared/session.js'), 'utf8');
65
+ assert.match(source, /i3-enterprise-enterprise-demo-/);
66
+ assert.doesNotMatch(source, /i3-prototype-antdv-/);
67
+ assert.match(fs.readFileSync(path.join(dir, 'app/index.html'), 'utf8'), /enterprise-bootstrap\.mjs/);
68
+ assert.match(fs.readFileSync(path.join(dir, 'app/index.html'), 'utf8'), /tokens\.css/);
69
+ const other = initialize(t);
70
+ assert.notEqual(read(dir, 'prototype.json').runtime.storagePrefix, read(other, 'prototype.json').runtime.storagePrefix);
71
+ });
72
+ test('missing enterprise runtime imports are rejected while declarative data-bind attributes remain valid', t => {
73
+ const dir = initialize(t);
74
+ assert.equal(lib.checkPrototype(dir).status, 'passed');
75
+ fs.unlinkSync(path.join(dir, 'app/runtime/controls.js'));
76
+ const result = lib.checkPrototype(dir);
77
+ assert.equal(result.status, 'failed');
78
+ assert.match(result.errors.join(' '), /controls\.js/);
79
+ });
80
+ test('tampered template source assets are rejected before a new instance can be trusted', t => {
81
+ const temp = project(t);
82
+ const copy = path.join(temp, 'enterprise-admin');
83
+ fs.cpSync(path.join(skill, 'assets/templates/enterprise-admin'), copy, { recursive: true });
84
+ fs.appendFileSync(path.join(copy, 'reference/styles/app.css'), '\n/* unexpected source edit */');
85
+ const { verifyReference } = require(path.join(skill, 'scripts/enterprise-template.cjs'));
86
+ assert.throws(() => verifyReference(copy), /integrity|来源完整性/);
87
+ });
88
+ test('enterprise preview serves JavaScript modules and SVG assets with browser-compatible MIME types', async t => {
89
+ const dir = initialize(t);
90
+ const child = spawn(process.execPath, ['app/serve.cjs'], { cwd: dir, stdio: ['ignore', 'pipe', 'pipe'] });
91
+ t.after(() => child.kill());
92
+ const url = await new Promise((resolve, reject) => {
93
+ const timer = setTimeout(() => reject(new Error('Preview start timed out')), 5000);
94
+ child.stdout.on('data', data => { const match = data.toString().match(/http:\/\/127\.0\.0\.1:\d+\//); if (match) { clearTimeout(timer); resolve(match[0]); } });
95
+ child.once('error', reject);
96
+ });
97
+ const js = await fetch(url + 'app/app.js');
98
+ assert.equal(js.status, 200);
99
+ assert.match(js.headers.get('content-type'), /javascript/);
100
+ const svg = await fetch(url + 'app/assets/empty.svg');
101
+ assert.equal(svg.status, 200);
102
+ assert.match(svg.headers.get('content-type'), /image\/svg\+xml/);
103
+ });
104
+ test('gallery and generated enterprise instances deliver the same scrolling adapter while retaining the complete reference', t => {
105
+ const dir = initialize(t);
106
+ const css = fs.readFileSync(path.join(dir, 'app/usability.css'));
107
+ assert.equal(css.compare(fs.readFileSync(path.join(skill, 'assets/templates/enterprise-admin/usability.css'))), 0);
108
+ assert.match(fs.readFileSync(path.join(dir, 'app/index.html'), 'utf8'), /href="usability\.css"/);
109
+ const preview = lib.listTemplates()[0].preview.split('#')[0];
110
+ const entry = path.join(skill, 'assets/templates', preview);
111
+ assert.notEqual(preview, 'enterprise-admin/reference/index.html');
112
+ const html = fs.readFileSync(entry, 'utf8');
113
+ assert.match(html, /href="usability\.css"/);
114
+ for (const match of html.matchAll(/(?:src|href)="([^"#]+)"/g)) {
115
+ if (match[1].startsWith('data:')) continue;
116
+ assert.ok(fs.existsSync(path.resolve(path.dirname(entry), match[1])), match[1]);
117
+ }
118
+ const { verifyReference } = require(path.join(skill, 'scripts/enterprise-template.cjs'));
119
+ assert.equal(verifyReference().fileCount, 326);
120
+ });
121
+ test('scrolling behavior remains protected after an enterprise baseline is confirmed', t => {
122
+ const dir = initialize(t);
123
+ // Unit fixture only: these records exercise the baseline guard and do not
124
+ // claim real browser execution or human acceptance of a delivered prototype.
125
+ fs.writeFileSync(path.join(dir, 'qa/unit-fixture.txt'), 'UNIT FIXTURE ONLY');
126
+ const manifest = lib.contentManifest(dir);
127
+ const scenarios = new Set(read(dir, 'requirements-map.json').requirements.flatMap(x => x.scenarios));
128
+ fs.writeFileSync(path.join(dir, 'qa/browser.json'), JSON.stringify({
129
+ ...manifest, status: 'passed', source: 'UNIT FIXTURE ONLY', consoleErrors: [],
130
+ screenshots: ['qa/unit-fixture.txt'], viewports: [390, 1440],
131
+ journeys: [...scenarios].map(id => ({ id, status: 'passed' })),
132
+ }));
133
+ lib.freezeBaseline(dir, { revision: manifest.revision, digest: manifest.digest, reviewer: 'unit fixture', statement: 'UNIT FIXTURE ONLY', source: 'test fixture' });
134
+ fs.appendFileSync(path.join(dir, 'app/usability.css'), '\n/* changed scrolling behavior */\n');
135
+ assert.ok(lib.compareBaseline(dir).protectedChanges.includes('app/usability.css'));
136
+ const guard = spawnSync(process.execPath, [path.join(skill, 'scripts/check-prototype.cjs'), dir, '--enforce-baseline'], { encoding: 'utf8' });
137
+ assert.equal(guard.status, 1);
138
+ assert.match(guard.stdout, /Design constraints changed/);
139
+ });
@@ -0,0 +1,291 @@
1
+ #!/usr/bin/env node
2
+
3
+ 'use strict';
4
+
5
+ // Contract test for skills/i3-constraint-driven-development/references/floor-guard.md.
6
+ // The fenced `js` block is extracted unchanged and run, with real git, against small
7
+ // fixtures: each is a fresh repository with one source file, one test file and a
8
+ // CONSTRAINTS.md carrying a floor bullet, a coverage minimum, a bundle maximum and an
9
+ // Exceptions table. Loosening moves must exit 1, tightening and no-op moves must exit 0.
10
+
11
+ const assert = require('node:assert/strict');
12
+ const fs = require('node:fs');
13
+ const os = require('node:os');
14
+ const path = require('node:path');
15
+ const { spawnSync } = require('node:child_process');
16
+ const { after, before, test } = require('node:test');
17
+
18
+ const REFERENCE = path.join(
19
+ __dirname, '..', 'skills', 'i3-constraint-driven-development', 'references', 'floor-guard.md',
20
+ );
21
+ const CONSTRAINTS = [
22
+ '# Constraints',
23
+ '',
24
+ 'Last reviewed: 2026-08-08 by @owner',
25
+ '',
26
+ '## Floor',
27
+ '- No skipped tests.',
28
+ '- Latency: p95 under 200 ms and p99 under 900 ms.',
29
+ '',
30
+ '| Dimension | Rule |',
31
+ '|---|---|',
32
+ '| Coverage | >= 80% |',
33
+ '| Bundle | <= 200 KB |',
34
+ '',
35
+ '## Exceptions',
36
+ '',
37
+ '| ID | Rule | Owner | Expires |',
38
+ '|---|---|---|---|',
39
+ '| W1 | no-explicit-any | @owner | 2026-11-01 |',
40
+ '',
41
+ ].join('\n');
42
+
43
+ let scratch;
44
+ let guard;
45
+ const sandboxes = [];
46
+
47
+ before(() => {
48
+ scratch = fs.mkdtempSync(path.join(os.tmpdir(), 'agent-skills-floor-guard-test-'));
49
+ const source = fs.readFileSync(REFERENCE, 'utf8');
50
+ const match = source.match(/```js\n([\s\S]*?)\n```/);
51
+ assert.ok(match, 'floor-guard.md must contain one fenced js block');
52
+ guard = path.join(scratch, 'floor-guard.mjs');
53
+ fs.writeFileSync(guard, match[1] + '\n');
54
+ });
55
+
56
+ after(() => {
57
+ for (const dir of sandboxes) fs.rmSync(dir, { recursive: true, force: true });
58
+ if (scratch) fs.rmSync(scratch, { recursive: true, force: true });
59
+ });
60
+
61
+ function git(cwd, ...args) {
62
+ const result = spawnSync('git', args, {
63
+ cwd,
64
+ encoding: 'utf8',
65
+ env: {
66
+ ...process.env,
67
+ GIT_AUTHOR_NAME: 'Floor Guard Test',
68
+ GIT_AUTHOR_EMAIL: 'floor-guard@example.invalid',
69
+ GIT_COMMITTER_NAME: 'Floor Guard Test',
70
+ GIT_COMMITTER_EMAIL: 'floor-guard@example.invalid',
71
+ GIT_CONFIG_GLOBAL: '/dev/null',
72
+ },
73
+ });
74
+ assert.equal(result.status, 0, `git ${args.join(' ')} failed: ${result.stderr}`);
75
+ return result.stdout;
76
+ }
77
+
78
+ function makeRepo() {
79
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), 'agent-skills-floor-guard-fixture-'));
80
+ sandboxes.push(root);
81
+ git(root, 'init', '-q');
82
+ fs.writeFileSync(path.join(root, 'app.js'), 'module.exports = 1;\n');
83
+ fs.writeFileSync(
84
+ path.join(root, 'app.test.js'),
85
+ "const assert = require('assert');\nassert.equal(require('./app'), 1);\n",
86
+ );
87
+ fs.writeFileSync(path.join(root, 'CONSTRAINTS.md'), CONSTRAINTS);
88
+ git(root, 'add', '.');
89
+ git(root, 'commit', '-qm', 'baseline');
90
+ return root;
91
+ }
92
+
93
+ function editConstraints(root, from, to) {
94
+ const file = path.join(root, 'CONSTRAINTS.md');
95
+ const text = fs.readFileSync(file, 'utf8');
96
+ assert.ok(text.includes(from), `fixture CONSTRAINTS.md must contain ${JSON.stringify(from)}`);
97
+ fs.writeFileSync(file, text.replace(from, to));
98
+ }
99
+
100
+ function commitFile(root, name, text) {
101
+ fs.writeFileSync(path.join(root, name), text);
102
+ git(root, 'add', name);
103
+ git(root, 'commit', '-qm', `add ${name}`);
104
+ }
105
+
106
+ function runGuard(root, cwd = root) {
107
+ return spawnSync(process.execPath, [guard, '--base', 'HEAD'], { cwd, encoding: 'utf8' });
108
+ }
109
+
110
+ const cases = [
111
+ ['unchanged repository is clean', 0, () => {}],
112
+ ['a suppression added to a tracked file is a violation', 1, (root) => {
113
+ fs.writeFileSync(path.join(root, 'app.js'), '// @ts-ignore\nmodule.exports = 1;\n');
114
+ }],
115
+ ['a suppression in a new untracked file is a violation', 1, (root) => {
116
+ fs.writeFileSync(path.join(root, 'new.js'), '// @ts-ignore\nmodule.exports = 1;\n');
117
+ }],
118
+ ['a skipped test in a new untracked file is a violation', 1, (root) => {
119
+ fs.writeFileSync(path.join(root, 'new.test.js'), "test.skip('regression', () => {});\n");
120
+ }],
121
+ ['a suppression in a staged new file is a violation', 1, (root) => {
122
+ fs.writeFileSync(path.join(root, 'new.js'), '// @ts-ignore\nmodule.exports = 1;\n');
123
+ git(root, 'add', '-A');
124
+ }],
125
+ ['a deleted test file is a violation', 1, (root) => {
126
+ fs.unlinkSync(path.join(root, 'app.test.js'));
127
+ }],
128
+ ['a staged deleted test file is a violation', 1, (root) => {
129
+ fs.unlinkSync(path.join(root, 'app.test.js'));
130
+ git(root, 'add', '-A');
131
+ }],
132
+ ['an assertion removed from a surviving test file is a violation', 1, (root) => {
133
+ fs.writeFileSync(path.join(root, 'app.test.js'), "const assert = require('assert');\n");
134
+ }],
135
+ ['lowering a minimum is a violation', 1, (root) => {
136
+ editConstraints(root, '| Coverage | >= 80% |', '| Coverage | >= 60% |');
137
+ }],
138
+ ['raising a minimum is silent', 0, (root) => {
139
+ editConstraints(root, '| Coverage | >= 80% |', '| Coverage | >= 90% |');
140
+ }],
141
+ ['raising a maximum is a violation', 1, (root) => {
142
+ editConstraints(root, '| Bundle | <= 200 KB |', '| Bundle | <= 300 KB |');
143
+ }],
144
+ ['lowering a maximum is silent', 0, (root) => {
145
+ editConstraints(root, '| Bundle | <= 200 KB |', '| Bundle | <= 150 KB |');
146
+ }],
147
+ ['deleting one threshold from a rule is a violation', 1, (root) => {
148
+ editConstraints(root, 'p95 under 200 ms and p99 under 900 ms.', 'p95 under 200 ms.');
149
+ }],
150
+ ['a number inserted before a threshold is silent', 0, (root) => {
151
+ editConstraints(root, '| Coverage | >= 80% |', '| Coverage | per ADR 7, >= 80% |');
152
+ }],
153
+ ['adding a threshold to a rule is silent', 0, (root) => {
154
+ editConstraints(root, '| Bundle | <= 200 KB |', '| Bundle | <= 200 KB, <= 60 KB gzipped |');
155
+ }],
156
+ ['a deleted floor rule is a violation', 1, (root) => {
157
+ editConstraints(root, '- No skipped tests.\n', '');
158
+ }],
159
+ ['a new exception row is a violation', 1, (root) => {
160
+ const file = path.join(root, 'CONSTRAINTS.md');
161
+ fs.appendFileSync(file, '| W2 | temporary waiver | @owner | 2026-10-01 |\n');
162
+ }],
163
+ ];
164
+
165
+ for (const [name, expectedExit, mutate] of cases) {
166
+ test(`floor guard: ${name}`, () => {
167
+ const root = makeRepo();
168
+ mutate(root);
169
+ const result = runGuard(root);
170
+ assert.equal(
171
+ result.status, expectedExit,
172
+ `expected exit ${expectedExit}, got ${result.status}\nstdout: ${result.stdout}\nstderr: ${result.stderr}`,
173
+ );
174
+ });
175
+ }
176
+
177
+ test('floor guard: a removed exception row is silent', () => {
178
+ const root = makeRepo();
179
+ editConstraints(root, '| W1 | no-explicit-any | @owner | 2026-11-01 |\n', '');
180
+ const result = runGuard(root);
181
+ assert.equal(result.status, 0, result.stderr);
182
+ });
183
+
184
+ test('floor guard: a missing merge base exits 2, never 0', () => {
185
+ const root = makeRepo();
186
+ const result = spawnSync(process.execPath, [guard, '--base', 'no-such-ref'], {
187
+ cwd: root, encoding: 'utf8',
188
+ });
189
+ assert.equal(result.status, 2, result.stderr);
190
+ });
191
+
192
+ test('floor guard: a threshold with no readable direction is reported when it changes', () => {
193
+ const root = makeRepo();
194
+ editConstraints(root, '| W1 | no-explicit-any | @owner | 2026-11-01 |', '| W1 | no-explicit-any | @owner | 2027-11-01 |');
195
+ const result = runGuard(root);
196
+ assert.equal(result.status, 1, result.stderr);
197
+ assert.match(result.stderr, /threshold-changed/);
198
+ });
199
+
200
+ test('floor guard: a renamed rule is reported as removed, with a note that its label may have changed', () => {
201
+ const root = makeRepo();
202
+ editConstraints(root, '| Coverage | >= 80% |', '| Code coverage | >= 80% |');
203
+ const result = runGuard(root);
204
+ assert.equal(result.status, 1, result.stderr);
205
+ assert.match(result.stderr, /\[rule-removed\]/);
206
+ assert.match(result.stderr, /label changed/);
207
+ });
208
+
209
+ test('floor guard: a threshold that loses its direction words is reported as removed, with a note saying so', () => {
210
+ const root = makeRepo();
211
+ editConstraints(root, '| Coverage | >= 80% |', '| Coverage | 80% |');
212
+ const result = runGuard(root);
213
+ assert.equal(result.status, 1, result.stderr);
214
+ assert.match(result.stderr, /\[threshold-removed\]/);
215
+ assert.match(result.stderr, /direction words/);
216
+ });
217
+
218
+ // Inside a hunk every line is content. An added line that starts with `++` shows in the diff
219
+ // as `+++...`, and a removed line that starts with `--` as `---...`: neither is a file header.
220
+ test('floor guard: an added line that starts with ++ is still checked', () => {
221
+ const root = makeRepo();
222
+ fs.writeFileSync(
223
+ path.join(root, 'app.js'),
224
+ 'let n = 0;\n++n; // eslint-disable-line no-plusplus\nmodule.exports = n;\n',
225
+ );
226
+ const result = runGuard(root);
227
+ assert.equal(result.status, 1, result.stderr);
228
+ assert.match(result.stderr, /\[silenced-checker\] app\.js:/);
229
+ });
230
+
231
+ test('floor guard: an added line that starts with "++ " does not rename the file for later hunks', () => {
232
+ const root = makeRepo();
233
+ commitFile(root, 'counter.test.js', [
234
+ "const assert = require('assert');",
235
+ 'let n = 0;',
236
+ 'n += 1;',
237
+ 'const m = 2;',
238
+ 'assert.equal(n, 1);',
239
+ 'assert.equal(m, 2);',
240
+ '',
241
+ ].join('\n'));
242
+ const file = path.join(root, 'counter.test.js');
243
+ const text = fs.readFileSync(file, 'utf8');
244
+ fs.writeFileSync(file, text.replace('n += 1;', '++ n;').replace('assert.equal(m, 2);\n', ''));
245
+ const result = runGuard(root);
246
+ assert.equal(result.status, 1, result.stderr);
247
+ assert.match(result.stderr, /\[assertion-removed\] counter\.test\.js:/);
248
+ });
249
+
250
+ test('floor guard: a removed line that starts with -- is still checked', () => {
251
+ const root = makeRepo();
252
+ commitFile(root, 'countdown.test.js', [
253
+ "const assert = require('assert');",
254
+ 'let n = 1;',
255
+ '--n; assert.equal(n, 0);',
256
+ '',
257
+ ].join('\n'));
258
+ const file = path.join(root, 'countdown.test.js');
259
+ fs.writeFileSync(file, fs.readFileSync(file, 'utf8').replace('--n; assert.equal(n, 0);\n', ''));
260
+ const result = runGuard(root);
261
+ assert.equal(result.status, 1, result.stderr);
262
+ assert.match(result.stderr, /\[assertion-removed\] countdown\.test\.js:/);
263
+ });
264
+
265
+ // `git ls-files` lists only the current directory's subtree, relative to it, while `git diff`
266
+ // covers the whole tree with paths from the top. Run from a subfolder, the guard has to see the
267
+ // same files, under the same names, as it does from the top.
268
+ test('floor guard: run from a subfolder, an untracked file outside it is still checked', () => {
269
+ const root = makeRepo();
270
+ fs.mkdirSync(path.join(root, 'sub'));
271
+ fs.writeFileSync(path.join(root, 'new.js'), '// @ts-ignore\nmodule.exports = 1;\n');
272
+ const result = runGuard(root, path.join(root, 'sub'));
273
+ assert.equal(result.status, 1, result.stderr);
274
+ assert.match(result.stderr, /\[silenced-checker\] new\.js:/);
275
+ });
276
+
277
+ test('floor guard: run from a subfolder, an untracked file inside it is named from the top', () => {
278
+ const root = makeRepo();
279
+ fs.mkdirSync(path.join(root, 'sub'));
280
+ fs.writeFileSync(path.join(root, 'sub', 'new.js'), '// @ts-ignore\nmodule.exports = 1;\n');
281
+ const result = runGuard(root, path.join(root, 'sub'));
282
+ assert.equal(result.status, 1, result.stderr);
283
+ assert.match(result.stderr, /\[silenced-checker\] sub\/new\.js:/);
284
+ });
285
+
286
+ test('floor guard: outside a git work tree exits 2, never 0', () => {
287
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'agent-skills-floor-guard-no-repo-'));
288
+ sandboxes.push(dir);
289
+ const result = runGuard(dir);
290
+ assert.equal(result.status, 2, result.stderr);
291
+ });