@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,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
+ }
@@ -25,9 +25,7 @@ export function buildIndex(roots, opts = {}) {
25
25
  const { now = null, packageRoot } = opts;
26
26
 
27
27
  // Resolve package root: two levels up from this file (scripts/lib/ → repo root)
28
- const pkgRoot =
29
- packageRoot ??
30
- new URL("../../", import.meta.url).pathname.replace(/\/$/, "");
28
+ const pkgRoot = packageRoot ?? new URL("../../", import.meta.url).pathname.replace(/\/$/, "");
31
29
 
32
30
  // Source bundles via the canonical list-bundles helper (deduplicated, resilient).
33
31
  const entries = listBundles(roots);
@@ -115,7 +115,5 @@ export function resolveBundlePath(arg, opts = {}) {
115
115
  // --- Rule 3: nothing found ---
116
116
  const uniqueCandidates = [...new Set(candidates)];
117
117
  const candidateList = uniqueCandidates.map((c) => ` - ${c}`).join("\n");
118
- throw new Error(
119
- `Plugin "${arg}" not found. Looked in:\n${candidateList}\nPass an explicit path instead.`,
120
- );
118
+ throw new Error(`Plugin "${arg}" not found. Looked in:\n${candidateList}\nPass an explicit path instead.`);
121
119
  }
@@ -0,0 +1,604 @@
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
+
48
+ import { spawnSync } from "node:child_process";
49
+ import { createHash } from "node:crypto";
50
+ import { existsSync, lstatSync, readFileSync, readlinkSync } from "node:fs";
51
+ import { homedir } from "node:os";
52
+ import { basename, join } from "node:path";
53
+ import * as TOML from "@iarna/toml";
54
+ import { entryPresent, findBlock } from "../../dist/index.js";
55
+ import {
56
+ abs,
57
+ buildPlan,
58
+ CONFIG_PATH,
59
+ fileSha,
60
+ HOOK_LOG_FILES,
61
+ lockRel,
62
+ REPO_HOSTS,
63
+ readBundle,
64
+ readJsonStrict,
65
+ readLock,
66
+ resolveRepoRoot,
67
+ sha256,
68
+ } from "./run-repo-install.mjs";
69
+
70
+ const STALE_MARKER_PATH = ".agents/enact-repo.toml";
71
+ const KIMI_HOOKS_MARKER = "# BEGIN ENACT KIMI HOOKS";
72
+ const REQUIRED_BINARIES = ["enact-hook", "lean-ctx", "azure-devops-mcp"];
73
+
74
+ // enact-hook per-repo logs: `.agents/hooks/hooks.log` (deny log CSV) and
75
+ // `.agents/hooks/hooks-activity.log` (activity log CSV -- deny columns plus
76
+ // host/kind/event/tool/session/downstream/duration_ms). Written by the
77
+ // global `enact-hook` runtime, never by this package; reported read-only.
78
+ const [DENY_LOG_REL, ACTIVITY_LOG_REL] = HOOK_LOG_FILES;
79
+ const DENY_LOG_COLUMNS = ["timestamp", "surface", "reason_id", "command", "agent_message"];
80
+ const ACTIVITY_LOG_COLUMNS = [
81
+ ...DENY_LOG_COLUMNS,
82
+ "host",
83
+ "kind",
84
+ "event",
85
+ "tool",
86
+ "session",
87
+ "downstream",
88
+ "duration_ms",
89
+ ];
90
+ const DENY_LOG_LAST_ROWS = 5;
91
+
92
+ // ---------------------------------------------------------------------------
93
+ // small read-only helpers
94
+ // ---------------------------------------------------------------------------
95
+
96
+ function checkBinary(name) {
97
+ const which = spawnSync("which", [name], { encoding: "utf8" });
98
+ if (which.status !== 0 || !which.stdout.trim()) return { found: false };
99
+ const path = which.stdout.trim();
100
+ const ver = spawnSync(name, ["--version"], { encoding: "utf8", timeout: 5000 });
101
+ const version = ver.status === 0 ? `${ver.stdout || ver.stderr || ""}`.trim().split("\n")[0] : null;
102
+ return { found: true, path, version };
103
+ }
104
+
105
+ function checkCrgBinary() {
106
+ for (const name of ["crg", "code-review-graph"]) {
107
+ const r = checkBinary(name);
108
+ if (r.found) return { ...r, name };
109
+ }
110
+ return { found: false, name: "crg (or code-review-graph)" };
111
+ }
112
+
113
+ function computeCurrentPlanHashes(pluginRoot, bundle, hosts, repo) {
114
+ const plan = buildPlan(pluginRoot, bundle, hosts, repo);
115
+ const map = new Map();
116
+ for (const [rel, content] of plan.files) map.set(rel, sha256(content));
117
+ return map;
118
+ }
119
+
120
+ // Codex: read-only check of ~/.codex/config.toml `projects."<path>".trust_level`
121
+ // for this EXACT repo path. Never writes.
122
+ function checkCodexTrust(repo, home) {
123
+ const configPath = join(home, ".codex", "config.toml");
124
+ if (!existsSync(configPath)) {
125
+ return { configFound: false, trustLevel: null, note: `${configPath} not found` };
126
+ }
127
+ let doc;
128
+ try {
129
+ doc = TOML.parse(readFileSync(configPath, "utf8"));
130
+ } catch (err) {
131
+ return {
132
+ configFound: true,
133
+ trustLevel: null,
134
+ note: `cannot parse ${configPath}: ${err instanceof Error ? err.message : String(err)}`,
135
+ };
136
+ }
137
+ const entry = doc.projects && typeof doc.projects === "object" ? doc.projects[repo] : undefined;
138
+ const trustLevel =
139
+ entry && typeof entry === "object" && typeof entry.trust_level === "string" ? entry.trust_level : null;
140
+ return {
141
+ configFound: true,
142
+ trustLevel,
143
+ note: trustLevel
144
+ ? undefined
145
+ : `repo not marked trusted in ${configPath} (projects."${repo}".trust_level) -- Codex hooks/config load only after you trust this project`,
146
+ };
147
+ }
148
+
149
+ // Kimi hooks are global-only (installed by enact-vps); we only REPORT whether
150
+ // the global block is present, never write it ourselves.
151
+ function checkKimiGlobalHooks(home) {
152
+ const configPath = join(home, ".kimi-code", "config.toml");
153
+ if (!existsSync(configPath)) return { configFound: false, hooksBlockPresent: false, configPath };
154
+ const text = readFileSync(configPath, "utf8");
155
+ return { configFound: true, hooksBlockPresent: text.includes(KIMI_HOOKS_MARKER), configPath };
156
+ }
157
+
158
+ function kimiCodeHome() {
159
+ return process.env.KIMI_CODE_HOME || join(homedir(), ".kimi-code");
160
+ }
161
+
162
+ function kimiWorkspaceTrustSlug(repo) {
163
+ return basename(repo)
164
+ .toLowerCase()
165
+ .replace(/[^a-z0-9]+/g, "-")
166
+ .replace(/^-+|-+$/g, "");
167
+ }
168
+
169
+ // Kimi Code v0.39.1 loads project MCP servers (`.kimi-code/mcp.json` included)
170
+ // ONLY when the workspace is trusted:
171
+ // `loadMcpServers({ includeProject: trust.isTrusted() })`. Trust record:
172
+ // `${KIMI_CODE_HOME:-~/.kimi-code}/workspace-trust/wd_<slug>_<sha256(absRoot)[:12]>`
173
+ // containing `{"root": "<abs path>", "trustedAt": <ms>}`. READ-ONLY: never
174
+ // creates or modifies the trust record -- granting trust is the user's own
175
+ // action in Kimi Code ("Trust this folder").
176
+ function checkKimiWorkspaceTrust(repo) {
177
+ const home = kimiCodeHome();
178
+ const slug = kimiWorkspaceTrustSlug(repo);
179
+ const hash = createHash("sha256").update(repo).digest("hex").slice(0, 12);
180
+ const recordPath = join(home, "workspace-trust", `wd_${slug}_${hash}`);
181
+ const untrustedNote = (why) =>
182
+ `${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)`;
183
+
184
+ if (!existsSync(recordPath)) {
185
+ return { trusted: false, recordPath, note: untrustedNote(`not trusted (no trust record at ${recordPath})`) };
186
+ }
187
+ let record;
188
+ try {
189
+ record = JSON.parse(readFileSync(recordPath, "utf8"));
190
+ } catch (err) {
191
+ return {
192
+ trusted: false,
193
+ recordPath,
194
+ note: untrustedNote(
195
+ `trust record at ${recordPath} is malformed JSON (${err instanceof Error ? err.message : String(err)})`,
196
+ ),
197
+ };
198
+ }
199
+ if (!record || record.root !== repo) {
200
+ return {
201
+ trusted: false,
202
+ recordPath,
203
+ note: untrustedNote(
204
+ `trust record at ${recordPath} is for a different root (${record?.root ?? "(none)"}), not ${repo}`,
205
+ ),
206
+ };
207
+ }
208
+ return { trusted: true, recordPath, trustedAt: record.trustedAt ?? null };
209
+ }
210
+
211
+ // ---------------------------------------------------------------------------
212
+ // enact-hook per-repo logs (read-only) — robust CSV parsing: quoted fields
213
+ // (so a quoted `command`/`agent_message` may embed commas, or even raw
214
+ // newlines) plus plain unquoted fields (the common case, already flattened
215
+ // to a single line by the writer). RFC4180-shaped, minus a header row (both
216
+ // logs are append-only data rows, no header).
217
+ // ---------------------------------------------------------------------------
218
+ function parseCsvRows(text) {
219
+ const rows = [];
220
+ let row = [];
221
+ let field = "";
222
+ let inQuotes = false;
223
+ for (let i = 0; i < text.length; i++) {
224
+ const c = text[i];
225
+ if (inQuotes) {
226
+ if (c === '"') {
227
+ if (text[i + 1] === '"') {
228
+ field += '"';
229
+ i++;
230
+ } else {
231
+ inQuotes = false;
232
+ }
233
+ } else {
234
+ field += c;
235
+ }
236
+ continue;
237
+ }
238
+ if (c === '"') {
239
+ inQuotes = true;
240
+ continue;
241
+ }
242
+ if (c === ",") {
243
+ row.push(field);
244
+ field = "";
245
+ continue;
246
+ }
247
+ if (c === "\r") continue;
248
+ if (c === "\n") {
249
+ row.push(field);
250
+ rows.push(row);
251
+ row = [];
252
+ field = "";
253
+ continue;
254
+ }
255
+ field += c;
256
+ }
257
+ if (field.length > 0 || row.length > 0) {
258
+ row.push(field);
259
+ rows.push(row);
260
+ }
261
+ // Drop blank trailing/interstitial lines (a single empty field).
262
+ return rows.filter((r) => r.length > 1 || r[0] !== "");
263
+ }
264
+
265
+ function readHookLogSummary(repo, rel, columns, lastN) {
266
+ const path = abs(repo, rel);
267
+ if (!existsSync(path)) return { path: rel, exists: false, rowCount: 0, lastRows: [] };
268
+ const rows = parseCsvRows(readFileSync(path, "utf8"));
269
+ const lastRows =
270
+ lastN > 0
271
+ ? rows.slice(-lastN).map((cols) => Object.fromEntries(columns.map((name, i) => [name, cols[i] ?? ""])))
272
+ : [];
273
+ return { path: rel, exists: true, rowCount: rows.length, lastRows };
274
+ }
275
+
276
+ // Informational only (never affects `problems`/exitCode) -- these logs are
277
+ // the runtime's own operational history, not an install-health signal.
278
+ function checkHookLogs(repo) {
279
+ return {
280
+ denyLog: readHookLogSummary(repo, DENY_LOG_REL, DENY_LOG_COLUMNS, DENY_LOG_LAST_ROWS),
281
+ activityLog: readHookLogSummary(repo, ACTIVITY_LOG_REL, ACTIVITY_LOG_COLUMNS, 0),
282
+ };
283
+ }
284
+
285
+ function runHookDoctor(repo, enactHook) {
286
+ if (!enactHook?.found) {
287
+ return { available: false, note: "enact-hook not found on PATH; skipping `enact-hook doctor --repo`" };
288
+ }
289
+ const res = spawnSync("enact-hook", ["doctor", "--repo", repo], { encoding: "utf8", timeout: 10000 });
290
+ if (res.error) {
291
+ return { available: false, note: `could not run enact-hook doctor --repo: ${res.error.message}` };
292
+ }
293
+ const combined = `${res.stdout ?? ""}${res.stderr ?? ""}`;
294
+ if (res.status !== 0 && /unknown or missing hook kind/i.test(combined)) {
295
+ return { available: false, note: "the installed enact-hook does not support the 'doctor' sub-command yet" };
296
+ }
297
+ return { available: true, exitCode: res.status, stdout: res.stdout ?? "", stderr: res.stderr ?? "" };
298
+ }
299
+
300
+ // ---------------------------------------------------------------------------
301
+ // lock integrity — every managed file present + hash match; every merged
302
+ // JSON entry / TOML block present; lists drifted/missing.
303
+ // ---------------------------------------------------------------------------
304
+ function checkLockIntegrity(repo, name, lock) {
305
+ const missingFiles = [];
306
+ const driftedFiles = [];
307
+ for (const [rel, { sha256: want }] of Object.entries(lock.files)) {
308
+ if (!existsSync(abs(repo, rel))) missingFiles.push(rel);
309
+ else if (fileSha(repo, rel) !== want) driftedFiles.push(rel);
310
+ }
311
+ const jsonIssues = [];
312
+ for (const [rel, record] of Object.entries(lock.merged)) {
313
+ const path = abs(repo, rel);
314
+ if (!existsSync(path)) {
315
+ jsonIssues.push(`${rel} (file missing)`);
316
+ continue;
317
+ }
318
+ let doc;
319
+ try {
320
+ doc = readJsonStrict(path, rel);
321
+ } catch (err) {
322
+ jsonIssues.push(`${rel} (${err instanceof Error ? err.message : String(err)})`);
323
+ continue;
324
+ }
325
+ for (const entry of record.entries) {
326
+ if (!entryPresent(doc, entry)) jsonIssues.push(`${rel} (${entry.path.join(".")})`);
327
+ }
328
+ }
329
+ const tomlIssues = [];
330
+ for (const [rel, record] of Object.entries(lock.toml)) {
331
+ const path = abs(repo, rel);
332
+ const found = existsSync(path) ? findBlock(readFileSync(path, "utf8"), name) : null;
333
+ if (!found || sha256(found.block) !== record.sha256) tomlIssues.push(rel);
334
+ }
335
+ // Managed symlinks (today: the Claude plugin's skills -> ../../.agents/skills
336
+ // link). These carry no content hash, so `lock.files`-style verification does
337
+ // not reach them: a broken or retargeted link is invisible to every other
338
+ // check here. It is not a cosmetic gap -- a dangling link makes Claude Code
339
+ // report `Skills (0)` while the repo still looks installed, which is exactly
340
+ // the "presence is not armedness" failure AGENTS.md exists to catch. Verify
341
+ // by the link's own mechanism: it must BE a symlink, point where the lock
342
+ // says, and actually resolve.
343
+ //
344
+ // lstatSync, never existsSync: existsSync follows the link and returns false
345
+ // for a dangling one, so it cannot tell "absent" from "present but broken".
346
+ const symlinkIssues = [];
347
+ for (const [rel, record] of Object.entries(lock.symlinks ?? {})) {
348
+ const path = abs(repo, rel);
349
+ const st = lstatSync(path, { throwIfNoEntry: false });
350
+ if (!st) {
351
+ symlinkIssues.push(`${rel} (missing)`);
352
+ continue;
353
+ }
354
+ if (!st.isSymbolicLink()) {
355
+ symlinkIssues.push(`${rel} (not a symlink)`);
356
+ continue;
357
+ }
358
+ const target = readlinkSync(path);
359
+ if (target !== record.target) {
360
+ symlinkIssues.push(`${rel} (target is ${target}, expected ${record.target})`);
361
+ continue;
362
+ }
363
+ if (!existsSync(path)) symlinkIssues.push(`${rel} (dangling -> ${target})`);
364
+ }
365
+ const valid =
366
+ missingFiles.length === 0 &&
367
+ driftedFiles.length === 0 &&
368
+ jsonIssues.length === 0 &&
369
+ tomlIssues.length === 0 &&
370
+ symlinkIssues.length === 0;
371
+ return { valid, missingFiles, driftedFiles, jsonIssues, tomlIssues, symlinkIssues };
372
+ }
373
+
374
+ // ---------------------------------------------------------------------------
375
+ // per-host status
376
+ // ---------------------------------------------------------------------------
377
+ function checkHosts(repo, lock, home, contentOutdated) {
378
+ const hosts = {};
379
+ for (const host of REPO_HOSTS) {
380
+ const targeted = lock.hosts.includes(host);
381
+ if (host === "claude") {
382
+ const present =
383
+ !targeted ||
384
+ (existsSync(abs(repo, ".claude-plugin/marketplace.json")) && existsSync(abs(repo, ".claude/settings.json")));
385
+ hosts.claude = {
386
+ targeted,
387
+ present,
388
+ note: targeted
389
+ ? "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"
390
+ : "not targeted by this install",
391
+ };
392
+ } else if (host === "codex") {
393
+ const present =
394
+ !targeted || existsSync(abs(repo, ".codex/hooks.json")) || existsSync(abs(repo, ".codex/config.toml"));
395
+ hosts.codex = {
396
+ targeted,
397
+ present,
398
+ trust: checkCodexTrust(repo, home),
399
+ note: targeted
400
+ ? "config/hooks load only after you trust this project; hooks review (/hooks) is pending until you review them in Codex"
401
+ : "not targeted by this install",
402
+ };
403
+ } else if (host === "cursor") {
404
+ const present =
405
+ !targeted || existsSync(abs(repo, ".cursor/hooks.json")) || existsSync(abs(repo, ".cursor/mcp.json"));
406
+ hosts.cursor = {
407
+ targeted,
408
+ present,
409
+ note: targeted
410
+ ? "Cursor prompts for MCP server approval on first use -- approve code-review-graph/lean-ctx in Cursor's MCP settings"
411
+ : "not targeted by this install",
412
+ };
413
+ } else if (host === "kimi") {
414
+ const present = !targeted || existsSync(abs(repo, ".kimi-code/mcp.json"));
415
+ const globalHooks = checkKimiGlobalHooks(home);
416
+ hosts.kimi = {
417
+ targeted,
418
+ present,
419
+ globalHooksInstalled: globalHooks.hooksBlockPresent,
420
+ globalHooksNote: !globalHooks.configFound
421
+ ? `${globalHooks.configPath} not found`
422
+ : globalHooks.hooksBlockPresent
423
+ ? "global Kimi hooks block present (owned + installed by enact-vps)"
424
+ : `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`,
425
+ workspaceTrust: checkKimiWorkspaceTrust(repo),
426
+ };
427
+ } else if (host === "opencode") {
428
+ const rel = `.opencode/plugins/${lock.plugin}.ts`;
429
+ const present = !targeted || existsSync(abs(repo, rel));
430
+ const generatedFromCurrentBundle = targeted && present ? !contentOutdated.includes(rel) : null;
431
+ hosts.opencode = {
432
+ targeted,
433
+ present,
434
+ generatedFromCurrentBundle,
435
+ note: targeted
436
+ ? "one generated plugin file; re-run install after a bundle update to regenerate it"
437
+ : "not targeted by this install",
438
+ };
439
+ }
440
+ }
441
+ return hosts;
442
+ }
443
+
444
+ // ---------------------------------------------------------------------------
445
+ // managed-repo marker
446
+ // ---------------------------------------------------------------------------
447
+ function checkMarker(repo) {
448
+ const path = abs(repo, CONFIG_PATH);
449
+ const base = { path: CONFIG_PATH };
450
+ if (!existsSync(path)) {
451
+ return {
452
+ ...base,
453
+ present: false,
454
+ parses: false,
455
+ extensionsPresent: false,
456
+ valid: false,
457
+ note: "missing -- enact-hook only acts in repos containing this file; re-run install",
458
+ };
459
+ }
460
+ let doc;
461
+ try {
462
+ doc = TOML.parse(readFileSync(path, "utf8"));
463
+ } catch (err) {
464
+ return {
465
+ ...base,
466
+ present: true,
467
+ parses: false,
468
+ extensionsPresent: false,
469
+ valid: false,
470
+ note: `cannot parse: ${err instanceof Error ? err.message : String(err)}`,
471
+ };
472
+ }
473
+ // `[extensions]` is the marker: its presence is what makes a repo
474
+ // enact-hook-managed, and its sub-tables are the declared extension set.
475
+ const extensionsPresent = doc.extensions !== undefined;
476
+ const declared = extensionsPresent
477
+ ? Object.entries(doc.extensions)
478
+ .filter(([, v]) => v && typeof v === "object" && !Array.isArray(v))
479
+ .map(([k]) => k)
480
+ : [];
481
+ return {
482
+ ...base,
483
+ present: true,
484
+ parses: true,
485
+ extensionsPresent,
486
+ declared,
487
+ valid: extensionsPresent,
488
+ note: extensionsPresent ? undefined : "present but has no [extensions] table -- re-run install",
489
+ };
490
+ }
491
+
492
+ // Existence check only: the old marker is never read (HARDCUT, no dual-read).
493
+ function checkStaleMarker(repo) {
494
+ const present = existsSync(abs(repo, STALE_MARKER_PATH));
495
+ return {
496
+ path: STALE_MARKER_PATH,
497
+ present,
498
+ note: present
499
+ ? `stale leftover from the pre-${CONFIG_PATH} installer; nothing reads it -- safe to delete`
500
+ : undefined,
501
+ };
502
+ }
503
+
504
+ // ---------------------------------------------------------------------------
505
+ // entrypoint
506
+ // ---------------------------------------------------------------------------
507
+ export function runRepoDoctor(pluginRoot, options = {}) {
508
+ // Derived from the bundle being doctored, never hardcoded: any plugin is
509
+ // installable from the CLI, so doctoring `enact-loop` must read
510
+ // `.agents/enact-loop.lock.json`, not enact-repo's. A hardcoded name here
511
+ // reported "not installed" for a plugin that was installed perfectly well.
512
+ const name = readBundle(pluginRoot).name;
513
+ const repo = resolveRepoRoot(options.repo);
514
+ const home = options.home ?? homedir();
515
+ const problems = [];
516
+
517
+ const lock = readLock(repo, name);
518
+ if (!lock) {
519
+ return {
520
+ name,
521
+ repo,
522
+ installed: false,
523
+ problems: [
524
+ `${name} is not installed in ${repo} (no ${lockRel(name)}) -- install with: enact-extensions install ${name} --repo ${repo}`,
525
+ ],
526
+ exitCode: 1,
527
+ };
528
+ }
529
+
530
+ let bundle = null;
531
+ let bundleError = null;
532
+ try {
533
+ bundle = readBundle(pluginRoot);
534
+ } catch (err) {
535
+ bundleError = err instanceof Error ? err.message : String(err);
536
+ }
537
+
538
+ let contentOutdated = [];
539
+ if (bundle) {
540
+ try {
541
+ const currentHashes = computeCurrentPlanHashes(pluginRoot, bundle, lock.hosts, repo);
542
+ for (const [rel, want] of currentHashes) {
543
+ const have = lock.files[rel]?.sha256;
544
+ if (have && have !== want) contentOutdated.push(rel);
545
+ }
546
+ } catch {
547
+ // Best-effort enrichment only; lock-integrity below is the hard check.
548
+ contentOutdated = [];
549
+ }
550
+ }
551
+
552
+ const version = {
553
+ installed: lock.version,
554
+ bundle: bundle ? bundle.version : null,
555
+ outdated: bundle ? bundle.version !== lock.version : null,
556
+ contentOutdated,
557
+ note: bundleError,
558
+ };
559
+
560
+ const lockIntegrity = checkLockIntegrity(repo, name, lock);
561
+ if (!lockIntegrity.valid) {
562
+ problems.push(
563
+ `lock integrity: ${lockIntegrity.missingFiles.length} missing + ${lockIntegrity.driftedFiles.length} drifted managed file(s), ` +
564
+ `${lockIntegrity.jsonIssues.length} json + ${lockIntegrity.tomlIssues.length} toml + ` +
565
+ `${lockIntegrity.symlinkIssues.length} symlink issue(s) -- ` +
566
+ `re-run "install --force" to repair or "uninstall --force" to remove`,
567
+ );
568
+ }
569
+
570
+ const hosts = checkHosts(repo, lock, home, contentOutdated);
571
+
572
+ const binaries = {};
573
+ for (const bin of REQUIRED_BINARIES) binaries[bin] = checkBinary(bin);
574
+ binaries.crg = checkCrgBinary();
575
+ const missingBinaries = Object.entries(binaries)
576
+ .filter(([, v]) => !v.found)
577
+ .map(([k, v]) => v.name ?? k);
578
+ if (missingBinaries.length > 0) {
579
+ problems.push(`missing required global binaries on PATH: ${missingBinaries.join(", ")}`);
580
+ }
581
+
582
+ const marker = checkMarker(repo);
583
+ if (!marker.valid) problems.push(`${CONFIG_PATH}: ${marker.note}`);
584
+ const staleMarker = checkStaleMarker(repo);
585
+
586
+ const hookDoctor = runHookDoctor(repo, binaries["enact-hook"]);
587
+ const hookLogs = checkHookLogs(repo);
588
+
589
+ return {
590
+ name,
591
+ repo,
592
+ installed: true,
593
+ version,
594
+ lock: lockIntegrity,
595
+ hosts,
596
+ binaries,
597
+ marker,
598
+ staleMarker,
599
+ hookDoctor,
600
+ hookLogs,
601
+ problems,
602
+ exitCode: problems.length > 0 ? 1 : 0,
603
+ };
604
+ }