@amsterdamdatalabs/enact-extensions 0.1.42 → 0.1.48

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 (596) hide show
  1. package/README.md +67 -108
  2. package/bundled-extensions.json +3 -0
  3. package/dist/create/claude.d.ts.map +1 -1
  4. package/dist/create/claude.js +1 -1
  5. package/dist/create/claude.js.map +1 -1
  6. package/dist/create/codex.d.ts.map +1 -1
  7. package/dist/create/codex.js +2 -3
  8. package/dist/create/codex.js.map +1 -1
  9. package/dist/create/cursor.d.ts.map +1 -1
  10. package/dist/create/cursor.js +3 -7
  11. package/dist/create/cursor.js.map +1 -1
  12. package/dist/create/enact.d.ts.map +1 -1
  13. package/dist/create/enact.js +2 -0
  14. package/dist/create/enact.js.map +1 -1
  15. package/dist/create/index.d.ts +4 -1
  16. package/dist/create/index.d.ts.map +1 -1
  17. package/dist/create/index.js +9 -3
  18. package/dist/create/index.js.map +1 -1
  19. package/dist/create/kimi.d.ts +16 -0
  20. package/dist/create/kimi.d.ts.map +1 -0
  21. package/dist/create/kimi.js +86 -0
  22. package/dist/create/kimi.js.map +1 -0
  23. package/dist/create/opencode.d.ts +129 -0
  24. package/dist/create/opencode.d.ts.map +1 -0
  25. package/dist/create/opencode.js +689 -0
  26. package/dist/create/opencode.js.map +1 -0
  27. package/dist/index.d.ts +14 -19
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +11 -11
  30. package/dist/index.js.map +1 -1
  31. package/dist/internal/agents.d.ts +11 -1
  32. package/dist/internal/agents.d.ts.map +1 -1
  33. package/dist/internal/agents.js +120 -4
  34. package/dist/internal/agents.js.map +1 -1
  35. package/dist/internal/extensions-table.d.ts +87 -0
  36. package/dist/internal/extensions-table.d.ts.map +1 -0
  37. package/dist/internal/extensions-table.js +195 -0
  38. package/dist/internal/extensions-table.js.map +1 -0
  39. package/dist/internal/file-ops.d.ts +36 -0
  40. package/dist/internal/file-ops.d.ts.map +1 -0
  41. package/dist/internal/file-ops.js +89 -0
  42. package/dist/internal/file-ops.js.map +1 -0
  43. package/dist/internal/hooks.d.ts +56 -0
  44. package/dist/internal/hooks.d.ts.map +1 -0
  45. package/dist/internal/hooks.js +128 -0
  46. package/dist/internal/hooks.js.map +1 -0
  47. package/dist/internal/io.d.ts.map +1 -1
  48. package/dist/internal/io.js.map +1 -1
  49. package/dist/internal/json-merge.d.ts +63 -0
  50. package/dist/internal/json-merge.d.ts.map +1 -0
  51. package/dist/internal/json-merge.js +124 -0
  52. package/dist/internal/json-merge.js.map +1 -0
  53. package/dist/internal/lock-ownership.d.ts +41 -0
  54. package/dist/internal/lock-ownership.d.ts.map +1 -0
  55. package/dist/internal/lock-ownership.js +24 -0
  56. package/dist/internal/lock-ownership.js.map +1 -0
  57. package/dist/internal/pick.d.ts.map +1 -1
  58. package/dist/internal/pick.js.map +1 -1
  59. package/dist/internal/platform.d.ts.map +1 -1
  60. package/dist/internal/platform.js +82 -42
  61. package/dist/internal/platform.js.map +1 -1
  62. package/dist/internal/schema.d.ts.map +1 -1
  63. package/dist/internal/schema.js.map +1 -1
  64. package/dist/internal/toml-block.d.ts +59 -0
  65. package/dist/internal/toml-block.d.ts.map +1 -0
  66. package/dist/internal/toml-block.js +113 -0
  67. package/dist/internal/toml-block.js.map +1 -0
  68. package/dist/internal/types.d.ts +2 -1
  69. package/dist/internal/types.d.ts.map +1 -1
  70. package/dist/projection.d.ts +47 -0
  71. package/dist/projection.d.ts.map +1 -0
  72. package/dist/projection.js +180 -0
  73. package/dist/projection.js.map +1 -0
  74. package/dist/validate/index.d.ts +10 -5
  75. package/dist/validate/index.d.ts.map +1 -1
  76. package/dist/validate/index.js +59 -10
  77. package/dist/validate/index.js.map +1 -1
  78. package/dist/validate/kimi.d.ts +3 -0
  79. package/dist/validate/kimi.d.ts.map +1 -0
  80. package/dist/validate/kimi.js +11 -0
  81. package/dist/validate/kimi.js.map +1 -0
  82. package/dist/validate/opencode.d.ts +3 -0
  83. package/dist/validate/opencode.d.ts.map +1 -0
  84. package/dist/validate/opencode.js +11 -0
  85. package/dist/validate/opencode.js.map +1 -0
  86. package/dist/validate/run.d.ts +39 -0
  87. package/dist/validate/run.d.ts.map +1 -0
  88. package/dist/validate/run.js +60 -0
  89. package/dist/validate/run.js.map +1 -0
  90. package/extensions/enact-loop/.agents/plugin.json +12 -8
  91. package/extensions/enact-loop/scripts/validate.mjs +84 -2
  92. package/extensions/enact-loop/skills/enact-loop/SKILL.md +36 -466
  93. package/extensions/enact-loop/skills/enact-loop/references/loop-contract.md +114 -0
  94. package/extensions/enact-loop/skills/loop-budget/SKILL.md +43 -26
  95. package/extensions/enact-loop/skills/loop-intake/SKILL.md +44 -32
  96. package/extensions/enact-repo/.agents/plugin.json +55 -0
  97. package/extensions/enact-repo/.mcp.json +20 -0
  98. package/extensions/enact-repo/README.md +90 -0
  99. package/extensions/enact-repo/hooks/hooks.json +98 -0
  100. package/extensions/enact-repo/lean-ctx/config.toml +35 -0
  101. package/extensions/enact-repo/lean-ctx/layout.toml +5 -0
  102. package/extensions/enact-repo/skills/aca-sandboxes/SKILL.md +53 -0
  103. package/extensions/enact-repo/skills/aca-sandboxes/references/capabilities.md +52 -0
  104. package/extensions/enact-repo/skills/aca-sandboxes/references/install.md +87 -0
  105. package/extensions/enact-repo/skills/aca-sandboxes/references/prerequisites.md +52 -0
  106. package/extensions/enact-repo/skills/aca-sandboxes/references/quickstart.md +164 -0
  107. package/extensions/enact-repo/skills/aca-sandboxes/references/reference-advanced.md +251 -0
  108. package/extensions/enact-repo/skills/aca-sandboxes/references/reference.md +287 -0
  109. package/extensions/enact-repo/skills/aca-sandboxes/references/response-cues.md +71 -0
  110. package/extensions/enact-repo/skills/aca-sandboxes/references/scenarios.md +219 -0
  111. package/extensions/enact-repo/skills/aca-sandboxes/version.json +4 -0
  112. package/extensions/enact-repo/skills/backend-remove-deadcode/SKILL.md +96 -0
  113. package/extensions/enact-repo/skills/cmux-leader/SKILL.md +61 -0
  114. package/extensions/enact-repo/skills/cmux-send/SKILL.md +61 -0
  115. package/extensions/enact-repo/skills/code-review/SKILL.md +100 -0
  116. package/extensions/enact-repo/skills/codebase-design/SKILL.md +98 -0
  117. package/extensions/enact-repo/skills/codebase-design/references/DEEPENING.md +37 -0
  118. package/extensions/enact-repo/skills/codebase-design/references/DESIGN-IT-TWICE.md +44 -0
  119. package/extensions/enact-repo/skills/codebase-design/references/TESTABILITY.md +29 -0
  120. package/extensions/enact-repo/skills/computer-use/SKILL.md +76 -0
  121. package/extensions/enact-repo/skills/debug-issue/SKILL.md +40 -0
  122. package/extensions/enact-repo/skills/diagnosing-bugs/SKILL.md +100 -0
  123. package/extensions/enact-repo/skills/diagnosing-bugs/references/FEEDBACK-LOOP-TACTICS.md +34 -0
  124. package/extensions/enact-repo/skills/diagnosing-bugs/scripts/hitl-loop.template.sh +41 -0
  125. package/extensions/enact-repo/skills/domain-modeling/SKILL.md +86 -0
  126. package/extensions/enact-repo/skills/domain-modeling/references/ADR-FORMAT.md +47 -0
  127. package/extensions/enact-repo/skills/domain-modeling/references/CONTEXT-FORMAT.md +60 -0
  128. package/extensions/enact-repo/skills/explore-codebase/SKILL.md +41 -0
  129. package/extensions/enact-repo/skills/frontend-design/LICENSE.txt +177 -0
  130. package/extensions/enact-repo/skills/frontend-design/SKILL.md +56 -0
  131. package/extensions/enact-repo/skills/grill-me/SKILL.md +20 -0
  132. package/extensions/enact-repo/skills/grill-with-docs/SKILL.md +20 -0
  133. package/extensions/enact-repo/skills/handoff/SKILL.md +28 -0
  134. package/extensions/enact-repo/skills/http-contract-migration/SKILL.md +74 -0
  135. package/extensions/enact-repo/skills/http-contract-migration/references/compatibility-and-gates.md +26 -0
  136. package/extensions/enact-repo/skills/http-contract-migration/references/hexagonal-boundary.md +16 -0
  137. package/extensions/enact-repo/skills/http-contract-migration/references/publication-and-adoption.md +31 -0
  138. package/extensions/enact-repo/skills/http-contract-migration/references/wire-fidelity-and-dto.md +31 -0
  139. package/extensions/enact-repo/skills/implement/SKILL.md +28 -0
  140. package/extensions/enact-repo/skills/improve-codebase-architecture/SKILL.md +80 -0
  141. package/extensions/enact-repo/skills/improve-codebase-architecture/references/HTML-REPORT.md +123 -0
  142. package/extensions/enact-repo/skills/interaction-design/SKILL.md +30 -0
  143. package/extensions/enact-repo/skills/interaction-design/references/Workflow.md +146 -0
  144. package/extensions/enact-repo/skills/interaction-design/references/animation-libraries-gsap.md +219 -0
  145. package/extensions/enact-repo/skills/interaction-design/references/animation-libraries-native.md +110 -0
  146. package/extensions/enact-repo/skills/interaction-design/references/animation-libraries.md +177 -0
  147. package/extensions/enact-repo/skills/interaction-design/references/interaction-patterns.md +166 -0
  148. package/extensions/enact-repo/skills/interaction-design/references/microinteraction-patterns-advanced.md +285 -0
  149. package/extensions/enact-repo/skills/interaction-design/references/microinteraction-patterns.md +254 -0
  150. package/extensions/enact-repo/skills/interaction-design/references/scroll-animations-reveals.md +213 -0
  151. package/extensions/enact-repo/skills/interaction-design/references/scroll-animations.md +208 -0
  152. package/extensions/enact-repo/skills/lean-ctx/SKILL.md +81 -0
  153. package/extensions/enact-repo/skills/orca-cli/SKILL.md +88 -0
  154. package/extensions/enact-repo/skills/orchestration/SKILL.md +80 -0
  155. package/extensions/enact-repo/skills/prototype/SKILL.md +37 -0
  156. package/extensions/enact-repo/skills/prototype/references/LOGIC.md +79 -0
  157. package/extensions/enact-repo/skills/prototype/references/UI.md +112 -0
  158. package/extensions/enact-repo/skills/refactor-safely/SKILL.md +44 -0
  159. package/extensions/enact-repo/skills/remove-deadcode/SKILL.md +54 -0
  160. package/extensions/enact-repo/skills/research/SKILL.md +27 -0
  161. package/extensions/enact-repo/skills/resolving-merge-conflicts/SKILL.md +28 -0
  162. package/extensions/enact-repo/skills/review-changes/SKILL.md +45 -0
  163. package/extensions/enact-repo/skills/tailwind-4-docs/SKILL.md +88 -0
  164. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/accent-color.mdx +149 -0
  165. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/adding-custom-styles.mdx +635 -0
  166. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/align-content.mdx +300 -0
  167. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/align-items.mdx +241 -0
  168. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/align-self.mdx +294 -0
  169. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/animation.mdx +286 -0
  170. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/appearance.mdx +180 -0
  171. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/aspect-ratio.mdx +98 -0
  172. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-blur.mdx +109 -0
  173. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-brightness.mdx +82 -0
  174. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-contrast.mdx +82 -0
  175. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-grayscale.mdx +99 -0
  176. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-hue-rotate.mdx +173 -0
  177. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-invert.mdx +99 -0
  178. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-opacity.mdx +103 -0
  179. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-saturate.mdx +98 -0
  180. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-sepia.mdx +95 -0
  181. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter.mdx +113 -0
  182. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backface-visibility.mdx +110 -0
  183. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-attachment.mdx +126 -0
  184. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-blend-mode.mdx +79 -0
  185. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-clip.mdx +85 -0
  186. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-color.mdx +176 -0
  187. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-image.mdx +349 -0
  188. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-origin.mdx +64 -0
  189. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-position.mdx +171 -0
  190. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-repeat.mdx +127 -0
  191. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-size.mdx +100 -0
  192. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/block-size.mdx +190 -0
  193. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/border-collapse.mdx +181 -0
  194. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/border-color.mdx +316 -0
  195. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/border-radius.mdx +347 -0
  196. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/border-spacing.mdx +117 -0
  197. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/border-style.mdx +129 -0
  198. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/border-width.mdx +344 -0
  199. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/box-decoration-break.mdx +71 -0
  200. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/box-shadow.mdx +497 -0
  201. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/box-sizing.mdx +175 -0
  202. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/break-after.mdx +38 -0
  203. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/break-before.mdx +38 -0
  204. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/break-inside.mdx +34 -0
  205. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/caption-side.mdx +190 -0
  206. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/caret-color.mdx +66 -0
  207. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/clear.mdx +224 -0
  208. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/color-scheme.mdx +81 -0
  209. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/color.mdx +125 -0
  210. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/colors.mdx +927 -0
  211. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/columns.mdx +310 -0
  212. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/compatibility.mdx +193 -0
  213. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/content.mdx +129 -0
  214. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/cursor.mdx +104 -0
  215. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/dark-mode.mdx +191 -0
  216. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/detecting-classes-in-source-files.mdx +315 -0
  217. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/display.mdx +523 -0
  218. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/editor-setup.mdx +90 -0
  219. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/field-sizing.mdx +75 -0
  220. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/fill.mdx +100 -0
  221. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-blur.mdx +114 -0
  222. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-brightness.mdx +102 -0
  223. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-contrast.mdx +102 -0
  224. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-drop-shadow.mdx +230 -0
  225. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-grayscale.mdx +101 -0
  226. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-hue-rotate.mdx +171 -0
  227. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-invert.mdx +93 -0
  228. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-saturate.mdx +109 -0
  229. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-sepia.mdx +92 -0
  230. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter.mdx +113 -0
  231. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/flex-basis.mdx +144 -0
  232. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/flex-direction.mdx +130 -0
  233. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/flex-grow.mdx +129 -0
  234. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/flex-shrink.mdx +95 -0
  235. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/flex-wrap.mdx +118 -0
  236. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/flex.mdx +164 -0
  237. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/float.mdx +197 -0
  238. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/font-family.mdx +119 -0
  239. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/font-feature-settings.mdx +52 -0
  240. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/font-size.mdx +184 -0
  241. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/font-smoothing.mdx +67 -0
  242. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/font-stretch.mdx +138 -0
  243. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/font-style.mdx +62 -0
  244. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/font-variant-numeric.mdx +228 -0
  245. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/font-weight.mdx +105 -0
  246. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/forced-color-adjust.mdx +152 -0
  247. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/functions-and-directives.mdx +322 -0
  248. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/gap.mdx +100 -0
  249. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/grid-auto-columns.mdx +43 -0
  250. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/grid-auto-flow.mdx +58 -0
  251. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/grid-auto-rows.mdx +43 -0
  252. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/grid-column.mdx +124 -0
  253. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/grid-row.mdx +115 -0
  254. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/grid-template-columns.mdx +101 -0
  255. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/grid-template-rows.mdx +108 -0
  256. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/height.mdx +260 -0
  257. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/hover-focus-and-other-states.mdx +4935 -0
  258. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/hyphens.mdx +112 -0
  259. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/inline-size.mdx +191 -0
  260. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/isolation.mdx +30 -0
  261. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/justify-content.mdx +348 -0
  262. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/justify-items.mdx +286 -0
  263. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/justify-self.mdx +282 -0
  264. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/letter-spacing.mdx +100 -0
  265. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/line-clamp.mdx +110 -0
  266. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/line-height.mdx +147 -0
  267. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/list-style-image.mdx +80 -0
  268. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/list-style-position.mdx +67 -0
  269. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/list-style-type.mdx +86 -0
  270. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/margin.mdx +397 -0
  271. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-clip.mdx +66 -0
  272. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-composite.mdx +70 -0
  273. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-image.mdx +933 -0
  274. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-mode.mdx +114 -0
  275. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-origin.mdx +66 -0
  276. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-position.mdx +117 -0
  277. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-repeat.mdx +169 -0
  278. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-size.mdx +104 -0
  279. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-type.mdx +98 -0
  280. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/max-block-size.mdx +153 -0
  281. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/max-height.mdx +164 -0
  282. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/max-inline-size.mdx +185 -0
  283. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/max-width.mdx +214 -0
  284. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/min-block-size.mdx +146 -0
  285. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/min-height.mdx +150 -0
  286. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/min-inline-size.mdx +153 -0
  287. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/min-width.mdx +153 -0
  288. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mix-blend-mode.mdx +103 -0
  289. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/object-fit.mdx +147 -0
  290. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/object-position.mdx +182 -0
  291. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/opacity.mdx +84 -0
  292. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/order.mdx +94 -0
  293. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/outline-color.mdx +130 -0
  294. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/outline-offset.mdx +72 -0
  295. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/outline-style.mdx +134 -0
  296. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/outline-width.mdx +91 -0
  297. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/overflow-wrap.mdx +130 -0
  298. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/overflow.mdx +665 -0
  299. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/overscroll-behavior.mdx +151 -0
  300. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/padding.mdx +232 -0
  301. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/perspective-origin.mdx +127 -0
  302. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/perspective.mdx +137 -0
  303. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/place-content.mdx +257 -0
  304. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/place-items.mdx +269 -0
  305. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/place-self.mdx +257 -0
  306. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/pointer-events.mdx +101 -0
  307. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/position.mdx +399 -0
  308. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/preflight.mdx +291 -0
  309. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/resize.mdx +110 -0
  310. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/responsive-design.mdx +666 -0
  311. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/rotate.mdx +291 -0
  312. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/scale.mdx +360 -0
  313. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/scroll-behavior.mdx +39 -0
  314. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/scroll-margin.mdx +268 -0
  315. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/scroll-padding.mdx +255 -0
  316. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/scroll-snap-align.mdx +281 -0
  317. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/scroll-snap-stop.mdx +198 -0
  318. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/scroll-snap-type.mdx +284 -0
  319. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/skew.mdx +352 -0
  320. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/stroke-width.mdx +74 -0
  321. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/stroke.mdx +103 -0
  322. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/styling-with-utility-classes.mdx +1020 -0
  323. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/table-layout.mdx +212 -0
  324. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-align.mdx +162 -0
  325. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-decoration-color.mdx +155 -0
  326. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-decoration-line.mdx +143 -0
  327. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-decoration-style.mdx +75 -0
  328. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-decoration-thickness.mdx +75 -0
  329. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-indent.mdx +74 -0
  330. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-overflow.mdx +103 -0
  331. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-shadow.mdx +177 -0
  332. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-transform.mdx +106 -0
  333. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-underline-offset.mdx +74 -0
  334. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-wrap.mdx +144 -0
  335. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/theme.mdx +1142 -0
  336. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/top-right-bottom-left.mdx +296 -0
  337. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/touch-action.mdx +95 -0
  338. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/transform-origin.mdx +130 -0
  339. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/transform-style.mdx +110 -0
  340. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/transform.mdx +51 -0
  341. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/transition-behavior.mdx +76 -0
  342. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/transition-delay.mdx +76 -0
  343. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/transition-duration.mdx +82 -0
  344. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/transition-property.mdx +137 -0
  345. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/transition-timing-function.mdx +89 -0
  346. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/translate.mdx +487 -0
  347. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/upgrade-guide.mdx +910 -0
  348. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/user-select.mdx +114 -0
  349. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/vertical-align.mdx +194 -0
  350. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/visibility.mdx +287 -0
  351. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/white-space.mdx +211 -0
  352. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/width.mdx +264 -0
  353. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/will-change.mdx +47 -0
  354. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/word-break.mdx +94 -0
  355. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/z-index.mdx +104 -0
  356. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs-catalog.md +251 -0
  357. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs-index.tsx +237 -0
  358. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs-source.txt +6 -0
  359. package/extensions/enact-repo/skills/tailwind-4-docs/references/gotchas.md +18 -0
  360. package/extensions/enact-repo/skills/tailwind-4-docs/scripts/sync_tailwind_docs.py +183 -0
  361. package/extensions/enact-repo/skills/tdd/SKILL.md +49 -0
  362. package/extensions/enact-repo/skills/tdd/references/mocking.md +59 -0
  363. package/extensions/enact-repo/skills/tdd/references/tests.md +77 -0
  364. package/extensions/enact-repo/skills/teach/SKILL.md +88 -0
  365. package/extensions/enact-repo/skills/teach/references/GLOSSARY-FORMAT.md +35 -0
  366. package/extensions/enact-repo/skills/teach/references/LEARNING-RECORD-FORMAT.md +46 -0
  367. package/extensions/enact-repo/skills/teach/references/MISSION-FORMAT.md +31 -0
  368. package/extensions/enact-repo/skills/teach/references/PHILOSOPHY.md +65 -0
  369. package/extensions/enact-repo/skills/teach/references/RESOURCES-FORMAT.md +32 -0
  370. package/extensions/enact-repo/skills/testing/SKILL.md +54 -0
  371. package/extensions/enact-repo/skills/to-spec/SKILL.md +85 -0
  372. package/extensions/enact-repo/skills/to-tickets/SKILL.md +75 -0
  373. package/extensions/enact-repo/skills/to-tickets/references/TICKET-TEMPLATES.md +39 -0
  374. package/extensions/enact-repo/skills/triage/SKILL.md +99 -0
  375. package/extensions/enact-repo/skills/triage/references/AGENT-BRIEF.md +207 -0
  376. package/extensions/enact-repo/skills/triage/references/NEEDS-INFO-TEMPLATE.md +17 -0
  377. package/extensions/enact-repo/skills/triage/references/OUT-OF-SCOPE.md +105 -0
  378. package/extensions/enact-repo/skills/ui-ux-pro-max/SKILL.md +32 -0
  379. package/extensions/enact-repo/skills/ui-ux-pro-max/references/Workflow.md +207 -0
  380. package/extensions/enact-repo/skills/ui-ux-pro-max/references/workflow-reference.md +175 -0
  381. package/extensions/enact-repo/skills/wayfinder/SKILL.md +100 -0
  382. package/extensions/enact-repo/skills/wayfinder/references/TEMPLATES.md +35 -0
  383. package/extensions/enact-repo/skills/wayfinder/references/TICKET-TYPES.md +8 -0
  384. package/extensions/enact-repo/skills/writing-great-skills/SKILL.md +93 -0
  385. package/extensions/enact-repo/skills/writing-great-skills/references/GLOSSARY.md +201 -0
  386. package/package.json +22 -17
  387. package/scripts/enact-extensions.mjs +411 -1006
  388. package/scripts/lib/allowed-plugins.mjs +52 -0
  389. package/scripts/lib/build-index.mjs +1 -3
  390. package/scripts/lib/resolve-bundle.mjs +1 -3
  391. package/scripts/lib/run-repo-doctor.mjs +604 -0
  392. package/scripts/lib/run-repo-install.mjs +1651 -0
  393. package/scripts/lib/run-sync.mjs +4 -10
  394. package/scripts/lib/run-validate.mjs +23 -39
  395. package/scripts/lib/skill-validator.mjs +1096 -0
  396. package/spec/enact.json +21 -3
  397. package/spec/enact.md +13 -12
  398. package/spec/kimi.json +100 -0
  399. package/spec/opencode.json +64 -0
  400. package/dist/install.d.ts +0 -235
  401. package/dist/install.d.ts.map +0 -1
  402. package/dist/install.js +0 -697
  403. package/dist/install.js.map +0 -1
  404. package/dist/internal/claude.d.ts +0 -65
  405. package/dist/internal/claude.d.ts.map +0 -1
  406. package/dist/internal/claude.js +0 -200
  407. package/dist/internal/claude.js.map +0 -1
  408. package/dist/internal/codex.d.ts +0 -43
  409. package/dist/internal/codex.d.ts.map +0 -1
  410. package/dist/internal/codex.js +0 -211
  411. package/dist/internal/codex.js.map +0 -1
  412. package/dist/internal/cursor.d.ts +0 -2
  413. package/dist/internal/cursor.d.ts.map +0 -1
  414. package/dist/internal/cursor.js +0 -6
  415. package/dist/internal/cursor.js.map +0 -1
  416. package/dist/principles.d.ts +0 -28
  417. package/dist/principles.d.ts.map +0 -1
  418. package/dist/principles.js +0 -159
  419. package/dist/principles.js.map +0 -1
  420. package/dist/provision.d.ts +0 -30
  421. package/dist/provision.d.ts.map +0 -1
  422. package/dist/provision.js +0 -202
  423. package/dist/provision.js.map +0 -1
  424. package/extensions/dev-state/.agents/plugin.json +0 -36
  425. package/extensions/dev-state/skills/dev-state-plan-graduation/SKILL.md +0 -194
  426. package/extensions/dev-state/skills/dev-state-plan-graduation/agents/openai.yaml +0 -4
  427. package/extensions/dev-state/skills/dev-state-plan-graduation/references/reference.md +0 -130
  428. package/extensions/enact-context/.agents/plugin.json +0 -41
  429. package/extensions/enact-context/.mcp.json +0 -8
  430. package/extensions/enact-context/README.md +0 -25
  431. package/extensions/enact-context/assets/icon.png +0 -0
  432. package/extensions/enact-context/assets/logo.png +0 -0
  433. package/extensions/enact-context/hooks/hooks.json +0 -115
  434. package/extensions/enact-context/skills/enact-context/SKILL.md +0 -151
  435. package/extensions/enact-context/skills/enact-context/scripts/install.sh +0 -69
  436. package/extensions/enact-core/.agents/plugin.json +0 -40
  437. package/extensions/enact-core/OPERATING-PRINCIPLES.md +0 -7
  438. package/extensions/enact-core/hooks/hooks.json +0 -26
  439. package/extensions/enact-evolve/.agents/plugin.json +0 -47
  440. package/extensions/enact-evolve/agents/evolve-session-analyst.toml +0 -37
  441. package/extensions/enact-evolve/assets/icon.png +0 -0
  442. package/extensions/enact-evolve/assets/logo.png +0 -0
  443. package/extensions/enact-evolve/skills/mined-investigate-loop/SKILL.md +0 -68
  444. package/extensions/enact-evolve/skills/session-analysis/SKILL.md +0 -98
  445. package/extensions/enact-evolve/skills/session-analysis/scripts/run-evolve-analysis.sh +0 -343
  446. package/extensions/enact-factory/.agents/plugin.json +0 -49
  447. package/extensions/enact-factory/.mcp.json +0 -8
  448. package/extensions/enact-factory/agents/architect.toml +0 -34
  449. package/extensions/enact-factory/agents/code-reviewer.toml +0 -33
  450. package/extensions/enact-factory/agents/critic.toml +0 -39
  451. package/extensions/enact-factory/agents/executor.toml +0 -26
  452. package/extensions/enact-factory/agents/explore.toml +0 -25
  453. package/extensions/enact-factory/agents/planner.toml +0 -26
  454. package/extensions/enact-factory/agents/verifier.toml +0 -33
  455. package/extensions/enact-factory/assets/icon.png +0 -0
  456. package/extensions/enact-factory/assets/logo.png +0 -0
  457. package/extensions/enact-factory/skills/advisor/SKILL.md +0 -82
  458. package/extensions/enact-factory/skills/ai-slop-cleaner/SKILL.md +0 -57
  459. package/extensions/enact-factory/skills/autonomous-runner/SKILL.md +0 -353
  460. package/extensions/enact-factory/skills/azdo-ci-strategy/SKILL.md +0 -309
  461. package/extensions/enact-factory/skills/azdo-ci-strategy/references/build-failures.md +0 -60
  462. package/extensions/enact-factory/skills/azdo-ci-strategy/references/cli-reference.md +0 -87
  463. package/extensions/enact-factory/skills/azdo-ci-strategy/references/policies-and-pipelines.md +0 -132
  464. package/extensions/enact-factory/skills/azdo-ci-strategy/references/troubleshooting.md +0 -53
  465. package/extensions/enact-factory/skills/cmux-leader/SKILL.md +0 -74
  466. package/extensions/enact-factory/skills/cmux-send/SKILL.md +0 -50
  467. package/extensions/enact-factory/skills/committee/SKILL.md +0 -80
  468. package/extensions/enact-factory/skills/deep-interview/SKILL.md +0 -68
  469. package/extensions/enact-factory/skills/deslop-handover/SKILL.md +0 -97
  470. package/extensions/enact-factory/skills/deslop-handover/deslop.py +0 -181
  471. package/extensions/enact-factory/skills/drive-loop/SKILL.md +0 -394
  472. package/extensions/enact-factory/skills/drive-loop/references/contract-schema.md +0 -127
  473. package/extensions/enact-factory/skills/handoff/SKILL.md +0 -75
  474. package/extensions/enact-factory/skills/hyperplan/SKILL.md +0 -59
  475. package/extensions/enact-factory/skills/looplan/SKILL.md +0 -120
  476. package/extensions/enact-factory/skills/paseo-dispatch/SKILL.md +0 -141
  477. package/extensions/enact-factory/skills/plan/SKILL.md +0 -103
  478. package/extensions/enact-factory/skills/remove-deadcode/SKILL.md +0 -46
  479. package/extensions/enact-factory/skills/research/SKILL.md +0 -83
  480. package/extensions/enact-factory/skills/review/SKILL.md +0 -67
  481. package/extensions/enact-factory/skills/security-research/SKILL.md +0 -57
  482. package/extensions/enact-factory/skills/tdd/SKILL.md +0 -62
  483. package/extensions/enact-factory/skills/testing-strategy/SKILL.md +0 -172
  484. package/extensions/enact-factory/skills/trace/SKILL.md +0 -42
  485. package/extensions/enact-factory/skills/ultraqa/SKILL.md +0 -85
  486. package/extensions/enact-factory/skills/work-with-workitem/SKILL.md +0 -56
  487. package/extensions/enact-factory/skills/workitem-triage/SKILL.md +0 -42
  488. package/extensions/enact-wiki/.agents/plugin.json +0 -43
  489. package/extensions/enact-wiki/.mcp.json +0 -15
  490. package/extensions/enact-wiki/README.md +0 -44
  491. package/extensions/enact-wiki/assets/icon.png +0 -0
  492. package/extensions/enact-wiki/assets/logo.png +0 -0
  493. package/extensions/enact-wiki/skills/document-parser/SKILL.md +0 -17
  494. package/extensions/enact-wiki/skills/document-parser/scripts/parse.sh +0 -60
  495. package/extensions/enact-wiki/skills/document-parser/skill.json +0 -9
  496. package/extensions/enact-wiki/skills/enact-wiki/SKILL.md +0 -30
  497. package/extensions/enact-wiki/skills/enact-wiki/references/ingest.md +0 -62
  498. package/extensions/enact-wiki/skills/enact-wiki/references/manage.md +0 -34
  499. package/extensions/enact-wiki/skills/enact-wiki/references/query.md +0 -59
  500. package/extensions/enact-wiki/skills/search-lab/SKILL.md +0 -57
  501. package/extensions/enact-wiki/skills/search-lab/scripts/analyze.ts +0 -23
  502. package/extensions/enact-wiki/skills/wiki/SKILL.md +0 -42
  503. package/extensions/net-revenue-management/.agents/plugin.json +0 -40
  504. package/extensions/net-revenue-management/.mcp.json +0 -9
  505. package/extensions/net-revenue-management/skills/net-revenue-risks/SKILL.md +0 -30
  506. package/extensions/net-revenue-management/skills/net-revenue-scenario/SKILL.md +0 -31
  507. package/extensions/plugin-dev/.agents/plugin.json +0 -41
  508. package/extensions/plugin-dev/agents/agent-creator.md +0 -199
  509. package/extensions/plugin-dev/agents/plugin-validator.md +0 -91
  510. package/extensions/plugin-dev/agents/skill-reviewer.md +0 -212
  511. package/extensions/plugin-dev/skills/agent-development/SKILL.md +0 -641
  512. package/extensions/plugin-dev/skills/agent-development/examples/agent-creation-prompt.md +0 -250
  513. package/extensions/plugin-dev/skills/agent-development/examples/complete-agent-examples.md +0 -461
  514. package/extensions/plugin-dev/skills/agent-development/references/advanced-agent-fields.md +0 -246
  515. package/extensions/plugin-dev/skills/agent-development/references/agent-creation-system-prompt.md +0 -216
  516. package/extensions/plugin-dev/skills/agent-development/references/permission-modes-rules.md +0 -226
  517. package/extensions/plugin-dev/skills/agent-development/references/system-prompt-design.md +0 -464
  518. package/extensions/plugin-dev/skills/agent-development/references/triggering-examples.md +0 -474
  519. package/extensions/plugin-dev/skills/agent-development/scripts/create-agent-skeleton.sh +0 -176
  520. package/extensions/plugin-dev/skills/agent-development/scripts/test-agent-trigger.sh +0 -227
  521. package/extensions/plugin-dev/skills/agent-development/scripts/validate-agent.sh +0 -227
  522. package/extensions/plugin-dev/skills/create-plugin/SKILL.md +0 -505
  523. package/extensions/plugin-dev/skills/hook-development/SKILL.md +0 -861
  524. package/extensions/plugin-dev/skills/hook-development/examples/load-context.sh +0 -55
  525. package/extensions/plugin-dev/skills/hook-development/examples/validate-bash.sh +0 -57
  526. package/extensions/plugin-dev/skills/hook-development/examples/validate-write.sh +0 -48
  527. package/extensions/plugin-dev/skills/hook-development/references/advanced.md +0 -871
  528. package/extensions/plugin-dev/skills/hook-development/references/hook-input-schemas.md +0 -145
  529. package/extensions/plugin-dev/skills/hook-development/references/migration.md +0 -392
  530. package/extensions/plugin-dev/skills/hook-development/references/patterns.md +0 -430
  531. package/extensions/plugin-dev/skills/hook-development/scripts/README.md +0 -181
  532. package/extensions/plugin-dev/skills/hook-development/scripts/hook-linter.sh +0 -153
  533. package/extensions/plugin-dev/skills/hook-development/scripts/test-hook.sh +0 -276
  534. package/extensions/plugin-dev/skills/hook-development/scripts/validate-hook-schema.sh +0 -159
  535. package/extensions/plugin-dev/skills/mcp-integration/SKILL.md +0 -775
  536. package/extensions/plugin-dev/skills/mcp-integration/examples/http-server.json +0 -20
  537. package/extensions/plugin-dev/skills/mcp-integration/examples/sse-server.json +0 -19
  538. package/extensions/plugin-dev/skills/mcp-integration/examples/stdio-server.json +0 -38
  539. package/extensions/plugin-dev/skills/mcp-integration/examples/ws-server.json +0 -26
  540. package/extensions/plugin-dev/skills/mcp-integration/references/authentication.md +0 -601
  541. package/extensions/plugin-dev/skills/mcp-integration/references/server-discovery.md +0 -190
  542. package/extensions/plugin-dev/skills/mcp-integration/references/server-types.md +0 -572
  543. package/extensions/plugin-dev/skills/mcp-integration/references/tool-usage.md +0 -623
  544. package/extensions/plugin-dev/skills/plugin-dev-guide/SKILL.md +0 -221
  545. package/extensions/plugin-dev/skills/plugin-structure/SKILL.md +0 -705
  546. package/extensions/plugin-dev/skills/plugin-structure/examples/advanced-plugin.md +0 -774
  547. package/extensions/plugin-dev/skills/plugin-structure/examples/minimal-plugin.md +0 -83
  548. package/extensions/plugin-dev/skills/plugin-structure/examples/standard-plugin.md +0 -611
  549. package/extensions/plugin-dev/skills/plugin-structure/references/advanced-topics.md +0 -289
  550. package/extensions/plugin-dev/skills/plugin-structure/references/component-patterns.md +0 -592
  551. package/extensions/plugin-dev/skills/plugin-structure/references/github-actions.md +0 -233
  552. package/extensions/plugin-dev/skills/plugin-structure/references/headless-ci-mode.md +0 -193
  553. package/extensions/plugin-dev/skills/plugin-structure/references/manifest-reference.md +0 -625
  554. package/extensions/plugin-dev/skills/plugin-structure/references/output-styles.md +0 -116
  555. package/extensions/plugin-dev/skills/skill-development/SKILL.md +0 -562
  556. package/extensions/plugin-dev/skills/skill-development/examples/complete-skill.md +0 -465
  557. package/extensions/plugin-dev/skills/skill-development/examples/frontmatter-templates.md +0 -167
  558. package/extensions/plugin-dev/skills/skill-development/examples/minimal-skill.md +0 -111
  559. package/extensions/plugin-dev/skills/skill-development/references/advanced-frontmatter.md +0 -225
  560. package/extensions/plugin-dev/skills/skill-development/references/commands-vs-skills.md +0 -39
  561. package/extensions/plugin-dev/skills/skill-development/references/skill-creation-workflow.md +0 -379
  562. package/extensions/plugin-dev/skills/skill-development/references/skill-creator-original.md +0 -210
  563. package/extensions/plugin-dev/skills/start/SKILL.md +0 -82
  564. package/scripts/check-hooks.mjs +0 -174
  565. package/scripts/check-principles.mjs +0 -116
  566. package/scripts/hooks/session-start-drift-check.mjs +0 -49
  567. package/scripts/install.sh +0 -70
  568. package/scripts/lib/auto-update.mjs +0 -88
  569. package/scripts/lib/bundle-hash.mjs +0 -137
  570. package/scripts/lib/hooks.mjs +0 -585
  571. package/scripts/lib/ledger.mjs +0 -163
  572. package/scripts/lib/migrate-artifacts.mjs +0 -144
  573. package/scripts/lib/outdated.mjs +0 -144
  574. package/scripts/lib/postinstall-offer.mjs +0 -83
  575. package/scripts/lib/principles.mjs +0 -109
  576. package/scripts/lib/provision-mcp.mjs +0 -16
  577. package/scripts/lib/resolve-plugin-root.mjs +0 -9
  578. package/scripts/lib/run-install.mjs +0 -507
  579. package/scripts/lib/run-prune.mjs +0 -94
  580. package/scripts/lib/run-uninstall.mjs +0 -244
  581. package/scripts/lib/run-update.mjs +0 -165
  582. package/scripts/lib/serve.mjs +0 -472
  583. package/scripts/lib/ups-router.mjs +0 -392
  584. package/scripts/postinstall.mjs +0 -101
  585. package/scripts/setup-enact-context.sh +0 -28
  586. package/scripts/version-bump.sh +0 -484
  587. package/web/assets/README.md +0 -111
  588. package/web/assets/logo-full.png +0 -0
  589. package/web/assets/logo-slim.png +0 -0
  590. package/web/assets/tokens/base.css +0 -45
  591. package/web/assets/tokens/colors.css +0 -248
  592. package/web/assets/tokens/effects.css +0 -24
  593. package/web/assets/tokens/fonts.css +0 -8
  594. package/web/assets/tokens/index.css +0 -18
  595. package/web/assets/tokens/spacing.css +0 -50
  596. package/web/index.html +0 -1188
@@ -0,0 +1,689 @@
1
+ import { withHostFlag } from "../internal/hooks.js";
2
+ import { pickManifestFields, withPlatformKeyword } from "../internal/pick.js";
3
+ import { MANIFEST_FIELDS } from "../internal/platform.js";
4
+ // ---------------------------------------------------------------------------
5
+ // OpenCode manifest descriptor (DERIVERS entry)
6
+ // ---------------------------------------------------------------------------
7
+ /**
8
+ * Derive the OpenCode descriptor (`.opencode-plugin/plugin.json`) from the
9
+ * canonical Enact manifest. OpenCode has no documented plugin manifest file of
10
+ * its own — this descriptor is Enact-internal bookkeeping (validated by
11
+ * spec/opencode.json) that records project metadata plus the canonical
12
+ * `hooks`/`mcpServers` SOURCE PATHS (not their resolved content). A future
13
+ * installer reads those paths, loads the referenced JSON, and calls
14
+ * {@link deriveOpenCodeMcp} / {@link deriveOpenCodePlugin} to generate the
15
+ * real OpenCode artifacts: a root `opencode.json` MCP fragment and a
16
+ * `.opencode/plugins/<name>.ts` file.
17
+ */
18
+ export function deriveOpenCodeManifest(enact) {
19
+ const picked = pickManifestFields(enact, MANIFEST_FIELDS.opencode);
20
+ return {
21
+ ...picked,
22
+ description: (typeof picked.description === "string" ? picked.description : undefined) ?? `${enact.name} plugin for OpenCode.`,
23
+ keywords: withPlatformKeyword(Array.isArray(picked.keywords) ? picked.keywords : undefined, "opencode"),
24
+ };
25
+ }
26
+ /**
27
+ * Project a canonical `.mcp.json` document
28
+ * (`{mcpServers:{name:{command,args,env,cwd?}}}`) into OpenCode's root
29
+ * `opencode.json` MCP fragment.
30
+ *
31
+ * Source (verified 2026-09-14, this session): https://opencode.ai/docs —
32
+ * OpenCode MCP servers are declared directly under `"mcp"` in `opencode.json`
33
+ * as `{"<name>": {"type":"local", "command":["cmd", ...args],
34
+ * "environment": {...}, "cwd": "...", "enabled": true}}`. There is no
35
+ * `servers` wrapper (unlike the canonical `mcpServers` key) and no `disabled`
36
+ * key — OpenCode uses `enabled` and we always emit `enabled: true` for a
37
+ * server the canonical manifest declares (a disabled server simply would not
38
+ * be declared).
39
+ *
40
+ * Servers without a `command` (e.g. a remote/HTTP-only definition) have no
41
+ * documented OpenCode "local" equivalent here and are skipped rather than
42
+ * guessed at.
43
+ */
44
+ export function deriveOpenCodeMcp(canonicalMcp) {
45
+ const doc = canonicalMcp && typeof canonicalMcp === "object" && !Array.isArray(canonicalMcp)
46
+ ? canonicalMcp
47
+ : {};
48
+ const servers = doc.mcpServers && typeof doc.mcpServers === "object" && !Array.isArray(doc.mcpServers) ? doc.mcpServers : {};
49
+ const mcp = {};
50
+ for (const [name, def] of Object.entries(servers)) {
51
+ if (!def || typeof def !== "object" || Array.isArray(def))
52
+ continue;
53
+ const command = typeof def.command === "string" ? def.command : undefined;
54
+ if (!command)
55
+ continue;
56
+ const args = Array.isArray(def.args) ? def.args.map((a) => String(a)) : [];
57
+ const entry = {
58
+ type: "local",
59
+ command: [command, ...args],
60
+ enabled: true,
61
+ };
62
+ if (def.env && typeof def.env === "object" && !Array.isArray(def.env)) {
63
+ const environment = {};
64
+ for (const [k, v] of Object.entries(def.env)) {
65
+ environment[k] = String(v);
66
+ }
67
+ entry.environment = environment;
68
+ }
69
+ if (typeof def.cwd === "string" && def.cwd.trim()) {
70
+ entry.cwd = def.cwd;
71
+ }
72
+ mcp[name] = entry;
73
+ }
74
+ return { mcp };
75
+ }
76
+ // ---------------------------------------------------------------------------
77
+ // OpenCode hooks + MCP + skills -> ONE project plugin
78
+ // ---------------------------------------------------------------------------
79
+ //
80
+ // Owner decision (Tarun, 2026-09-14): OpenCode output is a SINGLE real plugin
81
+ // (`.opencode/plugins/<name>.ts`) that carries hooks, MCP servers AND skills
82
+ // together — not three separate artifacts. This reflects live evidence
83
+ // gathered against a real OpenCode 1.18.29 install (see
84
+ // .scratch/opencode-plugin-example/ and .scratch/opencode-probe/ in this
85
+ // repo) plus the official @opencode-ai/plugin `Hooks` interface:
86
+ //
87
+ // - `config(input)` mutation adds `mcp` servers and `skills.paths` —
88
+ // confirmed via `opencode debug config` / `opencode mcp list` /
89
+ // `opencode debug skill` against a live install. A same-named MCP server
90
+ // already present in the user's config is left untouched (skip + log to
91
+ // stderr) — user config survives.
92
+ // - `session.created` / `session.idle` are NOT top-level Hooks keys (an
93
+ // earlier version of this generator emitted them as top-level object
94
+ // keys, which never fired — a real bug the current tests catch). They
95
+ // only arrive via the generic `event({event})` hook, dispatched on
96
+ // `event.type`.
97
+ // - Pushing a synthetic text part onto `chat.message`'s `output.parts` was
98
+ // tried and PASSED without throwing, but broke every subsequent real
99
+ // `opencode run` call with `UnknownError: Unexpected server error` (live
100
+ // A/B evidence, .scratch/opencode-probe/log.jsonl). Context injection
101
+ // instead: `chat.message` runs the UserPromptSubmit command and stores
102
+ // its context keyed by `input.sessionID`; `experimental.chat.system.transform`
103
+ // (confirmed firing on every request, carrying `sessionID`) appends that
104
+ // stored context to `output.system` for the MATCHING session only.
105
+ // - `tool.execute.before` (throw to block) / `tool.execute.after` are real
106
+ // top-level keys, live-confirmed to block a bash call.
107
+ // - Plugin root is resolved from the `directory` the OpenCode runtime
108
+ // passes into the plugin factory (the project root) — never from
109
+ // `${CLAUDE_PLUGIN_ROOT}`, which OpenCode does not set.
110
+ //
111
+ // Event mapping (table-driven, same pattern as CURSOR_HOOK_EVENT_MAP in
112
+ // src/internal/agents.ts). The map value is either a literal OpenCode Hooks
113
+ // key ("tool.execute.before", "chat.message", ...) or, for the two events
114
+ // that only exist as `event.type` values, a synthetic "event:<type>" key
115
+ // meaning "dispatched inside the shared `event` hook when event.type equals
116
+ // <type>":
117
+ //
118
+ // PreToolUse -> tool.execute.before (throw to block; deny contract below)
119
+ // PostToolUse -> tool.execute.after (cannot block: the call already ran)
120
+ // UserPromptSubmit -> chat.message (+ experimental.chat.system.transform
121
+ // pairing — see context-injection
122
+ // note above; this used to fall
123
+ // back onto SessionStart because no
124
+ // direct equivalent was known. It
125
+ // is now a NATIVE mapping.)
126
+ // SessionStart -> event:session.created
127
+ // SessionIdle -> event:session.idle
128
+ // PreCompact -> experimental.session.compacting
129
+ //
130
+ // Left UNMAPPED on purpose (never invented — surfaced as `warnings` instead):
131
+ // - Stop: no documented "main agent turn finished" event distinct from
132
+ // session.idle (which already covers SessionIdle).
133
+ // - SubagentStart / SubagentStop: no documented subagent lifecycle hook.
134
+ //
135
+ // Fallback (owner rule, Tarun): when a host has no equivalent of a canonical
136
+ // event, its hooks run on a documented substitute event instead:
137
+ // - SessionEnd -> SessionIdle: OpenCode has no session-end event, so
138
+ // canonical SessionEnd hooks run on `event:session.idle` (folded into the
139
+ // same bucket as native SessionIdle hooks, running after them, each
140
+ // command still carrying its own `fallback_for: "SessionEnd"` tag).
141
+ // Accepted consequence: they fire after every response, not only at true
142
+ // session end.
143
+ const OPENCODE_HOOK_EVENT_MAP = {
144
+ PreToolUse: "tool.execute.before",
145
+ PostToolUse: "tool.execute.after",
146
+ UserPromptSubmit: "chat.message",
147
+ SessionStart: "event:session.created",
148
+ SessionIdle: "event:session.idle",
149
+ PreCompact: "experimental.session.compacting",
150
+ };
151
+ /**
152
+ * Table-driven fallback for canonical events with no documented OpenCode
153
+ * equivalent of their own.
154
+ *
155
+ * - SessionEnd -> SessionIdle (owner rule, Tarun): OpenCode has no
156
+ * session-end event, so canonical SessionEnd hooks run on SessionIdle
157
+ * instead — attaching to the `event:session.idle` bucket. Accepted
158
+ * consequence: they fire after every response, not only at true session
159
+ * end.
160
+ *
161
+ * Fallback commands run AFTER any native commands already targeting that
162
+ * same bucket, each still honoring its own `timeout`. The stdin payload for a
163
+ * fallback command stays truthful about which event actually fired
164
+ * (`hook_event_name` is the FALLBACK TARGET's canonical name) plus
165
+ * `fallback_for` naming the originating canonical event — and never
166
+ * fabricates fields that don't exist for the target event.
167
+ */
168
+ const OPENCODE_HOOK_EVENT_FALLBACK = {
169
+ SessionEnd: "SessionIdle",
170
+ };
171
+ /**
172
+ * Canonical (Claude-style, cross-host) tool-name token -> real OpenCode tool
173
+ * id. Canonical `hooks.json` matchers (see
174
+ * `extensions/enact-repo/hooks/hooks.json`) are written in Claude's
175
+ * PascalCase vocabulary plus a handful of other hosts' own names
176
+ * (`str_replace_editor` is Codex's editor tool, `edit_file` is Cursor's,
177
+ * `create_file`/`write_file` appear in some agent SDKs) -- none of which
178
+ * match OpenCode's OWN tool ids.
179
+ *
180
+ * Source of truth: live `GET /experimental/tool/ids` against a real
181
+ * `opencode serve` 1.18.18 instance (verified 2026-09-14, this session,
182
+ * `.scratch/toolid-probe/`), which returned exactly:
183
+ * ["invalid","question","bash","read","glob","grep","edit","write","task",
184
+ * "webfetch","todowrite","websearch","skill","apply_patch"]
185
+ * Notably: OpenCode tool ids are lowercase and single-word; there is no
186
+ * "list" tool, and the apply-a-raw-patch tool is "apply_patch", not "patch".
187
+ */
188
+ const CANONICAL_TO_OPENCODE_TOOL = {
189
+ bash: "bash",
190
+ shell: "bash",
191
+ read: "read",
192
+ write: "write",
193
+ writefile: "write",
194
+ write_file: "write",
195
+ createfile: "write",
196
+ create_file: "write",
197
+ edit: "edit",
198
+ multiedit: "edit",
199
+ strreplace: "edit",
200
+ str_replace: "edit",
201
+ str_replace_editor: "edit",
202
+ edit_file: "edit",
203
+ replace_in_file: "edit",
204
+ grep: "grep",
205
+ glob: "glob",
206
+ webfetch: "webfetch",
207
+ websearch: "websearch",
208
+ todowrite: "todowrite",
209
+ task: "task",
210
+ skill: "skill",
211
+ apply_patch: "apply_patch",
212
+ patch: "apply_patch",
213
+ question: "question",
214
+ };
215
+ /**
216
+ * Project a canonical matcher (e.g. `"Bash"`, or
217
+ * `"Write|Edit|MultiEdit|StrReplace|str_replace_editor|..."`) into an
218
+ * OpenCode-tool-id alternation (e.g. `"bash"`, `"write|edit"`), deduping
219
+ * repeated targets. A token with no known canonical mapping is kept
220
+ * (lowercased) as a passthrough rather than dropped -- combined with the
221
+ * case-insensitive ANCHORED matching {@link emitToolMethod} generates, this
222
+ * is a safety net that still matches an already-OpenCode-shaped or unknown
223
+ * matcher instead of silently never firing.
224
+ */
225
+ export function projectMatcherToOpenCode(matcher) {
226
+ const tokens = matcher
227
+ .split("|")
228
+ .map((t) => t.trim())
229
+ .filter(Boolean);
230
+ const projected = [];
231
+ for (const token of tokens) {
232
+ const key = token.toLowerCase().replace(/[^a-z0-9_]/g, "");
233
+ const mapped = CANONICAL_TO_OPENCODE_TOOL[key] ?? token.toLowerCase();
234
+ if (!projected.includes(mapped))
235
+ projected.push(mapped);
236
+ }
237
+ return projected.join("|");
238
+ }
239
+ function asCanonicalHooksDoc(canonicalHooks) {
240
+ if (!canonicalHooks || typeof canonicalHooks !== "object")
241
+ return {};
242
+ const doc = canonicalHooks;
243
+ return doc.hooks && typeof doc.hooks === "object" && !Array.isArray(doc.hooks) ? doc.hooks : {};
244
+ }
245
+ function flattenCanonicalEvent(entries, fallbackFor) {
246
+ if (!Array.isArray(entries))
247
+ return [];
248
+ const flat = [];
249
+ for (const entry of entries) {
250
+ const matcher = typeof entry.matcher === "string" && entry.matcher.trim() ? entry.matcher : undefined;
251
+ for (const inner of entry.hooks ?? []) {
252
+ const command = typeof inner.command === "string" ? inner.command : undefined;
253
+ if (!command)
254
+ continue;
255
+ const flatCommand = { command: withHostFlag(command, "opencode") };
256
+ if (matcher)
257
+ flatCommand.matcher = projectMatcherToOpenCode(matcher);
258
+ if (typeof inner.timeout === "number" && Number.isFinite(inner.timeout)) {
259
+ flatCommand.timeoutMs = Math.round(inner.timeout * 1000);
260
+ }
261
+ if (fallbackFor)
262
+ flatCommand.fallbackFor = fallbackFor;
263
+ flat.push(flatCommand);
264
+ }
265
+ }
266
+ return flat;
267
+ }
268
+ /**
269
+ * Return canonical hook events that declare active commands but have no
270
+ * documented OpenCode equivalent in {@link OPENCODE_HOOK_EVENT_MAP} AND no
271
+ * entry in {@link OPENCODE_HOOK_EVENT_FALLBACK} (a fallback-projected event
272
+ * is not "unmapped" — see {@link fallbackOpenCodeHookEvents}).
273
+ */
274
+ export function unmappedOpenCodeHookEvents(canonicalHooks) {
275
+ const sourceHooks = asCanonicalHooksDoc(canonicalHooks);
276
+ const unmapped = [];
277
+ for (const [event, entries] of Object.entries(sourceHooks)) {
278
+ if (OPENCODE_HOOK_EVENT_MAP[event])
279
+ continue;
280
+ if (OPENCODE_HOOK_EVENT_FALLBACK[event])
281
+ continue;
282
+ if (flattenCanonicalEvent(entries).length > 0)
283
+ unmapped.push(event);
284
+ }
285
+ return unmapped;
286
+ }
287
+ /**
288
+ * Return the canonical hook events projected via
289
+ * {@link OPENCODE_HOOK_EVENT_FALLBACK} that declare active commands — e.g.
290
+ * `[{from:"SessionEnd", to:"SessionIdle"}]`. These are NOT reported by
291
+ * {@link unmappedOpenCodeHookEvents}: they run, just on a substitute event.
292
+ */
293
+ export function fallbackOpenCodeHookEvents(canonicalHooks) {
294
+ const sourceHooks = asCanonicalHooksDoc(canonicalHooks);
295
+ const fallbacks = [];
296
+ for (const [from, to] of Object.entries(OPENCODE_HOOK_EVENT_FALLBACK)) {
297
+ if (flattenCanonicalEvent(sourceHooks[from]).length > 0)
298
+ fallbacks.push({ from, to });
299
+ }
300
+ return fallbacks;
301
+ }
302
+ function toIdentifier(pluginName) {
303
+ const parts = pluginName.split(/[^a-zA-Z0-9]+/).filter(Boolean);
304
+ if (parts.length === 0)
305
+ return "plugin";
306
+ const [first, ...rest] = parts;
307
+ return first.toLowerCase() + rest.map((p) => p.charAt(0).toUpperCase() + p.slice(1).toLowerCase()).join("");
308
+ }
309
+ function emitCommandArray(name, commands) {
310
+ const lines = commands.map((c) => {
311
+ const fields = [`command: ${JSON.stringify(c.command)}`];
312
+ if (c.matcher)
313
+ fields.push(`matcher: ${JSON.stringify(c.matcher)}`);
314
+ if (c.timeoutMs !== undefined)
315
+ fields.push(`timeoutMs: ${c.timeoutMs}`);
316
+ if (c.fallbackFor)
317
+ fields.push(`fallbackFor: ${JSON.stringify(c.fallbackFor)}`);
318
+ return ` { ${fields.join(", ")} },`;
319
+ });
320
+ return `const ${name}: HookCommandSpec[] = [\n${lines.join("\n")}\n];`;
321
+ }
322
+ function emitConfigMethod(hasMcp, hasSkills) {
323
+ const mcpBlock = hasMcp
324
+ ? ` input.mcp = input.mcp || {};
325
+ for (const [name, def] of Object.entries(CONFIG_MCP_SERVERS)) {
326
+ if (Object.prototype.hasOwnProperty.call(input.mcp, name)) {
327
+ // OpenCode re-invokes config() on every config reload. If WE added
328
+ // this server on a previous call, seeing it again here is not a
329
+ // real conflict -- do not warn about our own injection. Only a
330
+ // same-named entry this plugin never added is a genuine
331
+ // user-defined conflict worth logging.
332
+ if (!enactInjectedMcpServers.has(name)) {
333
+ console.error("[" + PLUGIN_NAME + "] config: mcp server " + name + " already defined in user config -- skipping");
334
+ }
335
+ continue;
336
+ }
337
+ input.mcp[name] = def;
338
+ enactInjectedMcpServers.add(name);
339
+ }`
340
+ : "";
341
+ const skillsBlock = hasSkills
342
+ ? ` input.skills = input.skills || {};
343
+ input.skills.paths = Array.isArray(input.skills.paths) ? input.skills.paths : [];
344
+ const skillsDirAbs = join(directory, CONFIG_SKILLS_DIR);
345
+ if (!input.skills.paths.includes(skillsDirAbs)) {
346
+ input.skills.paths.push(skillsDirAbs);
347
+ }`
348
+ : "";
349
+ const body = [mcpBlock, skillsBlock].filter(Boolean).join("\n");
350
+ return ` async config(input: any) {
351
+ ${body}
352
+ },`;
353
+ }
354
+ function emitChatMessageMethod(constName) {
355
+ return ` "chat.message": async (input: any, output: any) => {
356
+ const parts = output && Array.isArray(output.parts) ? output.parts : [];
357
+ const promptText = parts.filter((p: any) => p && p.type === "text").map((p: any) => p.text).join(" ");
358
+ let context: string | undefined;
359
+ for (const spec of ${constName}) {
360
+ const payload = {
361
+ hook_event_name: "UserPromptSubmit",
362
+ prompt: promptText,
363
+ cwd: directory,
364
+ session_id: input && input.sessionID,
365
+ };
366
+ const result = await runHookCommand(spec, payload, directory);
367
+ const extracted = extractHookContext(result);
368
+ if (extracted) context = context ? context + " " + extracted : extracted;
369
+ }
370
+ const sessionID = input && input.sessionID;
371
+ if (sessionID) {
372
+ if (context) enactPromptContext.set(sessionID, context);
373
+ else enactPromptContext.delete(sessionID);
374
+ }
375
+ },`;
376
+ }
377
+ function emitChatSystemTransformMethod() {
378
+ return ` "experimental.chat.system.transform": async (input: any, output: any) => {
379
+ const sessionID = input && input.sessionID;
380
+ if (!sessionID) return;
381
+ const context = enactPromptContext.get(sessionID);
382
+ if (context && output && Array.isArray(output.system)) {
383
+ output.system.push(context);
384
+ }
385
+ },`;
386
+ }
387
+ function emitToolMethod(opencodeEvent, constName, canonicalEvent, canBlock) {
388
+ return ` ${JSON.stringify(opencodeEvent)}: async (input: ToolHookInput, output: ToolHookOutput) => {
389
+ for (const spec of ${constName}) {
390
+ if (spec.matcher && !new RegExp("^(?:" + spec.matcher + ")$", "i").test(input.tool)) continue;
391
+ const payload = {
392
+ hook_event_name: ${JSON.stringify(canonicalEvent)},
393
+ tool_name: input.tool,
394
+ tool_input: output.args,
395
+ cwd: directory,
396
+ session_id: input.sessionID,
397
+ };
398
+ const result = await runHookCommand(spec, payload, directory);
399
+ ${canBlock ? "const reason = denyReason(result);\n if (reason) throw new Error(reason);" : "// PostToolUse cannot block: the tool call already completed."}
400
+ }
401
+ },`;
402
+ }
403
+ function emitEventMethod(hasCreated, hasIdle, createdConstName, idleConstName) {
404
+ const createdBlock = hasCreated
405
+ ? ` if (event && event.type === "session.created") {
406
+ for (const spec of ${createdConstName}) {
407
+ const payload = {
408
+ hook_event_name: "SessionStart",
409
+ cwd: directory,
410
+ session_id: event.properties && (event.properties.sessionID || (event.properties.info && event.properties.info.id)),
411
+ };
412
+ await runHookCommand(spec, payload, directory);
413
+ }
414
+ }`
415
+ : "";
416
+ const idleBlock = hasIdle
417
+ ? ` if (event && event.type === "session.idle") {
418
+ for (const spec of ${idleConstName}) {
419
+ const payload = {
420
+ hook_event_name: "SessionIdle",
421
+ cwd: directory,
422
+ session_id: event.properties && (event.properties.sessionID || (event.properties.info && event.properties.info.id)),
423
+ ...(spec.fallbackFor ? { fallback_for: spec.fallbackFor } : {}),
424
+ };
425
+ await runHookCommand(spec, payload, directory);
426
+ }
427
+ }`
428
+ : "";
429
+ const body = [createdBlock, idleBlock].filter(Boolean).join("\n");
430
+ return ` event: async ({ event }: { event: any }) => {
431
+ ${body}
432
+ },`;
433
+ }
434
+ function emitCompactingMethod(constName) {
435
+ return ` "experimental.session.compacting": async (input: any) => {
436
+ for (const spec of ${constName}) {
437
+ const payload = {
438
+ hook_event_name: "PreCompact",
439
+ cwd: directory,
440
+ session_id: input && input.sessionID,
441
+ };
442
+ await runHookCommand(spec, payload, directory);
443
+ }
444
+ },`;
445
+ }
446
+ /**
447
+ * Generate the TypeScript source for a SINGLE OpenCode project plugin
448
+ * (`.opencode/plugins/<pluginName>.ts`) that carries a bundle's hooks, MCP
449
+ * servers AND skills together — see the module-level owner-decision comment
450
+ * above for the live-evidence basis of every mapping choice below.
451
+ *
452
+ * Runtime choice: OpenCode plugins run on Bun. This generated file uses
453
+ * `Bun.spawn` rather than the Bun Shell `$` helper because `Bun.spawn` has a
454
+ * documented `timeout` + `killSignal` option
455
+ * (https://bun.com/docs/api/spawn, verified 2026-09-14) needed to honor each
456
+ * canonical hook command's `timeout` (seconds), and gives direct access to
457
+ * `stdin`, `exitCode`, `stdout`/`stderr` text.
458
+ *
459
+ * Truthful failures: a hook command that crashes (e.g. `Bun.spawn` itself
460
+ * throws) or exits non-zero for a reason other than a PreToolUse deny is
461
+ * logged to stderr with the plugin's name — never silently swallowed, and
462
+ * never treated as a block (fail open). The PreToolUse deny throw itself
463
+ * happens OUTSIDE any try/catch in the generated code, so it can never be
464
+ * caught and swallowed by error handling elsewhere in the same method.
465
+ *
466
+ * PreToolUse (`tool.execute.before`) deny contract: the configured command
467
+ * receives `{hook_event_name, tool_name, tool_input, cwd, session_id}` as
468
+ * JSON on stdin. The call is blocked (the generated hook throws) when the
469
+ * command exits with code 2, or its stdout parses as JSON with
470
+ * `hookSpecificOutput.permissionDecision === "deny"`.
471
+ *
472
+ * UserPromptSubmit (`chat.message` + `experimental.chat.system.transform`):
473
+ * the configured command receives `{hook_event_name:"UserPromptSubmit",
474
+ * prompt, cwd, session_id}` as JSON on stdin. Its `hookSpecificOutput.additionalContext`
475
+ * (or, failing that, its raw stdout) is stored keyed by session id and
476
+ * injected into `output.system` the next time `experimental.chat.system.transform`
477
+ * fires for that same session — see the module comment for why this replaced
478
+ * a direct `output.parts` push.
479
+ *
480
+ * Canonical events with no documented OpenCode equivalent and no fallback are
481
+ * NOT wired into any hook; call {@link unmappedOpenCodeHookEvents} to get
482
+ * that list. Events projected via {@link OPENCODE_HOOK_EVENT_FALLBACK} (e.g.
483
+ * SessionEnd -> SessionIdle) ARE wired in, under their fallback target's
484
+ * bucket; call {@link fallbackOpenCodeHookEvents} to get that list.
485
+ */
486
+ export function deriveOpenCodePlugin(source, pluginName) {
487
+ const sourceHooks = asCanonicalHooksDoc(source?.hooks);
488
+ // Keyed by the OpenCode Hooks method this bucket attaches to (or, for
489
+ // SessionStart/SessionIdle, the synthetic "event:<event.type>" dispatch
490
+ // key), but each entry keeps the ORIGINATING canonical event name too: the
491
+ // JSON payload's `hook_event_name` must stay the canonical PascalCase name
492
+ // (PreToolUse, SessionStart, ...) so a command written against the
493
+ // canonical hook contract (Claude/Codex/Cursor-style) sees the name it
494
+ // expects, not OpenCode's own event naming.
495
+ const byOpenCodeEvent = new Map();
496
+ for (const [canonicalEvent, opencodeEvent] of Object.entries(OPENCODE_HOOK_EVENT_MAP)) {
497
+ const flat = flattenCanonicalEvent(sourceHooks[canonicalEvent]);
498
+ if (flat.length > 0)
499
+ byOpenCodeEvent.set(opencodeEvent, { canonicalEvent, commands: flat });
500
+ }
501
+ // Fold fallback-projected events (OPENCODE_HOOK_EVENT_FALLBACK) into their
502
+ // target's bucket, AFTER any native commands already collected above, so
503
+ // e.g. SessionEnd commands run after native SessionIdle commands under the
504
+ // same "event:session.idle" bucket.
505
+ for (const [fallbackEvent, targetCanonicalEvent] of Object.entries(OPENCODE_HOOK_EVENT_FALLBACK)) {
506
+ const opencodeEvent = OPENCODE_HOOK_EVENT_MAP[targetCanonicalEvent];
507
+ if (!opencodeEvent)
508
+ continue; // defensive: fallback target must itself be a mapped event
509
+ const flat = flattenCanonicalEvent(sourceHooks[fallbackEvent], fallbackEvent);
510
+ if (flat.length === 0)
511
+ continue;
512
+ const existing = byOpenCodeEvent.get(opencodeEvent);
513
+ if (existing) {
514
+ existing.commands = [...existing.commands, ...flat];
515
+ }
516
+ else {
517
+ byOpenCodeEvent.set(opencodeEvent, { canonicalEvent: targetCanonicalEvent, commands: flat });
518
+ }
519
+ }
520
+ const warnings = unmappedOpenCodeHookEvents(source?.hooks);
521
+ const fallbacks = fallbackOpenCodeHookEvents(source?.hooks);
522
+ const identifier = toIdentifier(pluginName);
523
+ const mcpAdditions = deriveOpenCodeMcp(source?.mcpServers).mcp;
524
+ const hasMcp = Object.keys(mcpAdditions).length > 0;
525
+ const skillsDir = typeof source?.skillsDir === "string" && source.skillsDir.trim() ? source.skillsDir : undefined;
526
+ const hasConfig = hasMcp || Boolean(skillsDir);
527
+ const hasChatMessage = byOpenCodeEvent.has("chat.message");
528
+ const hasToolBefore = byOpenCodeEvent.has("tool.execute.before");
529
+ const hasToolAfter = byOpenCodeEvent.has("tool.execute.after");
530
+ const hasSessionCreated = byOpenCodeEvent.has("event:session.created");
531
+ const hasSessionIdle = byOpenCodeEvent.has("event:session.idle");
532
+ const hasEvent = hasSessionCreated || hasSessionIdle;
533
+ const hasCompacting = byOpenCodeEvent.has("experimental.session.compacting");
534
+ const hasAnyHookExec = hasChatMessage || hasToolBefore || hasToolAfter || hasEvent || hasCompacting;
535
+ const constNameFor = (key) => `HOOKS_${key.toUpperCase().replace(/[^A-Z0-9]+/g, "_")}`;
536
+ const constDecls = [];
537
+ for (const [key, { commands }] of byOpenCodeEvent.entries()) {
538
+ constDecls.push(emitCommandArray(constNameFor(key), commands));
539
+ }
540
+ if (hasMcp) {
541
+ constDecls.push(`const CONFIG_MCP_SERVERS: Record<string, any> = ${JSON.stringify(mcpAdditions, null, 2)};`);
542
+ // Tracks MCP server names THIS plugin instance has injected into
543
+ // input.mcp, across repeated config() calls (OpenCode re-invokes
544
+ // config() on every config reload) -- see emitConfigMethod.
545
+ constDecls.push(`const enactInjectedMcpServers = new Set<string>();`);
546
+ }
547
+ if (skillsDir) {
548
+ constDecls.push(`const CONFIG_SKILLS_DIR = ${JSON.stringify(skillsDir)};`);
549
+ }
550
+ const methods = [];
551
+ if (hasConfig)
552
+ methods.push(emitConfigMethod(hasMcp, Boolean(skillsDir)));
553
+ if (hasChatMessage) {
554
+ methods.push(emitChatMessageMethod(constNameFor("chat.message")));
555
+ methods.push(emitChatSystemTransformMethod());
556
+ }
557
+ if (hasToolBefore) {
558
+ methods.push(emitToolMethod("tool.execute.before", constNameFor("tool.execute.before"), byOpenCodeEvent.get("tool.execute.before").canonicalEvent, true));
559
+ }
560
+ if (hasToolAfter) {
561
+ methods.push(emitToolMethod("tool.execute.after", constNameFor("tool.execute.after"), byOpenCodeEvent.get("tool.execute.after").canonicalEvent, false));
562
+ }
563
+ if (hasEvent) {
564
+ methods.push(emitEventMethod(hasSessionCreated, hasSessionIdle, constNameFor("event:session.created"), constNameFor("event:session.idle")));
565
+ }
566
+ if (hasCompacting)
567
+ methods.push(emitCompactingMethod(constNameFor("experimental.session.compacting")));
568
+ const warningsComment = warnings.length > 0
569
+ ? `//\n// Unmapped canonical events with active commands (no documented OpenCode\n// equivalent — see OPENCODE_HOOK_EVENT_MAP in src/create/opencode.ts):\n${warnings.map((w) => `// - ${w}`).join("\n")}\n`
570
+ : "";
571
+ const fallbackComment = fallbacks.length > 0
572
+ ? `//\n// Projected via fallback (owner rule: an event with no documented OpenCode\n// equivalent runs on a substitute event instead — see\n// OPENCODE_HOOK_EVENT_FALLBACK in src/create/opencode.ts):\n${fallbacks.map((f) => `// - ${f.from} -> ${f.to}`).join("\n")}\n`
573
+ : "";
574
+ // `join` is only actually referenced by the skills.paths block, not by the
575
+ // MCP block, so import it only when a skills dir was provided.
576
+ const importsBlock = skillsDir ? `import { join } from "node:path";\n\n` : "";
577
+ // PLUGIN_NAME is referenced both by config()'s same-named-server skip log
578
+ // and by runHookCommand's truthful-failure logging -- emit it whenever
579
+ // EITHER needs it, not only when hooks execute (a config-only plugin, with
580
+ // MCP servers but no hooks, still needs it for the skip log).
581
+ const needsPluginName = hasMcp || hasAnyHookExec;
582
+ const pluginNameConst = needsPluginName ? `const PLUGIN_NAME = ${JSON.stringify(pluginName)};\n\n` : "";
583
+ const sharedHelpers = hasAnyHookExec
584
+ ? `async function runHookCommand(
585
+ spec: HookCommandSpec,
586
+ payload: Record<string, unknown>,
587
+ cwd: string,
588
+ ): Promise<{ exitCode: number | null; stdout: string; stderr: string }> {
589
+ try {
590
+ const proc = Bun.spawn(["/bin/sh", "-c", spec.command], {
591
+ cwd,
592
+ stdin: "pipe",
593
+ stdout: "pipe",
594
+ stderr: "pipe",
595
+ ...(spec.timeoutMs ? { timeout: spec.timeoutMs, killSignal: "SIGTERM" } : {}),
596
+ });
597
+ proc.stdin.write(JSON.stringify(payload));
598
+ proc.stdin.end();
599
+ const [stdout, stderr] = await Promise.all([
600
+ new Response(proc.stdout).text(),
601
+ new Response(proc.stderr).text(),
602
+ ]);
603
+ await proc.exited;
604
+ if (proc.exitCode !== 0 && proc.exitCode !== 2) {
605
+ console.error("[" + PLUGIN_NAME + "] hook command exited " + proc.exitCode + ": " + spec.command);
606
+ }
607
+ return { exitCode: proc.exitCode, stdout, stderr };
608
+ } catch (err) {
609
+ const message = err instanceof Error ? err.message : String(err);
610
+ console.error("[" + PLUGIN_NAME + "] hook command crashed: " + spec.command + " -- " + message);
611
+ return { exitCode: null, stdout: "", stderr: message };
612
+ }
613
+ }
614
+ `
615
+ : "";
616
+ const denyHelper = hasToolBefore
617
+ ? `
618
+ function denyReason(result: { exitCode: number | null; stdout: string; stderr: string }): string | undefined {
619
+ if (result.exitCode === 2) {
620
+ return result.stderr.trim() || "PreToolUse hook denied the call (exit code 2)";
621
+ }
622
+ try {
623
+ const parsed = JSON.parse(result.stdout) as {
624
+ hookSpecificOutput?: { permissionDecision?: string; permissionDecisionReason?: string };
625
+ };
626
+ if (parsed?.hookSpecificOutput?.permissionDecision === "deny") {
627
+ return parsed.hookSpecificOutput.permissionDecisionReason || "PreToolUse hook denied the call";
628
+ }
629
+ } catch {
630
+ // stdout was not JSON -- not a deny signal.
631
+ }
632
+ return undefined;
633
+ }
634
+ `
635
+ : "";
636
+ const chatContextHelper = hasChatMessage
637
+ ? `
638
+ const enactPromptContext = new Map<string, string>();
639
+
640
+ function extractHookContext(result: { exitCode: number | null; stdout: string; stderr: string }): string | undefined {
641
+ const trimmed = result.stdout.trim();
642
+ if (!trimmed) return undefined;
643
+ try {
644
+ const parsed = JSON.parse(trimmed) as { hookSpecificOutput?: { additionalContext?: string } };
645
+ const additional = parsed?.hookSpecificOutput?.additionalContext;
646
+ if (typeof additional === "string" && additional.trim()) {
647
+ return additional.trim();
648
+ }
649
+ } catch {
650
+ // stdout was not JSON -- treat it as plain-text context.
651
+ }
652
+ return trimmed;
653
+ }
654
+ `
655
+ : "";
656
+ return `// AUTO-GENERATED by enact-extensions (deriveOpenCodePlugin). Do not edit by hand.
657
+ // Source: canonical hooks.json + .mcp.json + skills dir -> ONE OpenCode project plugin.
658
+ ${warningsComment}${fallbackComment}
659
+ ${importsBlock}interface HookCommandSpec {
660
+ command: string;
661
+ matcher?: string;
662
+ timeoutMs?: number;
663
+ fallbackFor?: string;
664
+ }
665
+
666
+ interface ToolHookInput {
667
+ tool: string;
668
+ sessionID?: string;
669
+ callID?: string;
670
+ }
671
+
672
+ interface ToolHookOutput {
673
+ args: Record<string, unknown>;
674
+ }
675
+
676
+ ${constDecls.join("\n\n") || "// No canonical hook event maps to a documented OpenCode hook for this plugin, and no MCP servers or skills dir were provided."}
677
+
678
+ ${pluginNameConst}
679
+ ${sharedHelpers}${denyHelper}${chatContextHelper}
680
+ export const ${identifier}Plugin = async ({ directory }: { directory: string }) => {
681
+ return {
682
+ ${methods.join("\n") || " // No mapped hooks."}
683
+ };
684
+ };
685
+
686
+ export default ${identifier}Plugin;
687
+ `;
688
+ }
689
+ //# sourceMappingURL=opencode.js.map