@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,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
|
+
```
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: jahia-dev
|
|
3
|
+
description: Entry point for Jahia JavaScript module development. Detects your project state and tells you what to do next. Start here if you are new to the project or unsure what skill to use.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Jahia Dev — Project GPS
|
|
7
|
+
|
|
8
|
+
You are the entry point for Jahia JavaScript module development. Your job is to assess the current project state and guide the user to the right next skill.
|
|
9
|
+
|
|
10
|
+
## Step 1 — Detect project state
|
|
11
|
+
|
|
12
|
+
Run all checks in parallel.
|
|
13
|
+
|
|
14
|
+
### 1. Module exists?
|
|
15
|
+
|
|
16
|
+
Search for a `package.json` that references `@jahia/javascript-modules-library` in the current directory or subdirectories:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
find . -name "package.json" -not -path "*/node_modules/*" | xargs grep -l "@jahia/javascript-modules-library" 2>/dev/null | head -5
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
- Found → record the module name (from the `name` field in that `package.json`)
|
|
23
|
+
- Not found → module does not exist yet
|
|
24
|
+
|
|
25
|
+
### 2. Jahia running?
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/cms/login
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
- `200` → Jahia is running at `http://localhost:8080`
|
|
32
|
+
- Anything else → Jahia is not running
|
|
33
|
+
|
|
34
|
+
### 3. Content types defined?
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
find src/components -name "definition.cnd" 2>/dev/null | wc -l
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Record the count of `.cnd` files found under `src/components`.
|
|
41
|
+
|
|
42
|
+
### 4. Views defined?
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
find src/components -name "*.server.tsx" -o -name "*.client.tsx" 2>/dev/null | wc -l
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Record the count of view files found.
|
|
49
|
+
|
|
50
|
+
### 5. Page templates defined?
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
find src/templates/Page -type f 2>/dev/null | wc -l
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Record the count of files in `src/templates/Page/`. More than 1 means custom templates exist (the default `index.server.tsx` is always present).
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Step 2 — Report project state to user
|
|
61
|
+
|
|
62
|
+
Print a clear, scannable status summary:
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
📦 Module: ✅ <module-name> (found) OR ❌ not found
|
|
66
|
+
🐳 Jahia: ✅ running at http://localhost:8080 OR ❌ not running
|
|
67
|
+
📋 Content types: <N> defined
|
|
68
|
+
🖼 Views: <N> defined
|
|
69
|
+
📄 Page templates: <N> defined
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Step 3 — Recommend next action
|
|
75
|
+
|
|
76
|
+
Use the matrix below to pick exactly one recommendation to highlight:
|
|
77
|
+
|
|
78
|
+
| Condition | Recommendation |
|
|
79
|
+
|-----------|---------------|
|
|
80
|
+
| No module found | 🚀 **Start here:** invoke `/jahia-dev-create-template-set` to scaffold a new Jahia JavaScript module. |
|
|
81
|
+
| Module found, Jahia not running | 🐳 Your module is ready. Invoke `/jahia-dev-start-local` to start Jahia locally (Docker recommended). |
|
|
82
|
+
| Module + Jahia running, 0 content types | 🎯 Jahia is running! Time to build your first component. Invoke `/jahia-dev-build-component` to create a content type + view. |
|
|
83
|
+
| Module + Jahia running, content types exist, ≤1 page template | 📐 You have components. Invoke `/jahia-dev-create-page-template` to create a page template and start assembling pages. |
|
|
84
|
+
| Module + Jahia running, templates exist (>1) | 🏗 Your module is taking shape! Choose what to do next (see options below). |
|
|
85
|
+
|
|
86
|
+
When the last condition applies, present all options:
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
🏗 Your module is taking shape! What would you like to do next?
|
|
90
|
+
- Add a new component → /jahia-dev-build-component
|
|
91
|
+
- Create a content listing → /jahia-dev-query-content
|
|
92
|
+
- Review your code for issues → /jahia-dev-review
|
|
93
|
+
- Screenshot a reference site → /jahia-dev-screenshot
|
|
94
|
+
- Create a new page template → /jahia-dev-create-page-template
|
|
95
|
+
- Clean up boilerplate → run /jahia-dev-review and look for S10
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Step 4 — Print the full skill map
|
|
101
|
+
|
|
102
|
+
Always print this at the end so the user can navigate anywhere:
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
## Jahia Development Skills
|
|
106
|
+
|
|
107
|
+
### Setup
|
|
108
|
+
/jahia-dev-create-template-set Scaffold a new JS/React module
|
|
109
|
+
/jahia-dev-start-local Start Jahia locally (Docker or bare metal)
|
|
110
|
+
|
|
111
|
+
### Building
|
|
112
|
+
/jahia-dev-build-component Build a complete component (content type + view) ← start here
|
|
113
|
+
/jahia-dev-define-content-type Define a CND content type and types.ts
|
|
114
|
+
/jahia-dev-create-view Implement a React view (.server.tsx or .client.tsx Island)
|
|
115
|
+
/jahia-dev-create-page-template Create a page template with Areas
|
|
116
|
+
|
|
117
|
+
### Content
|
|
118
|
+
/jahia-dev-query-content Query JCR content with JCR-SQL2 or useJCRQuery
|
|
119
|
+
|
|
120
|
+
### Quality
|
|
121
|
+
/jahia-dev-review Review code for Jahia and generic best practices
|
|
122
|
+
/jahia-dev-screenshot Screenshot reference URL + Jahia render for visual comparison
|
|
123
|
+
/jahia-dev-debug Debug build/deploy/runtime errors end-to-end
|
|
124
|
+
```
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: jahia-dev-accessibility
|
|
3
|
+
description: Audits a Jahia JS module for WCAG 2.1 AA accessibility violations using axe-core and Playwright. Runs automated checks against all live pages, reports violations by severity, and fixes them in the React views and CSS. Invoke after building components or before final review.
|
|
4
|
+
allowed-tools: Bash, Read, Write, Edit
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Skill: jahia-dev-accessibility
|
|
8
|
+
|
|
9
|
+
Runs a live accessibility audit against all published pages of the site, reports violations, and fixes them in the source code.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Step 1 — Confirm pages are live
|
|
14
|
+
|
|
15
|
+
You need the list of public page URLs. Look for `pages.json` in the module root first:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
cat pages.json 2>/dev/null || echo "not found"
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
If absent, derive URLs from the site structure or ask the user. All pages must be accessible at `http://localhost:8080`.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Step 2 — Install audit tooling
|
|
26
|
+
|
|
27
|
+
Check if `@axe-core/playwright` and `playwright` are available:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
node -e "require('@axe-core/playwright'); require('playwright'); console.log('ok')" 2>/dev/null || echo "missing"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
If missing, install temporarily (project-local, not committed):
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npm install --no-save @axe-core/playwright playwright
|
|
37
|
+
npx playwright install chromium --with-deps
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Step 3 — Run the audit
|
|
43
|
+
|
|
44
|
+
Save this script as `/tmp/a11y-audit.mjs` and run it:
|
|
45
|
+
|
|
46
|
+
```js
|
|
47
|
+
import { chromium } from "playwright";
|
|
48
|
+
import { AxeBuilder } from "@axe-core/playwright";
|
|
49
|
+
import { readFileSync } from "fs";
|
|
50
|
+
|
|
51
|
+
const urls = JSON.parse(readFileSync("pages.json", "utf-8"));
|
|
52
|
+
|
|
53
|
+
const browser = await chromium.launch({ args: ["--no-sandbox"] });
|
|
54
|
+
const page = await browser.newPage();
|
|
55
|
+
|
|
56
|
+
for (const url of urls) {
|
|
57
|
+
console.log(`\n${"=".repeat(60)}\nAuditing: ${url}\n${"=".repeat(60)}`);
|
|
58
|
+
await page.goto(url, { waitUntil: "networkidle", timeout: 30_000 });
|
|
59
|
+
|
|
60
|
+
const results = await new AxeBuilder({ page })
|
|
61
|
+
.withTags(["wcag2a", "wcag2aa", "wcag21aa"])
|
|
62
|
+
.analyze();
|
|
63
|
+
|
|
64
|
+
if (results.violations.length === 0) {
|
|
65
|
+
console.log("✅ No violations found.");
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
for (const v of results.violations) {
|
|
70
|
+
console.log(`\n[${v.impact?.toUpperCase()}] ${v.id}: ${v.description}`);
|
|
71
|
+
console.log(`Help: ${v.helpUrl}`);
|
|
72
|
+
for (const node of v.nodes) {
|
|
73
|
+
console.log(` Target: ${node.target.join(" > ")}`);
|
|
74
|
+
console.log(` HTML: ${node.html}`);
|
|
75
|
+
if (node.failureSummary) {
|
|
76
|
+
console.log(` Fix: ${node.failureSummary}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
await browser.close();
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
node /tmp/a11y-audit.mjs 2>&1 | tee /tmp/a11y-report.txt
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Step 4 — Interpret results
|
|
92
|
+
|
|
93
|
+
Group violations by impact. Focus on `critical` and `serious` first — they contribute most to a poor score.
|
|
94
|
+
|
|
95
|
+
Common violations in Jahia JS modules and their fixes:
|
|
96
|
+
|
|
97
|
+
### 🔴 Critical / Serious
|
|
98
|
+
|
|
99
|
+
**`color-contrast`** — text fails WCAG AA contrast ratio (4.5:1 for normal text, 3:1 for large text)
|
|
100
|
+
```css
|
|
101
|
+
/* Bad */
|
|
102
|
+
color: #aaa; background: #fff;
|
|
103
|
+
|
|
104
|
+
/* Fix — use a contrast checker: https://webaim.org/resources/contrastchecker/ */
|
|
105
|
+
color: #595959; /* 7:1 ratio on white */
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**`image-alt`** — `<img>` missing `alt` attribute
|
|
109
|
+
```tsx
|
|
110
|
+
/* Bad */
|
|
111
|
+
<img src={buildNodeUrl(props.image)} />
|
|
112
|
+
|
|
113
|
+
/* Fix — use content from CND, fall back to empty string for decorative */
|
|
114
|
+
<img src={buildNodeUrl(props.image)} alt={props.imageAlt ?? ""} />
|
|
115
|
+
```
|
|
116
|
+
Add `- imageAlt (string) i18n` to the CND and `imageAlt?: string` to `types.ts`.
|
|
117
|
+
|
|
118
|
+
**`button-name`** — `<button>` or `<a>` is empty (icon-only without label)
|
|
119
|
+
```tsx
|
|
120
|
+
/* Bad */
|
|
121
|
+
<button><svg>...</svg></button>
|
|
122
|
+
|
|
123
|
+
/* Fix */
|
|
124
|
+
<button aria-label="Open menu"><svg aria-hidden="true">...</svg></button>
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**`landmark-one-main`** — page has no `<main>` landmark
|
|
128
|
+
```tsx
|
|
129
|
+
/* Fix — wrap page content in <main> */
|
|
130
|
+
<main id="main-content">
|
|
131
|
+
{/* page content */}
|
|
132
|
+
</main>
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**`page-has-heading-one`** — page has no `<h1>` element
|
|
136
|
+
```tsx
|
|
137
|
+
/* Fix — ensure the hero or first section renders an <h1> */
|
|
138
|
+
<h1>{props.title}</h1>
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**`link-name`** — `<a>` with no accessible text
|
|
142
|
+
```tsx
|
|
143
|
+
/* Bad */
|
|
144
|
+
<a href={url}><img src="..." /></a>
|
|
145
|
+
|
|
146
|
+
/* Fix */
|
|
147
|
+
<a href={url}><img src="..." alt={props.linkLabel ?? "Learn more"} /></a>
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### 🟡 Moderate
|
|
151
|
+
|
|
152
|
+
**`heading-order`** — headings skip levels (e.g. `<h1>` → `<h3>`)
|
|
153
|
+
```tsx
|
|
154
|
+
/* Review: the first heading in a component should be h2 (after the page h1) */
|
|
155
|
+
/* Section titles: h2, subsections: h3 */
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**`region`** — content is outside landmark regions
|
|
159
|
+
Wrap page sections in semantic elements: `<header>`, `<nav>`, `<main>`, `<footer>`, `<section aria-label="...">`.
|
|
160
|
+
|
|
161
|
+
**`list`** — `<ul>` or `<ol>` contains elements other than `<li>`
|
|
162
|
+
```tsx
|
|
163
|
+
/* Bad */
|
|
164
|
+
<ul>
|
|
165
|
+
<div>item</div>
|
|
166
|
+
</ul>
|
|
167
|
+
|
|
168
|
+
/* Fix */
|
|
169
|
+
<ul>
|
|
170
|
+
<li>item</li>
|
|
171
|
+
</ul>
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
**`html-has-lang`** — `<html>` element missing `lang` attribute
|
|
175
|
+
This is set at the page template level. Verify the template registered in `src/templates/` includes `lang`:
|
|
176
|
+
```tsx
|
|
177
|
+
/* In the page template */
|
|
178
|
+
<html lang={currentLanguage ?? "en"}>
|
|
179
|
+
```
|
|
180
|
+
Jahia provides the language via `useServerContext()`:
|
|
181
|
+
```tsx
|
|
182
|
+
import { useServerContext } from "@jahia/javascript-modules-library";
|
|
183
|
+
const { currentLanguage } = useServerContext();
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
**`aria-required-children`** — ARIA role is missing required children
|
|
187
|
+
Avoid misusing ARIA roles. Prefer native HTML elements (`<ul>/<li>`, `<table>/<tr>/<td>`).
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## Step 5 — Fix in source
|
|
192
|
+
|
|
193
|
+
For each violation:
|
|
194
|
+
|
|
195
|
+
1. Identify the component: match `node.target` HTML to a `.server.tsx` file
|
|
196
|
+
2. Edit the view to apply the fix
|
|
197
|
+
3. If the fix requires a new CND field (e.g. `imageAlt`), update `definition.cnd` and `types.ts`
|
|
198
|
+
4. Run `yarn build && yarn jahia-deploy`
|
|
199
|
+
|
|
200
|
+
After all fixes:
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
# Re-run the audit to verify violations are resolved
|
|
204
|
+
node /tmp/a11y-audit.mjs 2>&1 | grep -E "(CRITICAL|SERIOUS|MODERATE|No violations)"
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
Iterate until only `minor` violations remain (or none).
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## Step 6 — Proactive checks beyond axe-core
|
|
212
|
+
|
|
213
|
+
axe-core catches ~30–40% of WCAG issues automatically. Also check manually:
|
|
214
|
+
|
|
215
|
+
- **Keyboard navigation**: can every interactive element (link, button, form field) be reached with Tab?
|
|
216
|
+
- **Focus indicators**: is `:focus` visible on all interactive elements?
|
|
217
|
+
```css
|
|
218
|
+
/* Ensure focus ring is never suppressed globally */
|
|
219
|
+
/* Bad */
|
|
220
|
+
* { outline: none; }
|
|
221
|
+
/* Fix — use :focus-visible */
|
|
222
|
+
:focus-visible { outline: 2px solid #0969da; outline-offset: 2px; }
|
|
223
|
+
```
|
|
224
|
+
- **Skip link**: add a "Skip to main content" link as the first focusable element
|
|
225
|
+
```tsx
|
|
226
|
+
<a href="#main-content" className={styles.skipLink}>Skip to main content</a>
|
|
227
|
+
```
|
|
228
|
+
```css
|
|
229
|
+
.skipLink {
|
|
230
|
+
position: absolute;
|
|
231
|
+
top: -100%;
|
|
232
|
+
left: 0;
|
|
233
|
+
background: #000;
|
|
234
|
+
color: #fff;
|
|
235
|
+
padding: 8px 16px;
|
|
236
|
+
z-index: 999;
|
|
237
|
+
}
|
|
238
|
+
.skipLink:focus { top: 0; }
|
|
239
|
+
```
|
|
240
|
+
- **Motion**: if any CSS animation exists, wrap it in `@media (prefers-reduced-motion: no-preference)`
|
|
241
|
+
- **Touch targets**: interactive elements should be at least 44×44px
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## Step 7 — Report summary
|
|
246
|
+
|
|
247
|
+
After fixing, report:
|
|
248
|
+
|
|
249
|
+
```
|
|
250
|
+
## Accessibility Audit Summary
|
|
251
|
+
|
|
252
|
+
Pages audited: N
|
|
253
|
+
Violations fixed:
|
|
254
|
+
- [critical] color-contrast: 3 instances → fixed (updated CSS contrast ratios)
|
|
255
|
+
- [serious] image-alt: 2 instances → fixed (added imageAlt CND field)
|
|
256
|
+
- [serious] button-name: 1 instance → fixed (added aria-label to icon button)
|
|
257
|
+
- [moderate] heading-order: 2 instances → fixed (restructured h2/h3 hierarchy)
|
|
258
|
+
|
|
259
|
+
Remaining violations: N (all minor / informational)
|
|
260
|
+
|
|
261
|
+
Axe tags checked: wcag2a, wcag2aa, wcag21aa
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## References
|
|
267
|
+
|
|
268
|
+
- WebAIM Contrast Checker: https://webaim.org/resources/contrastchecker/
|
|
269
|
+
- axe-core rules: https://dequeuniversity.com/rules/axe/
|
|
270
|
+
- WCAG 2.1 Quick Ref: https://www.w3.org/WAI/WCAG21/quickref/
|
|
271
|
+
- MDN ARIA: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA
|