@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.
- package/README.md +48 -0
- package/dist/claude/.claude/rules/jahia.md +76 -0
- package/dist/claude/.claude/skills/jahia/SKILL.md +136 -0
- package/dist/claude/.claude/skills/jahia-content/SKILL.md +139 -0
- package/dist/claude/.claude/skills/jahia-content-create-content/SKILL.md +384 -0
- package/dist/claude/.claude/skills/jahia-content-explore-structure/SKILL.md +164 -0
- package/dist/claude/.claude/skills/jahia-content-move-content/SKILL.md +236 -0
- package/dist/claude/.claude/skills/jahia-content-query-content/SKILL.md +144 -0
- package/dist/claude/.claude/skills/jahia-content-translate-content/SKILL.md +297 -0
- package/dist/claude/.claude/skills/jahia-dev/SKILL.md +124 -0
- package/dist/claude/.claude/skills/jahia-dev-accessibility/SKILL.md +271 -0
- package/dist/claude/.claude/skills/jahia-dev-apis/SKILL.md +52 -0
- package/dist/claude/.claude/skills/jahia-dev-apis/references/authentication.md +484 -0
- package/dist/claude/.claude/skills/jahia-dev-apis/references/graphql.md +657 -0
- package/dist/claude/.claude/skills/jahia-dev-apis/references/jcr-api.md +465 -0
- package/dist/claude/.claude/skills/jahia-dev-apis/references/security.md +541 -0
- package/dist/claude/.claude/skills/jahia-dev-build-component/SKILL.md +140 -0
- package/dist/claude/.claude/skills/jahia-dev-create-page-template/SKILL.md +303 -0
- package/dist/claude/.claude/skills/jahia-dev-create-template-set/SKILL.md +232 -0
- package/dist/claude/.claude/skills/jahia-dev-create-view/SKILL.md +838 -0
- package/dist/claude/.claude/skills/jahia-dev-cypress/SKILL.md +445 -0
- package/dist/claude/.claude/skills/jahia-dev-debug/SKILL.md +176 -0
- package/dist/claude/.claude/skills/jahia-dev-define-content-type/SKILL.md +536 -0
- package/dist/claude/.claude/skills/jahia-dev-import-from/SKILL.md +244 -0
- package/dist/claude/.claude/skills/jahia-dev-java/SKILL.md +105 -0
- package/dist/claude/.claude/skills/jahia-dev-java/references/backend.md +331 -0
- package/dist/claude/.claude/skills/jahia-dev-java/references/content-types.md +273 -0
- package/dist/claude/.claude/skills/jahia-dev-java/references/modules.md +218 -0
- package/dist/claude/.claude/skills/jahia-dev-java/references/osgi.md +208 -0
- package/dist/claude/.claude/skills/jahia-dev-java/references/rendering.md +191 -0
- package/dist/claude/.claude/skills/jahia-dev-java/references/ui-extensions.md +344 -0
- package/dist/claude/.claude/skills/jahia-dev-jexperience/SKILL.md +269 -0
- package/dist/claude/.claude/skills/jahia-dev-ops/SKILL.md +50 -0
- package/dist/claude/.claude/skills/jahia-dev-ops/references/docker.md +151 -0
- package/dist/claude/.claude/skills/jahia-dev-ops/references/monitoring.md +195 -0
- package/dist/claude/.claude/skills/jahia-dev-ops/references/provisioning.md +269 -0
- package/dist/claude/.claude/skills/jahia-dev-osgi-module/SKILL.md +297 -0
- package/dist/claude/.claude/skills/jahia-dev-properties/SKILL.md +147 -0
- package/dist/claude/.claude/skills/jahia-dev-properties/references/all-properties.md +231 -0
- package/dist/claude/.claude/skills/jahia-dev-query-content/SKILL.md +407 -0
- package/dist/claude/.claude/skills/jahia-dev-review/SKILL.md +228 -0
- package/dist/claude/.claude/skills/jahia-dev-screenshot/SKILL.md +177 -0
- package/dist/claude/.claude/skills/jahia-dev-start-local/SKILL.md +129 -0
- package/dist/claude/.claude/skills/jahia-dev-ui-extension/SKILL.md +559 -0
- package/dist/claude/CLAUDE.md +90 -0
- package/dist/codex/.agents/skills/jahia/SKILL.md +136 -0
- package/dist/codex/.agents/skills/jahia-content/SKILL.md +139 -0
- package/dist/codex/.agents/skills/jahia-content-create-content/SKILL.md +384 -0
- package/dist/codex/.agents/skills/jahia-content-explore-structure/SKILL.md +164 -0
- package/dist/codex/.agents/skills/jahia-content-move-content/SKILL.md +236 -0
- package/dist/codex/.agents/skills/jahia-content-query-content/SKILL.md +144 -0
- package/dist/codex/.agents/skills/jahia-content-translate-content/SKILL.md +297 -0
- package/dist/codex/.agents/skills/jahia-dev/SKILL.md +124 -0
- package/dist/codex/.agents/skills/jahia-dev-accessibility/SKILL.md +271 -0
- package/dist/codex/.agents/skills/jahia-dev-apis/SKILL.md +52 -0
- package/dist/codex/.agents/skills/jahia-dev-apis/references/authentication.md +484 -0
- package/dist/codex/.agents/skills/jahia-dev-apis/references/graphql.md +657 -0
- package/dist/codex/.agents/skills/jahia-dev-apis/references/jcr-api.md +465 -0
- package/dist/codex/.agents/skills/jahia-dev-apis/references/security.md +541 -0
- package/dist/codex/.agents/skills/jahia-dev-build-component/SKILL.md +140 -0
- package/dist/codex/.agents/skills/jahia-dev-create-page-template/SKILL.md +303 -0
- package/dist/codex/.agents/skills/jahia-dev-create-template-set/SKILL.md +232 -0
- package/dist/codex/.agents/skills/jahia-dev-create-view/SKILL.md +838 -0
- package/dist/codex/.agents/skills/jahia-dev-cypress/SKILL.md +445 -0
- package/dist/codex/.agents/skills/jahia-dev-debug/SKILL.md +176 -0
- package/dist/codex/.agents/skills/jahia-dev-define-content-type/SKILL.md +536 -0
- package/dist/codex/.agents/skills/jahia-dev-import-from/SKILL.md +244 -0
- package/dist/codex/.agents/skills/jahia-dev-java/SKILL.md +105 -0
- package/dist/codex/.agents/skills/jahia-dev-java/references/backend.md +331 -0
- package/dist/codex/.agents/skills/jahia-dev-java/references/content-types.md +273 -0
- package/dist/codex/.agents/skills/jahia-dev-java/references/modules.md +218 -0
- package/dist/codex/.agents/skills/jahia-dev-java/references/osgi.md +208 -0
- package/dist/codex/.agents/skills/jahia-dev-java/references/rendering.md +191 -0
- package/dist/codex/.agents/skills/jahia-dev-java/references/ui-extensions.md +344 -0
- package/dist/codex/.agents/skills/jahia-dev-jexperience/SKILL.md +269 -0
- package/dist/codex/.agents/skills/jahia-dev-ops/SKILL.md +50 -0
- package/dist/codex/.agents/skills/jahia-dev-ops/references/docker.md +151 -0
- package/dist/codex/.agents/skills/jahia-dev-ops/references/monitoring.md +195 -0
- package/dist/codex/.agents/skills/jahia-dev-ops/references/provisioning.md +269 -0
- package/dist/codex/.agents/skills/jahia-dev-osgi-module/SKILL.md +297 -0
- package/dist/codex/.agents/skills/jahia-dev-properties/SKILL.md +147 -0
- package/dist/codex/.agents/skills/jahia-dev-properties/references/all-properties.md +231 -0
- package/dist/codex/.agents/skills/jahia-dev-query-content/SKILL.md +407 -0
- package/dist/codex/.agents/skills/jahia-dev-review/SKILL.md +228 -0
- package/dist/codex/.agents/skills/jahia-dev-screenshot/SKILL.md +177 -0
- package/dist/codex/.agents/skills/jahia-dev-start-local/SKILL.md +129 -0
- package/dist/codex/.agents/skills/jahia-dev-ui-extension/SKILL.md +559 -0
- package/dist/codex/AGENTS.md +89 -0
- package/dist/copilot/.agents/skills/jahia/SKILL.md +136 -0
- package/dist/copilot/.agents/skills/jahia-content/SKILL.md +139 -0
- package/dist/copilot/.agents/skills/jahia-content-create-content/SKILL.md +384 -0
- package/dist/copilot/.agents/skills/jahia-content-explore-structure/SKILL.md +164 -0
- package/dist/copilot/.agents/skills/jahia-content-move-content/SKILL.md +236 -0
- package/dist/copilot/.agents/skills/jahia-content-query-content/SKILL.md +144 -0
- package/dist/copilot/.agents/skills/jahia-content-translate-content/SKILL.md +297 -0
- package/dist/copilot/.agents/skills/jahia-dev/SKILL.md +124 -0
- package/dist/copilot/.agents/skills/jahia-dev-accessibility/SKILL.md +271 -0
- package/dist/copilot/.agents/skills/jahia-dev-apis/SKILL.md +52 -0
- package/dist/copilot/.agents/skills/jahia-dev-apis/references/authentication.md +484 -0
- package/dist/copilot/.agents/skills/jahia-dev-apis/references/graphql.md +657 -0
- package/dist/copilot/.agents/skills/jahia-dev-apis/references/jcr-api.md +465 -0
- package/dist/copilot/.agents/skills/jahia-dev-apis/references/security.md +541 -0
- package/dist/copilot/.agents/skills/jahia-dev-build-component/SKILL.md +140 -0
- package/dist/copilot/.agents/skills/jahia-dev-create-page-template/SKILL.md +303 -0
- package/dist/copilot/.agents/skills/jahia-dev-create-template-set/SKILL.md +232 -0
- package/dist/copilot/.agents/skills/jahia-dev-create-view/SKILL.md +838 -0
- package/dist/copilot/.agents/skills/jahia-dev-cypress/SKILL.md +445 -0
- package/dist/copilot/.agents/skills/jahia-dev-debug/SKILL.md +176 -0
- package/dist/copilot/.agents/skills/jahia-dev-define-content-type/SKILL.md +536 -0
- package/dist/copilot/.agents/skills/jahia-dev-import-from/SKILL.md +244 -0
- package/dist/copilot/.agents/skills/jahia-dev-java/SKILL.md +105 -0
- package/dist/copilot/.agents/skills/jahia-dev-java/references/backend.md +331 -0
- package/dist/copilot/.agents/skills/jahia-dev-java/references/content-types.md +273 -0
- package/dist/copilot/.agents/skills/jahia-dev-java/references/modules.md +218 -0
- package/dist/copilot/.agents/skills/jahia-dev-java/references/osgi.md +208 -0
- package/dist/copilot/.agents/skills/jahia-dev-java/references/rendering.md +191 -0
- package/dist/copilot/.agents/skills/jahia-dev-java/references/ui-extensions.md +344 -0
- package/dist/copilot/.agents/skills/jahia-dev-jexperience/SKILL.md +269 -0
- package/dist/copilot/.agents/skills/jahia-dev-ops/SKILL.md +50 -0
- package/dist/copilot/.agents/skills/jahia-dev-ops/references/docker.md +151 -0
- package/dist/copilot/.agents/skills/jahia-dev-ops/references/monitoring.md +195 -0
- package/dist/copilot/.agents/skills/jahia-dev-ops/references/provisioning.md +269 -0
- package/dist/copilot/.agents/skills/jahia-dev-osgi-module/SKILL.md +297 -0
- package/dist/copilot/.agents/skills/jahia-dev-properties/SKILL.md +147 -0
- package/dist/copilot/.agents/skills/jahia-dev-properties/references/all-properties.md +231 -0
- package/dist/copilot/.agents/skills/jahia-dev-query-content/SKILL.md +407 -0
- package/dist/copilot/.agents/skills/jahia-dev-review/SKILL.md +228 -0
- package/dist/copilot/.agents/skills/jahia-dev-screenshot/SKILL.md +177 -0
- package/dist/copilot/.agents/skills/jahia-dev-start-local/SKILL.md +129 -0
- package/dist/copilot/.agents/skills/jahia-dev-ui-extension/SKILL.md +559 -0
- package/dist/copilot/AGENTS.md +89 -0
- package/dist/cursor/.agents/skills/jahia/SKILL.md +136 -0
- package/dist/cursor/.agents/skills/jahia-content/SKILL.md +139 -0
- package/dist/cursor/.agents/skills/jahia-content-create-content/SKILL.md +384 -0
- package/dist/cursor/.agents/skills/jahia-content-explore-structure/SKILL.md +164 -0
- package/dist/cursor/.agents/skills/jahia-content-move-content/SKILL.md +236 -0
- package/dist/cursor/.agents/skills/jahia-content-query-content/SKILL.md +144 -0
- package/dist/cursor/.agents/skills/jahia-content-translate-content/SKILL.md +297 -0
- package/dist/cursor/.agents/skills/jahia-dev/SKILL.md +124 -0
- package/dist/cursor/.agents/skills/jahia-dev-accessibility/SKILL.md +271 -0
- package/dist/cursor/.agents/skills/jahia-dev-apis/SKILL.md +52 -0
- package/dist/cursor/.agents/skills/jahia-dev-apis/references/authentication.md +484 -0
- package/dist/cursor/.agents/skills/jahia-dev-apis/references/graphql.md +657 -0
- package/dist/cursor/.agents/skills/jahia-dev-apis/references/jcr-api.md +465 -0
- package/dist/cursor/.agents/skills/jahia-dev-apis/references/security.md +541 -0
- package/dist/cursor/.agents/skills/jahia-dev-build-component/SKILL.md +140 -0
- package/dist/cursor/.agents/skills/jahia-dev-create-page-template/SKILL.md +303 -0
- package/dist/cursor/.agents/skills/jahia-dev-create-template-set/SKILL.md +232 -0
- package/dist/cursor/.agents/skills/jahia-dev-create-view/SKILL.md +838 -0
- package/dist/cursor/.agents/skills/jahia-dev-cypress/SKILL.md +445 -0
- package/dist/cursor/.agents/skills/jahia-dev-debug/SKILL.md +176 -0
- package/dist/cursor/.agents/skills/jahia-dev-define-content-type/SKILL.md +536 -0
- package/dist/cursor/.agents/skills/jahia-dev-import-from/SKILL.md +244 -0
- package/dist/cursor/.agents/skills/jahia-dev-java/SKILL.md +105 -0
- package/dist/cursor/.agents/skills/jahia-dev-java/references/backend.md +331 -0
- package/dist/cursor/.agents/skills/jahia-dev-java/references/content-types.md +273 -0
- package/dist/cursor/.agents/skills/jahia-dev-java/references/modules.md +218 -0
- package/dist/cursor/.agents/skills/jahia-dev-java/references/osgi.md +208 -0
- package/dist/cursor/.agents/skills/jahia-dev-java/references/rendering.md +191 -0
- package/dist/cursor/.agents/skills/jahia-dev-java/references/ui-extensions.md +344 -0
- package/dist/cursor/.agents/skills/jahia-dev-jexperience/SKILL.md +269 -0
- package/dist/cursor/.agents/skills/jahia-dev-ops/SKILL.md +50 -0
- package/dist/cursor/.agents/skills/jahia-dev-ops/references/docker.md +151 -0
- package/dist/cursor/.agents/skills/jahia-dev-ops/references/monitoring.md +195 -0
- package/dist/cursor/.agents/skills/jahia-dev-ops/references/provisioning.md +269 -0
- package/dist/cursor/.agents/skills/jahia-dev-osgi-module/SKILL.md +297 -0
- package/dist/cursor/.agents/skills/jahia-dev-properties/SKILL.md +147 -0
- package/dist/cursor/.agents/skills/jahia-dev-properties/references/all-properties.md +231 -0
- package/dist/cursor/.agents/skills/jahia-dev-query-content/SKILL.md +407 -0
- package/dist/cursor/.agents/skills/jahia-dev-review/SKILL.md +228 -0
- package/dist/cursor/.agents/skills/jahia-dev-screenshot/SKILL.md +177 -0
- package/dist/cursor/.agents/skills/jahia-dev-start-local/SKILL.md +129 -0
- package/dist/cursor/.agents/skills/jahia-dev-ui-extension/SKILL.md +559 -0
- package/dist/cursor/.cursor/rules/jahia.mdc +80 -0
- package/dist/gemini/.agents/skills/jahia/SKILL.md +136 -0
- package/dist/gemini/.agents/skills/jahia-content/SKILL.md +139 -0
- package/dist/gemini/.agents/skills/jahia-content-create-content/SKILL.md +384 -0
- package/dist/gemini/.agents/skills/jahia-content-explore-structure/SKILL.md +164 -0
- package/dist/gemini/.agents/skills/jahia-content-move-content/SKILL.md +236 -0
- package/dist/gemini/.agents/skills/jahia-content-query-content/SKILL.md +144 -0
- package/dist/gemini/.agents/skills/jahia-content-translate-content/SKILL.md +297 -0
- package/dist/gemini/.agents/skills/jahia-dev/SKILL.md +124 -0
- package/dist/gemini/.agents/skills/jahia-dev-accessibility/SKILL.md +271 -0
- package/dist/gemini/.agents/skills/jahia-dev-apis/SKILL.md +52 -0
- package/dist/gemini/.agents/skills/jahia-dev-apis/references/authentication.md +484 -0
- package/dist/gemini/.agents/skills/jahia-dev-apis/references/graphql.md +657 -0
- package/dist/gemini/.agents/skills/jahia-dev-apis/references/jcr-api.md +465 -0
- package/dist/gemini/.agents/skills/jahia-dev-apis/references/security.md +541 -0
- package/dist/gemini/.agents/skills/jahia-dev-build-component/SKILL.md +140 -0
- package/dist/gemini/.agents/skills/jahia-dev-create-page-template/SKILL.md +303 -0
- package/dist/gemini/.agents/skills/jahia-dev-create-template-set/SKILL.md +232 -0
- package/dist/gemini/.agents/skills/jahia-dev-create-view/SKILL.md +838 -0
- package/dist/gemini/.agents/skills/jahia-dev-cypress/SKILL.md +445 -0
- package/dist/gemini/.agents/skills/jahia-dev-debug/SKILL.md +176 -0
- package/dist/gemini/.agents/skills/jahia-dev-define-content-type/SKILL.md +536 -0
- package/dist/gemini/.agents/skills/jahia-dev-import-from/SKILL.md +244 -0
- package/dist/gemini/.agents/skills/jahia-dev-java/SKILL.md +105 -0
- package/dist/gemini/.agents/skills/jahia-dev-java/references/backend.md +331 -0
- package/dist/gemini/.agents/skills/jahia-dev-java/references/content-types.md +273 -0
- package/dist/gemini/.agents/skills/jahia-dev-java/references/modules.md +218 -0
- package/dist/gemini/.agents/skills/jahia-dev-java/references/osgi.md +208 -0
- package/dist/gemini/.agents/skills/jahia-dev-java/references/rendering.md +191 -0
- package/dist/gemini/.agents/skills/jahia-dev-java/references/ui-extensions.md +344 -0
- package/dist/gemini/.agents/skills/jahia-dev-jexperience/SKILL.md +269 -0
- package/dist/gemini/.agents/skills/jahia-dev-ops/SKILL.md +50 -0
- package/dist/gemini/.agents/skills/jahia-dev-ops/references/docker.md +151 -0
- package/dist/gemini/.agents/skills/jahia-dev-ops/references/monitoring.md +195 -0
- package/dist/gemini/.agents/skills/jahia-dev-ops/references/provisioning.md +269 -0
- package/dist/gemini/.agents/skills/jahia-dev-osgi-module/SKILL.md +297 -0
- package/dist/gemini/.agents/skills/jahia-dev-properties/SKILL.md +147 -0
- package/dist/gemini/.agents/skills/jahia-dev-properties/references/all-properties.md +231 -0
- package/dist/gemini/.agents/skills/jahia-dev-query-content/SKILL.md +407 -0
- package/dist/gemini/.agents/skills/jahia-dev-review/SKILL.md +228 -0
- package/dist/gemini/.agents/skills/jahia-dev-screenshot/SKILL.md +177 -0
- package/dist/gemini/.agents/skills/jahia-dev-start-local/SKILL.md +129 -0
- package/dist/gemini/.agents/skills/jahia-dev-ui-extension/SKILL.md +559 -0
- package/dist/gemini/AGENTS.md +89 -0
- package/dist/gemini/GEMINI.md +6 -0
- package/dist/index.js +975 -0
- package/dist/opencode/.agents/skills/jahia/SKILL.md +136 -0
- package/dist/opencode/.agents/skills/jahia-content/SKILL.md +139 -0
- package/dist/opencode/.agents/skills/jahia-content-create-content/SKILL.md +384 -0
- package/dist/opencode/.agents/skills/jahia-content-explore-structure/SKILL.md +164 -0
- package/dist/opencode/.agents/skills/jahia-content-move-content/SKILL.md +236 -0
- package/dist/opencode/.agents/skills/jahia-content-query-content/SKILL.md +144 -0
- package/dist/opencode/.agents/skills/jahia-content-translate-content/SKILL.md +297 -0
- package/dist/opencode/.agents/skills/jahia-dev/SKILL.md +124 -0
- package/dist/opencode/.agents/skills/jahia-dev-accessibility/SKILL.md +271 -0
- package/dist/opencode/.agents/skills/jahia-dev-apis/SKILL.md +52 -0
- package/dist/opencode/.agents/skills/jahia-dev-apis/references/authentication.md +484 -0
- package/dist/opencode/.agents/skills/jahia-dev-apis/references/graphql.md +657 -0
- package/dist/opencode/.agents/skills/jahia-dev-apis/references/jcr-api.md +465 -0
- package/dist/opencode/.agents/skills/jahia-dev-apis/references/security.md +541 -0
- package/dist/opencode/.agents/skills/jahia-dev-build-component/SKILL.md +140 -0
- package/dist/opencode/.agents/skills/jahia-dev-create-page-template/SKILL.md +303 -0
- package/dist/opencode/.agents/skills/jahia-dev-create-template-set/SKILL.md +232 -0
- package/dist/opencode/.agents/skills/jahia-dev-create-view/SKILL.md +838 -0
- package/dist/opencode/.agents/skills/jahia-dev-cypress/SKILL.md +445 -0
- package/dist/opencode/.agents/skills/jahia-dev-debug/SKILL.md +176 -0
- package/dist/opencode/.agents/skills/jahia-dev-define-content-type/SKILL.md +536 -0
- package/dist/opencode/.agents/skills/jahia-dev-import-from/SKILL.md +244 -0
- package/dist/opencode/.agents/skills/jahia-dev-java/SKILL.md +105 -0
- package/dist/opencode/.agents/skills/jahia-dev-java/references/backend.md +331 -0
- package/dist/opencode/.agents/skills/jahia-dev-java/references/content-types.md +273 -0
- package/dist/opencode/.agents/skills/jahia-dev-java/references/modules.md +218 -0
- package/dist/opencode/.agents/skills/jahia-dev-java/references/osgi.md +208 -0
- package/dist/opencode/.agents/skills/jahia-dev-java/references/rendering.md +191 -0
- package/dist/opencode/.agents/skills/jahia-dev-java/references/ui-extensions.md +344 -0
- package/dist/opencode/.agents/skills/jahia-dev-jexperience/SKILL.md +269 -0
- package/dist/opencode/.agents/skills/jahia-dev-ops/SKILL.md +50 -0
- package/dist/opencode/.agents/skills/jahia-dev-ops/references/docker.md +151 -0
- package/dist/opencode/.agents/skills/jahia-dev-ops/references/monitoring.md +195 -0
- package/dist/opencode/.agents/skills/jahia-dev-ops/references/provisioning.md +269 -0
- package/dist/opencode/.agents/skills/jahia-dev-osgi-module/SKILL.md +297 -0
- package/dist/opencode/.agents/skills/jahia-dev-properties/SKILL.md +147 -0
- package/dist/opencode/.agents/skills/jahia-dev-properties/references/all-properties.md +231 -0
- package/dist/opencode/.agents/skills/jahia-dev-query-content/SKILL.md +407 -0
- package/dist/opencode/.agents/skills/jahia-dev-review/SKILL.md +228 -0
- package/dist/opencode/.agents/skills/jahia-dev-screenshot/SKILL.md +177 -0
- package/dist/opencode/.agents/skills/jahia-dev-start-local/SKILL.md +129 -0
- package/dist/opencode/.agents/skills/jahia-dev-ui-extension/SKILL.md +559 -0
- package/dist/opencode/AGENTS.md +89 -0
- package/dist/windsurf/.windsurf/rules/jahia.md +80 -0
- package/dist/windsurf/.windsurf/skills/jahia/SKILL.md +136 -0
- package/dist/windsurf/.windsurf/skills/jahia-content/SKILL.md +139 -0
- package/dist/windsurf/.windsurf/skills/jahia-content-create-content/SKILL.md +384 -0
- package/dist/windsurf/.windsurf/skills/jahia-content-explore-structure/SKILL.md +164 -0
- package/dist/windsurf/.windsurf/skills/jahia-content-move-content/SKILL.md +236 -0
- package/dist/windsurf/.windsurf/skills/jahia-content-query-content/SKILL.md +144 -0
- package/dist/windsurf/.windsurf/skills/jahia-content-translate-content/SKILL.md +297 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev/SKILL.md +124 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-accessibility/SKILL.md +271 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-apis/SKILL.md +52 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-apis/references/authentication.md +484 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-apis/references/graphql.md +657 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-apis/references/jcr-api.md +465 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-apis/references/security.md +541 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-build-component/SKILL.md +140 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-create-page-template/SKILL.md +303 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-create-template-set/SKILL.md +232 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-create-view/SKILL.md +838 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-cypress/SKILL.md +445 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-debug/SKILL.md +176 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-define-content-type/SKILL.md +536 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-import-from/SKILL.md +244 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-java/SKILL.md +105 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-java/references/backend.md +331 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-java/references/content-types.md +273 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-java/references/modules.md +218 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-java/references/osgi.md +208 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-java/references/rendering.md +191 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-java/references/ui-extensions.md +344 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-jexperience/SKILL.md +269 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-ops/SKILL.md +50 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-ops/references/docker.md +151 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-ops/references/monitoring.md +195 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-ops/references/provisioning.md +269 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-osgi-module/SKILL.md +297 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-properties/SKILL.md +147 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-properties/references/all-properties.md +231 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-query-content/SKILL.md +407 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-review/SKILL.md +228 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-screenshot/SKILL.md +177 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-start-local/SKILL.md +129 -0
- package/dist/windsurf/.windsurf/skills/jahia-dev-ui-extension/SKILL.md +559 -0
- package/dist/windsurf/AGENTS.md +89 -0
- 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
|
+
```
|