@jahia/agentic 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. package/README.md +48 -0
  2. package/dist/claude/.claude/rules/jahia.md +76 -0
  3. package/dist/claude/.claude/skills/jahia/SKILL.md +136 -0
  4. package/dist/claude/.claude/skills/jahia-content/SKILL.md +139 -0
  5. package/dist/claude/.claude/skills/jahia-content-create-content/SKILL.md +384 -0
  6. package/dist/claude/.claude/skills/jahia-content-explore-structure/SKILL.md +164 -0
  7. package/dist/claude/.claude/skills/jahia-content-move-content/SKILL.md +236 -0
  8. package/dist/claude/.claude/skills/jahia-content-query-content/SKILL.md +144 -0
  9. package/dist/claude/.claude/skills/jahia-content-translate-content/SKILL.md +297 -0
  10. package/dist/claude/.claude/skills/jahia-dev/SKILL.md +124 -0
  11. package/dist/claude/.claude/skills/jahia-dev-accessibility/SKILL.md +271 -0
  12. package/dist/claude/.claude/skills/jahia-dev-apis/SKILL.md +52 -0
  13. package/dist/claude/.claude/skills/jahia-dev-apis/references/authentication.md +484 -0
  14. package/dist/claude/.claude/skills/jahia-dev-apis/references/graphql.md +657 -0
  15. package/dist/claude/.claude/skills/jahia-dev-apis/references/jcr-api.md +465 -0
  16. package/dist/claude/.claude/skills/jahia-dev-apis/references/security.md +541 -0
  17. package/dist/claude/.claude/skills/jahia-dev-build-component/SKILL.md +140 -0
  18. package/dist/claude/.claude/skills/jahia-dev-create-page-template/SKILL.md +303 -0
  19. package/dist/claude/.claude/skills/jahia-dev-create-template-set/SKILL.md +232 -0
  20. package/dist/claude/.claude/skills/jahia-dev-create-view/SKILL.md +838 -0
  21. package/dist/claude/.claude/skills/jahia-dev-cypress/SKILL.md +445 -0
  22. package/dist/claude/.claude/skills/jahia-dev-debug/SKILL.md +176 -0
  23. package/dist/claude/.claude/skills/jahia-dev-define-content-type/SKILL.md +536 -0
  24. package/dist/claude/.claude/skills/jahia-dev-import-from/SKILL.md +244 -0
  25. package/dist/claude/.claude/skills/jahia-dev-java/SKILL.md +105 -0
  26. package/dist/claude/.claude/skills/jahia-dev-java/references/backend.md +331 -0
  27. package/dist/claude/.claude/skills/jahia-dev-java/references/content-types.md +273 -0
  28. package/dist/claude/.claude/skills/jahia-dev-java/references/modules.md +218 -0
  29. package/dist/claude/.claude/skills/jahia-dev-java/references/osgi.md +208 -0
  30. package/dist/claude/.claude/skills/jahia-dev-java/references/rendering.md +191 -0
  31. package/dist/claude/.claude/skills/jahia-dev-java/references/ui-extensions.md +344 -0
  32. package/dist/claude/.claude/skills/jahia-dev-jexperience/SKILL.md +269 -0
  33. package/dist/claude/.claude/skills/jahia-dev-ops/SKILL.md +50 -0
  34. package/dist/claude/.claude/skills/jahia-dev-ops/references/docker.md +151 -0
  35. package/dist/claude/.claude/skills/jahia-dev-ops/references/monitoring.md +195 -0
  36. package/dist/claude/.claude/skills/jahia-dev-ops/references/provisioning.md +269 -0
  37. package/dist/claude/.claude/skills/jahia-dev-osgi-module/SKILL.md +297 -0
  38. package/dist/claude/.claude/skills/jahia-dev-properties/SKILL.md +147 -0
  39. package/dist/claude/.claude/skills/jahia-dev-properties/references/all-properties.md +231 -0
  40. package/dist/claude/.claude/skills/jahia-dev-query-content/SKILL.md +407 -0
  41. package/dist/claude/.claude/skills/jahia-dev-review/SKILL.md +228 -0
  42. package/dist/claude/.claude/skills/jahia-dev-screenshot/SKILL.md +177 -0
  43. package/dist/claude/.claude/skills/jahia-dev-start-local/SKILL.md +129 -0
  44. package/dist/claude/.claude/skills/jahia-dev-ui-extension/SKILL.md +559 -0
  45. package/dist/claude/CLAUDE.md +90 -0
  46. package/dist/codex/.agents/skills/jahia/SKILL.md +136 -0
  47. package/dist/codex/.agents/skills/jahia-content/SKILL.md +139 -0
  48. package/dist/codex/.agents/skills/jahia-content-create-content/SKILL.md +384 -0
  49. package/dist/codex/.agents/skills/jahia-content-explore-structure/SKILL.md +164 -0
  50. package/dist/codex/.agents/skills/jahia-content-move-content/SKILL.md +236 -0
  51. package/dist/codex/.agents/skills/jahia-content-query-content/SKILL.md +144 -0
  52. package/dist/codex/.agents/skills/jahia-content-translate-content/SKILL.md +297 -0
  53. package/dist/codex/.agents/skills/jahia-dev/SKILL.md +124 -0
  54. package/dist/codex/.agents/skills/jahia-dev-accessibility/SKILL.md +271 -0
  55. package/dist/codex/.agents/skills/jahia-dev-apis/SKILL.md +52 -0
  56. package/dist/codex/.agents/skills/jahia-dev-apis/references/authentication.md +484 -0
  57. package/dist/codex/.agents/skills/jahia-dev-apis/references/graphql.md +657 -0
  58. package/dist/codex/.agents/skills/jahia-dev-apis/references/jcr-api.md +465 -0
  59. package/dist/codex/.agents/skills/jahia-dev-apis/references/security.md +541 -0
  60. package/dist/codex/.agents/skills/jahia-dev-build-component/SKILL.md +140 -0
  61. package/dist/codex/.agents/skills/jahia-dev-create-page-template/SKILL.md +303 -0
  62. package/dist/codex/.agents/skills/jahia-dev-create-template-set/SKILL.md +232 -0
  63. package/dist/codex/.agents/skills/jahia-dev-create-view/SKILL.md +838 -0
  64. package/dist/codex/.agents/skills/jahia-dev-cypress/SKILL.md +445 -0
  65. package/dist/codex/.agents/skills/jahia-dev-debug/SKILL.md +176 -0
  66. package/dist/codex/.agents/skills/jahia-dev-define-content-type/SKILL.md +536 -0
  67. package/dist/codex/.agents/skills/jahia-dev-import-from/SKILL.md +244 -0
  68. package/dist/codex/.agents/skills/jahia-dev-java/SKILL.md +105 -0
  69. package/dist/codex/.agents/skills/jahia-dev-java/references/backend.md +331 -0
  70. package/dist/codex/.agents/skills/jahia-dev-java/references/content-types.md +273 -0
  71. package/dist/codex/.agents/skills/jahia-dev-java/references/modules.md +218 -0
  72. package/dist/codex/.agents/skills/jahia-dev-java/references/osgi.md +208 -0
  73. package/dist/codex/.agents/skills/jahia-dev-java/references/rendering.md +191 -0
  74. package/dist/codex/.agents/skills/jahia-dev-java/references/ui-extensions.md +344 -0
  75. package/dist/codex/.agents/skills/jahia-dev-jexperience/SKILL.md +269 -0
  76. package/dist/codex/.agents/skills/jahia-dev-ops/SKILL.md +50 -0
  77. package/dist/codex/.agents/skills/jahia-dev-ops/references/docker.md +151 -0
  78. package/dist/codex/.agents/skills/jahia-dev-ops/references/monitoring.md +195 -0
  79. package/dist/codex/.agents/skills/jahia-dev-ops/references/provisioning.md +269 -0
  80. package/dist/codex/.agents/skills/jahia-dev-osgi-module/SKILL.md +297 -0
  81. package/dist/codex/.agents/skills/jahia-dev-properties/SKILL.md +147 -0
  82. package/dist/codex/.agents/skills/jahia-dev-properties/references/all-properties.md +231 -0
  83. package/dist/codex/.agents/skills/jahia-dev-query-content/SKILL.md +407 -0
  84. package/dist/codex/.agents/skills/jahia-dev-review/SKILL.md +228 -0
  85. package/dist/codex/.agents/skills/jahia-dev-screenshot/SKILL.md +177 -0
  86. package/dist/codex/.agents/skills/jahia-dev-start-local/SKILL.md +129 -0
  87. package/dist/codex/.agents/skills/jahia-dev-ui-extension/SKILL.md +559 -0
  88. package/dist/codex/AGENTS.md +89 -0
  89. package/dist/copilot/.agents/skills/jahia/SKILL.md +136 -0
  90. package/dist/copilot/.agents/skills/jahia-content/SKILL.md +139 -0
  91. package/dist/copilot/.agents/skills/jahia-content-create-content/SKILL.md +384 -0
  92. package/dist/copilot/.agents/skills/jahia-content-explore-structure/SKILL.md +164 -0
  93. package/dist/copilot/.agents/skills/jahia-content-move-content/SKILL.md +236 -0
  94. package/dist/copilot/.agents/skills/jahia-content-query-content/SKILL.md +144 -0
  95. package/dist/copilot/.agents/skills/jahia-content-translate-content/SKILL.md +297 -0
  96. package/dist/copilot/.agents/skills/jahia-dev/SKILL.md +124 -0
  97. package/dist/copilot/.agents/skills/jahia-dev-accessibility/SKILL.md +271 -0
  98. package/dist/copilot/.agents/skills/jahia-dev-apis/SKILL.md +52 -0
  99. package/dist/copilot/.agents/skills/jahia-dev-apis/references/authentication.md +484 -0
  100. package/dist/copilot/.agents/skills/jahia-dev-apis/references/graphql.md +657 -0
  101. package/dist/copilot/.agents/skills/jahia-dev-apis/references/jcr-api.md +465 -0
  102. package/dist/copilot/.agents/skills/jahia-dev-apis/references/security.md +541 -0
  103. package/dist/copilot/.agents/skills/jahia-dev-build-component/SKILL.md +140 -0
  104. package/dist/copilot/.agents/skills/jahia-dev-create-page-template/SKILL.md +303 -0
  105. package/dist/copilot/.agents/skills/jahia-dev-create-template-set/SKILL.md +232 -0
  106. package/dist/copilot/.agents/skills/jahia-dev-create-view/SKILL.md +838 -0
  107. package/dist/copilot/.agents/skills/jahia-dev-cypress/SKILL.md +445 -0
  108. package/dist/copilot/.agents/skills/jahia-dev-debug/SKILL.md +176 -0
  109. package/dist/copilot/.agents/skills/jahia-dev-define-content-type/SKILL.md +536 -0
  110. package/dist/copilot/.agents/skills/jahia-dev-import-from/SKILL.md +244 -0
  111. package/dist/copilot/.agents/skills/jahia-dev-java/SKILL.md +105 -0
  112. package/dist/copilot/.agents/skills/jahia-dev-java/references/backend.md +331 -0
  113. package/dist/copilot/.agents/skills/jahia-dev-java/references/content-types.md +273 -0
  114. package/dist/copilot/.agents/skills/jahia-dev-java/references/modules.md +218 -0
  115. package/dist/copilot/.agents/skills/jahia-dev-java/references/osgi.md +208 -0
  116. package/dist/copilot/.agents/skills/jahia-dev-java/references/rendering.md +191 -0
  117. package/dist/copilot/.agents/skills/jahia-dev-java/references/ui-extensions.md +344 -0
  118. package/dist/copilot/.agents/skills/jahia-dev-jexperience/SKILL.md +269 -0
  119. package/dist/copilot/.agents/skills/jahia-dev-ops/SKILL.md +50 -0
  120. package/dist/copilot/.agents/skills/jahia-dev-ops/references/docker.md +151 -0
  121. package/dist/copilot/.agents/skills/jahia-dev-ops/references/monitoring.md +195 -0
  122. package/dist/copilot/.agents/skills/jahia-dev-ops/references/provisioning.md +269 -0
  123. package/dist/copilot/.agents/skills/jahia-dev-osgi-module/SKILL.md +297 -0
  124. package/dist/copilot/.agents/skills/jahia-dev-properties/SKILL.md +147 -0
  125. package/dist/copilot/.agents/skills/jahia-dev-properties/references/all-properties.md +231 -0
  126. package/dist/copilot/.agents/skills/jahia-dev-query-content/SKILL.md +407 -0
  127. package/dist/copilot/.agents/skills/jahia-dev-review/SKILL.md +228 -0
  128. package/dist/copilot/.agents/skills/jahia-dev-screenshot/SKILL.md +177 -0
  129. package/dist/copilot/.agents/skills/jahia-dev-start-local/SKILL.md +129 -0
  130. package/dist/copilot/.agents/skills/jahia-dev-ui-extension/SKILL.md +559 -0
  131. package/dist/copilot/AGENTS.md +89 -0
  132. package/dist/cursor/.agents/skills/jahia/SKILL.md +136 -0
  133. package/dist/cursor/.agents/skills/jahia-content/SKILL.md +139 -0
  134. package/dist/cursor/.agents/skills/jahia-content-create-content/SKILL.md +384 -0
  135. package/dist/cursor/.agents/skills/jahia-content-explore-structure/SKILL.md +164 -0
  136. package/dist/cursor/.agents/skills/jahia-content-move-content/SKILL.md +236 -0
  137. package/dist/cursor/.agents/skills/jahia-content-query-content/SKILL.md +144 -0
  138. package/dist/cursor/.agents/skills/jahia-content-translate-content/SKILL.md +297 -0
  139. package/dist/cursor/.agents/skills/jahia-dev/SKILL.md +124 -0
  140. package/dist/cursor/.agents/skills/jahia-dev-accessibility/SKILL.md +271 -0
  141. package/dist/cursor/.agents/skills/jahia-dev-apis/SKILL.md +52 -0
  142. package/dist/cursor/.agents/skills/jahia-dev-apis/references/authentication.md +484 -0
  143. package/dist/cursor/.agents/skills/jahia-dev-apis/references/graphql.md +657 -0
  144. package/dist/cursor/.agents/skills/jahia-dev-apis/references/jcr-api.md +465 -0
  145. package/dist/cursor/.agents/skills/jahia-dev-apis/references/security.md +541 -0
  146. package/dist/cursor/.agents/skills/jahia-dev-build-component/SKILL.md +140 -0
  147. package/dist/cursor/.agents/skills/jahia-dev-create-page-template/SKILL.md +303 -0
  148. package/dist/cursor/.agents/skills/jahia-dev-create-template-set/SKILL.md +232 -0
  149. package/dist/cursor/.agents/skills/jahia-dev-create-view/SKILL.md +838 -0
  150. package/dist/cursor/.agents/skills/jahia-dev-cypress/SKILL.md +445 -0
  151. package/dist/cursor/.agents/skills/jahia-dev-debug/SKILL.md +176 -0
  152. package/dist/cursor/.agents/skills/jahia-dev-define-content-type/SKILL.md +536 -0
  153. package/dist/cursor/.agents/skills/jahia-dev-import-from/SKILL.md +244 -0
  154. package/dist/cursor/.agents/skills/jahia-dev-java/SKILL.md +105 -0
  155. package/dist/cursor/.agents/skills/jahia-dev-java/references/backend.md +331 -0
  156. package/dist/cursor/.agents/skills/jahia-dev-java/references/content-types.md +273 -0
  157. package/dist/cursor/.agents/skills/jahia-dev-java/references/modules.md +218 -0
  158. package/dist/cursor/.agents/skills/jahia-dev-java/references/osgi.md +208 -0
  159. package/dist/cursor/.agents/skills/jahia-dev-java/references/rendering.md +191 -0
  160. package/dist/cursor/.agents/skills/jahia-dev-java/references/ui-extensions.md +344 -0
  161. package/dist/cursor/.agents/skills/jahia-dev-jexperience/SKILL.md +269 -0
  162. package/dist/cursor/.agents/skills/jahia-dev-ops/SKILL.md +50 -0
  163. package/dist/cursor/.agents/skills/jahia-dev-ops/references/docker.md +151 -0
  164. package/dist/cursor/.agents/skills/jahia-dev-ops/references/monitoring.md +195 -0
  165. package/dist/cursor/.agents/skills/jahia-dev-ops/references/provisioning.md +269 -0
  166. package/dist/cursor/.agents/skills/jahia-dev-osgi-module/SKILL.md +297 -0
  167. package/dist/cursor/.agents/skills/jahia-dev-properties/SKILL.md +147 -0
  168. package/dist/cursor/.agents/skills/jahia-dev-properties/references/all-properties.md +231 -0
  169. package/dist/cursor/.agents/skills/jahia-dev-query-content/SKILL.md +407 -0
  170. package/dist/cursor/.agents/skills/jahia-dev-review/SKILL.md +228 -0
  171. package/dist/cursor/.agents/skills/jahia-dev-screenshot/SKILL.md +177 -0
  172. package/dist/cursor/.agents/skills/jahia-dev-start-local/SKILL.md +129 -0
  173. package/dist/cursor/.agents/skills/jahia-dev-ui-extension/SKILL.md +559 -0
  174. package/dist/cursor/.cursor/rules/jahia.mdc +80 -0
  175. package/dist/gemini/.agents/skills/jahia/SKILL.md +136 -0
  176. package/dist/gemini/.agents/skills/jahia-content/SKILL.md +139 -0
  177. package/dist/gemini/.agents/skills/jahia-content-create-content/SKILL.md +384 -0
  178. package/dist/gemini/.agents/skills/jahia-content-explore-structure/SKILL.md +164 -0
  179. package/dist/gemini/.agents/skills/jahia-content-move-content/SKILL.md +236 -0
  180. package/dist/gemini/.agents/skills/jahia-content-query-content/SKILL.md +144 -0
  181. package/dist/gemini/.agents/skills/jahia-content-translate-content/SKILL.md +297 -0
  182. package/dist/gemini/.agents/skills/jahia-dev/SKILL.md +124 -0
  183. package/dist/gemini/.agents/skills/jahia-dev-accessibility/SKILL.md +271 -0
  184. package/dist/gemini/.agents/skills/jahia-dev-apis/SKILL.md +52 -0
  185. package/dist/gemini/.agents/skills/jahia-dev-apis/references/authentication.md +484 -0
  186. package/dist/gemini/.agents/skills/jahia-dev-apis/references/graphql.md +657 -0
  187. package/dist/gemini/.agents/skills/jahia-dev-apis/references/jcr-api.md +465 -0
  188. package/dist/gemini/.agents/skills/jahia-dev-apis/references/security.md +541 -0
  189. package/dist/gemini/.agents/skills/jahia-dev-build-component/SKILL.md +140 -0
  190. package/dist/gemini/.agents/skills/jahia-dev-create-page-template/SKILL.md +303 -0
  191. package/dist/gemini/.agents/skills/jahia-dev-create-template-set/SKILL.md +232 -0
  192. package/dist/gemini/.agents/skills/jahia-dev-create-view/SKILL.md +838 -0
  193. package/dist/gemini/.agents/skills/jahia-dev-cypress/SKILL.md +445 -0
  194. package/dist/gemini/.agents/skills/jahia-dev-debug/SKILL.md +176 -0
  195. package/dist/gemini/.agents/skills/jahia-dev-define-content-type/SKILL.md +536 -0
  196. package/dist/gemini/.agents/skills/jahia-dev-import-from/SKILL.md +244 -0
  197. package/dist/gemini/.agents/skills/jahia-dev-java/SKILL.md +105 -0
  198. package/dist/gemini/.agents/skills/jahia-dev-java/references/backend.md +331 -0
  199. package/dist/gemini/.agents/skills/jahia-dev-java/references/content-types.md +273 -0
  200. package/dist/gemini/.agents/skills/jahia-dev-java/references/modules.md +218 -0
  201. package/dist/gemini/.agents/skills/jahia-dev-java/references/osgi.md +208 -0
  202. package/dist/gemini/.agents/skills/jahia-dev-java/references/rendering.md +191 -0
  203. package/dist/gemini/.agents/skills/jahia-dev-java/references/ui-extensions.md +344 -0
  204. package/dist/gemini/.agents/skills/jahia-dev-jexperience/SKILL.md +269 -0
  205. package/dist/gemini/.agents/skills/jahia-dev-ops/SKILL.md +50 -0
  206. package/dist/gemini/.agents/skills/jahia-dev-ops/references/docker.md +151 -0
  207. package/dist/gemini/.agents/skills/jahia-dev-ops/references/monitoring.md +195 -0
  208. package/dist/gemini/.agents/skills/jahia-dev-ops/references/provisioning.md +269 -0
  209. package/dist/gemini/.agents/skills/jahia-dev-osgi-module/SKILL.md +297 -0
  210. package/dist/gemini/.agents/skills/jahia-dev-properties/SKILL.md +147 -0
  211. package/dist/gemini/.agents/skills/jahia-dev-properties/references/all-properties.md +231 -0
  212. package/dist/gemini/.agents/skills/jahia-dev-query-content/SKILL.md +407 -0
  213. package/dist/gemini/.agents/skills/jahia-dev-review/SKILL.md +228 -0
  214. package/dist/gemini/.agents/skills/jahia-dev-screenshot/SKILL.md +177 -0
  215. package/dist/gemini/.agents/skills/jahia-dev-start-local/SKILL.md +129 -0
  216. package/dist/gemini/.agents/skills/jahia-dev-ui-extension/SKILL.md +559 -0
  217. package/dist/gemini/AGENTS.md +89 -0
  218. package/dist/gemini/GEMINI.md +6 -0
  219. package/dist/index.js +975 -0
  220. package/dist/opencode/.agents/skills/jahia/SKILL.md +136 -0
  221. package/dist/opencode/.agents/skills/jahia-content/SKILL.md +139 -0
  222. package/dist/opencode/.agents/skills/jahia-content-create-content/SKILL.md +384 -0
  223. package/dist/opencode/.agents/skills/jahia-content-explore-structure/SKILL.md +164 -0
  224. package/dist/opencode/.agents/skills/jahia-content-move-content/SKILL.md +236 -0
  225. package/dist/opencode/.agents/skills/jahia-content-query-content/SKILL.md +144 -0
  226. package/dist/opencode/.agents/skills/jahia-content-translate-content/SKILL.md +297 -0
  227. package/dist/opencode/.agents/skills/jahia-dev/SKILL.md +124 -0
  228. package/dist/opencode/.agents/skills/jahia-dev-accessibility/SKILL.md +271 -0
  229. package/dist/opencode/.agents/skills/jahia-dev-apis/SKILL.md +52 -0
  230. package/dist/opencode/.agents/skills/jahia-dev-apis/references/authentication.md +484 -0
  231. package/dist/opencode/.agents/skills/jahia-dev-apis/references/graphql.md +657 -0
  232. package/dist/opencode/.agents/skills/jahia-dev-apis/references/jcr-api.md +465 -0
  233. package/dist/opencode/.agents/skills/jahia-dev-apis/references/security.md +541 -0
  234. package/dist/opencode/.agents/skills/jahia-dev-build-component/SKILL.md +140 -0
  235. package/dist/opencode/.agents/skills/jahia-dev-create-page-template/SKILL.md +303 -0
  236. package/dist/opencode/.agents/skills/jahia-dev-create-template-set/SKILL.md +232 -0
  237. package/dist/opencode/.agents/skills/jahia-dev-create-view/SKILL.md +838 -0
  238. package/dist/opencode/.agents/skills/jahia-dev-cypress/SKILL.md +445 -0
  239. package/dist/opencode/.agents/skills/jahia-dev-debug/SKILL.md +176 -0
  240. package/dist/opencode/.agents/skills/jahia-dev-define-content-type/SKILL.md +536 -0
  241. package/dist/opencode/.agents/skills/jahia-dev-import-from/SKILL.md +244 -0
  242. package/dist/opencode/.agents/skills/jahia-dev-java/SKILL.md +105 -0
  243. package/dist/opencode/.agents/skills/jahia-dev-java/references/backend.md +331 -0
  244. package/dist/opencode/.agents/skills/jahia-dev-java/references/content-types.md +273 -0
  245. package/dist/opencode/.agents/skills/jahia-dev-java/references/modules.md +218 -0
  246. package/dist/opencode/.agents/skills/jahia-dev-java/references/osgi.md +208 -0
  247. package/dist/opencode/.agents/skills/jahia-dev-java/references/rendering.md +191 -0
  248. package/dist/opencode/.agents/skills/jahia-dev-java/references/ui-extensions.md +344 -0
  249. package/dist/opencode/.agents/skills/jahia-dev-jexperience/SKILL.md +269 -0
  250. package/dist/opencode/.agents/skills/jahia-dev-ops/SKILL.md +50 -0
  251. package/dist/opencode/.agents/skills/jahia-dev-ops/references/docker.md +151 -0
  252. package/dist/opencode/.agents/skills/jahia-dev-ops/references/monitoring.md +195 -0
  253. package/dist/opencode/.agents/skills/jahia-dev-ops/references/provisioning.md +269 -0
  254. package/dist/opencode/.agents/skills/jahia-dev-osgi-module/SKILL.md +297 -0
  255. package/dist/opencode/.agents/skills/jahia-dev-properties/SKILL.md +147 -0
  256. package/dist/opencode/.agents/skills/jahia-dev-properties/references/all-properties.md +231 -0
  257. package/dist/opencode/.agents/skills/jahia-dev-query-content/SKILL.md +407 -0
  258. package/dist/opencode/.agents/skills/jahia-dev-review/SKILL.md +228 -0
  259. package/dist/opencode/.agents/skills/jahia-dev-screenshot/SKILL.md +177 -0
  260. package/dist/opencode/.agents/skills/jahia-dev-start-local/SKILL.md +129 -0
  261. package/dist/opencode/.agents/skills/jahia-dev-ui-extension/SKILL.md +559 -0
  262. package/dist/opencode/AGENTS.md +89 -0
  263. package/dist/windsurf/.windsurf/rules/jahia.md +80 -0
  264. package/dist/windsurf/.windsurf/skills/jahia/SKILL.md +136 -0
  265. package/dist/windsurf/.windsurf/skills/jahia-content/SKILL.md +139 -0
  266. package/dist/windsurf/.windsurf/skills/jahia-content-create-content/SKILL.md +384 -0
  267. package/dist/windsurf/.windsurf/skills/jahia-content-explore-structure/SKILL.md +164 -0
  268. package/dist/windsurf/.windsurf/skills/jahia-content-move-content/SKILL.md +236 -0
  269. package/dist/windsurf/.windsurf/skills/jahia-content-query-content/SKILL.md +144 -0
  270. package/dist/windsurf/.windsurf/skills/jahia-content-translate-content/SKILL.md +297 -0
  271. package/dist/windsurf/.windsurf/skills/jahia-dev/SKILL.md +124 -0
  272. package/dist/windsurf/.windsurf/skills/jahia-dev-accessibility/SKILL.md +271 -0
  273. package/dist/windsurf/.windsurf/skills/jahia-dev-apis/SKILL.md +52 -0
  274. package/dist/windsurf/.windsurf/skills/jahia-dev-apis/references/authentication.md +484 -0
  275. package/dist/windsurf/.windsurf/skills/jahia-dev-apis/references/graphql.md +657 -0
  276. package/dist/windsurf/.windsurf/skills/jahia-dev-apis/references/jcr-api.md +465 -0
  277. package/dist/windsurf/.windsurf/skills/jahia-dev-apis/references/security.md +541 -0
  278. package/dist/windsurf/.windsurf/skills/jahia-dev-build-component/SKILL.md +140 -0
  279. package/dist/windsurf/.windsurf/skills/jahia-dev-create-page-template/SKILL.md +303 -0
  280. package/dist/windsurf/.windsurf/skills/jahia-dev-create-template-set/SKILL.md +232 -0
  281. package/dist/windsurf/.windsurf/skills/jahia-dev-create-view/SKILL.md +838 -0
  282. package/dist/windsurf/.windsurf/skills/jahia-dev-cypress/SKILL.md +445 -0
  283. package/dist/windsurf/.windsurf/skills/jahia-dev-debug/SKILL.md +176 -0
  284. package/dist/windsurf/.windsurf/skills/jahia-dev-define-content-type/SKILL.md +536 -0
  285. package/dist/windsurf/.windsurf/skills/jahia-dev-import-from/SKILL.md +244 -0
  286. package/dist/windsurf/.windsurf/skills/jahia-dev-java/SKILL.md +105 -0
  287. package/dist/windsurf/.windsurf/skills/jahia-dev-java/references/backend.md +331 -0
  288. package/dist/windsurf/.windsurf/skills/jahia-dev-java/references/content-types.md +273 -0
  289. package/dist/windsurf/.windsurf/skills/jahia-dev-java/references/modules.md +218 -0
  290. package/dist/windsurf/.windsurf/skills/jahia-dev-java/references/osgi.md +208 -0
  291. package/dist/windsurf/.windsurf/skills/jahia-dev-java/references/rendering.md +191 -0
  292. package/dist/windsurf/.windsurf/skills/jahia-dev-java/references/ui-extensions.md +344 -0
  293. package/dist/windsurf/.windsurf/skills/jahia-dev-jexperience/SKILL.md +269 -0
  294. package/dist/windsurf/.windsurf/skills/jahia-dev-ops/SKILL.md +50 -0
  295. package/dist/windsurf/.windsurf/skills/jahia-dev-ops/references/docker.md +151 -0
  296. package/dist/windsurf/.windsurf/skills/jahia-dev-ops/references/monitoring.md +195 -0
  297. package/dist/windsurf/.windsurf/skills/jahia-dev-ops/references/provisioning.md +269 -0
  298. package/dist/windsurf/.windsurf/skills/jahia-dev-osgi-module/SKILL.md +297 -0
  299. package/dist/windsurf/.windsurf/skills/jahia-dev-properties/SKILL.md +147 -0
  300. package/dist/windsurf/.windsurf/skills/jahia-dev-properties/references/all-properties.md +231 -0
  301. package/dist/windsurf/.windsurf/skills/jahia-dev-query-content/SKILL.md +407 -0
  302. package/dist/windsurf/.windsurf/skills/jahia-dev-review/SKILL.md +228 -0
  303. package/dist/windsurf/.windsurf/skills/jahia-dev-screenshot/SKILL.md +177 -0
  304. package/dist/windsurf/.windsurf/skills/jahia-dev-start-local/SKILL.md +129 -0
  305. package/dist/windsurf/.windsurf/skills/jahia-dev-ui-extension/SKILL.md +559 -0
  306. package/dist/windsurf/AGENTS.md +89 -0
  307. package/package.json +28 -0
@@ -0,0 +1,407 @@
1
+ ---
2
+ name: jahia-dev-query-content
3
+ description: Writes JCR-SQL2 queries to list and filter Jahia content. Use when asked to list articles, display content from a folder, filter by date, or build a content listing.
4
+ allowed-tools: Bash, Read, Write, Edit, WebFetch
5
+ ---
6
+
7
+ ## Overview
8
+
9
+ Jahia stores all content in a tree-based **Java Content Repository (JCR)**. Content can be queried using **JCR-SQL2**, a SQL-like language. This is used to build listings (blogs, news, team members, etc.) from content stored in **Content Folders**.
10
+
11
+ There are **three ways** to query content in Jahia JS modules:
12
+ 1. **No-code**: built-in `Jahia - Queries` component in Page Builder
13
+ 2. **Server-side hook**: `useJCRQuery` in a `.server.tsx` view
14
+ 3. **Client-side hook**: `useJCRQuery` in a `.client.tsx` island (for dynamic, browser-triggered queries)
15
+
16
+ ---
17
+
18
+ ## Step 1 — Understand Content Folders
19
+
20
+ Instead of placing content directly on a page, reusable content (blog posts, team members, etc.) is stored in **Content Folders** under the `contents/` tree of the site.
21
+
22
+ To create a content folder in Jahia UI:
23
+ 1. Open **jContent** (the content manager)
24
+ 2. Navigate to **Content Folders** in the left sidebar
25
+ 3. Right-click → **New Folder**, name it (e.g. `blog`)
26
+ 4. Create content items inside this folder
27
+
28
+ ---
29
+
30
+ ## Step 2 — Use the built-in query component (no code)
31
+
32
+ For simple listings, use the built-in **Jahia - Queries > Content items using JCR Query** component in Page Builder. Enter your JCR-SQL2 query in the query field.
33
+
34
+ ---
35
+
36
+ ## Step 2b — Make content folders editable in jContent
37
+
38
+ Content folders are browsable via **jContent** by default, but if editors need to manage content directly from the **Content Tree** in Page Builder, add `jmix:visibleInContentTree` to the folder node type:
39
+
40
+ ```cnd
41
+ [namespace:blogFolder] > jnt:contentFolder, jmix:visibleInContentTree
42
+ ```
43
+
44
+ This makes the folder appear in the left sidebar of Page Builder, enabling drag-and-drop management.
45
+
46
+ ---
47
+
48
+ ## Step 3 — Write a JCR-SQL2 query
49
+
50
+ ### Basic query — list all items of a type
51
+
52
+ ```sql
53
+ SELECT *
54
+ FROM [namespace:typeName] AS item
55
+ WHERE ISDESCENDANTNODE(item, '/sites/<siteKey>/contents/<folderName>')
56
+ ```
57
+
58
+ Replace `<siteKey>` with the site key set during site creation.
59
+
60
+ ### Filter out drafts (items without a date)
61
+
62
+ ```sql
63
+ SELECT *
64
+ FROM [namespace:blogPost] AS post
65
+ WHERE ISDESCENDANTNODE(post, '/sites/<siteKey>/contents/blog')
66
+ AND post.[publicationDate] IS NOT NULL
67
+ ORDER BY post.[publicationDate] DESC
68
+ ```
69
+
70
+ ### Query all descendants (not just direct children)
71
+
72
+ Use `ISDESCENDANTNODE` for nested folder structures:
73
+
74
+ ```sql
75
+ -- All blog posts anywhere under /contents/blog (including subfolders)
76
+ SELECT * FROM [namespace:blogPost] AS post
77
+ WHERE ISDESCENDANTNODE(post, '/sites/<siteKey>/contents/blog')
78
+ ```
79
+
80
+ Use `ISCHILDNODE` when you want only direct children of a folder:
81
+
82
+ ```sql
83
+ -- Only direct children of /contents/blog
84
+ SELECT * FROM [namespace:blogPost] AS post
85
+ WHERE ISCHILDNODE(post, '/sites/<siteKey>/contents/blog')
86
+ ```
87
+
88
+ ### Common query clauses
89
+
90
+ | Clause | Usage |
91
+ |---|---|
92
+ | `ISDESCENDANTNODE(x, '/path')` | Filter by location in the tree |
93
+ | `x.[prop] IS NOT NULL` | Exclude items without a property (draft filter) |
94
+ | `x.[prop] = 'value'` | Filter by property value |
95
+ | `ORDER BY x.[prop] DESC` | Sort descending |
96
+ | `ORDER BY x.[prop] ASC` | Sort ascending |
97
+
98
+ ---
99
+
100
+ ## Step 4 — Make a content type accessible at its own URL
101
+
102
+ Use `jmix:mainResource` **only** for content that needs **both a listing card AND a full detail page** (e.g. blog posts, team member profiles). Do not add it to visual composition types or navigation-only content.
103
+
104
+ To allow a blog post to be viewed as a full page, add `jmix:mainResource` to its CND definition:
105
+
106
+ ```cnd
107
+ [namespace:blogPost] > jnt:content, mix:title, jmix:mainResource, namespacemix:component
108
+ ```
109
+
110
+ Then create a full-page view for it:
111
+
112
+ ```tsx
113
+ // src/components/BlogPost/fullPage.server.tsx
114
+ // NOTE: componentType is "view" (NOT "template") — the MainResource template
115
+ // at src/templates/MainResource/default.server.tsx routes to this view automatically
116
+ import { jahiaComponent } from "@jahia/javascript-modules-library";
117
+ import type { Props } from "./types.js";
118
+ import classes from "./component.module.css";
119
+
120
+ jahiaComponent(
121
+ {
122
+ componentType: "view", // ← "view", NOT "template"
123
+ nodeType: "namespace:blogPost",
124
+ displayName: "Blog Post Full Page",
125
+ name: "fullPage", // ← this name is what MainResource routes to
126
+ },
127
+ ({ "jcr:title": title, body, subtitle }: Props) => (
128
+ <article className={classes.article}>
129
+ <h1>{title}</h1>
130
+ <p>{subtitle}</p>
131
+ <div dangerouslySetInnerHTML={{ __html: body }} />
132
+ </article>
133
+ ),
134
+ );
135
+ ```
136
+
137
+ ### Link to a full-page content item
138
+
139
+ Use `buildNodeUrl(currentNode)` to generate the URL to the item:
140
+
141
+ ```tsx
142
+ <a href={buildNodeUrl(currentNode)}>{title}</a>
143
+ ```
144
+
145
+ ---
146
+
147
+ ## Step 5 — Draft/publish pattern
148
+
149
+ A common pattern is to use a `publicationDate` property as a draft gate:
150
+
151
+ ```cnd
152
+ - publicationDate (date)
153
+ ```
154
+
155
+ Note: do **not** mark it as `mandatory` — that would be a breaking change on an existing type, and it doubles as the draft indicator (no date = draft).
156
+
157
+ In the query, filter published posts only:
158
+
159
+ ```sql
160
+ AND post.[publicationDate] IS NOT NULL
161
+ ORDER BY post.[publicationDate] DESC
162
+ ```
163
+
164
+ Display the date in the view:
165
+
166
+ ```tsx
167
+ {publicationDate && (
168
+ <time dateTime={publicationDate}>
169
+ {new Date(publicationDate).toLocaleDateString(
170
+ currentResource.getLocale().toString(),
171
+ { dateStyle: "long" }
172
+ )}
173
+ </time>
174
+ )}
175
+ ```
176
+
177
+ ---
178
+
179
+ ## Step 6 — Query in code with `useJCRQuery`
180
+
181
+ For custom listing components (rather than using the built-in query component), use `useJCRQuery` from the library inside a `.server.tsx` view:
182
+
183
+ ```tsx
184
+ import { jahiaComponent, useJCRQuery, Render } from "@jahia/javascript-modules-library";
185
+ import type { JCRNodeWrapper } from "org.jahia.services.content";
186
+
187
+ jahiaComponent(
188
+ { componentType: "view", nodeType: "namespace:blogListing" },
189
+ (_, { renderContext }) => {
190
+ const siteKey = renderContext.getSite().getName();
191
+ const posts = useJCRQuery({
192
+ query: `SELECT * FROM [namespace:blogPost] AS post
193
+ WHERE ISDESCENDANTNODE(post, '/sites/${siteKey}/contents/blog')
194
+ AND post.[publicationDate] IS NOT NULL
195
+ ORDER BY post.[publicationDate] DESC`,
196
+ });
197
+
198
+ return (
199
+ <section>
200
+ {posts.map((post: JCRNodeWrapper) => (
201
+ <Render key={post.getPath()} node={post} />
202
+ ))}
203
+ </section>
204
+ );
205
+ },
206
+ );
207
+ ```
208
+
209
+ > `useJCRQuery` is server-side only (`.server.tsx`). For client-side dynamic queries triggered by user interaction, use the GraphQL approach in a `.client.tsx` island.
210
+
211
+ ---
212
+
213
+ ## Step 7 — Language switcher with `getSiteLocales`
214
+
215
+ For sites with multiple languages, build a language switcher by combining `getSiteLocales()` with `j:invalidLanguages` and `node.hasI18N()`. Filter out disabled or untranslated locales before generating URLs.
216
+
217
+ ```tsx
218
+ import { getSiteLocales, buildNodeUrl, jahiaComponent } from "@jahia/javascript-modules-library";
219
+
220
+ jahiaComponent(
221
+ { componentType: "view", nodeType: "ns:languageSwitcher" },
222
+ (_, { currentNode }) => {
223
+ const locales = getSiteLocales(); // Record<string, java.util.Locale>
224
+
225
+ // Read j:invalidLanguages (languages disabled on this node)
226
+ const invalidCodes = currentNode.hasProperty("j:invalidLanguages")
227
+ ? currentNode.getProperty("j:invalidLanguages").getValues().map((v: any) => v.getString())
228
+ : [];
229
+ const invalidSet = new Set(invalidCodes);
230
+
231
+ const links = Object.entries(locales)
232
+ .filter(([code, locale]) =>
233
+ !invalidSet.has(code) && currentNode.hasI18N(locale),
234
+ )
235
+ .map(([code]) => ({
236
+ code,
237
+ url: buildNodeUrl(currentNode, { language: code }),
238
+ }));
239
+
240
+ return (
241
+ <nav aria-label="Language switcher">
242
+ {links.map(({ code, url }) => (
243
+ <a key={code} href={url} lang={code} hrefLang={code}>
244
+ {code.toUpperCase()}
245
+ </a>
246
+ ))}
247
+ </nav>
248
+ );
249
+ },
250
+ );
251
+ ```
252
+
253
+ > `getSiteLocales()` returns all locales configured for the site — not just the active language. Always filter by `j:invalidLanguages` and `hasI18N()` before displaying.
254
+
255
+ ---
256
+
257
+ ## Step 7b — Query via GraphQL with `useGQLQuery`
258
+
259
+ For complex queries that span multiple nodes or need field-level projection, `useGQLQuery` is more efficient than `useJCRQuery`. It runs synchronously on the server using the current user's session.
260
+
261
+ ```tsx
262
+ import { useGQLQuery, jahiaComponent } from "@jahia/javascript-modules-library";
263
+ import { gql } from "graphql-tag";
264
+
265
+ const BLOG_QUERY = gql`
266
+ query LatestPosts($path: String!) {
267
+ jcr {
268
+ nodeByPath(path: $path) {
269
+ descendants(typesFilter: { types: ["namespace:blogPost"] }, fieldFilter: {
270
+ filters: [{ fieldName: "publicationDate", evaluation: NOT_EMPTY }]
271
+ }) {
272
+ nodes {
273
+ name
274
+ path
275
+ displayName
276
+ property(name: "publicationDate") { value }
277
+ property(name: "jcr:title") { value }
278
+ }
279
+ }
280
+ }
281
+ }
282
+ }
283
+ `;
284
+
285
+ jahiaComponent(
286
+ { componentType: "view", nodeType: "namespace:blogListing" },
287
+ (_, { renderContext }) => {
288
+ const siteKey = renderContext.getSite().getName();
289
+ const data = useGQLQuery(BLOG_QUERY, { path: `/sites/${siteKey}/contents/blog` });
290
+ const posts = data?.jcr?.nodeByPath?.descendants?.nodes ?? [];
291
+
292
+ return (
293
+ <ul>
294
+ {posts.map((post: any) => (
295
+ <li key={post.path}>
296
+ <a href={post.path}>{post.property?.value ?? post.displayName}</a>
297
+ </li>
298
+ ))}
299
+ </ul>
300
+ );
301
+ },
302
+ );
303
+ ```
304
+
305
+ ---
306
+
307
+ ## Step 8 — Hierarchical content with nested folders
308
+
309
+ Content folders can be nested to create sections (e.g. `tutorials/front-end/`, `tutorials/editors/`). Use `ISDESCENDANTNODE` in queries to automatically include all levels — no query changes needed as you add sub-folders.
310
+
311
+ For **sidebar navigation** or **tree panels**, traverse the JCR hierarchy directly instead of querying:
312
+
313
+ ### Get a JCR node by path
314
+
315
+ ```tsx
316
+ import { useServerContext } from "@jahia/javascript-modules-library";
317
+ import type { JCRNodeWrapper } from "org.jahia.services.content";
318
+
319
+ const { renderContext } = useServerContext();
320
+ const folderNode = renderContext.getMainResource().getNode().getSession().getNode(
321
+ `/sites/${siteKey}/contents/tutorials`
322
+ ) as JCRNodeWrapper;
323
+ ```
324
+
325
+ ### Walk up to the section root
326
+
327
+ ```tsx
328
+ function findSectionRoot(node: JCRNodeWrapper): JCRNodeWrapper {
329
+ const parts = node.getPath().split("/");
330
+ const contentsPath = parts.slice(0, 4).join("/"); // /sites/siteKey/contents
331
+ let current = node;
332
+ while (current.getParent() && (current.getParent() as JCRNodeWrapper).getPath() !== contentsPath) {
333
+ current = current.getParent() as JCRNodeWrapper;
334
+ }
335
+ return current;
336
+ }
337
+ ```
338
+
339
+ > ⚠️ `getParent()` returns `Node` (JCR base type), not `JCRNodeWrapper`. Always cast: `current.getParent() as JCRNodeWrapper`.
340
+
341
+ ### Recursively render a folder tree
342
+
343
+ Use a plain function (not a React component) for recursive tree rendering — avoids hook scope issues:
344
+
345
+ ```tsx
346
+ import type { ReactElement } from "react";
347
+ import { buildNodeUrl } from "@jahia/javascript-modules-library";
348
+ import type { JCRNodeWrapper } from "org.jahia.services.content";
349
+
350
+ function renderTree(
351
+ folder: JCRNodeWrapper,
352
+ contentNodeType: string,
353
+ depth: number = 0,
354
+ ): ReactElement | null {
355
+ const items: Array<{ type: "folder" | "item"; node: JCRNodeWrapper }> = [];
356
+ const iter = folder.getNodes();
357
+ while (iter.hasNext()) {
358
+ const node = iter.nextNode() as JCRNodeWrapper;
359
+ if (node.isNodeType("jnt:contentFolder")) items.push({ type: "folder", node });
360
+ else if (node.isNodeType(contentNodeType)) items.push({ type: "item", node });
361
+ }
362
+ if (items.length === 0) return null;
363
+
364
+ return (
365
+ <ul>
366
+ {items.map(({ type, node }) => {
367
+ const key = node.getPath();
368
+ if (type === "folder") {
369
+ return (
370
+ <li key={key}>
371
+ <strong>{node.getPropertyAsString("jcr:title") || node.getName()}</strong>
372
+ {renderTree(node, contentNodeType, depth + 1)}
373
+ </li>
374
+ );
375
+ }
376
+ return (
377
+ <li key={key}>
378
+ <a href={buildNodeUrl(node)}>
379
+ {node.getPropertyAsString("jcr:title") || node.getName()}
380
+ </a>
381
+ </li>
382
+ );
383
+ })}
384
+ </ul>
385
+ );
386
+ }
387
+ ```
388
+
389
+ Use `folder.getNodes()` (returns a `NodeIterator`) — call `.hasNext()` / `.nextNode()` to iterate. The iterator preserves orderable-folder order (creation/manual reordering in jContent), which `ORDER BY jcr:name` would not.
390
+
391
+ ---
392
+
393
+ - **JCR repository browser**: http://localhost:8080/modules/tools/jcrBrowser.jsp
394
+ - **Installed definitions browser**: http://localhost:8080/modules/tools/definitionsBrowser.jsp
395
+
396
+ ---
397
+
398
+ ## Validation checklist
399
+ - [ ] Content folder exists in Jahia UI under `contents/`
400
+ - [ ] Site key in query matches the actual site key (use `renderContext.getSite().getName()` in code)
401
+ - [ ] Query returns expected results in the built-in query component
402
+ - [ ] `jmix:mainResource` added if items need a full-page view
403
+ - [ ] Draft/publish filtering works correctly
404
+ - [ ] `buildNodeUrl(currentNode)` used for item links
405
+
406
+ ## Troubleshooting
407
+ > https://academy.jahia.com/tutorials-get-started/front-end-developer/making-a-blog
@@ -0,0 +1,228 @@
1
+ ---
2
+ name: jahia-dev-review
3
+ description: Reviews a Jahia JavaScript module for generic and Jahia-specific best practices. Scans CND definitions, TypeScript views, and page templates. Reports issues in order of importance with fix suggestions. Covers 8 critical checks, 9 warnings, and 10 suggestions.
4
+ allowed-tools: Bash, Read
5
+ ---
6
+
7
+ # Skill: jahia-dev-review
8
+
9
+ Reviews a Jahia JavaScript module for correctness and best practices. Scans real files, reports issues in order of severity (🔴 Critical → 🟡 Warning → 🔵 Suggestion), and proposes fixes.
10
+
11
+ ---
12
+
13
+ ## Step 1 — Locate the module
14
+
15
+ Find the module root: look for `package.json` with `@jahia/javascript-modules-library`. Determine the `src/` directory.
16
+
17
+ ```bash
18
+ find . -name "package.json" -not -path "*/node_modules/*" | xargs grep -l "javascript-modules-library" 2>/dev/null | head -1
19
+ ```
20
+
21
+ ---
22
+
23
+ ## Step 2 — Collect files to review
24
+
25
+ ```bash
26
+ find src/ -name "definition.cnd" | sort
27
+ find src/ -name "*.server.tsx" | sort
28
+ find src/ -name "*.client.tsx" | sort
29
+ find src/ -name "types.ts" | sort
30
+ find src/templates/ -name "*.server.tsx" | sort
31
+ cat settings/definitions.cnd
32
+ ```
33
+
34
+ Read ALL collected files before starting the review.
35
+
36
+ ---
37
+
38
+ ## Step 3 — Run checks in order of severity
39
+
40
+ ### 🔴 CRITICAL — Will cause broken editor UX, broken pages, or security issues
41
+
42
+ **C1 — `jmix:droppableContent` used directly**
43
+ Check: any CND type (not mixin declarations in settings/definitions.cnd) extending `jmix:droppableContent` directly.
44
+ Fix: extend the module's custom component mixin (e.g. `namespacemix:component`) instead.
45
+
46
+ **C2 — `fullPage` view uses `componentType: "template"`**
47
+ Check: any `name: "fullPage"` view that also has `componentType: "template"`.
48
+ Fix: change to `componentType: "view"`. The `src/templates/MainResource/default.server.tsx` template already routes `jmix:mainResource` nodes to the `fullPage` view.
49
+
50
+ **C3 — `j:linknode` or `j:url` explicitly declared in CND**
51
+ Check: any CND type that explicitly declares `j:linknode` or `j:url` fields alongside `choicelist[linkTypeInitializer]`.
52
+ Fix: remove those two fields from the CND. They are injected automatically by Jahia's mixins at runtime. Only declare `- j:linkType (string, choicelist[linkTypeInitializer])`. The fields remain available in `types.ts` and in the view.
53
+
54
+ **C4 — `j:linkType` used as a URL in a view**
55
+ Check: any `.server.tsx` or `.client.tsx` file that uses `props["j:linkType"]` or `j:linkType` directly as an `href`.
56
+ Fix: use a `switch (props["j:linkType"])` with `buildNodeUrl(props["j:linknode"])` for internal and `props["j:url"]` for external.
57
+
58
+ **C5 — Weakreference node properties read directly in a view (cache issue)**
59
+ Check: views that access `.getPropertyAsString()`, `.getProperty(...)`, or property destructuring from a weakreference prop (other than `buildNodeUrl`).
60
+ Fix: render the referenced node via `<Render node={refNode} view="..." />` to get proper cache invalidation.
61
+
62
+ **C6 — Client component imports server-only APIs**
63
+ Check: any `.client.tsx` file that imports from `@jahia/javascript-modules-library` (except `Island` which is re-exported).
64
+ Fix: move server-side logic to the `.server.tsx` wrapper and pass results as serializable props to the Island.
65
+
66
+ **C7 — Cache explicitly disabled (`cache.expiration="0"`)**
67
+ Check: any `jahiaComponent` call with `properties: { "cache.expiration": "0" }`.
68
+ Fix: never set expiration to 0. If truly fresh data is needed, use a small value like `"5"` (5 seconds) to still protect under load.
69
+
70
+ **C8 — Generic area type used for every Area**
71
+ Check: page templates where every `<Area>` uses the same generic area type (e.g. `nodeType="namespace:pageArea"` everywhere). This means editors see ALL `pageComponent` types as droppable options in every area — a hero section will appear as an option in a feature card grid.
72
+ Fix: create **one typed area node per section** in `settings/definitions.cnd`, each with a tight child constraint:
73
+ ```cnd
74
+ [namespace:heroArea] > jnt:content, jmix:list, jmix:hiddenType orderable
75
+ + * (namespace:heroSection)
76
+
77
+ [namespace:featuresArea] > jnt:content, jmix:list, jmix:hiddenType orderable
78
+ + * (namespace:featureCard)
79
+ ```
80
+ Only use a generic `pageArea` for flexible areas (e.g. footer) where any component is valid.
81
+
82
+ ---
83
+
84
+ ### 🟡 WARNING — Will likely cause editor confusion, stale content, or runtime errors
85
+
86
+ **W1 — User-facing string fields without `i18n`**
87
+ Check: CND string/textarea/richtext properties that don't have `i18n` (exclude system properties like `j:linkType`, `j:url`, non-user-facing fields).
88
+ Fix: add `i18n` to all user-visible text properties.
89
+
90
+ **W2 — `jmix:mainResource` on non-content types**
91
+ Check: CND types that have `jmix:mainResource` but no richtext body or no obvious "detail page" use case (e.g. a visual composition type like a card or hero).
92
+ Fix: only use `jmix:mainResource` for content that genuinely needs both a listing card AND a full-page detail view.
93
+
94
+ **W3 — Structural container types missing `jmix:hiddenType`**
95
+ Check: CND types that have no `namespacemix:component` mixin (so they can't be dropped as components) but also don't have `jmix:hiddenType` — editors would never see them but they don't show up with a clear "hidden" intent.
96
+ Fix: add `jmix:hiddenType` to structural/container types. Do NOT use `jmix:studioOnly` — it can interfere with area rendering.
97
+
98
+ **W4 — Props not typed as optional (`?:`) / not guarded in views**
99
+ Check: (a) `types.ts` props typed as required (`title: string`) — all props must use `?:` because Jahia does not guarantee values are present at render time. (b) Views that use props without null/undefined guards, especially `buildNodeUrl(prop)` — passing `undefined` throws `"Expected a node in buildNodeUrl, received undefined"`.
100
+ Fix: use `?:` for all props in `types.ts`. Add conditional rendering (`{prop && <span>{prop}</span>}`) and guard node URLs (`prop ? { backgroundImage: \`url(${buildNodeUrl(prop)})\` } : undefined`).
101
+
102
+ **W5 — `weakreference multiple` not null-filtered before `.map()`**
103
+ Check: views mapping over a `weakreference multiple` prop without `.filter(x => x !== null)`.
104
+ Fix: `items?.filter(item => item !== null).map(...)`.
105
+
106
+ **W6 — Cache not configured for views using external/dynamic data**
107
+ Check: views that call external functions, use `Date.now()`, or fetch data, without `properties: { "cache.expiration": "..." }`.
108
+ Fix: add `cache.expiration` to the `jahiaComponent` properties.
109
+
110
+ **W7 — Missing `import.xml` or no homepage defined**
111
+ Check: look for `import.xml` at the module root. If absent or if it doesn't contain `j:isHomePage="true"`, editors won't have a default homepage.
112
+ Fix: add an `import.xml` with a homepage node (`j:isHomePage="true"`). Also add "Offline pages/Models", "Offline pages/Drafts", "Offline pages/Archive" folders with `jmix:systemNameReadonly` and `jmix:nolive` mixins. Add content folders with `jmix:contributeMode` restrictions where appropriate.
113
+
114
+ **W8 — Node type extends something other than `jnt:content`**
115
+ Check: CND types that extend anything other than `jnt:content`, `jnt:page`, `jmix:*`, or standard Jahia base types.
116
+ Fix: extend only `jnt:content` (or `jnt:page` for page types). To add fields to a type you don't control, use a mixin with `extends=<targetType>`. Unusual inheritance chains break edition interfaces in unpredictable ways.
117
+
118
+ **W9 — Hardcoded link URLs in views**
119
+ Check: any `.server.tsx`, `.client.tsx`, or template file containing a literal `href="http`, `href="/"`, or `href="/en/` (except in edit-mode chrome helpers). Also flag plain string `src="http` for non-bundled assets. Also flag any content data with `j:linkType: "external"` pointing to a path that looks like an internal Jahia URL (e.g. `/sites/`, `/cms/`, `/en/`).
120
+ Fix: **All navigable URLs must come from contributed content.** Use `j:linkType`/`j:linknode`/`j:url` props for editorial links, `buildNodeUrl(node)` for JCR node links.
121
+ 🚫 **NEVER use `j:linkType: "external"` to link to an internal Jahia page** — use `"internal"` + `j:linknode`. An external URL pointing internally breaks on environment changes, language switches, live/preview workspace toggling, and vanity URL rewrites. If no target page exists yet, omit the link; do not substitute an external workaround.
122
+
123
+ ---
124
+
125
+ ### 🔵 SUGGESTION — Quality improvements
126
+
127
+ **S1 — Non-semantic HTML**
128
+ Check: views that use `<div>` where `<article>`, `<section>`, `<nav>`, `<header>`, or `<footer>` would be more appropriate.
129
+ Fix: use semantic HTML for better accessibility and SEO.
130
+
131
+ **S2 — Images without meaningful alt text**
132
+ Check: `<img>` tags with `alt=""` or no `alt` attribute (unless there's a comment saying it's decorative).
133
+ Fix: add descriptive alt text. Decorative images should have `alt=""` with a comment.
134
+
135
+ **S3 — Accessibility violations (axe-core audit)**
136
+ Check: run `/jahia-dev-accessibility` against all live pages. A clean module has zero `critical` or `serious` violations.
137
+ Common issues in Jahia modules:
138
+ - `color-contrast`: hardcoded colours with insufficient contrast ratio — check with https://webaim.org/resources/contrastchecker/
139
+ - `image-alt`: `<img>` missing a meaningful `alt` prop sourced from CND
140
+ - `button-name`: icon-only `<button>` or `<a>` without `aria-label`
141
+ - `landmark-one-main`: page template missing a `<main>` wrapper
142
+ - `page-has-heading-one`: no `<h1>` rendered on any page
143
+ - `heading-order`: skipped heading levels between components (e.g. h1 → h3)
144
+ - `html-has-lang`: template not setting `lang` via `useServerContext().currentLanguage`
145
+ - `focus-visible` suppressed: global `* { outline: none }` in CSS kills keyboard navigation
146
+
147
+ Fix: identify each violating component by matching the axe target selector to a `.server.tsx` file, apply the fix, rebuild, and re-run the audit.
148
+
149
+ **S4 — Types using `any`**
150
+ Check: `types.ts` files or view files using TypeScript `any`.
151
+ Fix: use `JCRNodeWrapper` for node references, `string` / `number` / `boolean` for primitives.
152
+
153
+ **S5 — Bare `<Area>` without a `nodeType`**
154
+ Check: page templates using `<Area name="..." />` without a `nodeType` prop.
155
+ Fix: create a custom area type with `jmix:list`, `jmix:hiddenType`, and `orderable`, and reference it with `nodeType="namespace:areaType"`.
156
+
157
+ **S6 — `mix:title` inherited but `jcr:title` not in `types.ts`**
158
+ Check: CND types that extend `mix:title` but whose `types.ts` doesn't include `"jcr:title": string`.
159
+ Fix: add `"jcr:title"?: string` to the Props type.
160
+
161
+ **S7 — Missing `.properties` file entries or icon for new content types**
162
+ Check: for each node type found in `definition.cnd` files, verify that `settings/resources/<module>.properties` has a label (`cndNamespace_typeName=...`) and a corresponding icon exists at `settings/content-types-icons/<cndNamespace>_<typeName>.png`. The prefix must be the CND namespace (e.g. `ns_heroSection.png`), **not** the module name with hyphens (e.g. `my-module_heroSection.png` is wrong — the archetype generates wrong names that must be manually corrected).
163
+ Fix: add labels (and optionally `ui.tooltip` for fields) to the properties files. Rename any icons that use the module name with hyphens to use the CND namespace. Create a 32×32 PNG icon (free source: [flaticon.com](https://www.flaticon.com/)). Without these, editors see raw technical names and blank icon squares in the content picker.
164
+
165
+ **S8 — Hardcoded user-visible strings in views**
166
+ Check: `.server.tsx` / `.client.tsx` files with JSX string literals that are not coming from props or i18n functions (e.g. `<p>Learn more</p>`, `<button>Submit</button>`).
167
+ Fix: move UI labels to `settings/locales/en.json` and `fr.json` and resolve them with `useTranslation()`. Hardcoded strings break multilingual sites.
168
+
169
+ **S9 — Content list queries not using `ISDESCENDANTNODE` (non-recursive)**
170
+ Check: JCR-SQL2 queries using `jcr:path LIKE '/sites/.../content/%'` or a fixed path to limit results, instead of `ISDESCENDANTNODE(node, '/sites/.../content')`.
171
+ Fix: use `ISDESCENDANTNODE` to ensure queries work correctly even if editors reorganize content into sub-folders.
172
+
173
+ **S10 — No escape hatch when using a custom component mixin**
174
+ Check: a custom section type that restricts children to a custom mixin (e.g. `+ * (namespacemix:component)`) but the module provides no "content stack" escape hatch type that itself accepts `jmix:droppableContent`.
175
+ Fix: add a `namespace:contentStack > jnt:content, namespacemix:component + * (jmix:droppableContent)` type so power editors can still add arbitrary content when needed.
176
+
177
+ **S11 — Scaffold/boilerplate components still present**
178
+ Check: components under `src/components/Hello/` (or any other archetype-generated boilerplate) that are no longer referenced in `settings/import.xml` and no longer used by any view or page template.
179
+ ```bash
180
+ # Check if Hello components are still referenced anywhere
181
+ grep -r "helloWorld\|helloCard\|Hello/" src/templates/ settings/ --include="*.tsx" --include="*.xml" --include="*.cnd"
182
+ ```
183
+ Fix: once `import.xml` no longer provisions Hello World content and no template uses them, delete the entire `src/components/Hello/` directory, remove their entries from `.properties` files, and delete their icons from `settings/content-types-icons/`. Keeping dead components inflates the content picker and confuses editors.
184
+
185
+ ---
186
+
187
+ ## Step 4 — Report results
188
+
189
+ Format the output as:
190
+
191
+ ```
192
+ ## Jahia Module Review — <module name>
193
+
194
+ ### 🔴 Critical (N issues)
195
+ [C1] src/components/Hero/Section/definition.cnd — `jmix:droppableContent` used directly
196
+ Fix: extend `namespacemix:component` instead
197
+
198
+ ### 🟡 Warnings (N issues)
199
+ ...
200
+
201
+ ### 🔵 Suggestions (N issues)
202
+ ...
203
+
204
+ ### ✅ Summary
205
+ - N critical issues (must fix before shipping)
206
+ - N warnings (fix before sharing with editors)
207
+ - N suggestions (improve when time allows)
208
+ ```
209
+
210
+ If no issues found in a category, print `✅ None`.
211
+
212
+ ---
213
+
214
+ ## Step 5 — Ask to fix
215
+
216
+ After the report, ask: **"Would you like me to fix any of these issues?"**
217
+
218
+ If yes, fix them — use the guidance from the relevant skill (`jahia-dev-define-content-type`, `jahia-dev-create-view`) and run `yarn build && yarn jahia-deploy` to push changes.
219
+
220
+ ---
221
+
222
+ ## References
223
+
224
+ - Native Jahia mixins & node types: https://github.com/Jahia/jahia/tree/master/war/src/main/webapp/WEB-INF/etc/repository/nodetypes
225
+ - Integration best practices: https://github.com/Jahia/gautier-braindump/blob/main/articles/integration-best-practices/README.md
226
+ - Developer training: https://github.com/Jahia/developer-training/blob/main/js-training/slides.md
227
+
228
+ > If a check result is uncertain (e.g. "does this mixin exist?"), fetch the nodetypes directory above before reporting.