enonic-content-type-generator
enonic content type generator
SKILL.md
Full skill instructions
Enonic XP Content Type Generator
Procedures
Step 1: Detect Enonic XP Project
- Execute
node scripts/find-enonic-targets.mjs [workspaceRoot]to locate Enonic XP project roots. - If the script returns an empty array, warn that no Enonic XP project markers were found and ask for the target directory.
- Store the detected project root for use in subsequent steps.
Step 2: Gather Requirements
- Identify the content type name from the request. The name must be lowercase-hyphenated (e.g.,
blog-post). - Identify the display name — a human-readable label (e.g.,
Blog Post). - Determine the super-type. Default to
base:structuredunless the request specifies a folder (base:folder) or another built-in type. - List all requested fields with their input types. Read
references/content-type-reference.mdto map natural-language field descriptions to the correct Enonic XP input type and configuration. - Identify any item sets (repeatable grouped fields), option sets (single-select or multi-select choices), or mixin references.
- If the request mentions a mixin, determine whether to generate the mixin file or reference an existing one.
- If the request mentions x-data, determine whether to generate the x-data file or reference an existing one.
Step 3: Generate the Content Type XML
- Read
assets/content-type.template.xmlto obtain the starter template. - Replace
DISPLAY_NAMEwith the display name from Step 2. - Replace
DESCRIPTIONwith a short description or remove the element if none was provided. - Set the
<super-type>element to the value determined in Step 2. - Populate the
<form>element with the identified inputs, item sets, option sets, field sets, and mixin references. - For each input:
- Set the
nameattribute using camelCase. - Set the
typeattribute to the exact Enonic XP input type name (case-sensitive). - Add
<label>,<occurrences>,<help-text>,<default>, and<config>as required.
- Set the
- For ComboBox and RadioButton inputs, include all options inside
<config>. - For ContentSelector, ImageSelector, and MediaSelector inputs, include
<config>withallowContentType,allowPath,treeMode, andhideToggleIconas specified. - For TextLine and TextArea, add
<config>withmax-length,show-counter, orregexpif validation constraints are requested. - For Long and Double, add
<config>withminandmaxif range constraints are requested. - For DateTime, add
<config>with<timezone>true</timezone>if timezone-aware storage is requested. - If examples are needed for reference, read
references/examples.md.
Step 4: Write the File
- Construct the target path:
[projectRoot]/src/main/resources/site/content-types/[name]/[name].xml - Create the directory if it does not exist.
- Write the generated XML to the file.
- If a mixin was generated, write it to:
[projectRoot]/src/main/resources/site/mixins/[name]/[name].xml - If x-data was generated, write it to:
[projectRoot]/src/main/resources/site/x-data/[name]/[name].xml - If x-data references are needed in
site.xml, add<x-data>entries withallowContentTypesandoptionalattributes as specified.
Step 5: Validate Output
- Verify the generated XML is well-formed.
- Confirm every
<input>has a validtypeattribute by cross-referencingreferences/content-type-reference.md. - Confirm all
nameattributes are unique within their nesting level. - Confirm
<occurrences>values are logically consistent (minimum <= maximum, or maximum = 0 for unlimited). - If the request asks about super-types, input types, or schema structure without requesting file generation, answer the question using
references/content-type-reference.mdwithout creating files.
Error Handling
- If
scripts/find-enonic-targets.mjsexits with a non-zero code, report the stderr message and ask for the project root path manually. - If the requested input type does not match any known Enonic XP input type, read
references/content-type-reference.mdand suggest the closest match. Do not invent input type names. - If XML validation fails, read
references/troubleshooting.mdto diagnose and correct the error, then regenerate the file. - If a mixin reference cannot be resolved, confirm the mixin file path exists before writing the content type.
