{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "https://go.kicad.org/pcm/schemas/v1",
    "title": "KiCad PCM schema",
    "description": "KiCad Plugin and Content Manager repository and package metadata schema",
    "$ref": "#/definitions/Package",
    "definitions": {
        "Package": {
            "type": "object",
            "properties": {
                "name": {
                    "type": "string",
                    "description": "Package name",
                    "maxLength": 200
                },
                "description": {
                    "type": "string",
                    "description": "Short package description",
                    "maxLength": 500
                },
                "description_full": {
                    "type": "string",
                    "description": "Long package description",
                    "maxLength": 5000
                },
                "identifier": {
                    "type": "string",
                    "description": "Package identifier",
                    "pattern": "^[a-zA-Z][-a-zA-Z0-9.]{0,98}[a-zA-Z0-9]$"
                },
                "type": {
                    "type": "string",
                    "enum": [
                        "plugin",
                        "library",
                        "fab",
                        "colortheme"
                    ],
                    "description": "Type of the package"
                },
                "author": {
                    "$ref": "#/definitions/Contact",
                    "description": "Author of the package"
                },
                "maintainer": {
                    "$ref": "#/definitions/Contact",
                    "description": "Maintainer of the package"
                },
                "category": {
                    "type": "string",
                    "enum": [
                        "general",
                        "fab"
                    ],
                    "description": "Category of the package"
                },
                "license": {
                    "$ref": "#/definitions/License",
                    "description": "Package distribution license"
                },
                "resources": {
                    "type": "object",
                    "description": "Additional resource links for the package",
                    "patternProperties": {
                        "^[a-zA-Z][-a-zA-Z0-9 ]{0,48}[a-zA-Z0-9]$": {
                            "type": "string",
                            "maxLength": 500
                        }
                    },
                    "additionalProperties": false
                },
                "tags": {
                    "type": "array",
                    "description": "Tags for the package",
                    "items": {
                        "type": "string",
                        "pattern": "^[a-z][-a-z0-9]{0,48}[a-z0-9]$"
                    },
                    "minItems": 1,
                    "uniqueItems": true
                },
                "keep_on_update": {
                    "type": "array",
                    "description": "List of regular expressions describing which files should be kept on package update",
                    "items": {
                        "type": "string"
                    },
                    "uniqueItems": true
                },
                "versions": {
                    "type": "array",
                    "description": "Package versions",
                    "items": {
                        "$ref": "#/definitions/PackageVersion"
                    },
                    "uniqueItems": true
                }
            },
            "required": [
                "name",
                "description",
                "description_full",
                "identifier",
                "type",
                "author",
                "license",
                "resources",
                "versions"
            ]
        },
        "Contact": {
            "type": "object",
            "description": "Contact information",
            "properties": {
                "name": {
                    "type": "string",
                    "description": "Contact's name",
                    "maxLength": 500
                },
                "contact": {
                    "type": "object",
                    "description": "Contact information details",
                    "patternProperties": {
                        "^[a-z][-a-z0-9 ]{0,48}[a-z0-9]$": {
                            "type": "string",
                            "maxLength": 500
                        }
                    },
                    "additionalProperties": false
                }
            },
            "required": [
                "name",
                "contact"
            ]
        },
        "PackageVersion": {
            "type": "object",
            "description": "Package version details",
            "properties": {
                "version": {
                    "type": "string",
                    "description": "Package version number major[.minor[.patch]]",
                    "pattern": "^\\d{1,4}(\\.\\d{1,4}(\\.\\d{1,6})?)?$"
                },
                "version_epoch": {
                    "type": "integer",
                    "description": "Version epoch number. Versions with higher epoch will be considered later.",
                    "minimum": 0
                },
                "download_url": {
                    "description": "URL for direct download of the package archive",
                    "$ref": "#/definitions/URL"
                },
                "download_sha256": {
                    "type": "string",
                    "description": "SHA-256 hash of the package archive as lower case hex string",
                    "pattern": "^[a-f0-9]{64}$"
                },
                "download_size": {
                    "description": "Download size in bytes",
                    "type": "integer",
                    "minimum": 0
                },
                "install_size": {
                    "description": "Extracted size in bytes",
                    "type": "integer",
                    "minimum": 0
                },
                "status": {
                    "type": "string",
                    "description": "Development status of the package version",
                    "enum": [
                        "stable",
                        "testing",
                        "development",
                        "deprecated"
                    ]
                },
                "platforms": {
                    "type": "array",
                    "description": "Supported platforms",
                    "items": {
                        "type": "string",
                        "enum": [
                            "windows",
                            "macos",
                            "linux"
                        ]
                    },
                    "minItems": 1,
                    "uniqueItems": true
                },
                "runtime": {
                    "type": "string",
                    "enum": [
                        "swig",
                        "ipc"
                    ],
                    "description": "What runtime a plugin requires.  Assumed to be swig if absent.  Not used for non-plugin packages."
                },
                "kicad_version": {
                    "type": "string",
                    "description": "Minimum supported KiCad version",
                    "pattern": "^\\d{1,2}(\\.\\d{1,2}(\\.\\d{1,2})?)?$"
                },
                "kicad_version_max": {
                    "type": "string",
                    "description": "Maximum supported KiCad version",
                    "pattern": "^\\d{1,2}(\\.\\d{1,2}(\\.\\d{1,2})?)?$"
                },
                "keep_on_update": {
                    "type": "array",
                    "description": "List of regular expressions describing which files should be kept on package update",
                    "items": {
                        "type": "string"
                    },
                    "uniqueItems": true
                }
            },
            "required": [
                "version",
                "status",
                "kicad_version"
            ]
        },
        "PackageArray": {
            "type": "object",
            "description": "Array of package descriptions",
            "properties": {
                "packages": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/Package"
                    }
                }
            },
            "required": [
                "packages"
            ]
        },
        "Repository": {
            "type": "object",
            "description": "Repository metadata",
            "properties": {
                "name": {
                    "type": "string",
                    "description": "Repository name",
                    "maxLength": 500
                },
                "packages": {
                    "description": "Reference to repository packages metadata",
                    "$ref": "#/definitions/RepositoryResource"
                },
                "resources": {
                    "description": "Reference to additional resource files archive",
                    "$ref": "#/definitions/RepositoryResource"
                },
                "manifests": {
                    "description": "Reference to package manifests",
                    "$ref": "#/definitions/RepositoryResource"
                },
                "maintainer": {
                    "description": "Repository maintainer",
                    "$ref": "#/definitions/Contact"
                },
                "$schema": {
                    "$ref": "#/definitions/URL"
                }
            },
            "required": [
                "name",
                "packages"
            ]
        },
        "RepositoryResource": {
            "type": "object",
            "properties": {
                "url": {
                    "$ref": "#/definitions/URL"
                },
                "sha256": {
                    "type": "string",
                    "description": "SHA-256 hash of the resource file as lower case hex string",
                    "pattern": "^[a-f0-9]{64}$"
                },
                "update_timestamp": {
                    "type": "integer",
                    "description": "Update timestamp of the resource file"
                },
                "update_time_utc": {
                    "type": "string",
                    "description": "Human readable update time in UTC YYYY-MM-DD HH:MM:SS format",
                    "pattern": "^2\\d\\d\\d-\\d\\d-\\d\\d \\d\\d:\\d\\d:\\d\\d$"
                }
            },
            "required": [
                "url",
                "update_timestamp"
            ]
        },
        "URL": {
            "type": "string",
            "pattern": "^(https?:\\/\\/[^\\s\\/$.?#].[^\\s]*)|(file:\\/\\/([a-zA-Z]:|\\/)[^\\x00]+)$"
        },
        "License": {
            "type": "string",
            "enum": [
                "public-domain",
                "Apache",
                "Apache-1.0",
                "Apache-2.0",
                "Artistic",
                "Artistic-1.0",
                "Artistic-2.0",
                "BSD",
                "BSD-2-Clause",
                "BSD-3-Clause",
                "BSD-4-Clause",
                "ISC",
                "CC-BY",
                "CC-BY-1.0",
                "CC-BY-2.0",
                "CC-BY-2.5",
                "CC-BY-3.0",
                "CC-BY-4.0",
                "CC-BY-SA",
                "CC-BY-SA-1.0",
                "CC-BY-SA-2.0",
                "CC-BY-SA-2.5",
                "CC-BY-SA-3.0",
                "CC-BY-SA-4.0",
                "CC-BY-ND",
                "CC-BY-ND-1.0",
                "CC-BY-ND-2.0",
                "CC-BY-ND-2.5",
                "CC-BY-ND-3.0",
                "CC-BY-ND-4.0",
                "CC-BY-NC",
                "CC-BY-NC-1.0",
                "CC-BY-NC-2.0",
                "CC-BY-NC-2.5",
                "CC-BY-NC-3.0",
                "CC-BY-NC-4.0",
                "CC-BY-NC-SA",
                "CC-BY-NC-SA-1.0",
                "CC-BY-NC-SA-2.0",
                "CC-BY-NC-SA-2.5",
                "CC-BY-NC-SA-3.0",
                "CC-BY-NC-SA-4.0",
                "CC-BY-NC-ND",
                "CC-BY-NC-ND-1.0",
                "CC-BY-NC-ND-2.0",
                "CC-BY-NC-ND-2.5",
                "CC-BY-NC-ND-3.0",
                "CC-BY-NC-ND-4.0",
                "CC0-1.0",
                "CDDL-1.0",
                "CPL",
                "EFL",
                "EFL-1.0",
                "EFL-2.0",
                "MIT",
                "GPL",
                "GPL-1.0",
                "GPL-2.0",
                "GPL-3.0",
                "LGPL",
                "LGPL-2.1",
                "LGPL-3.0",
                "GNU-LGPL-2.0",
                "GFDL",
                "GFDL-1.0",
                "GFDL-1.1",
                "GFDL-1.2",
                "GFDL-1.3",
                "GFDL-NIV",
                "LPPL",
                "LPPL-1.0",
                "LPPL-1.1",
                "LPPL-1.2",
                "LPPL-1.3",
                "MPL-1.1",
                "Perl",
                "Python-2.0",
                "QPL-1.0",
                "W3C",
                "Zlib",
                "Zope",
                "Zope-1.0",
                "Zope-1.1",
                "Zope-2.0",
                "Zope-2.1",
                "CERN-OHL",
                "WTFPL",
                "Unlicense",
                "open-source",
                "unrestricted"
            ]
        }
    }
}
