@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,236 @@
1
+ ---
2
+ name: jahia-content-move-content
3
+ description: Moves and reorganizes JCR content nodes in Jahia. Use when asked to restructure content folders, nest flat content into sections, rename or move nodes, or tidy up a content tree.
4
+ ---
5
+
6
+ # Skill: jahia-content-move-content
7
+
8
+ Reorganizes the JCR content tree — moving nodes into sub-folders, renaming them, and reordering them — using the Jahia GraphQL API.
9
+
10
+ ---
11
+
12
+ ## Prerequisites
13
+
14
+ - Jahia running at `http://localhost:8080`
15
+ - Credentials: `root` / `root1234` (default)
16
+ - GraphQL endpoint: `http://localhost:8080/modules/graphql`
17
+
18
+ **Always include both auth flags:**
19
+ ```bash
20
+ curl -s -u root:root1234 \
21
+ -H "Content-Type: application/json" \
22
+ -H "Origin: http://localhost:8080" \
23
+ -X POST http://localhost:8080/modules/graphql \
24
+ -d '{"query": "..."}'
25
+ ```
26
+
27
+ > ⚠️ The `Origin` header is **required** — omitting it returns `Permission denied`.
28
+
29
+ ---
30
+
31
+ ## Step 1 — Audit the current content tree
32
+
33
+ Before moving anything, map out what exists and where:
34
+
35
+ ```bash
36
+ # List all content folders and their direct children
37
+ curl -s -u root:root1234 \
38
+ -H "Content-Type: application/json" \
39
+ -H "Origin: http://localhost:8080" \
40
+ -X POST http://localhost:8080/modules/graphql \
41
+ -d '{
42
+ "query": "{ jcr { nodeByPath(path: \"/sites/mySite/contents\") { descendants(fieldFilter: {filters: [{fieldName: \"primaryNodeType.name\", evaluation: EQUAL, value: \"jnt:contentFolder\"}]}) { nodes { path name } } } } }"
43
+ }'
44
+ ```
45
+
46
+ Or use a JCR-SQL2 query for a flat list of all content items:
47
+
48
+ ```bash
49
+ curl -s -u root:root1234 \
50
+ -H "Content-Type: application/json" \
51
+ -H "Origin: http://localhost:8080" \
52
+ -X POST http://localhost:8080/modules/graphql \
53
+ -d '{
54
+ "query": "{ jcr { nodesByQuery(query: \"SELECT * FROM [jnt:content] WHERE ISDESCENDANTNODE(\u0027/sites/mySite/contents\u0027) ORDER BY [jcr:path] ASC\", queryLanguage: SQL2) { nodes { path primaryNodeType { name } } } } }"
55
+ }'
56
+ ```
57
+
58
+ ---
59
+
60
+ ## Step 2 — Create target sub-folders
61
+
62
+ If destination folders don't exist yet, create them with `mix:title` for a proper display label:
63
+
64
+ ```bash
65
+ # Create a sub-folder
66
+ curl -s -u root:root1234 \
67
+ -H "Content-Type: application/json" \
68
+ -H "Origin: http://localhost:8080" \
69
+ -X POST http://localhost:8080/modules/graphql \
70
+ -d '{
71
+ "query": "mutation { jcr { addNode(parentPathOrId: \"/sites/mySite/contents/articles\", name: \"getting-started\", primaryNodeType: \"jnt:contentFolder\") { node { path } } } }"
72
+ }'
73
+
74
+ # Set a human-readable title on the folder
75
+ curl -s -u root:root1234 \
76
+ -H "Content-Type: application/json" \
77
+ -H "Origin: http://localhost:8080" \
78
+ -X POST http://localhost:8080/modules/graphql \
79
+ -d '{
80
+ "query": "mutation { jcr { mutateNode(pathOrId: \"/sites/mySite/contents/articles/getting-started\") { addMixins(mixins: [\"mix:title\"]) mutateProperty(name: \"jcr:title\") { setValue(language: \"en\", value: \"Getting Started\") } } } }"
81
+ }'
82
+ ```
83
+
84
+ ---
85
+
86
+ ## Step 3 — Move a node
87
+
88
+ Use `move` on a `mutateNode` to relocate a node to a new parent. The node keeps its name:
89
+
90
+ ```bash
91
+ curl -s -u root:root1234 \
92
+ -H "Content-Type: application/json" \
93
+ -H "Origin: http://localhost:8080" \
94
+ -X POST http://localhost:8080/modules/graphql \
95
+ -d '{
96
+ "query": "mutation { jcr { mutateNode(pathOrId: \"/sites/mySite/contents/articles/my-article\") { move(parentPathOrId: \"/sites/mySite/contents/articles/getting-started\") } } }"
97
+ }'
98
+ ```
99
+
100
+ > ⚠️ `move` does **not** support a `name` argument — use `rename` separately if needed.
101
+
102
+ ### Rename a node in place
103
+
104
+ ```bash
105
+ curl -s -u root:root1234 \
106
+ -H "Content-Type: application/json" \
107
+ -H "Origin: http://localhost:8080" \
108
+ -X POST http://localhost:8080/modules/graphql \
109
+ -d '{
110
+ "query": "mutation { jcr { mutateNode(pathOrId: \"/sites/mySite/contents/articles\") { rename(name: \"reference-pages\") } } }"
111
+ }'
112
+ ```
113
+
114
+ To move **and** rename, call `move` then `rename` in sequence, or combine in one mutation:
115
+
116
+ ```graphql
117
+ mutation {
118
+ jcr {
119
+ mutateNode(pathOrId: "/sites/mySite/contents/articles/old-name") {
120
+ move(parentPathOrId: "/sites/mySite/contents/articles/getting-started")
121
+ }
122
+ rename: mutateNode(pathOrId: "/sites/mySite/contents/articles/getting-started/old-name") {
123
+ rename(name: "new-name")
124
+ }
125
+ }
126
+ }
127
+ ```
128
+
129
+ ### Batch move with Python
130
+
131
+ ```python
132
+ import subprocess, json
133
+
134
+ def gql(q):
135
+ r = subprocess.run(["curl","-s","-u","root:root1234",
136
+ "-H","Origin: http://localhost:8080",
137
+ "-H","Content-Type: application/json",
138
+ "-X","POST","http://localhost:8080/modules/graphql",
139
+ "-d", json.dumps({"query": q})], capture_output=True, text=True)
140
+ d = json.loads(r.stdout)
141
+ if "errors" in d: print("ERR:", d["errors"][0]["message"][:80])
142
+ return d
143
+
144
+ moves = [
145
+ ("/sites/mySite/contents/articles/getting-started",
146
+ "/sites/mySite/contents/articles/core-concepts"),
147
+ ("/sites/mySite/contents/articles/graphql-api",
148
+ "/sites/mySite/contents/articles/api-reference"),
149
+ ]
150
+
151
+ for src, dest in moves:
152
+ r = gql(f'mutation {{ jcr {{ mutateNode(pathOrId: "{src}") {{ move(parentPathOrId: "{dest}") }} }} }}')
153
+ ok = "errors" not in r
154
+ print(f" {'✓' if ok else '✗'} {src.split('/')[-1]} → {dest.split('/')[-1]}")
155
+ ```
156
+
157
+ ---
158
+
159
+ ## Step 4 — Reorder siblings
160
+
161
+ To control the display order within a folder, use `reorder` after moving:
162
+
163
+ ```bash
164
+ curl -s -u root:root1234 \
165
+ -H "Content-Type: application/json" \
166
+ -H "Origin: http://localhost:8080" \
167
+ -X POST http://localhost:8080/modules/graphql \
168
+ -d '{
169
+ "query": "mutation { jcr { mutateNode(pathOrId: \"/sites/mySite/contents/articles/intro\") { reorder(reorderNodes: {moveBeforeOrAfter: BEFORE, target: \"advanced\"}) } } }"
170
+ }'
171
+ ```
172
+
173
+ ---
174
+
175
+ ## Step 5 — Publish after moving
176
+
177
+ Moving a node unpublishes it in the live workspace. Always republish after reorganizing:
178
+
179
+ ```bash
180
+ # Publish a single node
181
+ curl -s -u root:root1234 \
182
+ -H "Content-Type: application/json" \
183
+ -H "Origin: http://localhost:8080" \
184
+ -X POST http://localhost:8080/modules/graphql \
185
+ -d '{
186
+ "query": "mutation { jcr { mutateNode(pathOrId: \"/sites/mySite/contents/articles/getting-started/my-article\") { publish(languages: [\"en\"]) } } }"
187
+ }'
188
+
189
+ # Publish everything under a folder at once
190
+ curl -s -u root:root1234 \
191
+ -H "Content-Type: application/json" \
192
+ -H "Origin: http://localhost:8080" \
193
+ -X POST http://localhost:8080/modules/graphql \
194
+ -d '{
195
+ "query": "mutation { jcr { mutateNodesByQuery(query: \"SELECT * FROM [jnt:content] WHERE ISDESCENDANTNODE(\u0027/sites/mySite/contents\u0027)\", queryLanguage: SQL2) { publish(languages: [\"en\"]) } } }"
196
+ }'
197
+ ```
198
+
199
+ ---
200
+
201
+ ## Step 6 — Verify
202
+
203
+ ```bash
204
+ curl -s -u root:root1234 \
205
+ -H "Content-Type: application/json" \
206
+ -H "Origin: http://localhost:8080" \
207
+ -X POST http://localhost:8080/modules/graphql \
208
+ -d '{
209
+ "query": "{ jcr { nodesByQuery(query: \"SELECT * FROM [jnt:content] WHERE ISDESCENDANTNODE(\u0027/sites/mySite/contents\u0027)\", queryLanguage: SQL2) { nodes { path } } } }"
210
+ }'
211
+ ```
212
+
213
+ ---
214
+
215
+ ## Common errors
216
+
217
+ | Error | Cause | Fix |
218
+ |-------|-------|-----|
219
+ | `Permission denied` | Missing `Origin` header | Add `-H "Origin: http://localhost:8080"` |
220
+ | `ItemExistsException` | A node with that name already exists at the destination | Choose a different name or use `rename` after moving |
221
+ | `PathNotFoundException` | Source or destination path doesn't exist | Verify paths with `nodeByPath` first |
222
+ | `move` returns `null` | Node was already at that location | Verify the current path first |
223
+ | Content disappears from live after move | Move unpublishes — normal JCR behaviour | Run `publish` after every move |
224
+
225
+ ---
226
+
227
+ ## Workflow summary
228
+
229
+ ```
230
+ 1. Audit → list current paths and types
231
+ 2. Plan → map old paths to new paths/folders
232
+ 3. Create → addNode for any new folders needed
233
+ 4. Move → mutateNode { move(...) } for each item
234
+ 5. Publish → mutateNodesByQuery { publish(...) } for all affected content
235
+ 6. Verify → query back and confirm structure
236
+ ```
@@ -0,0 +1,144 @@
1
+ ---
2
+ name: jahia-content-query-content
3
+ description: Queries JCR content from a running Jahia instance via the GraphQL API. Use when asked to list, inspect, or retrieve content nodes, check what content exists, or audit a site's content.
4
+ ---
5
+
6
+ # Skill: jahia-content-query-content
7
+
8
+ Retrieves JCR content from a running Jahia instance using the GraphQL JCR query API.
9
+
10
+ ---
11
+
12
+ ## Prerequisites
13
+
14
+ - Jahia running at `http://localhost:8080`
15
+ - Credentials: `root` / `root1234` (default)
16
+ - GraphQL endpoint: `http://localhost:8080/modules/graphql`
17
+
18
+ **Auth pattern — always use both flags:**
19
+ ```bash
20
+ curl -u root:root1234 \
21
+ -H "Content-Type: application/json" \
22
+ -H "Origin: http://localhost:8080" \
23
+ ...
24
+ ```
25
+
26
+ > ⚠️ The `Origin: http://localhost:8080` header is **required**. Requests without it return `Permission denied` even with correct credentials.
27
+
28
+ ---
29
+
30
+ ## Query patterns
31
+
32
+ ### 1 — Get a node by path
33
+
34
+ ```bash
35
+ curl -s -u root:root1234 \
36
+ -H "Content-Type: application/json" \
37
+ -H "Origin: http://localhost:8080" \
38
+ -X POST http://localhost:8080/modules/graphql \
39
+ -d '{
40
+ "query": "{ jcr { nodeByPath(path: \"/sites/mySite/contents/articles\") { children { nodes { name path primaryNodeType { name } } } } } }"
41
+ }'
42
+ ```
43
+
44
+ ### 2 — Query by node type (JCR-SQL2)
45
+
46
+ ```bash
47
+ curl -s -u root:root1234 \
48
+ -H "Content-Type: application/json" \
49
+ -H "Origin: http://localhost:8080" \
50
+ -X POST http://localhost:8080/modules/graphql \
51
+ -d '{
52
+ "query": "{ jcr { nodesByQuery(query: \"SELECT * FROM [namespace:typeName] WHERE ISDESCENDANTNODE(\u0027/sites/mySite\u0027) ORDER BY [jcr:created] DESC\", queryLanguage: SQL2) { nodes { name path uuid } } } }"
53
+ }'
54
+ ```
55
+
56
+ ### 3 — Read node properties (including i18n)
57
+
58
+ ```bash
59
+ curl -s -u root:root1234 \
60
+ -H "Content-Type: application/json" \
61
+ -H "Origin: http://localhost:8080" \
62
+ -X POST http://localhost:8080/modules/graphql \
63
+ -d '{
64
+ "query": "{ jcr { nodeByPath(path: \"/sites/mySite/contents/articles/my-article\") { name uuid properties(language: \"en\") { name value } } } }"
65
+ }'
66
+ ```
67
+
68
+ > ⚠️ **i18n properties require `language:` in the `properties()` call.** Without it, i18n properties are returned empty.
69
+
70
+ ### 4 — Filter by property value
71
+
72
+ ```bash
73
+ curl -s -u root:root1234 \
74
+ -H "Content-Type: application/json" \
75
+ -H "Origin: http://localhost:8080" \
76
+ -X POST http://localhost:8080/modules/graphql \
77
+ -d '{
78
+ "query": "{ jcr { nodesByQuery(query: \"SELECT * FROM [namespace:article] WHERE [product] = \u0027jahia\u0027 AND ISDESCENDANTNODE(\u0027/sites/mySite\u0027)\", queryLanguage: SQL2) { nodes { name path } } } }"
79
+ }'
80
+ ```
81
+
82
+ ### 5 — List all sites
83
+
84
+ ```bash
85
+ curl -s -u root:root1234 \
86
+ -H "Content-Type: application/json" \
87
+ -H "Origin: http://localhost:8080" \
88
+ -X POST http://localhost:8080/modules/graphql \
89
+ -d '{
90
+ "query": "{ jcr { nodesByQuery(query: \"SELECT * FROM [jnt:virtualsite] WHERE ISCHILDNODE(\u0027/sites\u0027)\", queryLanguage: SQL2) { nodes { name path } } } }"
91
+ }'
92
+ ```
93
+
94
+ ### 6 — Check publication status
95
+
96
+ ```bash
97
+ curl -s -u root:root1234 \
98
+ -H "Content-Type: application/json" \
99
+ -H "Origin: http://localhost:8080" \
100
+ -X POST http://localhost:8080/modules/graphql \
101
+ -d '{
102
+ "query": "{ jcr { nodeByPath(path: \"/sites/mySite/contents/articles/my-article\") { name aggregatedPublicationInfo(language: \"en\") { publicationStatus } } } }"
103
+ }'
104
+ ```
105
+
106
+ Publication status values: `PUBLISHED`, `MODIFIED`, `NOT_PUBLISHED`, `UNPUBLISHED`, `MARKED_FOR_DELETION`
107
+
108
+ ---
109
+
110
+ ## JCR-SQL2 quick reference
111
+
112
+ ```sql
113
+ -- All nodes of a type under a path
114
+ SELECT * FROM [ns:typeName] WHERE ISDESCENDANTNODE('/sites/mySite')
115
+
116
+ -- Direct children only
117
+ SELECT * FROM [ns:typeName] WHERE ISCHILDNODE('/sites/mySite/contents/articles')
118
+
119
+ -- Filter by property
120
+ SELECT * FROM [ns:typeName] WHERE [propName] = 'value'
121
+
122
+ -- Order by date (newest first)
123
+ SELECT * FROM [ns:typeName] WHERE ISDESCENDANTNODE('/sites/mySite') ORDER BY [jcr:created] DESC
124
+
125
+ -- Limit results (pass limit/offset as query params)
126
+ -- nodesByQuery(query: "...", queryLanguage: SQL2, limit: 10, offset: 0)
127
+ ```
128
+
129
+ ---
130
+
131
+ ## Common errors
132
+
133
+ | Error | Cause | Fix |
134
+ |-------|-------|-----|
135
+ | `Permission denied` | Missing `Origin` header | Add `-H "Origin: http://localhost:8080"` |
136
+ | i18n properties returned empty | `language:` not specified | Add `language: "en"` to `properties()` call |
137
+ | Node not found | Wrong path or node doesn't exist | Verify path with `nodeByPath(path: "/sites")` first |
138
+
139
+ ---
140
+
141
+ ## References
142
+
143
+ - Jahia GraphQL API: `http://localhost:8080/modules/graphql` (open in browser for interactive playground)
144
+ - JCR-SQL2 language spec: https://docs.adobe.com/content/docs/en/spec/jcr/2.0/6_Query.html
@@ -0,0 +1,297 @@
1
+ ---
2
+ name: jahia-content-translate-content
3
+ description: Adds language support to a Jahia site and translates existing content nodes. Use when asked to add a new language, fill in missing translations, or audit which content lacks i18n values.
4
+ ---
5
+
6
+ # Skill: jahia-content-translate-content
7
+
8
+ Adds languages to a Jahia site and populates i18n properties on existing content nodes via the GraphQL API.
9
+
10
+ ---
11
+
12
+ ## Prerequisites
13
+
14
+ - Jahia running at `http://localhost:8080`
15
+ - Credentials: `root` / `root1234` (default)
16
+ - GraphQL endpoint: `http://localhost:8080/modules/graphql`
17
+
18
+ **Always include both auth flags:**
19
+ ```bash
20
+ curl -s -u root:root1234 \
21
+ -H "Content-Type: application/json" \
22
+ -H "Origin: http://localhost:8080" \
23
+ -X POST http://localhost:8080/modules/graphql \
24
+ -d '{"query": "..."}'
25
+ ```
26
+
27
+ > ⚠️ The `Origin` header is **required** — omitting it returns `Permission denied`.
28
+
29
+ ---
30
+
31
+ ## Step 1 — Enable the new language on the site
32
+
33
+ Before creating or querying translations, the language must be declared on the site node.
34
+
35
+ ```bash
36
+ # Check currently enabled languages
37
+ curl -s -u root:root1234 \
38
+ -H "Content-Type: application/json" \
39
+ -H "Origin: http://localhost:8080" \
40
+ -X POST http://localhost:8080/modules/graphql \
41
+ -d '{
42
+ "query": "{ jcr { nodeByPath(path: \"/sites/mySite\") { properties(names: [\"j:languages\",\"j:defaultLanguage\"]) { name values } } } }"
43
+ }'
44
+
45
+ # Add a language (e.g. "fr") — use setPropertiesBatch with the full new list
46
+ curl -s -u root:root1234 \
47
+ -H "Content-Type: application/json" \
48
+ -H "Origin: http://localhost:8080" \
49
+ -X POST http://localhost:8080/modules/graphql \
50
+ -d '{
51
+ "query": "mutation { jcr { mutateNode(pathOrId: \"/sites/mySite\") { setPropertiesBatch(properties: [{name: \"j:languages\", values: [\"en\", \"fr\"]}]) { path } } } }"
52
+ }'
53
+ ```
54
+
55
+ > ⚠️ `j:languages` is a multi-valued property — always pass the **complete** list of languages, not just the new one. Passing only `["fr"]` would remove `"en"`.
56
+
57
+ ---
58
+
59
+ ## Step 2 — Audit content missing translations
60
+
61
+ Query all i18n-bearing nodes and inspect which ones have empty values for the target language:
62
+
63
+ ```bash
64
+ # Find all content nodes under /sites/mySite/contents
65
+ curl -s -u root:root1234 \
66
+ -H "Content-Type: application/json" \
67
+ -H "Origin: http://localhost:8080" \
68
+ -X POST http://localhost:8080/modules/graphql \
69
+ -d '{
70
+ "query": "{ jcr { nodesByQuery(query: \"SELECT * FROM [jmix:i18n] WHERE ISDESCENDANTNODE(\u0027/sites/mySite/contents\u0027) ORDER BY [jcr:path] ASC\", queryLanguage: SQL2) { nodes { path primaryNodeType { name } properties(language: \"fr\") { name value } } } } }"
71
+ }'
72
+ ```
73
+
74
+ Or query a specific content type:
75
+
76
+ ```bash
77
+ curl -s -u root:root1234 \
78
+ -H "Content-Type: application/json" \
79
+ -H "Origin: http://localhost:8080" \
80
+ -X POST http://localhost:8080/modules/graphql \
81
+ -d '{
82
+ "query": "{ jcr { nodesByQuery(query: \"SELECT * FROM [namespace:article] WHERE ISDESCENDANTNODE(\u0027/sites/mySite/contents\u0027)\", queryLanguage: SQL2) { nodes { path properties(language: \"fr\") { name value } } } } }"
83
+ }'
84
+ ```
85
+
86
+ Look for nodes where i18n fields (`jcr:title`, `body`, etc.) have empty or null `value`.
87
+
88
+ ---
89
+
90
+ ## Step 3 — Set i18n properties
91
+
92
+ ### Single node
93
+
94
+ ```bash
95
+ curl -s -u root:root1234 \
96
+ -H "Content-Type: application/json" \
97
+ -H "Origin: http://localhost:8080" \
98
+ -X POST http://localhost:8080/modules/graphql \
99
+ -d '{
100
+ "query": "mutation { jcr { mutateNode(pathOrId: \"/sites/mySite/contents/articles/my-article\") { setPropertiesBatch(properties: [{name: \"jcr:title\", value: \"Mon article\", language: \"fr\"}, {name: \"body\", value: \"<p>Contenu ici</p>\", language: \"fr\"}]) { path } } } }"
101
+ }'
102
+ ```
103
+
104
+ > ⚠️ Use `setPropertiesBatch` (plural), not `setProperty` (singular — does not exist in the Jahia GraphQL API).
105
+
106
+ ### Critical ordering rule
107
+
108
+ When a content type has **mandatory** i18n fields (other than `jcr:title`), set those **before** `jcr:title`. Setting `jcr:title` first can trigger a constraint check before all mandatory fields are present.
109
+
110
+ The safe pattern — set all mandatory i18n fields in a single `setPropertiesBatch` call:
111
+
112
+ ```bash
113
+ curl -s -u root:root1234 \
114
+ -H "Content-Type: application/json" \
115
+ -H "Origin: http://localhost:8080" \
116
+ -X POST http://localhost:8080/modules/graphql \
117
+ -d '{
118
+ "query": "mutation { jcr { mutateNode(pathOrId: \"/sites/mySite/contents/articles/my-article\") { setPropertiesBatch(properties: [{name: \"body\", value: \"<p>Contenu ici</p>\", language: \"fr\"}, {name: \"jcr:title\", value: \"Mon article\", language: \"fr\"}]) { path } } } }"
119
+ }'
120
+ ```
121
+
122
+ ---
123
+
124
+ ## Step 4 — Bulk translation with Python
125
+
126
+ For translating many nodes at once:
127
+
128
+ ```python
129
+ import json
130
+ from urllib.request import Request, urlopen
131
+
132
+ JAHIA = "http://localhost:8080"
133
+ AUTH = ("root", "root1234")
134
+
135
+ import base64
136
+ token = base64.b64encode(f"{AUTH[0]}:{AUTH[1]}".encode()).decode()
137
+ HEADERS = {
138
+ "Content-Type": "application/json",
139
+ "Origin": JAHIA,
140
+ "Authorization": f"Basic {token}",
141
+ }
142
+
143
+ def gql(query):
144
+ body = json.dumps({"query": query}).encode()
145
+ req = Request(f"{JAHIA}/modules/graphql", data=body, headers=HEADERS, method="POST")
146
+ with urlopen(req) as r:
147
+ d = json.loads(r.read())
148
+ if "errors" in d:
149
+ print("ERR:", d["errors"][0]["message"][:120])
150
+ return d
151
+
152
+ # 1. List all articles missing French title
153
+ result = gql(
154
+ '{ jcr { nodesByQuery(query: "SELECT * FROM [namespace:article] '
155
+ "WHERE ISDESCENDANTNODE('/sites/mySite/contents') "
156
+ 'ORDER BY [jcr:path] ASC", queryLanguage: SQL2) '
157
+ '{ nodes { path properties(language: "fr") { name value } } } } }'
158
+ )
159
+
160
+ nodes = result["data"]["jcr"]["nodesByQuery"]["nodes"]
161
+ missing_fr = [
162
+ n["path"]
163
+ for n in nodes
164
+ if not any(p["name"] == "jcr:title" and p["value"] for p in n["properties"])
165
+ ]
166
+
167
+ # 2. Set French translations (replace with actual translated values)
168
+ translations = {
169
+ "/sites/mySite/contents/articles/article-1": ("Titre FR 1", "<p>Corps FR 1</p>"),
170
+ "/sites/mySite/contents/articles/article-2": ("Titre FR 2", "<p>Corps FR 2</p>"),
171
+ }
172
+
173
+ for path, (title, body) in translations.items():
174
+ r = gql(
175
+ f'mutation {{ jcr {{ mutateNode(pathOrId: "{path}") {{'
176
+ f' setPropertiesBatch(properties: ['
177
+ f' {{name: "body", value: {json.dumps(body)}, language: "fr"}},'
178
+ f' {{name: "jcr:title", value: {json.dumps(title)}, language: "fr"}}'
179
+ f' ]) {{ path }} }} }} }}'
180
+ )
181
+ ok = "errors" not in r
182
+ print(f" {'✓' if ok else '✗'} {path.split('/')[-1]}")
183
+ ```
184
+
185
+ ---
186
+
187
+ ## Step 5 — Choicelist fields and view-level translations
188
+
189
+ ### Choicelist fields should NOT be i18n
190
+
191
+ If a CND property uses a choicelist (e.g. `category`, `status`), its stored values are language-agnostic keys like `"featured"` or `"draft"`. The display label is translated **in the view**, not in the JCR.
192
+
193
+ ```tsx
194
+ // In the view component — translate the stored key to a display label
195
+ const STATUS_LABELS: Record<string, Record<string, string>> = {
196
+ en: { featured: "Featured", draft: "Draft" },
197
+ fr: { featured: "En vedette", draft: "Brouillon" },
198
+ };
199
+
200
+ const lang = renderContext.getMainResourceLocale().getLanguage();
201
+ const statusKey = properties.status as string;
202
+ const statusLabel = STATUS_LABELS[lang]?.[statusKey] ?? statusKey;
203
+ ```
204
+
205
+ Do **not** add `i18n` to the CND property for choicelists — the key should be the same in all languages.
206
+
207
+ ### Hardcoded UI strings
208
+
209
+ View-level strings that are not stored in JCR (button labels, headings, placeholder text) need locale-keyed label maps in the component:
210
+
211
+ ```tsx
212
+ const LABELS = {
213
+ en: { readMore: "Read more", by: "By" },
214
+ fr: { readMore: "Lire la suite", by: "Par" },
215
+ };
216
+
217
+ const t = LABELS[renderContext.getMainResourceLocale().getLanguage()] ?? LABELS.en;
218
+ // Usage: <a>{t.readMore}</a>
219
+ ```
220
+
221
+ ---
222
+
223
+ ## Step 6 — Clean up orphaned translation nodes
224
+
225
+ When you remove the `i18n` flag from a CND property (or delete a language from the site), orphaned `j:translation_XX` child nodes may remain. Inspect and remove them if needed:
226
+
227
+ ```bash
228
+ # Find translation sub-nodes for a content node
229
+ curl -s -u root:root1234 \
230
+ -H "Content-Type: application/json" \
231
+ -H "Origin: http://localhost:8080" \
232
+ -X POST http://localhost:8080/modules/graphql \
233
+ -d '{
234
+ "query": "{ jcr { nodeByPath(path: \"/sites/mySite/contents/articles/my-article\") { children { nodes { name primaryNodeType { name } } } } } }"
235
+ }'
236
+
237
+ # Delete an orphaned translation node
238
+ curl -s -u root:root1234 \
239
+ -H "Content-Type: application/json" \
240
+ -H "Origin: http://localhost:8080" \
241
+ -X POST http://localhost:8080/modules/graphql \
242
+ -d '{
243
+ "query": "mutation { jcr { deleteNode(pathOrId: \"/sites/mySite/contents/articles/my-article/j:translation_fr\") }"
244
+ }'
245
+ ```
246
+
247
+ ---
248
+
249
+ ## Step 7 — Publish translations
250
+
251
+ After setting i18n properties, republish to make them live:
252
+
253
+ ```bash
254
+ # Publish a single node for a specific language
255
+ curl -s -u root:root1234 \
256
+ -H "Content-Type: application/json" \
257
+ -H "Origin: http://localhost:8080" \
258
+ -X POST http://localhost:8080/modules/graphql \
259
+ -d '{
260
+ "query": "mutation { jcr { mutateNode(pathOrId: \"/sites/mySite/contents/articles/my-article\") { publish(languages: [\"fr\"]) } } }"
261
+ }'
262
+
263
+ # Publish all articles in both languages
264
+ curl -s -u root:root1234 \
265
+ -H "Content-Type: application/json" \
266
+ -H "Origin: http://localhost:8080" \
267
+ -X POST http://localhost:8080/modules/graphql \
268
+ -d '{
269
+ "query": "mutation { jcr { mutateNodesByQuery(query: \"SELECT * FROM [namespace:article] WHERE ISDESCENDANTNODE(\u0027/sites/mySite/contents\u0027)\", queryLanguage: SQL2) { publish(languages: [\"en\", \"fr\"]) } } }"
270
+ }'
271
+ ```
272
+
273
+ ---
274
+
275
+ ## Common errors
276
+
277
+ | Error | Cause | Fix |
278
+ |-------|-------|-----|
279
+ | `Permission denied` | Missing `Origin` header | Add `-H "Origin: http://localhost:8080"` |
280
+ | i18n property returned empty after set | Missing `language:` in `properties()` query | Add `language: "fr"` to read call |
281
+ | `ConstraintViolationException` on title set | Mandatory i18n field not set first | Use `setPropertiesBatch` with all mandatory fields in one call |
282
+ | Language not appearing in site | `j:languages` mutation only had the new language | Pass the full list: `["en", "fr"]` |
283
+ | Choicelist key changed per language | Property incorrectly declared `i18n` in CND | Remove `i18n` from the CND property; translate keys in the view |
284
+
285
+ ---
286
+
287
+ ## Workflow summary
288
+
289
+ ```
290
+ 1. Enable language → mutateNode j:languages with full list
291
+ 2. Audit → nodesByQuery with properties(language: "XX") to find gaps
292
+ 3. Translate → setPropertiesBatch with language: "XX" for each i18n field
293
+ 4. View strings → add locale-keyed label maps in .server.tsx
294
+ 5. Choicelists → translate keys in the view, not the JCR
295
+ 6. Publish → publish(languages: ["XX"]) for all affected nodes
296
+ 7. Verify → query back with language: "XX" to confirm values
297
+ ```