skills/migrating-json-schemas/SKILL.md
Migrates JSON Schemas between draft versions for use with z-schema. Use when the user wants to upgrade schemas from draft-04 to draft-2020-12, convert between draft formats, update deprecated keywords, replace id with $id, convert definitions to $defs, migrate items to prefixItems, replace dependencies with dependentRequired or dependentSchemas, adopt unevaluatedProperties or unevaluatedItems, or adapt schemas to newer JSON Schema features.
npx skillsauth add zaggino/z-schema migrating-json-schemasInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
z-schema supports draft-04, draft-06, draft-07, draft-2019-09, and draft-2020-12. This skill covers migrating schemas between drafts and verifying them with z-schema.
$schema or id/$id usage).import ZSchema from 'z-schema';
const validator = ZSchema.create({ version: 'draft2020-12' });
validator.validateSchema(schema) to surface incompatibilities.| Old keyword (draft-04) | New keyword (draft-2020-12) | Introduced in |
| ------------------------------------ | ------------------------------------ | ------------- |
| id | $id | draft-06 |
| definitions | $defs | draft-2019-09 |
| Array-form items (tuple) | prefixItems | draft-2020-12 |
| additionalItems | items (when prefixItems present) | draft-2020-12 |
| exclusiveMinimum: true (boolean) | exclusiveMinimum: <number> | draft-06 |
| exclusiveMaximum: true (boolean) | exclusiveMaximum: <number> | draft-06 |
| dependencies (string arrays) | dependentRequired | draft-2019-09 |
| dependencies (schema values) | dependentSchemas | draft-2019-09 |
| $recursiveRef / $recursiveAnchor | $dynamicRef / $dynamicAnchor | draft-2020-12 |
For the complete keyword mapping with examples, see references/keyword-mapping.md.
This is the largest jump. Apply changes in order:
1. Rename id to $id
// Before (draft-04)
{ "id": "http://example.com/person.json", "type": "object" }
// After (draft-2020-12)
{ "$id": "http://example.com/person.json", "type": "object" }
2. Convert boolean exclusiveMinimum/exclusiveMaximum to numeric
// Before (draft-04)
{ "type": "number", "minimum": 0, "exclusiveMinimum": true }
// After (draft-2020-12)
{ "type": "number", "exclusiveMinimum": 0 }
Note: the minimum keyword is removed when converting to exclusiveMinimum as a number, since exclusiveMinimum: 0 means "greater than 0".
3. Rename definitions to $defs
// Before
{ "definitions": { "address": { "type": "object" } } }
// After
{ "$defs": { "address": { "type": "object" } } }
Update all $ref values that point to #/definitions/... → #/$defs/....
4. Split dependencies
// Before (draft-04) — mixed dependencies
{
"dependencies": {
"billing_address": ["credit_card"],
"credit_card": { "type": "object", "properties": { "cvv": { "type": "string" } } }
}
}
// After (draft-2020-12) — split into two keywords
{
"dependentRequired": {
"billing_address": ["credit_card"]
},
"dependentSchemas": {
"credit_card": { "type": "object", "properties": { "cvv": { "type": "string" } } }
}
}
5. Convert tuple items to prefixItems
// Before (draft-04)
{
"type": "array",
"items": [{ "type": "string" }, { "type": "number" }],
"additionalItems": false
}
// After (draft-2020-12)
{
"type": "array",
"prefixItems": [{ "type": "string" }, { "type": "number" }],
"items": false
}
When items was an array (tuple validation), it becomes prefixItems. The old additionalItems becomes items.
6. Add $schema declaration
{ "$schema": "https://json-schema.org/draft/2020-12/schema" }
Smaller jump. Main changes:
definitions → $defs (and update $ref paths)items → prefixItemsadditionalItems → items (when prefixItems present)dependencies → dependentRequired / dependentSchemasunevaluatedProperties / unevaluatedItems for stricter validation of combined schemasMinimal changes:
items → prefixItems, additionalItems → items$recursiveRef/$recursiveAnchor → $dynamicRef/$dynamicAnchorAfter migration, validate the schema itself against the target draft's meta-schema:
import ZSchema from 'z-schema';
const validator = ZSchema.create({ version: 'draft2020-12' });
try {
validator.validateSchema(migratedSchema);
console.log('Schema is valid for draft-2020-12');
} catch (err) {
console.log('Schema issues:', err.details);
}
Then test data validation to confirm behavior is unchanged:
// Test with known-good data
validator.validate(knownGoodData, migratedSchema);
// Test with known-bad data
const { valid } = validator.validateSafe(knownBadData, migratedSchema);
if (valid) {
console.warn('Migration issue: previously invalid data now passes');
}
If schemas must work across multiple draft versions, use version: 'none' and set $schema in each schema to declare its own draft:
const validator = ZSchema.create({ version: 'none' });
development
Inspects, filters, and maps z-schema validation errors for application use. Use when the user needs to handle validation errors, walk nested inner errors from anyOf/oneOf/not combinators, map error codes to user-friendly messages, filter errors with includeErrors or excludeErrors, build form-field error mappers, use reportPathAsArray, interpret SchemaErrorDetail fields like code/path/keyword/inner, or debug why validation failed.
development
Guides contributors through the z-schema codebase, PR workflow, and common development tasks. Use when the user wants to contribute to z-schema, add a new feature or keyword, add an error code, add a format validator, modify options, write tests, run the test suite, fix a failing test, understand the validation pipeline, navigate the source code architecture, or submit a pull request. Also use when someone mentions contributing, PRs, the z-schema source code, or the JSON Schema Test Suite integration.
development
Authors JSON Schema definitions for use with z-schema validation. Use when the user needs to write a JSON Schema, define a schema for an API payload, create schemas for form validation, structure schemas with $ref and $defs, choose between oneOf/anyOf/if-then-else, design object schemas with required and additionalProperties, validate arrays with items or prefixItems, add format constraints, organize schemas for reuse, or write draft-2020-12 schemas.
development
Validates JSON data against JSON Schema using the z-schema library. Use when the user needs to validate JSON, check data against a schema, handle validation errors, use custom format validators, work with JSON Schema drafts 04 through 2020-12, set up z-schema in a project, compile schemas with cross-references, resolve remote $ref, configure validation options, or inspect error details. Covers sync/async modes, safe error handling, schema pre-compilation, remote references, TypeScript types, and browser/UMD usage.