@amsterdamdatalabs/enact-extensions 0.1.37 → 0.1.47

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 (577) hide show
  1. package/README.md +67 -108
  2. package/bundled-extensions.json +6 -0
  3. package/dist/create/enact.d.ts.map +1 -1
  4. package/dist/create/enact.js +2 -0
  5. package/dist/create/enact.js.map +1 -1
  6. package/dist/create/index.d.ts +3 -0
  7. package/dist/create/index.d.ts.map +1 -1
  8. package/dist/create/index.js +6 -0
  9. package/dist/create/index.js.map +1 -1
  10. package/dist/create/kimi.d.ts +16 -0
  11. package/dist/create/kimi.d.ts.map +1 -0
  12. package/dist/create/kimi.js +87 -0
  13. package/dist/create/kimi.js.map +1 -0
  14. package/dist/create/opencode.d.ts +129 -0
  15. package/dist/create/opencode.d.ts.map +1 -0
  16. package/dist/create/opencode.js +696 -0
  17. package/dist/create/opencode.js.map +1 -0
  18. package/dist/index.d.ts +12 -16
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +10 -10
  21. package/dist/index.js.map +1 -1
  22. package/dist/internal/agents.d.ts +12 -2
  23. package/dist/internal/agents.d.ts.map +1 -1
  24. package/dist/internal/agents.js +119 -3
  25. package/dist/internal/agents.js.map +1 -1
  26. package/dist/internal/extensions-table.d.ts +58 -0
  27. package/dist/internal/extensions-table.d.ts.map +1 -0
  28. package/dist/internal/extensions-table.js +134 -0
  29. package/dist/internal/extensions-table.js.map +1 -0
  30. package/dist/internal/file-ops.d.ts +36 -0
  31. package/dist/internal/file-ops.d.ts.map +1 -0
  32. package/dist/internal/file-ops.js +89 -0
  33. package/dist/internal/file-ops.js.map +1 -0
  34. package/dist/internal/hooks.d.ts +56 -0
  35. package/dist/internal/hooks.d.ts.map +1 -0
  36. package/dist/internal/hooks.js +128 -0
  37. package/dist/internal/hooks.js.map +1 -0
  38. package/dist/internal/json-merge.d.ts +63 -0
  39. package/dist/internal/json-merge.d.ts.map +1 -0
  40. package/dist/internal/json-merge.js +122 -0
  41. package/dist/internal/json-merge.js.map +1 -0
  42. package/dist/internal/lock-ownership.d.ts +41 -0
  43. package/dist/internal/lock-ownership.d.ts.map +1 -0
  44. package/dist/internal/lock-ownership.js +24 -0
  45. package/dist/internal/lock-ownership.js.map +1 -0
  46. package/dist/internal/platform.d.ts.map +1 -1
  47. package/dist/internal/platform.js +90 -4
  48. package/dist/internal/platform.js.map +1 -1
  49. package/dist/internal/schema.js.map +1 -1
  50. package/dist/internal/toml-block.d.ts +59 -0
  51. package/dist/internal/toml-block.d.ts.map +1 -0
  52. package/dist/internal/toml-block.js +113 -0
  53. package/dist/internal/toml-block.js.map +1 -0
  54. package/dist/internal/types.d.ts +2 -1
  55. package/dist/internal/types.d.ts.map +1 -1
  56. package/dist/projection.d.ts +47 -0
  57. package/dist/projection.d.ts.map +1 -0
  58. package/dist/projection.js +180 -0
  59. package/dist/projection.js.map +1 -0
  60. package/dist/validate/index.d.ts +9 -4
  61. package/dist/validate/index.d.ts.map +1 -1
  62. package/dist/validate/index.js +56 -7
  63. package/dist/validate/index.js.map +1 -1
  64. package/dist/validate/kimi.d.ts +3 -0
  65. package/dist/validate/kimi.d.ts.map +1 -0
  66. package/dist/validate/kimi.js +11 -0
  67. package/dist/validate/kimi.js.map +1 -0
  68. package/dist/validate/opencode.d.ts +3 -0
  69. package/dist/validate/opencode.d.ts.map +1 -0
  70. package/dist/validate/opencode.js +11 -0
  71. package/dist/validate/opencode.js.map +1 -0
  72. package/dist/validate/run.d.ts +39 -0
  73. package/dist/validate/run.d.ts.map +1 -0
  74. package/dist/validate/run.js +63 -0
  75. package/dist/validate/run.js.map +1 -0
  76. package/extensions/enact-loop/.agents/plugin.json +12 -8
  77. package/extensions/enact-loop/scripts/validate.mjs +113 -2
  78. package/extensions/enact-loop/skills/enact-loop/SKILL.md +36 -466
  79. package/extensions/enact-loop/skills/enact-loop/references/loop-contract.md +114 -0
  80. package/extensions/enact-loop/skills/loop-budget/SKILL.md +57 -0
  81. package/extensions/enact-loop/skills/loop-intake/SKILL.md +59 -0
  82. package/extensions/enact-repo/.agents/plugin.json +55 -0
  83. package/extensions/enact-repo/.mcp.json +20 -0
  84. package/extensions/enact-repo/README.md +90 -0
  85. package/extensions/enact-repo/hooks/hooks.json +98 -0
  86. package/extensions/enact-repo/lean-ctx/config.toml +35 -0
  87. package/extensions/enact-repo/lean-ctx/layout.toml +5 -0
  88. package/extensions/enact-repo/skills/aca-sandboxes/SKILL.md +53 -0
  89. package/extensions/enact-repo/skills/aca-sandboxes/references/capabilities.md +52 -0
  90. package/extensions/enact-repo/skills/aca-sandboxes/references/install.md +87 -0
  91. package/extensions/enact-repo/skills/aca-sandboxes/references/prerequisites.md +52 -0
  92. package/extensions/enact-repo/skills/aca-sandboxes/references/quickstart.md +164 -0
  93. package/extensions/enact-repo/skills/aca-sandboxes/references/reference-advanced.md +251 -0
  94. package/extensions/enact-repo/skills/aca-sandboxes/references/reference.md +287 -0
  95. package/extensions/enact-repo/skills/aca-sandboxes/references/response-cues.md +71 -0
  96. package/extensions/enact-repo/skills/aca-sandboxes/references/scenarios.md +219 -0
  97. package/extensions/enact-repo/skills/aca-sandboxes/version.json +4 -0
  98. package/extensions/enact-repo/skills/backend-remove-deadcode/SKILL.md +96 -0
  99. package/extensions/enact-repo/skills/cmux-leader/SKILL.md +61 -0
  100. package/extensions/enact-repo/skills/cmux-send/SKILL.md +61 -0
  101. package/extensions/enact-repo/skills/code-review/SKILL.md +100 -0
  102. package/extensions/enact-repo/skills/codebase-design/SKILL.md +98 -0
  103. package/extensions/enact-repo/skills/codebase-design/references/DEEPENING.md +37 -0
  104. package/extensions/enact-repo/skills/codebase-design/references/DESIGN-IT-TWICE.md +44 -0
  105. package/extensions/enact-repo/skills/codebase-design/references/TESTABILITY.md +29 -0
  106. package/extensions/enact-repo/skills/computer-use/SKILL.md +76 -0
  107. package/extensions/enact-repo/skills/debug-issue/SKILL.md +40 -0
  108. package/extensions/enact-repo/skills/diagnosing-bugs/SKILL.md +100 -0
  109. package/extensions/enact-repo/skills/diagnosing-bugs/references/FEEDBACK-LOOP-TACTICS.md +34 -0
  110. package/extensions/enact-repo/skills/diagnosing-bugs/scripts/hitl-loop.template.sh +41 -0
  111. package/extensions/enact-repo/skills/domain-modeling/SKILL.md +86 -0
  112. package/extensions/enact-repo/skills/domain-modeling/references/ADR-FORMAT.md +47 -0
  113. package/extensions/enact-repo/skills/domain-modeling/references/CONTEXT-FORMAT.md +60 -0
  114. package/extensions/enact-repo/skills/explore-codebase/SKILL.md +41 -0
  115. package/extensions/enact-repo/skills/frontend-design/LICENSE.txt +177 -0
  116. package/extensions/enact-repo/skills/frontend-design/SKILL.md +56 -0
  117. package/extensions/enact-repo/skills/grill-me/SKILL.md +20 -0
  118. package/extensions/enact-repo/skills/grill-with-docs/SKILL.md +20 -0
  119. package/extensions/enact-repo/skills/handoff/SKILL.md +28 -0
  120. package/extensions/enact-repo/skills/http-contract-migration/SKILL.md +74 -0
  121. package/extensions/enact-repo/skills/http-contract-migration/references/compatibility-and-gates.md +26 -0
  122. package/extensions/enact-repo/skills/http-contract-migration/references/hexagonal-boundary.md +16 -0
  123. package/extensions/enact-repo/skills/http-contract-migration/references/publication-and-adoption.md +31 -0
  124. package/extensions/enact-repo/skills/http-contract-migration/references/wire-fidelity-and-dto.md +31 -0
  125. package/extensions/enact-repo/skills/implement/SKILL.md +28 -0
  126. package/extensions/enact-repo/skills/improve-codebase-architecture/SKILL.md +80 -0
  127. package/extensions/enact-repo/skills/improve-codebase-architecture/references/HTML-REPORT.md +123 -0
  128. package/extensions/enact-repo/skills/interaction-design/SKILL.md +30 -0
  129. package/extensions/enact-repo/skills/interaction-design/references/Workflow.md +146 -0
  130. package/extensions/enact-repo/skills/interaction-design/references/animation-libraries-gsap.md +220 -0
  131. package/extensions/enact-repo/skills/interaction-design/references/animation-libraries-native.md +110 -0
  132. package/extensions/enact-repo/skills/interaction-design/references/animation-libraries.md +178 -0
  133. package/extensions/enact-repo/skills/interaction-design/references/interaction-patterns.md +166 -0
  134. package/extensions/enact-repo/skills/interaction-design/references/microinteraction-patterns-advanced.md +285 -0
  135. package/extensions/enact-repo/skills/interaction-design/references/microinteraction-patterns.md +254 -0
  136. package/extensions/enact-repo/skills/interaction-design/references/scroll-animations-reveals.md +213 -0
  137. package/extensions/enact-repo/skills/interaction-design/references/scroll-animations.md +209 -0
  138. package/extensions/enact-repo/skills/lean-ctx/SKILL.md +81 -0
  139. package/extensions/enact-repo/skills/orca-cli/SKILL.md +88 -0
  140. package/extensions/enact-repo/skills/orchestration/SKILL.md +80 -0
  141. package/extensions/enact-repo/skills/prototype/SKILL.md +37 -0
  142. package/extensions/enact-repo/skills/prototype/references/LOGIC.md +79 -0
  143. package/extensions/enact-repo/skills/prototype/references/UI.md +112 -0
  144. package/extensions/enact-repo/skills/refactor-safely/SKILL.md +44 -0
  145. package/extensions/enact-repo/skills/remove-deadcode/SKILL.md +54 -0
  146. package/extensions/enact-repo/skills/research/SKILL.md +27 -0
  147. package/extensions/enact-repo/skills/resolving-merge-conflicts/SKILL.md +28 -0
  148. package/extensions/enact-repo/skills/review-changes/SKILL.md +45 -0
  149. package/extensions/enact-repo/skills/tailwind-4-docs/SKILL.md +88 -0
  150. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/accent-color.mdx +149 -0
  151. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/adding-custom-styles.mdx +635 -0
  152. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/align-content.mdx +300 -0
  153. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/align-items.mdx +241 -0
  154. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/align-self.mdx +294 -0
  155. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/animation.mdx +286 -0
  156. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/appearance.mdx +180 -0
  157. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/aspect-ratio.mdx +98 -0
  158. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-blur.mdx +109 -0
  159. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-brightness.mdx +82 -0
  160. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-contrast.mdx +82 -0
  161. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-grayscale.mdx +99 -0
  162. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-hue-rotate.mdx +173 -0
  163. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-invert.mdx +99 -0
  164. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-opacity.mdx +103 -0
  165. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-saturate.mdx +98 -0
  166. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-sepia.mdx +95 -0
  167. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter.mdx +113 -0
  168. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backface-visibility.mdx +110 -0
  169. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-attachment.mdx +126 -0
  170. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-blend-mode.mdx +79 -0
  171. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-clip.mdx +85 -0
  172. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-color.mdx +176 -0
  173. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-image.mdx +349 -0
  174. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-origin.mdx +64 -0
  175. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-position.mdx +171 -0
  176. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-repeat.mdx +127 -0
  177. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-size.mdx +100 -0
  178. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/block-size.mdx +190 -0
  179. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/border-collapse.mdx +181 -0
  180. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/border-color.mdx +316 -0
  181. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/border-radius.mdx +347 -0
  182. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/border-spacing.mdx +117 -0
  183. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/border-style.mdx +129 -0
  184. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/border-width.mdx +344 -0
  185. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/box-decoration-break.mdx +71 -0
  186. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/box-shadow.mdx +497 -0
  187. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/box-sizing.mdx +175 -0
  188. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/break-after.mdx +38 -0
  189. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/break-before.mdx +38 -0
  190. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/break-inside.mdx +34 -0
  191. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/caption-side.mdx +190 -0
  192. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/caret-color.mdx +66 -0
  193. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/clear.mdx +224 -0
  194. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/color-scheme.mdx +81 -0
  195. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/color.mdx +125 -0
  196. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/colors.mdx +927 -0
  197. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/columns.mdx +310 -0
  198. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/compatibility.mdx +193 -0
  199. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/content.mdx +129 -0
  200. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/cursor.mdx +104 -0
  201. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/dark-mode.mdx +191 -0
  202. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/detecting-classes-in-source-files.mdx +315 -0
  203. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/display.mdx +523 -0
  204. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/editor-setup.mdx +90 -0
  205. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/field-sizing.mdx +75 -0
  206. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/fill.mdx +100 -0
  207. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-blur.mdx +114 -0
  208. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-brightness.mdx +102 -0
  209. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-contrast.mdx +102 -0
  210. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-drop-shadow.mdx +230 -0
  211. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-grayscale.mdx +101 -0
  212. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-hue-rotate.mdx +171 -0
  213. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-invert.mdx +93 -0
  214. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-saturate.mdx +109 -0
  215. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-sepia.mdx +92 -0
  216. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter.mdx +113 -0
  217. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/flex-basis.mdx +144 -0
  218. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/flex-direction.mdx +130 -0
  219. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/flex-grow.mdx +129 -0
  220. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/flex-shrink.mdx +95 -0
  221. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/flex-wrap.mdx +118 -0
  222. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/flex.mdx +164 -0
  223. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/float.mdx +197 -0
  224. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/font-family.mdx +119 -0
  225. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/font-feature-settings.mdx +52 -0
  226. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/font-size.mdx +184 -0
  227. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/font-smoothing.mdx +67 -0
  228. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/font-stretch.mdx +138 -0
  229. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/font-style.mdx +62 -0
  230. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/font-variant-numeric.mdx +228 -0
  231. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/font-weight.mdx +105 -0
  232. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/forced-color-adjust.mdx +152 -0
  233. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/functions-and-directives.mdx +322 -0
  234. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/gap.mdx +100 -0
  235. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/grid-auto-columns.mdx +43 -0
  236. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/grid-auto-flow.mdx +58 -0
  237. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/grid-auto-rows.mdx +43 -0
  238. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/grid-column.mdx +124 -0
  239. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/grid-row.mdx +115 -0
  240. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/grid-template-columns.mdx +101 -0
  241. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/grid-template-rows.mdx +108 -0
  242. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/height.mdx +260 -0
  243. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/hover-focus-and-other-states.mdx +4935 -0
  244. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/hyphens.mdx +112 -0
  245. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/inline-size.mdx +191 -0
  246. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/isolation.mdx +30 -0
  247. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/justify-content.mdx +348 -0
  248. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/justify-items.mdx +286 -0
  249. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/justify-self.mdx +282 -0
  250. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/letter-spacing.mdx +100 -0
  251. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/line-clamp.mdx +110 -0
  252. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/line-height.mdx +147 -0
  253. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/list-style-image.mdx +80 -0
  254. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/list-style-position.mdx +67 -0
  255. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/list-style-type.mdx +86 -0
  256. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/margin.mdx +397 -0
  257. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-clip.mdx +66 -0
  258. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-composite.mdx +70 -0
  259. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-image.mdx +933 -0
  260. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-mode.mdx +114 -0
  261. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-origin.mdx +66 -0
  262. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-position.mdx +117 -0
  263. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-repeat.mdx +169 -0
  264. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-size.mdx +104 -0
  265. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-type.mdx +98 -0
  266. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/max-block-size.mdx +153 -0
  267. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/max-height.mdx +164 -0
  268. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/max-inline-size.mdx +185 -0
  269. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/max-width.mdx +214 -0
  270. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/min-block-size.mdx +146 -0
  271. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/min-height.mdx +150 -0
  272. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/min-inline-size.mdx +153 -0
  273. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/min-width.mdx +153 -0
  274. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mix-blend-mode.mdx +103 -0
  275. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/object-fit.mdx +147 -0
  276. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/object-position.mdx +182 -0
  277. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/opacity.mdx +84 -0
  278. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/order.mdx +94 -0
  279. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/outline-color.mdx +130 -0
  280. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/outline-offset.mdx +72 -0
  281. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/outline-style.mdx +134 -0
  282. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/outline-width.mdx +91 -0
  283. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/overflow-wrap.mdx +130 -0
  284. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/overflow.mdx +665 -0
  285. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/overscroll-behavior.mdx +151 -0
  286. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/padding.mdx +232 -0
  287. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/perspective-origin.mdx +127 -0
  288. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/perspective.mdx +137 -0
  289. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/place-content.mdx +257 -0
  290. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/place-items.mdx +269 -0
  291. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/place-self.mdx +257 -0
  292. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/pointer-events.mdx +101 -0
  293. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/position.mdx +399 -0
  294. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/preflight.mdx +291 -0
  295. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/resize.mdx +110 -0
  296. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/responsive-design.mdx +666 -0
  297. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/rotate.mdx +291 -0
  298. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/scale.mdx +360 -0
  299. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/scroll-behavior.mdx +39 -0
  300. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/scroll-margin.mdx +268 -0
  301. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/scroll-padding.mdx +255 -0
  302. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/scroll-snap-align.mdx +281 -0
  303. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/scroll-snap-stop.mdx +198 -0
  304. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/scroll-snap-type.mdx +284 -0
  305. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/skew.mdx +352 -0
  306. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/stroke-width.mdx +74 -0
  307. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/stroke.mdx +103 -0
  308. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/styling-with-utility-classes.mdx +1020 -0
  309. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/table-layout.mdx +212 -0
  310. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-align.mdx +162 -0
  311. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-decoration-color.mdx +155 -0
  312. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-decoration-line.mdx +143 -0
  313. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-decoration-style.mdx +75 -0
  314. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-decoration-thickness.mdx +75 -0
  315. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-indent.mdx +74 -0
  316. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-overflow.mdx +103 -0
  317. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-shadow.mdx +177 -0
  318. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-transform.mdx +106 -0
  319. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-underline-offset.mdx +74 -0
  320. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-wrap.mdx +144 -0
  321. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/theme.mdx +1142 -0
  322. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/top-right-bottom-left.mdx +296 -0
  323. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/touch-action.mdx +95 -0
  324. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/transform-origin.mdx +130 -0
  325. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/transform-style.mdx +110 -0
  326. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/transform.mdx +51 -0
  327. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/transition-behavior.mdx +76 -0
  328. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/transition-delay.mdx +76 -0
  329. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/transition-duration.mdx +82 -0
  330. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/transition-property.mdx +137 -0
  331. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/transition-timing-function.mdx +89 -0
  332. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/translate.mdx +487 -0
  333. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/upgrade-guide.mdx +910 -0
  334. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/user-select.mdx +114 -0
  335. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/vertical-align.mdx +194 -0
  336. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/visibility.mdx +287 -0
  337. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/white-space.mdx +211 -0
  338. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/width.mdx +264 -0
  339. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/will-change.mdx +47 -0
  340. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/word-break.mdx +94 -0
  341. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/z-index.mdx +104 -0
  342. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs-catalog.md +251 -0
  343. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs-index.tsx +237 -0
  344. package/extensions/enact-repo/skills/tailwind-4-docs/references/docs-source.txt +6 -0
  345. package/extensions/enact-repo/skills/tailwind-4-docs/references/gotchas.md +18 -0
  346. package/extensions/enact-repo/skills/tailwind-4-docs/scripts/sync_tailwind_docs.py +183 -0
  347. package/extensions/enact-repo/skills/tdd/SKILL.md +49 -0
  348. package/extensions/enact-repo/skills/tdd/references/mocking.md +59 -0
  349. package/extensions/enact-repo/skills/tdd/references/tests.md +77 -0
  350. package/extensions/enact-repo/skills/teach/SKILL.md +88 -0
  351. package/extensions/enact-repo/skills/teach/references/GLOSSARY-FORMAT.md +35 -0
  352. package/extensions/enact-repo/skills/teach/references/LEARNING-RECORD-FORMAT.md +46 -0
  353. package/extensions/enact-repo/skills/teach/references/MISSION-FORMAT.md +31 -0
  354. package/extensions/enact-repo/skills/teach/references/PHILOSOPHY.md +65 -0
  355. package/extensions/enact-repo/skills/teach/references/RESOURCES-FORMAT.md +32 -0
  356. package/extensions/enact-repo/skills/testing/SKILL.md +54 -0
  357. package/extensions/enact-repo/skills/to-spec/SKILL.md +85 -0
  358. package/extensions/enact-repo/skills/to-tickets/SKILL.md +75 -0
  359. package/extensions/enact-repo/skills/to-tickets/references/TICKET-TEMPLATES.md +39 -0
  360. package/extensions/enact-repo/skills/triage/SKILL.md +99 -0
  361. package/extensions/enact-repo/skills/triage/references/AGENT-BRIEF.md +207 -0
  362. package/extensions/enact-repo/skills/triage/references/NEEDS-INFO-TEMPLATE.md +17 -0
  363. package/extensions/enact-repo/skills/triage/references/OUT-OF-SCOPE.md +105 -0
  364. package/extensions/enact-repo/skills/ui-ux-pro-max/SKILL.md +32 -0
  365. package/extensions/enact-repo/skills/ui-ux-pro-max/references/Workflow.md +207 -0
  366. package/extensions/enact-repo/skills/ui-ux-pro-max/references/workflow-reference.md +175 -0
  367. package/extensions/enact-repo/skills/wayfinder/SKILL.md +100 -0
  368. package/extensions/enact-repo/skills/wayfinder/references/TEMPLATES.md +35 -0
  369. package/extensions/enact-repo/skills/wayfinder/references/TICKET-TYPES.md +8 -0
  370. package/extensions/enact-repo/skills/writing-great-skills/SKILL.md +93 -0
  371. package/extensions/enact-repo/skills/writing-great-skills/references/GLOSSARY.md +201 -0
  372. package/package.json +18 -14
  373. package/scripts/enact-extensions.mjs +255 -873
  374. package/scripts/lib/allowed-plugins.mjs +52 -0
  375. package/scripts/lib/run-repo-doctor.mjs +571 -0
  376. package/scripts/lib/run-repo-install.mjs +1579 -0
  377. package/scripts/lib/run-sync.mjs +1 -1
  378. package/scripts/lib/run-validate.mjs +23 -37
  379. package/scripts/lib/skill-validator.mjs +872 -0
  380. package/spec/enact.json +21 -3
  381. package/spec/enact.md +13 -12
  382. package/spec/kimi.json +100 -0
  383. package/spec/opencode.json +64 -0
  384. package/dist/install.d.ts +0 -235
  385. package/dist/install.d.ts.map +0 -1
  386. package/dist/install.js +0 -697
  387. package/dist/install.js.map +0 -1
  388. package/dist/internal/claude.d.ts +0 -65
  389. package/dist/internal/claude.d.ts.map +0 -1
  390. package/dist/internal/claude.js +0 -200
  391. package/dist/internal/claude.js.map +0 -1
  392. package/dist/internal/codex.d.ts +0 -43
  393. package/dist/internal/codex.d.ts.map +0 -1
  394. package/dist/internal/codex.js +0 -211
  395. package/dist/internal/codex.js.map +0 -1
  396. package/dist/internal/cursor.d.ts +0 -2
  397. package/dist/internal/cursor.d.ts.map +0 -1
  398. package/dist/internal/cursor.js +0 -6
  399. package/dist/internal/cursor.js.map +0 -1
  400. package/dist/principles.d.ts +0 -28
  401. package/dist/principles.d.ts.map +0 -1
  402. package/dist/principles.js +0 -159
  403. package/dist/principles.js.map +0 -1
  404. package/dist/provision.d.ts +0 -30
  405. package/dist/provision.d.ts.map +0 -1
  406. package/dist/provision.js +0 -202
  407. package/dist/provision.js.map +0 -1
  408. package/extensions/dev-state/.agents/plugin.json +0 -36
  409. package/extensions/dev-state/skills/dev-state-plan-graduation/SKILL.md +0 -194
  410. package/extensions/dev-state/skills/dev-state-plan-graduation/agents/openai.yaml +0 -4
  411. package/extensions/dev-state/skills/dev-state-plan-graduation/references/reference.md +0 -130
  412. package/extensions/enact-context/.agents/plugin.json +0 -41
  413. package/extensions/enact-context/.mcp.json +0 -8
  414. package/extensions/enact-context/README.md +0 -25
  415. package/extensions/enact-context/assets/icon.png +0 -0
  416. package/extensions/enact-context/assets/logo.png +0 -0
  417. package/extensions/enact-context/hooks/hooks.json +0 -115
  418. package/extensions/enact-context/skills/enact-context/SKILL.md +0 -151
  419. package/extensions/enact-context/skills/enact-context/scripts/install.sh +0 -69
  420. package/extensions/enact-core/.agents/plugin.json +0 -40
  421. package/extensions/enact-core/OPERATING-PRINCIPLES.md +0 -7
  422. package/extensions/enact-core/hooks/hooks.json +0 -26
  423. package/extensions/enact-evolve/.agents/plugin.json +0 -47
  424. package/extensions/enact-evolve/agents/evolve-session-analyst.toml +0 -37
  425. package/extensions/enact-evolve/assets/icon.png +0 -0
  426. package/extensions/enact-evolve/assets/logo.png +0 -0
  427. package/extensions/enact-evolve/skills/mined-investigate-loop/SKILL.md +0 -68
  428. package/extensions/enact-evolve/skills/session-analysis/SKILL.md +0 -98
  429. package/extensions/enact-evolve/skills/session-analysis/scripts/run-evolve-analysis.sh +0 -343
  430. package/extensions/enact-factory/.agents/plugin.json +0 -49
  431. package/extensions/enact-factory/.mcp.json +0 -8
  432. package/extensions/enact-factory/agents/architect.toml +0 -34
  433. package/extensions/enact-factory/agents/code-reviewer.toml +0 -33
  434. package/extensions/enact-factory/agents/critic.toml +0 -39
  435. package/extensions/enact-factory/agents/executor.toml +0 -26
  436. package/extensions/enact-factory/agents/explore.toml +0 -25
  437. package/extensions/enact-factory/agents/planner.toml +0 -26
  438. package/extensions/enact-factory/agents/verifier.toml +0 -33
  439. package/extensions/enact-factory/assets/icon.png +0 -0
  440. package/extensions/enact-factory/assets/logo.png +0 -0
  441. package/extensions/enact-factory/skills/advisor/SKILL.md +0 -82
  442. package/extensions/enact-factory/skills/ai-slop-cleaner/SKILL.md +0 -57
  443. package/extensions/enact-factory/skills/autonomous-runner/SKILL.md +0 -353
  444. package/extensions/enact-factory/skills/azdo-ci-strategy/SKILL.md +0 -309
  445. package/extensions/enact-factory/skills/azdo-ci-strategy/references/build-failures.md +0 -60
  446. package/extensions/enact-factory/skills/azdo-ci-strategy/references/cli-reference.md +0 -87
  447. package/extensions/enact-factory/skills/azdo-ci-strategy/references/policies-and-pipelines.md +0 -132
  448. package/extensions/enact-factory/skills/azdo-ci-strategy/references/troubleshooting.md +0 -53
  449. package/extensions/enact-factory/skills/cmux-leader/SKILL.md +0 -74
  450. package/extensions/enact-factory/skills/cmux-send/SKILL.md +0 -50
  451. package/extensions/enact-factory/skills/committee/SKILL.md +0 -80
  452. package/extensions/enact-factory/skills/deep-interview/SKILL.md +0 -68
  453. package/extensions/enact-factory/skills/drive-loop/SKILL.md +0 -394
  454. package/extensions/enact-factory/skills/drive-loop/references/contract-schema.md +0 -127
  455. package/extensions/enact-factory/skills/handoff/SKILL.md +0 -75
  456. package/extensions/enact-factory/skills/hyperplan/SKILL.md +0 -59
  457. package/extensions/enact-factory/skills/looplan/SKILL.md +0 -120
  458. package/extensions/enact-factory/skills/plan/SKILL.md +0 -103
  459. package/extensions/enact-factory/skills/remove-deadcode/SKILL.md +0 -46
  460. package/extensions/enact-factory/skills/research/SKILL.md +0 -83
  461. package/extensions/enact-factory/skills/review/SKILL.md +0 -67
  462. package/extensions/enact-factory/skills/security-research/SKILL.md +0 -57
  463. package/extensions/enact-factory/skills/tdd/SKILL.md +0 -62
  464. package/extensions/enact-factory/skills/testing-strategy/SKILL.md +0 -172
  465. package/extensions/enact-factory/skills/trace/SKILL.md +0 -42
  466. package/extensions/enact-factory/skills/ultraqa/SKILL.md +0 -85
  467. package/extensions/enact-factory/skills/work-with-workitem/SKILL.md +0 -56
  468. package/extensions/enact-factory/skills/workitem-triage/SKILL.md +0 -42
  469. package/extensions/enact-wiki/.agents/plugin.json +0 -43
  470. package/extensions/enact-wiki/.mcp.json +0 -15
  471. package/extensions/enact-wiki/README.md +0 -44
  472. package/extensions/enact-wiki/assets/icon.png +0 -0
  473. package/extensions/enact-wiki/assets/logo.png +0 -0
  474. package/extensions/enact-wiki/skills/document-parser/SKILL.md +0 -17
  475. package/extensions/enact-wiki/skills/document-parser/scripts/parse.sh +0 -60
  476. package/extensions/enact-wiki/skills/document-parser/skill.json +0 -9
  477. package/extensions/enact-wiki/skills/enact-wiki/SKILL.md +0 -30
  478. package/extensions/enact-wiki/skills/enact-wiki/references/ingest.md +0 -62
  479. package/extensions/enact-wiki/skills/enact-wiki/references/manage.md +0 -34
  480. package/extensions/enact-wiki/skills/enact-wiki/references/query.md +0 -59
  481. package/extensions/enact-wiki/skills/search-lab/SKILL.md +0 -57
  482. package/extensions/enact-wiki/skills/search-lab/scripts/analyze.ts +0 -23
  483. package/extensions/enact-wiki/skills/wiki/SKILL.md +0 -42
  484. package/extensions/net-revenue-management/.agents/plugin.json +0 -40
  485. package/extensions/net-revenue-management/.mcp.json +0 -9
  486. package/extensions/net-revenue-management/skills/net-revenue-risks/SKILL.md +0 -30
  487. package/extensions/net-revenue-management/skills/net-revenue-scenario/SKILL.md +0 -31
  488. package/extensions/plugin-dev/.agents/plugin.json +0 -41
  489. package/extensions/plugin-dev/agents/agent-creator.md +0 -199
  490. package/extensions/plugin-dev/agents/plugin-validator.md +0 -91
  491. package/extensions/plugin-dev/agents/skill-reviewer.md +0 -212
  492. package/extensions/plugin-dev/skills/agent-development/SKILL.md +0 -641
  493. package/extensions/plugin-dev/skills/agent-development/examples/agent-creation-prompt.md +0 -250
  494. package/extensions/plugin-dev/skills/agent-development/examples/complete-agent-examples.md +0 -461
  495. package/extensions/plugin-dev/skills/agent-development/references/advanced-agent-fields.md +0 -246
  496. package/extensions/plugin-dev/skills/agent-development/references/agent-creation-system-prompt.md +0 -216
  497. package/extensions/plugin-dev/skills/agent-development/references/permission-modes-rules.md +0 -226
  498. package/extensions/plugin-dev/skills/agent-development/references/system-prompt-design.md +0 -464
  499. package/extensions/plugin-dev/skills/agent-development/references/triggering-examples.md +0 -474
  500. package/extensions/plugin-dev/skills/agent-development/scripts/create-agent-skeleton.sh +0 -176
  501. package/extensions/plugin-dev/skills/agent-development/scripts/test-agent-trigger.sh +0 -227
  502. package/extensions/plugin-dev/skills/agent-development/scripts/validate-agent.sh +0 -227
  503. package/extensions/plugin-dev/skills/create-plugin/SKILL.md +0 -505
  504. package/extensions/plugin-dev/skills/hook-development/SKILL.md +0 -861
  505. package/extensions/plugin-dev/skills/hook-development/examples/load-context.sh +0 -55
  506. package/extensions/plugin-dev/skills/hook-development/examples/validate-bash.sh +0 -57
  507. package/extensions/plugin-dev/skills/hook-development/examples/validate-write.sh +0 -48
  508. package/extensions/plugin-dev/skills/hook-development/references/advanced.md +0 -871
  509. package/extensions/plugin-dev/skills/hook-development/references/hook-input-schemas.md +0 -145
  510. package/extensions/plugin-dev/skills/hook-development/references/migration.md +0 -392
  511. package/extensions/plugin-dev/skills/hook-development/references/patterns.md +0 -430
  512. package/extensions/plugin-dev/skills/hook-development/scripts/README.md +0 -181
  513. package/extensions/plugin-dev/skills/hook-development/scripts/hook-linter.sh +0 -153
  514. package/extensions/plugin-dev/skills/hook-development/scripts/test-hook.sh +0 -276
  515. package/extensions/plugin-dev/skills/hook-development/scripts/validate-hook-schema.sh +0 -159
  516. package/extensions/plugin-dev/skills/mcp-integration/SKILL.md +0 -775
  517. package/extensions/plugin-dev/skills/mcp-integration/examples/http-server.json +0 -20
  518. package/extensions/plugin-dev/skills/mcp-integration/examples/sse-server.json +0 -19
  519. package/extensions/plugin-dev/skills/mcp-integration/examples/stdio-server.json +0 -38
  520. package/extensions/plugin-dev/skills/mcp-integration/examples/ws-server.json +0 -26
  521. package/extensions/plugin-dev/skills/mcp-integration/references/authentication.md +0 -601
  522. package/extensions/plugin-dev/skills/mcp-integration/references/server-discovery.md +0 -190
  523. package/extensions/plugin-dev/skills/mcp-integration/references/server-types.md +0 -572
  524. package/extensions/plugin-dev/skills/mcp-integration/references/tool-usage.md +0 -623
  525. package/extensions/plugin-dev/skills/plugin-dev-guide/SKILL.md +0 -221
  526. package/extensions/plugin-dev/skills/plugin-structure/SKILL.md +0 -705
  527. package/extensions/plugin-dev/skills/plugin-structure/examples/advanced-plugin.md +0 -774
  528. package/extensions/plugin-dev/skills/plugin-structure/examples/minimal-plugin.md +0 -83
  529. package/extensions/plugin-dev/skills/plugin-structure/examples/standard-plugin.md +0 -611
  530. package/extensions/plugin-dev/skills/plugin-structure/references/advanced-topics.md +0 -289
  531. package/extensions/plugin-dev/skills/plugin-structure/references/component-patterns.md +0 -592
  532. package/extensions/plugin-dev/skills/plugin-structure/references/github-actions.md +0 -233
  533. package/extensions/plugin-dev/skills/plugin-structure/references/headless-ci-mode.md +0 -193
  534. package/extensions/plugin-dev/skills/plugin-structure/references/manifest-reference.md +0 -625
  535. package/extensions/plugin-dev/skills/plugin-structure/references/output-styles.md +0 -116
  536. package/extensions/plugin-dev/skills/skill-development/SKILL.md +0 -562
  537. package/extensions/plugin-dev/skills/skill-development/examples/complete-skill.md +0 -465
  538. package/extensions/plugin-dev/skills/skill-development/examples/frontmatter-templates.md +0 -167
  539. package/extensions/plugin-dev/skills/skill-development/examples/minimal-skill.md +0 -111
  540. package/extensions/plugin-dev/skills/skill-development/references/advanced-frontmatter.md +0 -225
  541. package/extensions/plugin-dev/skills/skill-development/references/commands-vs-skills.md +0 -39
  542. package/extensions/plugin-dev/skills/skill-development/references/skill-creation-workflow.md +0 -379
  543. package/extensions/plugin-dev/skills/skill-development/references/skill-creator-original.md +0 -210
  544. package/extensions/plugin-dev/skills/start/SKILL.md +0 -82
  545. package/scripts/check-hooks.mjs +0 -174
  546. package/scripts/check-principles.mjs +0 -116
  547. package/scripts/hooks/session-start-drift-check.mjs +0 -48
  548. package/scripts/install.sh +0 -70
  549. package/scripts/lib/auto-update.mjs +0 -75
  550. package/scripts/lib/bundle-hash.mjs +0 -137
  551. package/scripts/lib/hooks.mjs +0 -585
  552. package/scripts/lib/ledger.mjs +0 -163
  553. package/scripts/lib/migrate-artifacts.mjs +0 -144
  554. package/scripts/lib/outdated.mjs +0 -144
  555. package/scripts/lib/postinstall-offer.mjs +0 -83
  556. package/scripts/lib/principles.mjs +0 -109
  557. package/scripts/lib/provision-mcp.mjs +0 -16
  558. package/scripts/lib/resolve-plugin-root.mjs +0 -9
  559. package/scripts/lib/run-install.mjs +0 -500
  560. package/scripts/lib/run-prune.mjs +0 -94
  561. package/scripts/lib/run-uninstall.mjs +0 -244
  562. package/scripts/lib/run-update.mjs +0 -152
  563. package/scripts/lib/serve.mjs +0 -472
  564. package/scripts/lib/ups-router.mjs +0 -392
  565. package/scripts/postinstall.mjs +0 -101
  566. package/scripts/setup-enact-context.sh +0 -28
  567. package/scripts/version-bump.sh +0 -484
  568. package/web/assets/README.md +0 -111
  569. package/web/assets/logo-full.png +0 -0
  570. package/web/assets/logo-slim.png +0 -0
  571. package/web/assets/tokens/base.css +0 -45
  572. package/web/assets/tokens/colors.css +0 -248
  573. package/web/assets/tokens/effects.css +0 -24
  574. package/web/assets/tokens/fonts.css +0 -8
  575. package/web/assets/tokens/index.css +0 -18
  576. package/web/assets/tokens/spacing.css +0 -50
  577. package/web/index.html +0 -1188
@@ -0,0 +1,52 @@
1
+ /**
2
+ * allowed-plugins.mjs — the DEFAULT set of plugin bundles this package ships.
3
+ *
4
+ * Owner decision, 2026-09-15: bundled-extensions.json names the defaults; it is
5
+ * NOT an allow-list. Install and uninstall of ANY resolvable bundle must work
6
+ * from the CLI. The previous behaviour refused every name but `enact-repo`, and
7
+ * refused on the RESOLVED NAME before resolution ran — so even an explicit path
8
+ * was rejected, while the error advised passing one.
9
+ *
10
+ * bundled-extensions.json remains the single place to change which bundles ship
11
+ * as defaults, and is still validated loudly rather than falling back to a scan
12
+ * of extensions/.
13
+ */
14
+ import { existsSync, readFileSync } from "node:fs";
15
+ import { dirname, join, resolve } from "node:path";
16
+ import { fileURLToPath } from "node:url";
17
+
18
+ const __dirname = dirname(fileURLToPath(import.meta.url));
19
+ const PACKAGE_ROOT = resolve(__dirname, "..", "..");
20
+
21
+ export const BUNDLED_EXTENSIONS_PATH = join(PACKAGE_ROOT, "bundled-extensions.json");
22
+
23
+ /**
24
+ * Read and validate bundled-extensions.json. Throws loudly (never falls back
25
+ * to scanning extensions/) when the file is missing or malformed.
26
+ *
27
+ * @returns {string[]} the default plugin names.
28
+ */
29
+ export function loadBundledPluginNames() {
30
+ if (!existsSync(BUNDLED_EXTENSIONS_PATH)) {
31
+ throw new Error(
32
+ `[enact-extensions] ${BUNDLED_EXTENSIONS_PATH} is missing; cannot determine the default plugin set.`,
33
+ );
34
+ }
35
+
36
+ let raw;
37
+ try {
38
+ raw = JSON.parse(readFileSync(BUNDLED_EXTENSIONS_PATH, "utf8"));
39
+ } catch (err) {
40
+ throw new Error(
41
+ `[enact-extensions] failed to parse ${BUNDLED_EXTENSIONS_PATH}: ${err instanceof Error ? err.message : String(err)}`,
42
+ );
43
+ }
44
+
45
+ if (!Array.isArray(raw.bundled) || raw.bundled.some((n) => typeof n !== "string" || !n)) {
46
+ throw new Error(
47
+ `[enact-extensions] ${BUNDLED_EXTENSIONS_PATH} must contain a "bundled" array of non-empty plugin name strings.`,
48
+ );
49
+ }
50
+
51
+ return raw.bundled;
52
+ }
@@ -0,0 +1,571 @@
1
+ /**
2
+ * `enact-extensions doctor enact-repo --repo <path> [--json]` — READ-ONLY
3
+ * health check for a repo-local `enact-repo` install. Never writes anything
4
+ * (not the lock, not any host file, not any global config). Replaces the
5
+ * `doctor`/`status` surface of the retired `enact-repo-controls` tool for the
6
+ * repo-local installer in this package.
7
+ *
8
+ * Checks:
9
+ * - installed? (lock present)
10
+ * - plugin version vs bundle version (outdated?), plus per-file content
11
+ * drift against what the CURRENT
12
+ * bundle would generate
13
+ * - lock integrity (every managed file present + hash
14
+ * match; every merged JSON entry /
15
+ * TOML block present; list drifted
16
+ * or missing)
17
+ * - per-host status: claude (marketplace + settings present; trust +
18
+ * "start a new session" note), codex (files present; read-only
19
+ * ~/.codex/config.toml projects."<repo>".trust_level; hooks-review-
20
+ * pending note), cursor (files present; MCP approval note), kimi
21
+ * (.kimi-code/mcp.json present; global hooks are enact-vps-owned, so we
22
+ * only report whether ~/.kimi-code/config.toml has the
23
+ * `# BEGIN ENACT KIMI HOOKS` block; PLUS a read-only Kimi Code
24
+ * workspace-trust check — Kimi only loads project MCP servers, including
25
+ * `.kimi-code/mcp.json`, once the workspace is trusted), opencode
26
+ * (plugin file present and generated from the current bundle)
27
+ * - required global binaries on PATH (enact-hook, lean-ctx,
28
+ * code-review-graph/crg, azure-devops-mcp) with versions
29
+ * - root `enact-config.toml` marker: present, parses as TOML, has our
30
+ * `[extensions]` table (other tools' tables are never inspected); a leftover
31
+ * `.agents/enact-repo.toml` is reported as stale (existence only, never
32
+ * read -- HARDCUT, no fallback)
33
+ * - `enact-hook doctor --repo <path>` passthrough, best-effort (never a
34
+ * hard requirement — reports "not available" when the binary or that
35
+ * sub-command isn't there)
36
+ * - enact-hook per-repo logs (informational, read-only): both log paths
37
+ * (`.agents/hooks/hooks.log` deny log, `.agents/hooks/hooks-activity.log`
38
+ * activity log), whether each exists, its row count, and (deny log only)
39
+ * the last 5 rows parsed into named columns
40
+ *
41
+ * Non-zero exit (report.exitCode = 1) ONLY for hard requirements: not
42
+ * installed, lock integrity failure, a missing required global binary, or an
43
+ * invalid/missing `enact-config.toml` marker. Everything else (outdated
44
+ * version, host trust/approval notes, hookDoctor unavailability, a stale
45
+ * `.agents/enact-repo.toml`) is informational.
46
+ */
47
+ import { createHash } from "node:crypto";
48
+ import { existsSync, lstatSync, readFileSync, readlinkSync } from "node:fs";
49
+ import { spawnSync } from "node:child_process";
50
+ import { homedir } from "node:os";
51
+ import { basename, join } from "node:path";
52
+ import * as TOML from "@iarna/toml";
53
+ import { entryPresent, findBlock } from "../../dist/index.js";
54
+ import {
55
+ CONFIG_PATH,
56
+ HOOK_LOG_FILES,
57
+ REPO_HOSTS,
58
+ abs,
59
+ buildPlan,
60
+ fileSha,
61
+ lockRel,
62
+ readBundle,
63
+ readJsonStrict,
64
+ readLock,
65
+ resolveRepoRoot,
66
+ sha256,
67
+ } from "./run-repo-install.mjs";
68
+
69
+ const STALE_MARKER_PATH = ".agents/enact-repo.toml";
70
+ const KIMI_HOOKS_MARKER = "# BEGIN ENACT KIMI HOOKS";
71
+ const REQUIRED_BINARIES = ["enact-hook", "lean-ctx", "azure-devops-mcp"];
72
+
73
+ // enact-hook per-repo logs: `.agents/hooks/hooks.log` (deny log CSV) and
74
+ // `.agents/hooks/hooks-activity.log` (activity log CSV -- deny columns plus
75
+ // host/kind/event/tool/session/downstream/duration_ms). Written by the
76
+ // global `enact-hook` runtime, never by this package; reported read-only.
77
+ const [DENY_LOG_REL, ACTIVITY_LOG_REL] = HOOK_LOG_FILES;
78
+ const DENY_LOG_COLUMNS = ["timestamp", "surface", "reason_id", "command", "agent_message"];
79
+ const ACTIVITY_LOG_COLUMNS = [...DENY_LOG_COLUMNS, "host", "kind", "event", "tool", "session", "downstream", "duration_ms"];
80
+ const DENY_LOG_LAST_ROWS = 5;
81
+
82
+ // ---------------------------------------------------------------------------
83
+ // small read-only helpers
84
+ // ---------------------------------------------------------------------------
85
+
86
+ function checkBinary(name) {
87
+ const which = spawnSync("which", [name], { encoding: "utf8" });
88
+ if (which.status !== 0 || !which.stdout.trim()) return { found: false };
89
+ const path = which.stdout.trim();
90
+ const ver = spawnSync(name, ["--version"], { encoding: "utf8", timeout: 5000 });
91
+ const version = ver.status === 0 ? `${ver.stdout || ver.stderr || ""}`.trim().split("\n")[0] : null;
92
+ return { found: true, path, version };
93
+ }
94
+
95
+ function checkCrgBinary() {
96
+ for (const name of ["crg", "code-review-graph"]) {
97
+ const r = checkBinary(name);
98
+ if (r.found) return { ...r, name };
99
+ }
100
+ return { found: false, name: "crg (or code-review-graph)" };
101
+ }
102
+
103
+ function computeCurrentPlanHashes(pluginRoot, bundle, hosts, repo) {
104
+ const plan = buildPlan(pluginRoot, bundle, hosts, repo);
105
+ const map = new Map();
106
+ for (const [rel, content] of plan.files) map.set(rel, sha256(content));
107
+ return map;
108
+ }
109
+
110
+ // Codex: read-only check of ~/.codex/config.toml `projects."<path>".trust_level`
111
+ // for this EXACT repo path. Never writes.
112
+ function checkCodexTrust(repo, home) {
113
+ const configPath = join(home, ".codex", "config.toml");
114
+ if (!existsSync(configPath)) {
115
+ return { configFound: false, trustLevel: null, note: `${configPath} not found` };
116
+ }
117
+ let doc;
118
+ try {
119
+ doc = TOML.parse(readFileSync(configPath, "utf8"));
120
+ } catch (err) {
121
+ return { configFound: true, trustLevel: null, note: `cannot parse ${configPath}: ${err instanceof Error ? err.message : String(err)}` };
122
+ }
123
+ const entry = doc.projects && typeof doc.projects === "object" ? doc.projects[repo] : undefined;
124
+ const trustLevel = entry && typeof entry === "object" && typeof entry.trust_level === "string" ? entry.trust_level : null;
125
+ return {
126
+ configFound: true,
127
+ trustLevel,
128
+ note: trustLevel
129
+ ? undefined
130
+ : `repo not marked trusted in ${configPath} (projects."${repo}".trust_level) -- Codex hooks/config load only after you trust this project`,
131
+ };
132
+ }
133
+
134
+ // Kimi hooks are global-only (installed by enact-vps); we only REPORT whether
135
+ // the global block is present, never write it ourselves.
136
+ function checkKimiGlobalHooks(home) {
137
+ const configPath = join(home, ".kimi-code", "config.toml");
138
+ if (!existsSync(configPath)) return { configFound: false, hooksBlockPresent: false, configPath };
139
+ const text = readFileSync(configPath, "utf8");
140
+ return { configFound: true, hooksBlockPresent: text.includes(KIMI_HOOKS_MARKER), configPath };
141
+ }
142
+
143
+ function kimiCodeHome() {
144
+ return process.env.KIMI_CODE_HOME || join(homedir(), ".kimi-code");
145
+ }
146
+
147
+ function kimiWorkspaceTrustSlug(repo) {
148
+ return basename(repo)
149
+ .toLowerCase()
150
+ .replace(/[^a-z0-9]+/g, "-")
151
+ .replace(/^-+|-+$/g, "");
152
+ }
153
+
154
+ // Kimi Code v0.39.1 loads project MCP servers (`.kimi-code/mcp.json` included)
155
+ // ONLY when the workspace is trusted:
156
+ // `loadMcpServers({ includeProject: trust.isTrusted() })`. Trust record:
157
+ // `${KIMI_CODE_HOME:-~/.kimi-code}/workspace-trust/wd_<slug>_<sha256(absRoot)[:12]>`
158
+ // containing `{"root": "<abs path>", "trustedAt": <ms>}`. READ-ONLY: never
159
+ // creates or modifies the trust record -- granting trust is the user's own
160
+ // action in Kimi Code ("Trust this folder").
161
+ function checkKimiWorkspaceTrust(repo) {
162
+ const home = kimiCodeHome();
163
+ const slug = kimiWorkspaceTrustSlug(repo);
164
+ const hash = createHash("sha256").update(repo).digest("hex").slice(0, 12);
165
+ const recordPath = join(home, "workspace-trust", `wd_${slug}_${hash}`);
166
+ const untrustedNote = (why) =>
167
+ `${why} -- open ${repo} in Kimi Code once and accept "Trust this folder"; until then Kimi loads no enact-repo MCP servers (project MCP, including .kimi-code/mcp.json, is skipped for untrusted workspaces)`;
168
+
169
+ if (!existsSync(recordPath)) {
170
+ return { trusted: false, recordPath, note: untrustedNote(`not trusted (no trust record at ${recordPath})`) };
171
+ }
172
+ let record;
173
+ try {
174
+ record = JSON.parse(readFileSync(recordPath, "utf8"));
175
+ } catch (err) {
176
+ return {
177
+ trusted: false,
178
+ recordPath,
179
+ note: untrustedNote(`trust record at ${recordPath} is malformed JSON (${err instanceof Error ? err.message : String(err)})`),
180
+ };
181
+ }
182
+ if (!record || record.root !== repo) {
183
+ return {
184
+ trusted: false,
185
+ recordPath,
186
+ note: untrustedNote(`trust record at ${recordPath} is for a different root (${record?.root ?? "(none)"}), not ${repo}`),
187
+ };
188
+ }
189
+ return { trusted: true, recordPath, trustedAt: record.trustedAt ?? null };
190
+ }
191
+
192
+ // ---------------------------------------------------------------------------
193
+ // enact-hook per-repo logs (read-only) — robust CSV parsing: quoted fields
194
+ // (so a quoted `command`/`agent_message` may embed commas, or even raw
195
+ // newlines) plus plain unquoted fields (the common case, already flattened
196
+ // to a single line by the writer). RFC4180-shaped, minus a header row (both
197
+ // logs are append-only data rows, no header).
198
+ // ---------------------------------------------------------------------------
199
+ function parseCsvRows(text) {
200
+ const rows = [];
201
+ let row = [];
202
+ let field = "";
203
+ let inQuotes = false;
204
+ for (let i = 0; i < text.length; i++) {
205
+ const c = text[i];
206
+ if (inQuotes) {
207
+ if (c === '"') {
208
+ if (text[i + 1] === '"') {
209
+ field += '"';
210
+ i++;
211
+ } else {
212
+ inQuotes = false;
213
+ }
214
+ } else {
215
+ field += c;
216
+ }
217
+ continue;
218
+ }
219
+ if (c === '"') {
220
+ inQuotes = true;
221
+ continue;
222
+ }
223
+ if (c === ",") {
224
+ row.push(field);
225
+ field = "";
226
+ continue;
227
+ }
228
+ if (c === "\r") continue;
229
+ if (c === "\n") {
230
+ row.push(field);
231
+ rows.push(row);
232
+ row = [];
233
+ field = "";
234
+ continue;
235
+ }
236
+ field += c;
237
+ }
238
+ if (field.length > 0 || row.length > 0) {
239
+ row.push(field);
240
+ rows.push(row);
241
+ }
242
+ // Drop blank trailing/interstitial lines (a single empty field).
243
+ return rows.filter((r) => r.length > 1 || r[0] !== "");
244
+ }
245
+
246
+ function readHookLogSummary(repo, rel, columns, lastN) {
247
+ const path = abs(repo, rel);
248
+ if (!existsSync(path)) return { path: rel, exists: false, rowCount: 0, lastRows: [] };
249
+ const rows = parseCsvRows(readFileSync(path, "utf8"));
250
+ const lastRows =
251
+ lastN > 0 ? rows.slice(-lastN).map((cols) => Object.fromEntries(columns.map((name, i) => [name, cols[i] ?? ""]))) : [];
252
+ return { path: rel, exists: true, rowCount: rows.length, lastRows };
253
+ }
254
+
255
+ // Informational only (never affects `problems`/exitCode) -- these logs are
256
+ // the runtime's own operational history, not an install-health signal.
257
+ function checkHookLogs(repo) {
258
+ return {
259
+ denyLog: readHookLogSummary(repo, DENY_LOG_REL, DENY_LOG_COLUMNS, DENY_LOG_LAST_ROWS),
260
+ activityLog: readHookLogSummary(repo, ACTIVITY_LOG_REL, ACTIVITY_LOG_COLUMNS, 0),
261
+ };
262
+ }
263
+
264
+ function runHookDoctor(repo, enactHook) {
265
+ if (!enactHook?.found) {
266
+ return { available: false, note: "enact-hook not found on PATH; skipping `enact-hook doctor --repo`" };
267
+ }
268
+ const res = spawnSync("enact-hook", ["doctor", "--repo", repo], { encoding: "utf8", timeout: 10000 });
269
+ if (res.error) {
270
+ return { available: false, note: `could not run enact-hook doctor --repo: ${res.error.message}` };
271
+ }
272
+ const combined = `${res.stdout ?? ""}${res.stderr ?? ""}`;
273
+ if (res.status !== 0 && /unknown or missing hook kind/i.test(combined)) {
274
+ return { available: false, note: "the installed enact-hook does not support the 'doctor' sub-command yet" };
275
+ }
276
+ return { available: true, exitCode: res.status, stdout: res.stdout ?? "", stderr: res.stderr ?? "" };
277
+ }
278
+
279
+ // ---------------------------------------------------------------------------
280
+ // lock integrity — every managed file present + hash match; every merged
281
+ // JSON entry / TOML block present; lists drifted/missing.
282
+ // ---------------------------------------------------------------------------
283
+ function checkLockIntegrity(repo, name, lock) {
284
+ const missingFiles = [];
285
+ const driftedFiles = [];
286
+ for (const [rel, { sha256: want }] of Object.entries(lock.files)) {
287
+ if (!existsSync(abs(repo, rel))) missingFiles.push(rel);
288
+ else if (fileSha(repo, rel) !== want) driftedFiles.push(rel);
289
+ }
290
+ const jsonIssues = [];
291
+ for (const [rel, record] of Object.entries(lock.merged)) {
292
+ const path = abs(repo, rel);
293
+ if (!existsSync(path)) {
294
+ jsonIssues.push(`${rel} (file missing)`);
295
+ continue;
296
+ }
297
+ let doc;
298
+ try {
299
+ doc = readJsonStrict(path, rel);
300
+ } catch (err) {
301
+ jsonIssues.push(`${rel} (${err instanceof Error ? err.message : String(err)})`);
302
+ continue;
303
+ }
304
+ for (const entry of record.entries) {
305
+ if (!entryPresent(doc, entry)) jsonIssues.push(`${rel} (${entry.path.join(".")})`);
306
+ }
307
+ }
308
+ const tomlIssues = [];
309
+ for (const [rel, record] of Object.entries(lock.toml)) {
310
+ const path = abs(repo, rel);
311
+ const found = existsSync(path) ? findBlock(readFileSync(path, "utf8"), name) : null;
312
+ if (!found || sha256(found.block) !== record.sha256) tomlIssues.push(rel);
313
+ }
314
+ // Managed symlinks (today: the Claude plugin's skills -> ../../.agents/skills
315
+ // link). These carry no content hash, so `lock.files`-style verification does
316
+ // not reach them: a broken or retargeted link is invisible to every other
317
+ // check here. It is not a cosmetic gap -- a dangling link makes Claude Code
318
+ // report `Skills (0)` while the repo still looks installed, which is exactly
319
+ // the "presence is not armedness" failure AGENTS.md exists to catch. Verify
320
+ // by the link's own mechanism: it must BE a symlink, point where the lock
321
+ // says, and actually resolve.
322
+ //
323
+ // lstatSync, never existsSync: existsSync follows the link and returns false
324
+ // for a dangling one, so it cannot tell "absent" from "present but broken".
325
+ const symlinkIssues = [];
326
+ for (const [rel, record] of Object.entries(lock.symlinks ?? {})) {
327
+ const path = abs(repo, rel);
328
+ const st = lstatSync(path, { throwIfNoEntry: false });
329
+ if (!st) {
330
+ symlinkIssues.push(`${rel} (missing)`);
331
+ continue;
332
+ }
333
+ if (!st.isSymbolicLink()) {
334
+ symlinkIssues.push(`${rel} (not a symlink)`);
335
+ continue;
336
+ }
337
+ const target = readlinkSync(path);
338
+ if (target !== record.target) {
339
+ symlinkIssues.push(`${rel} (target is ${target}, expected ${record.target})`);
340
+ continue;
341
+ }
342
+ if (!existsSync(path)) symlinkIssues.push(`${rel} (dangling -> ${target})`);
343
+ }
344
+ const valid =
345
+ missingFiles.length === 0 &&
346
+ driftedFiles.length === 0 &&
347
+ jsonIssues.length === 0 &&
348
+ tomlIssues.length === 0 &&
349
+ symlinkIssues.length === 0;
350
+ return { valid, missingFiles, driftedFiles, jsonIssues, tomlIssues, symlinkIssues };
351
+ }
352
+
353
+ // ---------------------------------------------------------------------------
354
+ // per-host status
355
+ // ---------------------------------------------------------------------------
356
+ function checkHosts(repo, lock, home, contentOutdated) {
357
+ const hosts = {};
358
+ for (const host of REPO_HOSTS) {
359
+ const targeted = lock.hosts.includes(host);
360
+ if (host === "claude") {
361
+ const present = !targeted || (existsSync(abs(repo, ".claude-plugin/marketplace.json")) && existsSync(abs(repo, ".claude/settings.json")));
362
+ hosts.claude = {
363
+ targeted,
364
+ present,
365
+ note: targeted
366
+ ? "loads only after you TRUST this folder in Claude Code -- the marketplace registers on first launch; if hooks/skills are missing in that FIRST session, start a NEW session in this folder"
367
+ : "not targeted by this install",
368
+ };
369
+ } else if (host === "codex") {
370
+ const present = !targeted || existsSync(abs(repo, ".codex/hooks.json")) || existsSync(abs(repo, ".codex/config.toml"));
371
+ hosts.codex = {
372
+ targeted,
373
+ present,
374
+ trust: checkCodexTrust(repo, home),
375
+ note: targeted
376
+ ? "config/hooks load only after you trust this project; hooks review (/hooks) is pending until you review them in Codex"
377
+ : "not targeted by this install",
378
+ };
379
+ } else if (host === "cursor") {
380
+ const present = !targeted || existsSync(abs(repo, ".cursor/hooks.json")) || existsSync(abs(repo, ".cursor/mcp.json"));
381
+ hosts.cursor = {
382
+ targeted,
383
+ present,
384
+ note: targeted
385
+ ? "Cursor prompts for MCP server approval on first use -- approve code-review-graph/lean-ctx in Cursor's MCP settings"
386
+ : "not targeted by this install",
387
+ };
388
+ } else if (host === "kimi") {
389
+ const present = !targeted || existsSync(abs(repo, ".kimi-code/mcp.json"));
390
+ const globalHooks = checkKimiGlobalHooks(home);
391
+ hosts.kimi = {
392
+ targeted,
393
+ present,
394
+ globalHooksInstalled: globalHooks.hooksBlockPresent,
395
+ globalHooksNote: !globalHooks.configFound
396
+ ? `${globalHooks.configPath} not found`
397
+ : globalHooks.hooksBlockPresent
398
+ ? "global Kimi hooks block present (owned + installed by enact-vps)"
399
+ : `global Kimi hooks block ("${KIMI_HOOKS_MARKER}") not found in ${globalHooks.configPath} -- hooks are global-only and enact-vps-owned; this repo install never writes them`,
400
+ workspaceTrust: checkKimiWorkspaceTrust(repo),
401
+ };
402
+ } else if (host === "opencode") {
403
+ const rel = `.opencode/plugins/${lock.plugin}.ts`;
404
+ const present = !targeted || existsSync(abs(repo, rel));
405
+ const generatedFromCurrentBundle = targeted && present ? !contentOutdated.includes(rel) : null;
406
+ hosts.opencode = {
407
+ targeted,
408
+ present,
409
+ generatedFromCurrentBundle,
410
+ note: targeted ? "one generated plugin file; re-run install after a bundle update to regenerate it" : "not targeted by this install",
411
+ };
412
+ }
413
+ }
414
+ return hosts;
415
+ }
416
+
417
+ // ---------------------------------------------------------------------------
418
+ // managed-repo marker
419
+ // ---------------------------------------------------------------------------
420
+ function checkMarker(repo) {
421
+ const path = abs(repo, CONFIG_PATH);
422
+ const base = { path: CONFIG_PATH };
423
+ if (!existsSync(path)) {
424
+ return {
425
+ ...base,
426
+ present: false,
427
+ parses: false,
428
+ extensionsPresent: false,
429
+ valid: false,
430
+ note: "missing -- enact-hook only acts in repos containing this file; re-run install",
431
+ };
432
+ }
433
+ let doc;
434
+ try {
435
+ doc = TOML.parse(readFileSync(path, "utf8"));
436
+ } catch (err) {
437
+ return {
438
+ ...base,
439
+ present: true,
440
+ parses: false,
441
+ extensionsPresent: false,
442
+ valid: false,
443
+ note: `cannot parse: ${err instanceof Error ? err.message : String(err)}`,
444
+ };
445
+ }
446
+ // `[extensions]` is the marker: its presence is what makes a repo
447
+ // enact-hook-managed, and its sub-tables are the declared extension set.
448
+ const extensionsPresent = doc.extensions !== undefined;
449
+ const declared = extensionsPresent
450
+ ? Object.entries(doc.extensions).filter(([, v]) => v && typeof v === "object" && !Array.isArray(v)).map(([k]) => k)
451
+ : [];
452
+ return {
453
+ ...base,
454
+ present: true,
455
+ parses: true,
456
+ extensionsPresent,
457
+ declared,
458
+ valid: extensionsPresent,
459
+ note: extensionsPresent ? undefined : "present but has no [extensions] table -- re-run install",
460
+ };
461
+ }
462
+
463
+ // Existence check only: the old marker is never read (HARDCUT, no dual-read).
464
+ function checkStaleMarker(repo) {
465
+ const present = existsSync(abs(repo, STALE_MARKER_PATH));
466
+ return {
467
+ path: STALE_MARKER_PATH,
468
+ present,
469
+ note: present ? `stale leftover from the pre-${CONFIG_PATH} installer; nothing reads it -- safe to delete` : undefined,
470
+ };
471
+ }
472
+
473
+ // ---------------------------------------------------------------------------
474
+ // entrypoint
475
+ // ---------------------------------------------------------------------------
476
+ export function runRepoDoctor(pluginRoot, options = {}) {
477
+ // Derived from the bundle being doctored, never hardcoded: any plugin is
478
+ // installable from the CLI, so doctoring `enact-loop` must read
479
+ // `.agents/enact-loop.lock.json`, not enact-repo's. A hardcoded name here
480
+ // reported "not installed" for a plugin that was installed perfectly well.
481
+ const name = readBundle(pluginRoot).name;
482
+ const repo = resolveRepoRoot(options.repo);
483
+ const home = options.home ?? homedir();
484
+ const problems = [];
485
+
486
+ const lock = readLock(repo, name);
487
+ if (!lock) {
488
+ return {
489
+ name,
490
+ repo,
491
+ installed: false,
492
+ problems: [`${name} is not installed in ${repo} (no ${lockRel(name)}) -- install with: enact-extensions install ${name} --repo ${repo}`],
493
+ exitCode: 1,
494
+ };
495
+ }
496
+
497
+ let bundle = null;
498
+ let bundleError = null;
499
+ try {
500
+ bundle = readBundle(pluginRoot);
501
+ } catch (err) {
502
+ bundleError = err instanceof Error ? err.message : String(err);
503
+ }
504
+
505
+ let contentOutdated = [];
506
+ if (bundle) {
507
+ try {
508
+ const currentHashes = computeCurrentPlanHashes(pluginRoot, bundle, lock.hosts, repo);
509
+ for (const [rel, want] of currentHashes) {
510
+ const have = lock.files[rel]?.sha256;
511
+ if (have && have !== want) contentOutdated.push(rel);
512
+ }
513
+ } catch {
514
+ // Best-effort enrichment only; lock-integrity below is the hard check.
515
+ contentOutdated = [];
516
+ }
517
+ }
518
+
519
+ const version = {
520
+ installed: lock.version,
521
+ bundle: bundle ? bundle.version : null,
522
+ outdated: bundle ? bundle.version !== lock.version : null,
523
+ contentOutdated,
524
+ note: bundleError,
525
+ };
526
+
527
+ const lockIntegrity = checkLockIntegrity(repo, name, lock);
528
+ if (!lockIntegrity.valid) {
529
+ problems.push(
530
+ `lock integrity: ${lockIntegrity.missingFiles.length} missing + ${lockIntegrity.driftedFiles.length} drifted managed file(s), ` +
531
+ `${lockIntegrity.jsonIssues.length} json + ${lockIntegrity.tomlIssues.length} toml + ` +
532
+ `${lockIntegrity.symlinkIssues.length} symlink issue(s) -- ` +
533
+ `re-run "install --force" to repair or "uninstall --force" to remove`,
534
+ );
535
+ }
536
+
537
+ const hosts = checkHosts(repo, lock, home, contentOutdated);
538
+
539
+ const binaries = {};
540
+ for (const bin of REQUIRED_BINARIES) binaries[bin] = checkBinary(bin);
541
+ binaries.crg = checkCrgBinary();
542
+ const missingBinaries = Object.entries(binaries)
543
+ .filter(([, v]) => !v.found)
544
+ .map(([k, v]) => v.name ?? k);
545
+ if (missingBinaries.length > 0) {
546
+ problems.push(`missing required global binaries on PATH: ${missingBinaries.join(", ")}`);
547
+ }
548
+
549
+ const marker = checkMarker(repo);
550
+ if (!marker.valid) problems.push(`${CONFIG_PATH}: ${marker.note}`);
551
+ const staleMarker = checkStaleMarker(repo);
552
+
553
+ const hookDoctor = runHookDoctor(repo, binaries["enact-hook"]);
554
+ const hookLogs = checkHookLogs(repo);
555
+
556
+ return {
557
+ name,
558
+ repo,
559
+ installed: true,
560
+ version,
561
+ lock: lockIntegrity,
562
+ hosts,
563
+ binaries,
564
+ marker,
565
+ staleMarker,
566
+ hookDoctor,
567
+ hookLogs,
568
+ problems,
569
+ exitCode: problems.length > 0 ? 1 : 0,
570
+ };
571
+ }