Schema JSON Format
Preview Feature: CLI AI Automation is a preview feature. If you encounter any issues, please report them at support.skipper18.com.
The -cli-schema-summaryverb outputs the entire Skipper project as structured JSON. This is the primary way for scripts and AI assistants to read a project's schema without parsing the .skipper XML file directly.
Top-Level Structure
The output is wrapped in a standard CLI envelope. The data field contains the project structure:
{
"project": {
"name": "MyProject",
"orm": "Doctrine2",
"mvc": "Symfony",
"uuid": "a1b2c3d4-...",
"modules": [...]
}
}Module Object
| Field | Type | Description |
|---|---|---|
| uuid | string | Unique identifier of the module |
| name | string | Display name of the module |
| namespace | string | Namespace or package prefix for entities in this module |
| export_path | string | Filesystem path where exported files are written |
| export_format | string | Export format (e.g. "Doctrine2PhpAttributes", "xml", "yaml"). May be absent when no format is configured. |
| entities | array | List of Entity objects in this module |
| regions | array | List of Region objects for visual grouping |
| comments | array | List of Comment objects attached to this module |
| orm_attributes | object | Framework-specific ORM attribute key-value pairs. Empty {} when none are set. |
Entity Object
| Field | Type | Description |
|---|---|---|
| uuid | string | Unique identifier of the entity |
| name | string | Fully qualified entity name (including namespace) |
| local_name | string | Short name without namespace prefix |
| description | string | Entity description text. Empty string when not set. |
| fields | array | List of Field objects belonging to this entity |
| associations | array | List of Association objects (one-to-one, one-to-many, many-to-one) |
| indexes | array | List of Index objects defined on this entity |
| orm_attributes | object | Framework-specific ORM attribute key-value pairs |
| many_to_many | array | List of Many-to-Many objects |
| embeddeds | array | List of Embedded objects |
Field Object
| Field | Type | Description |
|---|---|---|
| uuid | string | Unique identifier of the field |
| name | string | Field name |
| type | string | Data type (e.g. "integer", "string", "datetime", "text") |
| size | number | Column size/length (e.g. 255), 0 if not set |
| primary | boolean | Whether this field is part of the primary key |
| required | boolean | Whether this field is NOT NULL |
| nullable | boolean | Inverse of required — both are always present for convenience |
| unique | boolean | Whether a unique constraint exists on this field |
| auto_increment | boolean | Whether the field auto-increments |
| default | string | null | Default value expression, null if not set |
| orm_attributes | object | Framework-specific ORM attributes (e.g. precision, scale, column). Empty {} when none are set. |
Association Object
| Field | Type | Description |
|---|---|---|
| id | number | Project-scoped auto-increment identifier |
| to_entity | string | Name of the target entity |
| owner_alias | string | Property name on the owning side |
| inverse_alias | string | Property name on the inverse side |
| orm_attributes | object | Framework-specific ORM attributes. Empty {} when none are set. |
Index Object
| Field | Type | Description |
|---|---|---|
| id | number | Project-scoped auto-increment identifier |
| name | string | Index name |
| unique | boolean | Whether this is a unique index |
| fields | array | List of field names included in the index |
| orm_attributes | object | Framework-specific ORM attributes. Empty {} when none are set. |
Many-to-Many Object
| Field | Type | Description |
|---|---|---|
| id | number | Project-scoped auto-increment identifier |
| mn_entity | string | Name of the join table entity (if applicable) |
| owner_alias | string | Property name on the owning side |
| inverse_alias | string | Property name on the inverse side |
| orm_attributes | object | Framework-specific ORM attributes. Empty {} when none are set. |
Embedded Object
| Field | Type | Description |
|---|---|---|
| id | number | Project-scoped auto-increment identifier |
| to_entity | string | Name of the embedded entity |
| owner_alias | string | Property name on the owning side |
| inverse_alias | string | Property name on the inverse side |
| orm_attributes | object | Framework-specific ORM attributes. Empty {} when none are set. |
Region Object
| Field | Type | Description |
|---|---|---|
| id | number | Project-scoped auto-increment identifier |
| caption | string | Display caption for the region |
| description | string | Region description text. Empty string when not set. |
| namespace | string | Namespace override for entities within the region |
| orm_attributes | object | Framework-specific ORM attributes. Empty {} when none are set. |
Comment Object
| Field | Type | Description |
|---|---|---|
| id | number | Project-scoped auto-increment identifier |
| caption | string | Comment title text |
| description | string | Full description body of the comment |
ORM Attributes Object
The orm_attributes field is present on every object type (entity, field, association, index, many-to-many, embedded, module, region). It contains framework-specific configuration as key-value pairs. Values are always strings. Empty {} when no ORM attributes are set.
Nested structures (like options) become JSON objects. Ordered containers (like lifecycle-callbacks) become JSON arrays of objects.
Entity orm_attributes example (Doctrine2):
"orm_attributes": {
"table": "customers",
"repository-class": "App\Repository\CustomerRepository",
"change-tracking-policy": "DEFERRED_EXPLICIT",
"options": {
"charset": "utf8mb4",
"engine": "InnoDB"
},
"lifecycle-callbacks": [
{
"type": "prePersist",
"method": "onPrePersist"
}
]
}Field orm_attributes example:
"orm_attributes": {
"precision": "10",
"scale": "2",
"column": "customer_email"
}Inheritances
Note: Inheritances are managed via add_inheritance, update_inheritance, and remove_inheritance patch ops but are not yet included in schema-summary output.
Key Notes
IDs (
idon associations, indexes, many-to-many, embeddeds, regions, comments) are project-scoped auto-increment numbers. Use them forupdate_*andremove_*operations.UUIDs are stable identifiers for entities, fields, and modules -- they survive renames and moves.
orm_attributes is present on every object type (entity, field, association, index, M:N, embedded, module, region). Empty
{}when no ORM attributes are set. Values are always strings.name on entities and modules is the fully qualified name (e.g.
\App\Entity\Customer). local_name is the short name (e.g.Customer).nullable is the inverse of required -- both are always present on field objects for convenience.
export_format on modules may be absent when no format is configured.
Full Example
Below is a complete JSON output from a sample Doctrine2 project showing all object types with their orm_attributes, including field-level attributes, lifecycle callbacks, nested options, associations, indexes, many-to-many, embeddeds, regions, and comments:
{
"project": {
"name": "MyProject",
"orm": "Doctrine2",
"mvc": "Symfony",
"uuid": "dc9798d3-...",
"modules": [
{
"uuid": "b3cd1cb6-...",
"name": "\\AppBundle",
"namespace": "\\App\\Entity",
"export_path": "src/Entity",
"export_format": "Doctrine2PhpAttributes",
"entities": [
{
"uuid": "95f18d41-...",
"name": "\\App\\Entity\\Customer",
"local_name": "Customer",
"description": "Main customer entity",
"fields": [
{
"uuid": "ca9e942c-...",
"name": "id",
"type": "integer",
"size": 0,
"primary": true,
"required": true,
"nullable": false,
"unique": true,
"auto_increment": true,
"default": null,
"orm_attributes": {}
},
{
"uuid": "f31aa519-...",
"name": "email",
"type": "string",
"size": 255,
"primary": false,
"required": true,
"nullable": false,
"unique": true,
"auto_increment": false,
"default": null,
"orm_attributes": {
"column": "customer_email"
}
},
{
"uuid": "a830c960-...",
"name": "price",
"type": "decimal",
"size": 0,
"primary": false,
"required": true,
"nullable": false,
"unique": false,
"auto_increment": false,
"default": "0.00",
"orm_attributes": {
"precision": "10",
"scale": "2"
}
}
],
"associations": [
{
"id": 1,
"to_entity": "\\App\\Entity\\Order",
"owner_alias": "orders",
"inverse_alias": "customer",
"orm_attributes": {}
}
],
"indexes": [
{
"id": 1,
"name": "idx_email",
"unique": true,
"fields": ["email"],
"orm_attributes": {}
}
],
"orm_attributes": {
"table": "customers",
"repository-class": "App\\Repository\\CustomerRepository",
"change-tracking-policy": "DEFERRED_EXPLICIT",
"options": {
"charset": "utf8mb4"
},
"lifecycle-callbacks": [
{
"type": "prePersist",
"method": "onPrePersist"
}
]
},
"many_to_many": [
{
"id": 1,
"mn_entity": "\\App\\Entity\\CustomerTag",
"owner_alias": "tags",
"inverse_alias": "customers",
"orm_attributes": {}
}
],
"embeddeds": [
{
"id": 1,
"to_entity": "\\App\\Entity\\Address",
"owner_alias": "address",
"inverse_alias": null,
"orm_attributes": {}
}
]
}
],
"regions": [
{
"id": 1,
"caption": "Core Entities",
"description": "",
"namespace": "\\App\\Entity\\Core",
"orm_attributes": {}
}
],
"comments": [
{
"id": 1,
"caption": "TODO",
"description": "Add audit fields"
}
],
"orm_attributes": {}
}
]
}
}