diff --git a/src/api/json/catalog.json b/src/api/json/catalog.json
index 1522871c3ab..cfbde20a0d1 100644
--- a/src/api/json/catalog.json
+++ b/src/api/json/catalog.json
@@ -2801,6 +2801,15 @@
"fileMatch": ["**/eca/config.json", "**/.eca/config.json"],
"url": "https://eca.dev/config.json"
},
+ {
+ "name": "editorconfig-checker",
+ "description": "editorconfig-checker configuration file",
+ "fileMatch": [".editorconfig-checker.json"],
+ "url": "https://raw.githubusercontent.com/editorconfig-checker/editorconfig-checker/main/.editorconfig-checker.schema.json",
+ "versions": {
+ "3.8.0": "https://raw.githubusercontent.com/editorconfig-checker/editorconfig-checker/v3.8.0/.editorconfig-checker.schema.json"
+ }
+ },
{
"name": "eksctl",
"description": "eksctl cluster configuration file",
@@ -4568,6 +4577,17 @@
"fileMatch": [".kubri.yaml", ".kubri.yml", "kubri.yaml", "kubri.yml"],
"url": "https://kubri.dev/schema.json"
},
+ {
+ "name": "kind cluster",
+ "description": "Configuration file for kind (Kubernetes IN Docker) clusters",
+ "fileMatch": [
+ "kind.yaml",
+ "kind.yml",
+ "**/kind-config.yaml",
+ "**/kind-config.yml"
+ ],
+ "url": "https://www.schemastore.org/kind-cluster.json"
+ },
{
"name": "kustomization.yaml",
"description": "Kubernetes native configuration management",
@@ -10653,6 +10673,12 @@
"fileMatch": ["**/.slang/server.json", "**/.slang/local/server.json"],
"url": "https://raw.githubusercontent.com/hudson-trading/slang-server/refs/heads/main/clients/vscode/resources/config.schema.json"
},
+ {
+ "name": "Heloisa Assistant Plugins Marketplace",
+ "description": "Validation rules for the Heloísa assistant's plugin catalog",
+ "fileMatch": ["heloisa-marketplace.json"],
+ "url": "https://raw.githubusercontent.com/SchemaStore/schemastore/master/src/schemas/json/heloisa-marketplace.json"
+ },
{
"name": "OKF Graph",
"description": "Graph generated for an OKF bundle",
diff --git a/src/negative_test/dependabot-2.0/registries-scope-wrong-type.json b/src/negative_test/dependabot-2.0/registries-scope-wrong-type.json
new file mode 100644
index 00000000000..d5d8c068bcb
--- /dev/null
+++ b/src/negative_test/dependabot-2.0/registries-scope-wrong-type.json
@@ -0,0 +1,21 @@
+{
+ "registries": {
+ "github-packages": {
+ "scope": 42,
+ "token": "${{ secrets.GH_PACKAGES_PAT }}",
+ "type": "npm-registry",
+ "url": "https://npm.pkg.github.com"
+ }
+ },
+ "updates": [
+ {
+ "directory": "/",
+ "package-ecosystem": "npm",
+ "registries": ["github-packages"],
+ "schedule": {
+ "interval": "daily"
+ }
+ }
+ ],
+ "version": 2
+}
diff --git a/src/negative_test/kind-cluster/invalid-kind.yaml b/src/negative_test/kind-cluster/invalid-kind.yaml
new file mode 100644
index 00000000000..55a34889e55
--- /dev/null
+++ b/src/negative_test/kind-cluster/invalid-kind.yaml
@@ -0,0 +1,3 @@
+# yaml-language-server: $schema=../../schemas/json/kind-cluster.json
+kind: Node
+apiVersion: kind.x-k8s.io/v1alpha4
diff --git a/src/negative_test/kind-cluster/invalid-role.yaml b/src/negative_test/kind-cluster/invalid-role.yaml
new file mode 100644
index 00000000000..5dfc3e70370
--- /dev/null
+++ b/src/negative_test/kind-cluster/invalid-role.yaml
@@ -0,0 +1,5 @@
+# yaml-language-server: $schema=../../schemas/json/kind-cluster.json
+kind: Cluster
+apiVersion: kind.x-k8s.io/v1alpha4
+nodes:
+ - role: master
diff --git a/src/schema-validation.jsonc b/src/schema-validation.jsonc
index 1a645a8c425..6afba9efcbc 100644
--- a/src/schema-validation.jsonc
+++ b/src/schema-validation.jsonc
@@ -3,7 +3,6 @@
"ajvNotStrictMode": [
"anywork-ac-1.0.json",
"anywork-ac-1.1.json",
- "apibuilder.json",
"appsettings.json",
"asmdef.json",
"aurora-1.0.json",
@@ -23,15 +22,12 @@
"azure-iot-edge-deployment-template-4.0.json",
"azure-iot-edgeagent-deployment-1.0.json",
"azure-iot-edgeagent-deployment-1.1.json",
- "babelrc.json",
"backportrc.json",
- "band-manifest.json",
"behat.json",
"bitrise-step.json",
"bitrise.json",
"bootstraprc.json",
"bower.json",
- "bowerrc.json",
"boyka-config.json",
"bukkit-plugin.json",
"bundleconfig.json",
@@ -60,8 +56,6 @@
"datalogic-scan2deploy-android.json",
"datalogic-scan2deploy-ce.json",
"debugsettings.json",
- "dependabot-2.0.json",
- "dependabot.json",
"devinit.schema-1.0.json",
"devinit.schema-2.0.json",
"devinit.schema-3.0.json",
@@ -286,7 +280,6 @@
"yamllint.json",
"deployed.json",
"jfrog-pipelines.json",
- "jdt.json",
"lsdlschema-0.7.json",
"lsdlschema-1.0.json",
"lsdlschema-1.2.json",
@@ -940,9 +933,6 @@
"anywork-ac-1.0.json": {
"externalSchema": ["base.json"]
},
- "apibuilder.json": {
- "externalSchema": ["base-04.json"]
- },
"aio-wasm-graph-config-1.1.0.json": {
"unknownFormat": ["uint32"]
},
@@ -1012,9 +1002,6 @@
"bitrise.json": {
"externalSchema": ["bitrise-step.json"]
},
- "bower.json": {
- "externalSchema": ["base-04.json"]
- },
"cargo-make.json": {
"unknownKeywords": ["links"]
},
@@ -1109,12 +1096,6 @@
"dart-build.json": {
"unknownKeywords": ["deprecationMessage", "sources"]
},
- "dependabot-2.0.json": {
- "externalSchema": ["base.json"]
- },
- "dependabot.json": {
- "unknownKeywords": ["examples"]
- },
"drone.json": {
"externalSchema": ["kubernetes-definitions.json"],
"unknownKeywords": [
diff --git a/src/schemas/json/apibuilder.json b/src/schemas/json/apibuilder.json
index 9c30157625e..5f2ce32444e 100644
--- a/src/schemas/json/apibuilder.json
+++ b/src/schemas/json/apibuilder.json
@@ -1,6 +1,8 @@
{
- "$schema": "http://json-schema.org/draft-04/schema#",
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "https://json.schemastore.org/apibuilder.json",
"additionalProperties": false,
+ "type": "object",
"definitions": {
"apidoc": {
"title": "API documentation",
@@ -56,7 +58,8 @@
"properties": {
"name": {
"type": "string",
- "description": "Name of the license - e.g. MIT"
+ "description": "Name of the license",
+ "examples": ["MIT"]
},
"url": {
"type": "string",
@@ -173,7 +176,7 @@
"title": "enumeration",
"type": "object",
"patternProperties": {
- "^[a-zA-Z0-9_]*$": {
+ "^[a-zA-Z][a-zA-Z0-9_]*$": {
"title": "name",
"type": "object",
"description": "The name of the enum. Names must be alphanumeric and must start with a letter. Valid characters are a-z, A-Z, 0-9 and _ characters. The name must be unique in the set of names assigned to enums, interfaces, models, or unions types.",
@@ -243,7 +246,7 @@
"title": "interface",
"type": "object",
"patternProperties": {
- "^[a-zA-Z0-9_]*$": {
+ "^[a-zA-Z][a-zA-Z0-9_]*$": {
"title": "name",
"type": "object",
"description": "Name specifies the name of the interface. Names must be alphanumeric and start with a letter. Valid characters are a-z, A-Z, 0-9 and _ characters. The name must be unique in the set of names assigned to enums, interfaces, or models. Note you may define an interface and a union of the same name.",
@@ -285,7 +288,7 @@
"name": {
"type": "string",
"description": "Specifies the name of the field. Names must be alphanumeric and start with a letter. Valid characters are a-z, A-Z, 0-9 and _ characters.",
- "pattern": "^[a-zA-Z0-9_]*$"
+ "pattern": "^[a-zA-Z][a-zA-Z0-9_]*$"
},
"type": {
"type": "string",
@@ -341,7 +344,7 @@
"type": "object",
"description": "specifies the name of the model. Names must be alphanumeric and start with a letter. Valid characters are a-z, A-Z, 0-9 and _ characters. The name must be unique in the set of names assigned to enums, interfaces, models, or unions types.",
"patternProperties": {
- "^[a-zA-Z0-9_]*$": {
+ "^[a-zA-Z][a-zA-Z0-9_]*$": {
"title": "model",
"type": "object",
"properties": {
@@ -384,7 +387,7 @@
"title": "union",
"type": "object",
"patternProperties": {
- "^[a-zA-Z0-9_]*$": {
+ "^[a-zA-Z][a-zA-Z0-9_]*$": {
"type": "object",
"description": "Name specifies the name of the interface. Names must be alphanumeric and start with a letter. Valid characters are a-z, A-Z, 0-9 and _ characters. The name must be unique in the set of names assigned to enums, unions, or models. Note you may define an interface and a union of the same name, but in this case it is required to list that interface in the interfaces field.",
"properties": {
@@ -508,7 +511,6 @@
"operation": {
"title": "operation",
"type": "object",
- "description": "",
"properties": {
"method": {
"type": "string",
@@ -558,7 +560,7 @@
"name": {
"type": "string",
"description": "The name of the parameter. Names must be alphanumeric and must start with a letter. Valid characters are a-z, A-Z, 0-9 and _ characters.",
- "pattern": "^[a-zA-Z0-9_]*$"
+ "pattern": "^[a-zA-Z][a-zA-Z0-9_]*$"
},
"type": {
"type": "string",
@@ -674,7 +676,6 @@
}
},
"description": "JSON Schema for API Builder's api.json format from https://app.apibuilder.io/doc/apiJson",
- "id": "https://json.schemastore.org/apibuilder.json",
"properties": {
"$schema": {
"type": "string",
diff --git a/src/schemas/json/artifacthub-repo.json b/src/schemas/json/artifacthub-repo.json
index 5c76a8db0e9..95d1338faa4 100644
--- a/src/schemas/json/artifacthub-repo.json
+++ b/src/schemas/json/artifacthub-repo.json
@@ -1,7 +1,7 @@
{
- "$schema": "http://json-schema.org/draft-04/schema#",
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "https://json.schemastore.org/artifacthub-repo.json",
"additionalProperties": false,
- "id": "https://json.schemastore.org/artifacthub-repo.json",
"properties": {
"repositoryID": {
"description": "An identifier of the Artifact Hub repository where the packages will be published to",
diff --git a/src/schemas/json/asconfig-schema.json b/src/schemas/json/asconfig-schema.json
index 8a5e42cc958..afd4ba7bdbe 100644
--- a/src/schemas/json/asconfig-schema.json
+++ b/src/schemas/json/asconfig-schema.json
@@ -1,5 +1,6 @@
{
- "$schema": "http://json-schema.org/draft-04/schema#",
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "https://json.schemastore.org/asconfig-schema.json",
"additionalProperties": false,
"definitions": {
"nonEmptyString": {
@@ -269,7 +270,6 @@
}
}
},
- "id": "https://json.schemastore.org/asconfig-schema.json",
"properties": {
"extends": {
"$ref": "#/definitions/nonEmptyString"
diff --git a/src/schemas/json/babelrc.json b/src/schemas/json/babelrc.json
index 327aa806f07..4a1df8fe0a5 100644
--- a/src/schemas/json/babelrc.json
+++ b/src/schemas/json/babelrc.json
@@ -1,5 +1,6 @@
{
- "$schema": "http://json-schema.org/draft-04/schema#",
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "https://json.schemastore.org/babelrc.json",
"allOf": [
{
"$ref": "#/definitions/Options"
@@ -46,8 +47,15 @@
},
"compact": {
"description": "Do not include superfluous whitespace characters and line terminators. When set to \"auto\" compact is set to true on input sizes of >500KB.",
- "type": ["string", "boolean"],
- "enum": ["auto", true, false],
+ "anyOf": [
+ {
+ "const": ["auto"],
+ "type": "string"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
"default": "auto"
},
"extends": {
@@ -69,14 +77,28 @@
},
"ignore": {
"description": "Opposite of the \"only\" option",
- "type": ["string", "array"],
- "items": {
- "type": "string"
- }
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ ]
},
"inputSourceMap": {
"description": "If true, attempt to load an input sourcemap from the file itself. If an object is provided, it will be treated as the source map object itself.",
- "type": ["boolean", "object"],
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "object"
+ }
+ ],
"default": true
},
"keepModuleIdExtensions": {
@@ -99,24 +121,40 @@
},
"only": {
"description": "A glob, regex, or mixed array of both, matching paths to only compile. Can also be an array of arrays containing paths to explicitly match. When attempting to compile a non-matching file it's returned verbatim.",
- "type": ["string", "array"],
- "items": {
- "type": "string"
- }
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ ]
},
"plugins": {
"description": "List of plugins to load and use",
"type": "array",
"items": {
- "type": ["string", "array"],
- "items": [
+ "anyOf": [
{
- "description": "The name of the plugin.",
"type": "string"
},
{
- "description": "The options of the plugin.",
- "type": "object"
+ "items": [
+ {
+ "description": "The name of the plugin.",
+ "type": "string"
+ },
+ {
+ "description": "The options of the plugin.",
+ "type": "object"
+ }
+ ],
+ "type": "array",
+ "minItems": 2,
+ "additionalItems": false
}
]
}
@@ -125,15 +163,24 @@
"description": "List of presets (a set of plugins) to load and use",
"type": "array",
"items": {
- "type": ["string", "array"],
- "items": [
+ "anyOf": [
{
- "description": "The name of the preset.",
"type": "string"
},
{
- "description": "The options of the preset.",
- "type": "object"
+ "type": "array",
+ "items": [
+ {
+ "description": "The name of the preset.",
+ "type": "string"
+ },
+ {
+ "description": "The options of the preset.",
+ "type": "object"
+ }
+ ],
+ "minItems": 2,
+ "additionalItems": false
}
]
}
@@ -150,8 +197,15 @@
"sourceMaps": {
"default": false,
"description": "If truthy, adds a map property to returned output. If set to \"inline\", a comment with a sourceMappingURL directive is added to the bottom of the returned code. If set to \"both\" then a map property is returned as well as a source map comment appended.",
- "type": ["string", "boolean"],
- "enum": ["both", "inline", true, false]
+ "anyOf": [
+ {
+ "type": "string",
+ "enum": ["both", "inline"]
+ },
+ {
+ "type": "boolean"
+ }
+ ]
},
"sourceMapTarget": {
"description": "Set file on returned source map. (defaults to \"filenameRelative\")",
@@ -164,7 +218,6 @@
}
}
},
- "id": "https://json.schemastore.org/babelrc.json",
"title": "JSON schema for Babel 6+ configuration files",
"type": "object"
}
diff --git a/src/schemas/json/band-manifest.json b/src/schemas/json/band-manifest.json
index dac6a5542e6..3dbcacaf7a1 100644
--- a/src/schemas/json/band-manifest.json
+++ b/src/schemas/json/band-manifest.json
@@ -1,5 +1,6 @@
{
- "$schema": "http://json-schema.org/draft-04/schema#",
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "https://json.schemastore.org/band-manifest.json",
"definitions": {
"icon": {
"type": "string",
@@ -16,7 +17,7 @@
},
"condition": {
"description": "If set, then must be set to 'true' for this release",
- "enum": ["true"]
+ "const": "true"
},
"resource": {
"type": "object",
@@ -44,6 +45,7 @@
}
},
"page": {
+ "type": "object",
"required": ["layout"],
"properties": {
"layout": {
@@ -104,6 +106,7 @@
}
},
"textBinding": {
+ "type": "object",
"required": ["elementId", "value"],
"properties": {
"elementId": {
@@ -133,11 +136,10 @@
}
}
},
- "id": "https://json.schemastore.org/band-manifest.json",
"properties": {
"manifestVersion": {
"description": "Defines the contract between the web tile developer and the Microsoft Health app. It must be set to 1 for the current release.",
- "enum": [1]
+ "const": 1
},
"name": {
"description": "Defines the name of the web tile.",
diff --git a/src/schemas/json/bootstraprc.json b/src/schemas/json/bootstraprc.json
index 969ef6470f1..54b88f6813b 100644
--- a/src/schemas/json/bootstraprc.json
+++ b/src/schemas/json/bootstraprc.json
@@ -1,5 +1,6 @@
{
- "$schema": "http://json-schema.org/draft-04/schema#",
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "https://json.schemastore.org/bootstraprc.json",
"allOf": [
{
"$ref": "#/definitions/coreProperties"
@@ -77,7 +78,7 @@
},
"loglevel": {
"description": "The verbosity of logging. Exclude this property to disable.",
- "enum": ["debug"],
+ "const": "debug",
"type": "string"
},
"preBootstrapCustomizations": {
@@ -86,7 +87,14 @@
},
"scripts": {
"description": "Excludes/includes Bootstrap's JavaScript modules",
- "type": ["boolean", "object"]
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "object"
+ }
+ ]
},
"styleLoaders": {
"default": ["style", "css", "sass"],
@@ -100,7 +108,14 @@
},
"styles": {
"description": "Excludes/includes Bootstrap's CSS modules",
- "type": ["boolean", "object"]
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "object"
+ }
+ ]
},
"useCustomIconFontPath": {
"default": false,
@@ -115,7 +130,6 @@
}
}
},
- "id": "https://json.schemastore.org/bootstraprc.json",
"title": "JSON schema for Webpack's bootstrap-loader configuration file",
"type": "object"
}
diff --git a/src/schemas/json/bower.json b/src/schemas/json/bower.json
index c79af8c055f..41636594eed 100644
--- a/src/schemas/json/bower.json
+++ b/src/schemas/json/bower.json
@@ -1,10 +1,33 @@
{
- "$schema": "http://json-schema.org/draft-04/schema#",
- "id": "https://json.schemastore.org/bower.json",
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "https://json.schemastore.org/bower.json",
"patternProperties": {
"^_": {
"description": "Any property starting with _ is valid.",
- "additionalProperties": true
+ "anyOf": [
+ {
+ "type": "array"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "object",
+ "additionalProperties": true
+ },
+ {
+ "type": "string"
+ }
+ ]
}
},
"properties": {
@@ -25,16 +48,41 @@
},
"main": {
"description": "The primary acting files necessary to use your package.",
- "type": ["string", "array"]
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "array"
+ }
+ ]
},
"license": {
"description": "SPDX license identifier or path/url to a license.",
- "type": ["string", "array"],
- "maxLength": 140
+ "anyOf": [
+ {
+ "type": "string",
+ "maxLength": 140
+ },
+ {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "maxLength": 140
+ }
+ }
+ ]
},
"ignore": {
"description": "A list of files for Bower to ignore when installing your package.",
- "type": ["string", "array"]
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "array"
+ }
+ ]
},
"keywords": {
"description": "Used for search by keyword. Helps make your package easier to discover without people needing to know its name.",
@@ -48,7 +96,14 @@
"description": "A list of people that authored the contents of the package.",
"type": "array",
"items": {
- "type": ["string", "object"]
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "object"
+ }
+ ]
}
},
"homepage": {
@@ -62,7 +117,7 @@
"properties": {
"type": {
"type": "string",
- "enum": ["git"]
+ "const": "git"
},
"url": {
"type": "string",
@@ -98,16 +153,30 @@
"additionalProperties": {
"type": "object",
"additionalProperties": {
- "type": ["string", "array"]
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "array"
+ }
+ ]
}
}
},
"moduleType": {
"description": "The types of modules this package exposes",
- "type": ["array", "string"],
- "items": {
- "enum": ["amd", "es6", "globals", "node", "yui"]
- }
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "array",
+ "items": {
+ "enum": ["amd", "es6", "globals", "node", "yui"]
+ }
+ }
+ ]
}
},
"required": ["name"],
diff --git a/src/schemas/json/bowerrc.json b/src/schemas/json/bowerrc.json
index 8c978cf76b5..6a026dcc3ee 100644
--- a/src/schemas/json/bowerrc.json
+++ b/src/schemas/json/bowerrc.json
@@ -1,7 +1,7 @@
{
- "$schema": "http://json-schema.org/draft-04/schema#",
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "https://json.schemastore.org/bowerrc.json",
"additionalProperties": true,
- "id": "https://json.schemastore.org/bowerrc.json",
"properties": {
"analytics": {
"type": "boolean",
@@ -22,26 +22,44 @@
"default": "bower.json"
},
"registry": {
- "type": ["string", "object"],
- "description": "The registry config",
- "format": "uri",
- "properties": {
- "search": {
- "type": ["array", "string"],
- "description": "An array of URLs pointing to read-only Bower registries. A string means only one. When looking into the registry for an endpoint, Bower will query these registries by the specified order.",
- "format": "uri"
- },
- "register": {
+ "anyOf": [
+ {
"type": "string",
- "description": "The URL to use when registering packages.",
"format": "uri"
},
- "publish": {
- "type": "string",
- "description": "The URL to use when publishing packages.",
- "format": "uri"
+ {
+ "type": "object",
+ "properties": {
+ "search": {
+ "anyOf": [
+ {
+ "type": "string",
+ "format": "uri"
+ },
+ {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "format": "uri"
+ }
+ }
+ ],
+ "description": "An array of URLs pointing to read-only Bower registries. A string means only one. When looking into the registry for an endpoint, Bower will query these registries by the specified order."
+ },
+ "register": {
+ "type": "string",
+ "description": "The URL to use when registering packages.",
+ "format": "uri"
+ },
+ "publish": {
+ "type": "string",
+ "description": "The URL to use when publishing packages.",
+ "format": "uri"
+ }
+ }
}
- }
+ ],
+ "description": "The registry config"
},
"proxy": {
"type": "string",
@@ -67,7 +85,14 @@
"description": "Whether or not to do SSL key validation when making requests via https."
},
"ca": {
- "type": ["object", "string"],
+ "anyOf": [
+ {
+ "type": "object"
+ },
+ {
+ "type": "string"
+ }
+ ],
"description": "The CA certificates to be used, defaults to null. This is similar to the registry key, specifying each CA to use for each registry endpoint."
},
"color": {
diff --git a/src/schemas/json/dependabot-2.0.json b/src/schemas/json/dependabot-2.0.json
index ed7572625a8..7d5896fd1f1 100644
--- a/src/schemas/json/dependabot-2.0.json
+++ b/src/schemas/json/dependabot-2.0.json
@@ -700,6 +700,7 @@
"pre-commit",
"pub",
"rust-toolchain",
+ "sbt",
"swift",
"terraform",
"uv",
@@ -753,9 +754,19 @@
},
"anyOf": [
{
+ "properties": {
+ "dependency-name": {
+ "$ref": "#/definitions/update/properties/allow/items/properties/dependency-name"
+ }
+ },
"required": ["dependency-name"]
},
{
+ "properties": {
+ "dependency-type": {
+ "$ref": "#/definitions/dependency-type"
+ }
+ },
"required": ["dependency-type"]
}
],
@@ -789,18 +800,32 @@
"include": {
"description": "Specifies that any prefix is followed by a list of the dependencies updated in the commit.",
"type": "string",
- "enum": ["scope"],
- "default": "scope"
+ "const": "scope"
}
},
"anyOf": [
{
+ "properties": {
+ "prefix": {
+ "$ref": "#/definitions/update/properties/commit-message/properties/prefix"
+ }
+ },
"required": ["prefix"]
},
{
+ "properties": {
+ "prefix-development": {
+ "$ref": "#/definitions/update/properties/commit-message/properties/prefix-development"
+ }
+ },
"required": ["prefix-development"]
},
{
+ "properties": {
+ "include": {
+ "$ref": "#/definitions/update/properties/commit-message/properties/include"
+ }
+ },
"required": ["include"]
}
],
@@ -926,7 +951,7 @@
"group-by": {
"description": "Configure how dependencies are grouped within this group.",
"type": "string",
- "enum": ["dependency-name"]
+ "const": "dependency-name"
}
},
"additionalProperties": false
@@ -966,12 +991,27 @@
},
"anyOf": [
{
+ "properties": {
+ "dependency-name": {
+ "$ref": "#/definitions/update/properties/ignore/items/properties/dependency-name"
+ }
+ },
"required": ["dependency-name"]
},
{
+ "properties": {
+ "update-types": {
+ "$ref": "#/definitions/update/properties/ignore/items/properties/update-types"
+ }
+ },
"required": ["update-types"]
},
{
+ "properties": {
+ "versions": {
+ "$ref": "#/definitions/update/properties/ignore/items/properties/versions"
+ }
+ },
"required": ["versions"]
}
],
@@ -1080,12 +1120,9 @@
"timezone": {
"$ref": "#/definitions/timezone",
"description": "The time zone identifier must be from the Time Zone database maintained by IANA"
- },
- "cronjob": {
- "type": "string",
- "description": "Specify a valid cron expression for updates"
}
},
+ "required": ["interval"],
"allOf": [
{
"$comment": "If interval type is 'cron', enforce 'cronjob' property.",
@@ -1097,10 +1134,13 @@
}
},
"then": {
- "required": ["interval", "cronjob"]
- },
- "else": {
- "required": ["interval"]
+ "properties": {
+ "cronjob": {
+ "type": "string",
+ "description": "Specify a valid cron expression for updates"
+ }
+ },
+ "required": ["cronjob"]
}
}
]
@@ -1134,25 +1174,43 @@
"minLength": 1
}
},
+ "required": ["package-ecosystem"],
"allOf": [
{
"$comment": "Schedule is required UNLESS multi-ecosystem-group is specified",
"if": {
- "required": ["multi-ecosystem-group"]
+ "not": {
+ "properties": {
+ "multi-ecosystem-group": {}
+ },
+ "required": ["multi-ecosystem-group"]
+ }
},
"then": {
- "required": ["package-ecosystem"]
- },
- "else": {
- "required": ["package-ecosystem", "schedule"]
+ "properties": {
+ "schedule": {
+ "$ref": "#/definitions/update/properties/schedule"
+ }
+ },
+ "required": ["schedule"]
}
},
{
"oneOf": [
{
+ "properties": {
+ "directories": {
+ "$ref": "#/definitions/update/properties/directories"
+ }
+ },
"required": ["directories"]
},
{
+ "properties": {
+ "directory": {
+ "$ref": "#/definitions/update/properties/directory"
+ }
+ },
"required": ["directory"]
}
]
@@ -1163,6 +1221,11 @@
"required": ["multi-ecosystem-group"]
},
"then": {
+ "properties": {
+ "patterns": {
+ "$ref": "#/definitions/update/properties/patterns"
+ }
+ },
"required": ["patterns"]
}
}
@@ -1219,6 +1282,25 @@
"description": "For registries with type: python-index, if the boolean value is true, pip resolves dependencies by using the specified URL rather than the base URL of the Python Package Index (by default https://pypi.org/simple).",
"type": "boolean"
},
+ "scope": {
+ "$comment": "'scope' must be either a single npm scope, or an array of them.",
+ "description": "For registries with type: npm-registry, the npm scope or scopes served by this registry, for example '@my-org'. Dependabot binds only the listed scopes to this registry when generating the .npmrc, so packages outside those scopes continue to resolve from the base registry. This value takes precedence over scope inference from an existing .npmrc or from the lockfile.",
+ "oneOf": [
+ {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "minLength": 1
+ },
+ "uniqueItems": true,
+ "minItems": 1
+ },
+ {
+ "type": "string",
+ "minLength": 1
+ }
+ ]
+ },
"organization": {
"description": "",
"type": "string"
@@ -1308,12 +1390,9 @@
"timezone": {
"$ref": "#/definitions/timezone",
"description": "The time zone identifier must be from the Time Zone database maintained by IANA"
- },
- "cronjob": {
- "type": "string",
- "description": "Specify a valid cron expression for updates"
}
},
+ "required": ["interval"],
"allOf": [
{
"$comment": "If interval type is 'cron', enforce 'cronjob' property.",
@@ -1325,10 +1404,13 @@
}
},
"then": {
- "required": ["interval", "cronjob"]
- },
- "else": {
- "required": ["interval"]
+ "properties": {
+ "cronjob": {
+ "type": "string",
+ "description": "Specify a valid cron expression for updates"
+ }
+ },
+ "required": ["cronjob"]
}
}
]
@@ -1380,17 +1462,32 @@
"include": {
"description": "Specifies that any prefix is followed by a list of the dependencies updated in the commit",
"type": "string",
- "enum": ["scope"]
+ "const": "scope"
}
},
"anyOf": [
{
+ "properties": {
+ "prefix": {
+ "$ref": "#/definitions/multi-ecosystem-group/properties/commit-message/properties/prefix"
+ }
+ },
"required": ["prefix"]
},
{
+ "properties": {
+ "prefix-development": {
+ "$ref": "#/definitions/multi-ecosystem-group/properties/commit-message/properties/prefix-development"
+ }
+ },
"required": ["prefix-development"]
},
{
+ "properties": {
+ "include": {
+ "$ref": "#/definitions/multi-ecosystem-group/properties/commit-message/properties/include"
+ }
+ },
"required": ["include"]
}
],
@@ -1450,7 +1547,7 @@
"title": "Config file version",
"description": "Dependabot configuration files require this key, and its value must be 2",
"type": "integer",
- "enum": [2]
+ "const": 2
},
"enable-beta-ecosystems": {
"description": "Enable ecosystems that have beta-level support",
@@ -1494,7 +1591,9 @@
"else": {
"properties": {
"updates": {
+ "type": "array",
"items": {
+ "type": "object",
"properties": {
"package-ecosystem": {
"$ref": "#/definitions/package-ecosystem-values"
diff --git a/src/schemas/json/dependabot.json b/src/schemas/json/dependabot.json
index fa6dcfe0846..dcd43f92c99 100644
--- a/src/schemas/json/dependabot.json
+++ b/src/schemas/json/dependabot.json
@@ -1,14 +1,10 @@
{
- "$schema": "http://json-schema.org/draft-04/schema#",
- "definitions": {},
- "id": "https://json.schemastore.org/dependabot.json",
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "https://json.schemastore.org/dependabot.json",
"properties": {
"version": {
"type": "integer",
- "default": 1,
- "examples": [1],
- "minimum": 1,
- "maximum": 1
+ "const": 1
},
"update_configs": {
"type": "array",
@@ -53,11 +49,7 @@
"target_branch": {
"type": "string",
"description": "Branch to create pull requests against. By default your repository's default branch is used.",
- "items": {
- "type": "string",
- "description": "branchname",
- "examples": ["develop"]
- }
+ "examples": ["develop"]
},
"default_reviewers": {
"type": "array",
@@ -94,7 +86,7 @@
"description": "Limit which updates are allowed. By default all direct/top-level dependencies are kept up to date (indirect/sub-dependencies are only updated if they include security fixes).",
"items": {
"type": "object",
- "minItems": 1,
+ "minProperties": 1,
"properties": {
"match": {
"type": "object",
@@ -132,7 +124,7 @@
"description": "By default no updates are ignored. The version_requirement specifies the versions to ignore. The range format is specific to the package manager (e.g., ^1.0.0 for JS, or ~> 2.0 for Ruby).",
"items": {
"type": "object",
- "minItems": 1,
+ "minProperties": 1,
"properties": {
"match": {
"type": "object",
@@ -157,7 +149,7 @@
"description": "Automerged updates must be enabled at the account level (from account settings in your dashboard) before they can be configured on a project. Specify which update pull requests should be merged automatically. By default no updates are automerged. For all of the options below Dependabot will wait until all your status checks pass before merging. You can also set working hours for automerging in your dashboard account settings.",
"items": {
"type": "object",
- "minItems": 1,
+ "minProperties": 1,
"properties": {
"match": {
"type": "object",
diff --git a/src/schemas/json/glazewm.json b/src/schemas/json/glazewm.json
index 205063ef1d3..6ad473c86e9 100644
--- a/src/schemas/json/glazewm.json
+++ b/src/schemas/json/glazewm.json
@@ -17,62 +17,57 @@
"$ref": "#/definitions/invalid-shorthand-property"
},
"examples": [
- "focus left",
- "focus right",
- "focus up",
- "focus down",
- "focus workspace prev",
- "focus workspace next",
- "focus workspace recent",
- "move left",
- "move right",
- "move up",
- "move down",
- "move to workspace WORKSPACE_NAME",
- "resize HEIGHT WIDTH",
- "resize borders SHORTHAND_PROPERTY",
- "set floating",
- "set tiling",
- "set minimized",
- "set maximized",
- "toggle floating",
- "toggle maximized",
- "focus mode toggle",
- "tiling direction vertical",
- "tiling direction horizontal",
- "tiling direction toggle",
- "exit wm",
- "reload config",
+ "focus --direction left",
+ "focus --direction right",
+ "focus --direction up",
+ "focus --direction down",
+ "focus --workspace 1",
+ "focus --next-active-workspace",
+ "focus --prev-active-workspace",
+ "focus --recent-workspace",
+ "move --direction left",
+ "move --direction right",
+ "move --direction up",
+ "move --direction down",
+ "move --workspace 1",
+ "resize --width -2%",
+ "resize --height +2%",
+ "set-floating",
+ "toggle-floating --centered",
+ "toggle-tiling",
+ "toggle-fullscreen",
+ "toggle-minimized",
+ "toggle-tiling-direction",
+ "wm-cycle-focus",
+ "wm-exit",
+ "wm-reload-config",
+ "wm-redraw",
+ "wm-toggle-pause",
"close",
- "exec PROCESS_NAME",
+ "shell-exec cmd",
"ignore"
]
},
"binding": {
"title": "binding",
- "description": "A binding\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#keybindings",
+ "description": "A keybinding\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#keybindings",
"type": "string",
- "not": {
- "pattern": "^\\s+$"
- },
- "examples": ["Alt+H"]
+ "minLength": 1,
+ "examples": ["alt+h", "alt+shift+space", "alt+1", "escape", "enter"]
},
"commands": {
"title": "commands",
- "description": "Commands\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#available-commands",
+ "description": "Commands to execute\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#available-commands",
"type": "array",
- "uniqueItems": true,
- "minItems": 2,
"items": {
"$ref": "#/definitions/command"
}
},
"bindings": {
"title": "bindings",
- "description": "Bindings\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#keybindings",
+ "description": "Keybindings\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#keybindings",
"type": "array",
- "uniqueItems": true,
- "minItems": 2,
+ "minItems": 1,
"items": {
"$ref": "#/definitions/binding"
}
@@ -116,10 +111,9 @@
},
"opacity-property": {
"title": "opacity",
- "type": "number",
- "minimum": 0,
- "maximum": 1,
- "default": 1
+ "type": "string",
+ "minLength": 1,
+ "default": "1"
},
"background-property": {
"$ref": "#/definitions/color",
@@ -175,6 +169,7 @@
"battery",
"cpu",
"gpu",
+ "memory",
"network",
"volume",
"text file",
@@ -955,68 +950,21 @@
},
"source": {
"title": "source",
- "description": "A source path for the 'Image' component\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#bar-component-image",
+ "description": "An image source for the 'Image' component\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#bar-component-image",
"type": "string",
"minLength": 1
- }
- },
- "additionalProperties": false
- }
- },
- {
- "if": {
- "properties": {
- "type": {
- "const": "system tray"
- }
- }
- },
- "then": {
- "properties": {
- "type": {
- "$ref": "#/definitions/component.type-property"
- },
- "margin": {
- "$ref": "#/definitions/component.margin-property"
- },
- "padding": {
- "$ref": "#/definitions/component.padding-property"
- },
- "opacity": {
- "$ref": "#/definitions/component.opacity-property"
- },
- "background": {
- "$ref": "#/definitions/component.background-property"
- },
- "foreground": {
- "$ref": "#/definitions/component.foreground-property"
- },
- "font_family": {
- "$ref": "#/definitions/component.font-family-property"
- },
- "font_size": {
- "$ref": "#/definitions/component.font-size-property"
},
- "font_weight": {
- "$ref": "#/definitions/component.font-weight-property"
- },
- "border_width": {
- "$ref": "#/definitions/component.border-width-property"
- },
- "border_color": {
- "$ref": "#/definitions/component.border-color-property"
- },
- "label_expand_text": {
- "title": "label expand text",
- "description": "An expand label for the 'System Tray' component\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#bar-component-system-tray",
+ "height": {
+ "title": "height",
+ "description": "A height for the 'Image' component\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#bar-component-image",
"type": "string",
- "examples": ["<"]
+ "minLength": 1
},
- "label_collapse_text": {
- "title": "label collapse text",
- "description": "An collapse label for the 'System Tray' component\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#bar-component-system-tray",
+ "width": {
+ "title": "width",
+ "description": "A width for the 'Image' component\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#bar-component-image",
"type": "string",
- "examples": [">"]
+ "minLength": 1
}
},
"additionalProperties": false
@@ -1026,7 +974,7 @@
"if": {
"properties": {
"type": {
- "const": "music"
+ "const": "system tray"
}
}
},
@@ -1064,205 +1012,461 @@
},
"border_color": {
"$ref": "#/definitions/component.border-color-property"
- },
- "label_not_playing": {
- "title": "label not playing",
- "description": "A not playing label for the 'Music' component\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#bar-component-music",
- "type": "string"
- },
- "label_paused": {
- "title": "label paused",
- "description": "A paused label for the 'Music' component\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#bar-component-music",
- "type": "string",
- "examples": ["{song_title} - {artist_name}"]
- },
- "label_playing": {
- "title": "label playing",
- "description": "A playing label for the 'Music' component\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#bar-component-music",
- "type": "string",
- "examples": ["{song_title} - {artist_name}"]
- },
- "max_title_length": {
- "title": "max title length",
- "description": "A maximum title length for the 'Music' component\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#bar-component-music",
- "type": "integer",
- "minimum": 0,
- "examples": [20]
- },
- "max_artist_length": {
- "title": "max artist length",
- "description": "A maximum artist length for the 'Music' component\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#bar-component-music",
- "type": "integer",
- "minimum": 0,
- "examples": [20]
}
},
"additionalProperties": false
}
}
- ]
+ ],
+ "required": ["type"]
}
+ },
+ "match-criterion": {
+ "title": "match criterion",
+ "description": "A match criterion for window rules\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#window-rules",
+ "type": "object",
+ "properties": {
+ "window_process": {
+ "title": "window process",
+ "description": "Match by window process name",
+ "type": "object",
+ "properties": {
+ "equals": {
+ "description": "Exact match for the window process name",
+ "type": "string",
+ "minLength": 1
+ },
+ "includes": {
+ "description": "Substring match for the window process name",
+ "type": "string",
+ "minLength": 1
+ },
+ "regex": {
+ "description": "Regex match for the window process name",
+ "type": "string",
+ "minLength": 1
+ },
+ "not_equals": {
+ "description": "Negative exact match for the window process name",
+ "type": "string",
+ "minLength": 1
+ },
+ "not_regex": {
+ "description": "Negative regex match for the window process name",
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "additionalProperties": false,
+ "minProperties": 1,
+ "maxProperties": 1
+ },
+ "window_title": {
+ "title": "window title",
+ "description": "Match by window title",
+ "type": "object",
+ "properties": {
+ "equals": {
+ "description": "Exact match for the window title",
+ "type": "string",
+ "minLength": 1
+ },
+ "includes": {
+ "description": "Substring match for the window title",
+ "type": "string",
+ "minLength": 1
+ },
+ "regex": {
+ "description": "Regex match for the window title",
+ "type": "string",
+ "minLength": 1
+ },
+ "not_equals": {
+ "description": "Negative exact match for the window title",
+ "type": "string",
+ "minLength": 1
+ },
+ "not_regex": {
+ "description": "Negative regex match for the window title",
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "additionalProperties": false,
+ "minProperties": 1,
+ "maxProperties": 1
+ },
+ "window_class": {
+ "title": "window class",
+ "description": "Match by window class name",
+ "type": "object",
+ "properties": {
+ "equals": {
+ "description": "Exact match for the window class name",
+ "type": "string",
+ "minLength": 1
+ },
+ "includes": {
+ "description": "Substring match for the window class name",
+ "type": "string",
+ "minLength": 1
+ },
+ "regex": {
+ "description": "Regex match for the window class name",
+ "type": "string",
+ "minLength": 1
+ },
+ "not_equals": {
+ "description": "Negative exact match for the window class name",
+ "type": "string",
+ "minLength": 1
+ },
+ "not_regex": {
+ "description": "Negative regex match for the window class name",
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "additionalProperties": false,
+ "minProperties": 1,
+ "maxProperties": 1
+ }
+ },
+ "additionalProperties": false,
+ "minProperties": 1
+ },
+ "keybinding-object": {
+ "title": "keybinding",
+ "description": "A keybinding object\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#keybindings",
+ "type": "object",
+ "properties": {
+ "commands": {
+ "$ref": "#/definitions/commands"
+ },
+ "bindings": {
+ "$ref": "#/definitions/bindings"
+ }
+ },
+ "required": ["commands", "bindings"],
+ "additionalProperties": false
}
},
- "title": "GlazeWM settings",
- "description": "GlazeWM settings",
- "type": "object",
"properties": {
"general": {
"title": "general",
- "description": "General settings\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#general",
+ "description": "General settings\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#general-configuration",
"type": "object",
"properties": {
+ "startup_commands": {
+ "$ref": "#/definitions/commands",
+ "title": "startup commands",
+ "description": "Commands to run when the WM has started"
+ },
+ "shutdown_commands": {
+ "$ref": "#/definitions/commands",
+ "title": "shutdown commands",
+ "description": "Commands to run just before the WM is shutdown"
+ },
+ "config_reload_commands": {
+ "$ref": "#/definitions/commands",
+ "title": "config reload commands",
+ "description": "Commands to run after the WM config is reloaded"
+ },
"focus_follows_cursor": {
"title": "focus follows cursor",
- "description": "Whether to automatically focus windows underneath the cursor\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#general",
- "type": "boolean",
- "default": false
- },
- "cursor_follows_focus": {
- "title": "cursor follows focus",
- "description": "Whether to jump the cursor between windows focused by the WM\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#general",
+ "description": "Whether to automatically focus windows underneath the cursor",
"type": "boolean",
"default": false
},
"toggle_workspace_on_refocus": {
"title": "toggle workspace on refocus",
- "description": "Whether to switch back and forth between the previously focused workspace when focusing the current workspace\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#general",
- "type": "boolean",
- "default": true
- },
- "show_floating_on_top": {
- "title": "show floating on top",
- "description": "Whether to show floating windows as always on top\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#general",
+ "description": "Whether to switch back and forth between the previously focused workspace when focusing the current workspace",
"type": "boolean",
"default": false
},
- "floating_window_move_amount": {
- "title": "floating window move amount",
- "description": "An amount to move floating windows by\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#general",
+ "cursor_jump": {
+ "title": "cursor jump",
+ "description": "Cursor jump settings",
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "title": "enabled",
+ "description": "Whether to automatically move the cursor on the specified trigger",
+ "type": "boolean",
+ "default": true
+ },
+ "trigger": {
+ "title": "trigger",
+ "description": "Trigger for cursor jump",
+ "type": "string",
+ "enum": ["monitor_focus", "window_focus"],
+ "default": "monitor_focus"
+ }
+ },
+ "additionalProperties": false
+ },
+ "hide_method": {
+ "title": "hide method",
+ "description": "How windows should be hidden when switching workspaces",
"type": "string",
- "minLength": 2,
- "pattern": "^\\d+%$",
- "default": "5%"
+ "enum": ["cloak", "hide", "place_in_corner"],
+ "default": "cloak"
},
- "center_new_floating_windows": {
- "title": "center new floating windows",
- "description": "Whether to center new floating windows\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#general",
+ "show_all_in_taskbar": {
+ "title": "show all in taskbar",
+ "description": "Affects which windows get shown in the native Windows taskbar. Has no effect if hide_method is 'hide'",
+ "type": "boolean",
+ "default": false
+ }
+ },
+ "additionalProperties": false
+ },
+ "gaps": {
+ "title": "gaps",
+ "description": "Gap settings\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#gaps",
+ "type": "object",
+ "properties": {
+ "scale_with_dpi": {
+ "title": "scale with dpi",
+ "description": "Whether to scale the gaps with the DPI of the monitor",
"type": "boolean",
"default": true
},
- "window_animations": {
- "title": "window animations",
- "description": "Whether to enable window transition animations\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#general",
+ "inner_gap": {
+ "title": "inner gap",
+ "description": "Gap between adjacent windows",
+ "type": "string",
+ "minLength": 1,
+ "default": "20px"
+ },
+ "outer_gap": {
+ "title": "outer gap",
+ "description": "Gap between windows and the screen edge. Can be a single string or an object with per-edge values",
+ "oneOf": [
+ {
+ "type": "string",
+ "minLength": 1
+ },
+ {
+ "type": "object",
+ "properties": {
+ "top": {
+ "title": "top",
+ "type": "string",
+ "minLength": 1
+ },
+ "right": {
+ "title": "right",
+ "type": "string",
+ "minLength": 1
+ },
+ "bottom": {
+ "title": "bottom",
+ "type": "string",
+ "minLength": 1
+ },
+ "left": {
+ "title": "left",
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "additionalProperties": false
+ }
+ ]
+ },
+ "single_window_outer_gap": {
+ "title": "single window outer gap",
+ "description": "Gap between a single window and the screen edge when it's the only window in the workspace. Same format as outer_gap",
"oneOf": [
{
- "type": "boolean"
+ "type": "string",
+ "minLength": 1
},
- { "type": "string", "const": "unchanged" }
- ],
- "default": "unchanged"
+ {
+ "type": "object",
+ "properties": {
+ "top": {
+ "title": "top",
+ "type": "string",
+ "minLength": 1
+ },
+ "right": {
+ "title": "right",
+ "type": "string",
+ "minLength": 1
+ },
+ "bottom": {
+ "title": "bottom",
+ "type": "string",
+ "minLength": 1
+ },
+ "left": {
+ "title": "left",
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "additionalProperties": false
+ }
+ ]
}
},
"additionalProperties": false
},
- "keybindings": {
- "title": "keybindings",
- "description": "Keybindings\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#keybindings",
- "type": "array",
- "uniqueItems": true,
- "minItems": 1,
- "items": {
- "description": "A keybinding\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#keybindings",
- "type": "object",
- "oneOf": [
- {
- "properties": {
- "binding": {
- "$ref": "#/definitions/binding"
+ "window_effects": {
+ "title": "window effects",
+ "description": "Window effect settings\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#window-effects",
+ "type": "object",
+ "properties": {
+ "focused_window": {
+ "title": "focused window",
+ "description": "Visual effects to apply to the focused window",
+ "type": "object",
+ "properties": {
+ "border": {
+ "title": "border",
+ "description": "Highlight the window with a colored border. Exclusive to Windows 11 due to API limitations",
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "title": "enabled",
+ "type": "boolean",
+ "default": true
+ },
+ "color": {
+ "$ref": "#/definitions/color",
+ "title": "color",
+ "default": "#8dbcff"
+ }
},
- "command": {
- "$ref": "#/definitions/command"
- }
+ "additionalProperties": false
},
- "additionalProperties": false
- },
- {
- "properties": {
- "bindings": {
- "$ref": "#/definitions/bindings"
+ "hide_title_bar": {
+ "title": "hide title bar",
+ "description": "Remove the title bar from the window's frame",
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "title": "enabled",
+ "type": "boolean",
+ "default": false
+ }
},
- "command": {
- "$ref": "#/definitions/command"
- }
+ "additionalProperties": false
},
- "additionalProperties": false
- },
- {
- "properties": {
- "binding": {
- "$ref": "#/definitions/binding"
+ "corner_style": {
+ "title": "corner style",
+ "description": "Change the corner style of the window's frame. Exclusive to Windows 11 due to API limitations",
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "title": "enabled",
+ "type": "boolean",
+ "default": false
+ },
+ "style": {
+ "title": "style",
+ "type": "string",
+ "enum": ["square", "rounded", "small_rounded"],
+ "default": "square"
+ }
},
- "commands": {
- "$ref": "#/definitions/commands"
- }
+ "additionalProperties": false
},
- "additionalProperties": false
- },
- {
- "properties": {
- "bindings": {
- "$ref": "#/definitions/bindings"
+ "transparency": {
+ "title": "transparency",
+ "description": "Change the transparency of the window",
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "title": "enabled",
+ "type": "boolean",
+ "default": false
+ },
+ "opacity": {
+ "$ref": "#/definitions/opacity-property",
+ "title": "opacity",
+ "default": "95%"
+ }
},
- "commands": {
- "$ref": "#/definitions/commands"
- }
- },
- "additionalProperties": false
- }
- ],
- "minProperties": 2,
- "maxProperties": 2
- }
- },
- "focus_borders": {
- "title": "focus borders",
- "description": "Focus settings\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#focus-window-border-configuration",
- "type": "object",
- "properties": {
- "active": {
- "title": "active",
- "description": "An active border\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#focus-window-border-configuration",
- "type": "object",
- "properties": {
- "enabled": {
- "title": "enabled",
- "description": "Whether to enable the active border\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#focus-window-border-configuration",
- "type": "boolean",
- "default": true
- },
- "color": {
- "$ref": "#/definitions/color",
- "title": "color",
- "description": "A color of the active border\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#focus-window-border-configuration"
+ "additionalProperties": false
}
},
"additionalProperties": false
},
- "inactive": {
- "title": "inactive",
- "description": "An inactive border\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#focus-window-border-configuration",
+ "other_windows": {
+ "title": "other windows",
+ "description": "Visual effects to apply to non-focused windows",
"type": "object",
"properties": {
- "enabled": {
- "title": "enabled",
- "description": "Whether to enable the inactive border\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#focus-window-border-configuration",
- "type": "boolean",
- "default": false
+ "border": {
+ "title": "border",
+ "description": "Highlight the window with a colored border",
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "title": "enabled",
+ "type": "boolean",
+ "default": true
+ },
+ "color": {
+ "$ref": "#/definitions/color",
+ "title": "color",
+ "default": "#a1a1a1"
+ }
+ },
+ "additionalProperties": false
+ },
+ "hide_title_bar": {
+ "title": "hide title bar",
+ "description": "Remove the title bar from the window's frame",
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "title": "enabled",
+ "type": "boolean",
+ "default": false
+ }
+ },
+ "additionalProperties": false
+ },
+ "corner_style": {
+ "title": "corner style",
+ "description": "Change the corner style of the window's frame",
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "title": "enabled",
+ "type": "boolean",
+ "default": false
+ },
+ "style": {
+ "title": "style",
+ "type": "string",
+ "enum": ["square", "rounded", "small_rounded"],
+ "default": "square"
+ }
+ },
+ "additionalProperties": false
},
- "color": {
- "$ref": "#/definitions/color",
- "title": "color",
- "description": "A color of the active border\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#focus-window-border-configuration"
+ "transparency": {
+ "title": "transparency",
+ "description": "Change the transparency of the window",
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "title": "enabled",
+ "type": "boolean",
+ "default": false
+ },
+ "opacity": {
+ "$ref": "#/definitions/opacity-property",
+ "title": "opacity",
+ "default": "0%"
+ }
+ },
+ "additionalProperties": false
}
},
"additionalProperties": false
@@ -1270,107 +1474,83 @@
},
"additionalProperties": false
},
- "gaps": {
- "title": "gaps",
- "description": "Gap settings\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#gap-configuration",
+ "window_behavior": {
+ "title": "window behavior",
+ "description": "Window behavior settings\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#window-behavior",
"type": "object",
"properties": {
- "inner_gap": {
- "title": "inner gap",
- "description": "An inner gap\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#gap-configuration",
+ "initial_state": {
+ "title": "initial state",
+ "description": "New windows are created in this state whenever possible",
"type": "string",
- "minLength": 1,
- "not": {
- "$ref": "#/definitions/invalid-shorthand-property"
- },
- "default": "20px"
+ "enum": ["tiling", "floating"],
+ "default": "tiling"
},
- "outer_gap": {
- "title": "outer gap",
- "description": "An outer gap\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#gap-configuration",
- "type": "string",
- "minLength": 1,
- "not": {
- "$ref": "#/definitions/invalid-shorthand-property"
+ "state_defaults": {
+ "title": "state defaults",
+ "description": "Default options for when a new window is created",
+ "type": "object",
+ "properties": {
+ "floating": {
+ "title": "floating",
+ "description": "Default options for floating windows",
+ "type": "object",
+ "properties": {
+ "centered": {
+ "title": "centered",
+ "description": "Whether to center floating windows by default",
+ "type": "boolean",
+ "default": true
+ },
+ "shown_on_top": {
+ "title": "shown on top",
+ "description": "Whether to show floating windows as always on top",
+ "type": "boolean",
+ "default": false
+ }
+ },
+ "additionalProperties": false
+ },
+ "fullscreen": {
+ "title": "fullscreen",
+ "description": "Default options for fullscreen windows",
+ "type": "object",
+ "properties": {
+ "maximized": {
+ "title": "maximized",
+ "description": "Maximize the window if possible",
+ "type": "boolean",
+ "default": false
+ },
+ "shown_on_top": {
+ "title": "shown on top",
+ "description": "Whether to show fullscreen windows as always on top",
+ "type": "boolean",
+ "default": false
+ }
+ },
+ "additionalProperties": false
+ }
},
- "default": "20px"
+ "additionalProperties": false
}
},
"additionalProperties": false
},
- "workspaces": {
- "title": "workspaces",
- "description": "Workspace settings\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#workspaces-configuration",
- "type": "array",
- "uniqueItems": true,
- "minItems": 1,
- "items": {
- "description": "A workspace setting\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#workspaces-configuration",
- "type": "object",
- "properties": {
- "name": {
- "title": "name",
- "description": "A unique name of the workspace\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#workspaces-configuration",
- "type": "string",
- "minLength": 1,
- "pattern": "\\S",
- "examples": ["1"]
- },
- "display_name": {
- "title": "display name",
- "description": "A display name of the workspace\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#workspaces-configuration",
- "type": "string",
- "minLength": 1,
- "pattern": "\\S",
- "examples": ["1"]
- },
- "bind_to_monitor": {
- "title": "bind to monitor",
- "description": "Whether to bind the workspace to a specific monitor\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#workspaces-configuration",
- "type": "boolean"
- },
- "keep_alive": {
- "title": "keep alive",
- "description": "Whether not to destroy the workspace when it's empty\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#workspaces-configuration",
- "type": "boolean",
- "default": false
- }
- },
- "additionalProperties": false
- }
- },
"bar": {
"title": "bar",
"description": "Bar settings\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#bar-configuration",
"type": "object",
"properties": {
- "enabled": {
- "title": "title",
- "description": "Whether to enable the bar\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#bar-configuration",
- "type": "boolean",
- "default": true
- },
"height": {
"$ref": "#/definitions/length",
"title": "height",
"description": "A height of the bar\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#bar-configuration",
- "default": "30px"
- },
- "position": {
- "title": "position",
- "description": "A position of the bar\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#bar-configuration",
- "type": "string",
- "enum": ["top", "bottom"],
- "default": "top"
- },
- "always_on_top": {
- "title": "always on top",
- "description": "Whether to keep the bar above other windows\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#bar-configuration",
- "type": "boolean",
- "default": false
+ "default": "40px"
},
"opacity": {
"$ref": "#/definitions/opacity-property",
+ "title": "opacity",
"description": "An opacity of the bar\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#bar-configuration"
},
"background": {
@@ -1447,42 +1627,125 @@
},
"additionalProperties": false
},
+ "workspaces": {
+ "title": "workspaces",
+ "description": "Workspace settings\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#workspaces",
+ "type": "array",
+ "uniqueItems": true,
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "title": "name",
+ "description": "The name of the workspace",
+ "type": "string",
+ "minLength": 1
+ },
+ "keep_alive": {
+ "title": "keep alive",
+ "description": "Whether to keep the workspace alive when it has no windows",
+ "type": "boolean"
+ },
+ "display_name": {
+ "title": "display name",
+ "description": "Optional display name for the workspace, used in 3rd-party apps like Zebar",
+ "type": "string"
+ },
+ "bind_to_monitor": {
+ "title": "bind to monitor",
+ "description": "Bind the workspace to a specific monitor index",
+ "type": "integer",
+ "minimum": 0
+ }
+ },
+ "required": ["name"],
+ "additionalProperties": false
+ }
+ },
"window_rules": {
- "title": "windows rules",
- "description": "Windows rule settings\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#window-rules",
+ "title": "window rules",
+ "description": "Window rule settings\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#window-rules",
"type": "array",
"uniqueItems": true,
"items": {
"type": "object",
"properties": {
- "command": {
- "$ref": "#/definitions/command"
+ "commands": {
+ "$ref": "#/definitions/commands"
},
- "match_process_name": {
- "title": "match process name",
- "description": "A process name to match\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#window-rules",
- "type": "string",
- "minLength": 1,
- "examples": ["chrome"]
+ "match": {
+ "title": "match",
+ "description": "Match criteria for this window rule. All criteria within a match item are ANDed together. Multiple match items are ORed together",
+ "type": "array",
+ "minItems": 1,
+ "items": {
+ "$ref": "#/definitions/match-criterion"
+ }
},
- "match_title": {
- "title": "match title",
- "description": "A window title to match\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#window-rules",
- "type": "string",
- "minLength": 1,
- "examples": ["/.*/"]
+ "on": {
+ "title": "on",
+ "description": "Window events that trigger this rule. Defaults to [Manage, TitleChange]",
+ "type": "array",
+ "minItems": 1,
+ "items": {
+ "type": "string",
+ "enum": ["focus", "manage", "title_change"]
+ }
},
- "match_class_name": {
- "title": "match class name",
- "description": "A class name to match\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#window-rules",
+ "run_once": {
+ "title": "run once",
+ "description": "Whether to only run this rule once per window",
+ "type": "boolean",
+ "default": false
+ }
+ },
+ "required": ["commands", "match"],
+ "additionalProperties": false
+ }
+ },
+ "binding_modes": {
+ "title": "binding modes",
+ "description": "Binding mode settings\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#binding-modes",
+ "type": "array",
+ "uniqueItems": true,
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "title": "name",
+ "description": "The name of the binding mode",
"type": "string",
- "minLength": 1,
- "examples": ["Chrome_WidgetWin_1"]
+ "minLength": 1
+ },
+ "display_name": {
+ "title": "display name",
+ "description": "Optional display name for the binding mode",
+ "type": "string"
+ },
+ "keybindings": {
+ "title": "keybindings",
+ "description": "Keybindings for this binding mode",
+ "type": "array",
+ "minItems": 1,
+ "items": {
+ "$ref": "#/definitions/keybinding-object"
+ }
}
},
+ "required": ["name", "keybindings"],
"additionalProperties": false
}
+ },
+ "keybindings": {
+ "title": "keybindings",
+ "description": "Global keybinding settings\nhttps://github.com/glzr-io/glazewm?tab=readme-ov-file#keybindings",
+ "type": "array",
+ "minItems": 1,
+ "items": {
+ "$ref": "#/definitions/keybinding-object"
+ }
}
},
- "additionalProperties": true
+ "additionalProperties": true,
+ "type": "object"
}
diff --git a/src/schemas/json/heloisa-marketplace.json b/src/schemas/json/heloisa-marketplace.json
new file mode 100644
index 00000000000..73da678abfe
--- /dev/null
+++ b/src/schemas/json/heloisa-marketplace.json
@@ -0,0 +1,46 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "https://json.schemastore.org/heloisa-marketplace.json",
+ "title": "Heloísa Assistant Plugins Marketplace",
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "version": { "type": "string" },
+ "description": { "type": "string" },
+ "owner": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "email": { "type": "string" }
+ },
+ "required": ["name"],
+ "additionalProperties": false
+ },
+ "homepage": { "type": "string", "format": "uri" },
+ "plugins": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "description": { "type": "string" },
+ "version": { "type": "string" },
+ "author": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "email": { "type": "string" }
+ },
+ "additionalProperties": false
+ },
+ "source": { "type": "string" },
+ "category": { "type": "string" }
+ },
+ "required": ["name", "source"],
+ "additionalProperties": false
+ }
+ }
+ },
+ "required": ["name", "version", "plugins"],
+ "additionalProperties": false
+}
diff --git a/src/schemas/json/jdt.json b/src/schemas/json/jdt.json
index 7dac5a21adc..d2f1ad6ccd9 100644
--- a/src/schemas/json/jdt.json
+++ b/src/schemas/json/jdt.json
@@ -1,5 +1,6 @@
{
- "$schema": "http://json-schema.org/draft-04/schema#",
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "https://json.schemastore.org/jdt.json",
"additionalProperties": {
"$ref": "#"
},
@@ -13,7 +14,6 @@
"description": "The transformation value that should be applied."
}
},
- "id": "https://json.schemastore.org/jdt.json",
"properties": {
"@jdt.rename": {
"anyOf": [
@@ -33,6 +33,7 @@
"type": "array",
"description": "Renames nodes",
"items": {
+ "type": "object",
"properties": {
"@jdt.path": {
"$ref": "#/definitions/@jdt.path"
@@ -46,60 +47,108 @@
]
},
"@jdt.replace": {
- "type": ["array", "object"],
- "description": "Replaces the current node with the given value. ",
- "properties": {
- "@jdt.path": {
- "$ref": "#/definitions/@jdt.path"
+ "anyOf": [
+ {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "@jdt.path": {
+ "$ref": "#/definitions/@jdt.path"
+ },
+ "@jdt.value": {
+ "$ref": "#/definitions/@jdt.value"
+ }
+ }
+ }
},
- "@jdt.value": {
- "$ref": "#/definitions/@jdt.value"
- }
- },
- "items": {
- "properties": {
- "@jdt.path": {
- "$ref": "#/definitions/@jdt.path"
- },
- "@jdt.value": {
- "$ref": "#/definitions/@jdt.value"
+ {
+ "type": "object",
+ "properties": {
+ "@jdt.path": {
+ "$ref": "#/definitions/@jdt.path"
+ },
+ "@jdt.value": {
+ "$ref": "#/definitions/@jdt.value"
+ }
}
}
- }
+ ],
+ "description": "Replaces the current node with the given value. "
},
"@jdt.remove": {
- "type": ["array", "boolean", "object", "string"],
- "description": "Removes the node with the given name from the current level.",
- "properties": {
- "@jdt.path": {
- "$ref": "#/definitions/@jdt.path"
+ "anyOf": [
+ {
+ "type": "array",
+ "items": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "object"
+ },
+ {
+ "type": "string"
+ }
+ ]
+ }
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "@jdt.path": {
+ "$ref": "#/definitions/@jdt.path"
+ }
+ }
+ },
+ {
+ "type": "string"
}
- },
- "items": {
- "type": ["boolean", "integer", "null", "number", "object", "string"]
- }
+ ],
+ "description": "Removes the node with the given name from the current level."
},
"@jdt.merge": {
- "description": "Merges the current node value with the given object.",
- "type": ["object", "array"],
- "properties": {
- "@jdt.path": {
- "$ref": "#/definitions/@jdt.path"
+ "anyOf": [
+ {
+ "type": "object",
+ "properties": {
+ "@jdt.path": {
+ "$ref": "#/definitions/@jdt.path"
+ },
+ "@jdt.value": {
+ "$ref": "#/definitions/@jdt.value"
+ }
+ }
},
- "@jdt.value": {
- "$ref": "#/definitions/@jdt.value"
- }
- },
- "items": {
- "properties": {
- "@jdt.path": {
- "$ref": "#/definitions/@jdt.path"
- },
- "@jdt.value": {
- "$ref": "#/definitions/@jdt.value"
+ {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "@jdt.path": {
+ "$ref": "#/definitions/@jdt.path"
+ },
+ "@jdt.value": {
+ "$ref": "#/definitions/@jdt.value"
+ }
+ }
}
}
- }
+ ],
+ "description": "Merges the current node value with the given object."
}
},
"title": "JSON schema for JSON Document Transforms",
diff --git a/src/schemas/json/kind-cluster.json b/src/schemas/json/kind-cluster.json
new file mode 100644
index 00000000000..931dd916bc3
--- /dev/null
+++ b/src/schemas/json/kind-cluster.json
@@ -0,0 +1,231 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "https://json.schemastore.org/kind-cluster.json",
+ "$comment": "Schema for Kubernetes kind cluster config (kind.x-k8s.io/v1alpha4). Docs: https://kind.sigs.k8s.io/docs/user/configuration/",
+ "title": "kind cluster configuration",
+ "description": "Configuration file for kind (Kubernetes IN Docker) clusters using apiVersion kind.x-k8s.io/v1alpha4.",
+ "type": "object",
+ "required": ["kind", "apiVersion"],
+ "additionalProperties": false,
+ "properties": {
+ "kind": {
+ "type": "string",
+ "const": "Cluster",
+ "description": "Resource kind. Must be Cluster."
+ },
+ "apiVersion": {
+ "type": "string",
+ "const": "kind.x-k8s.io/v1alpha4",
+ "description": "kind config API version."
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Cluster name. Overridden by --name / KIND_CLUSTER_NAME."
+ },
+ "nodes": {
+ "type": "array",
+ "description": "Node definitions. Defaults to a single control-plane node when omitted.",
+ "items": {
+ "$ref": "#/definitions/node"
+ }
+ },
+ "networking": {
+ "$ref": "#/definitions/networking"
+ },
+ "featureGates": {
+ "type": "object",
+ "description": "Kubernetes feature gates applied cluster-wide.",
+ "additionalProperties": {
+ "type": "boolean"
+ }
+ },
+ "runtimeConfig": {
+ "type": "object",
+ "description": "kube-apiserver --runtime-config key/value pairs.",
+ "additionalProperties": {
+ "type": "string"
+ }
+ },
+ "kubeadmConfigPatches": {
+ "type": "array",
+ "description": "RFC 7386 merge patches (inline YAML) applied to kubeadm config.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "kubeadmConfigPatchesJSON6902": {
+ "type": "array",
+ "description": "RFC 6902 JSON patches for kubeadm config.",
+ "items": {
+ "$ref": "#/definitions/patchJSON6902"
+ }
+ },
+ "containerdConfigPatches": {
+ "type": "array",
+ "description": "TOML merge patches applied to every node containerd config.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "containerdConfigPatchesJSON6902": {
+ "type": "array",
+ "description": "RFC 6902 patches applied to every node containerd config.",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "definitions": {
+ "node": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "role": {
+ "type": "string",
+ "enum": ["control-plane", "worker"],
+ "default": "control-plane",
+ "description": "Node role in the kind cluster."
+ },
+ "image": {
+ "type": "string",
+ "description": "Node container image (kindest/node tag)."
+ },
+ "labels": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ },
+ "description": "Labels applied to the node."
+ },
+ "extraMounts": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/mount"
+ }
+ },
+ "extraPortMappings": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/portMapping"
+ }
+ },
+ "kubeadmConfigPatches": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "kubeadmConfigPatchesJSON6902": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/patchJSON6902"
+ }
+ }
+ }
+ },
+ "mount": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["hostPath", "containerPath"],
+ "properties": {
+ "hostPath": {
+ "type": "string"
+ },
+ "containerPath": {
+ "type": "string"
+ },
+ "readOnly": {
+ "type": "boolean"
+ },
+ "selinuxRelabel": {
+ "type": "boolean"
+ },
+ "propagation": {
+ "type": "string",
+ "enum": ["None", "HostToContainer", "Bidirectional"]
+ }
+ }
+ },
+ "portMapping": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["containerPort"],
+ "properties": {
+ "containerPort": {
+ "type": "integer"
+ },
+ "hostPort": {
+ "type": "integer"
+ },
+ "listenAddress": {
+ "type": "string"
+ },
+ "protocol": {
+ "type": "string",
+ "enum": ["TCP", "UDP", "SCTP"]
+ }
+ }
+ },
+ "networking": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "ipFamily": {
+ "type": "string",
+ "enum": ["ipv4", "ipv6", "dual"]
+ },
+ "apiServerPort": {
+ "type": "integer"
+ },
+ "apiServerAddress": {
+ "type": "string"
+ },
+ "podSubnet": {
+ "type": "string"
+ },
+ "serviceSubnet": {
+ "type": "string"
+ },
+ "disableDefaultCNI": {
+ "type": "boolean"
+ },
+ "kubeProxyMode": {
+ "type": "string",
+ "enum": ["iptables", "ipvs", "nftables", "none"]
+ },
+ "dnsSearch": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "patchJSON6902": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["patch"],
+ "properties": {
+ "group": {
+ "type": "string"
+ },
+ "version": {
+ "type": "string"
+ },
+ "kind": {
+ "type": "string"
+ },
+ "patch": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "namespace": {
+ "type": "string"
+ }
+ }
+ }
+ }
+}
diff --git a/src/schemas/json/partial-mypy.json b/src/schemas/json/partial-mypy.json
index dd5c9fbe00f..1e04e0333a6 100644
--- a/src/schemas/json/partial-mypy.json
+++ b/src/schemas/json/partial-mypy.json
@@ -651,6 +651,11 @@
}
]
},
+ "native_parser": {
+ "description": "This enables fast Rust-based parser that parses directly to mypy AST. It will become the default parser in one of the next mypy releases.",
+ "x-intellij-html-description": "This enables fast Rust-based parser that parses directly to mypy AST. It will become the default parser in one of the next mypy releases.",
+ "type": "boolean"
+ },
"overrides": {
"type": "array",
"items": {
diff --git a/src/schemas/json/uv.json b/src/schemas/json/uv.json
index bf094c20e50..0de20fbcd42 100644
--- a/src/schemas/json/uv.json
+++ b/src/schemas/json/uv.json
@@ -179,17 +179,17 @@
}
},
"exclude-dependencies": {
- "description": "Package names to exclude, e.g., `werkzeug`, `numpy`.",
+ "description": "Dependencies to exclude when resolving the project's dependencies.\n\nExcludes are used to prevent a package from being selected during resolution,\nregardless of whether it's requested by any other package. When a package is excluded,\nit will be omitted from the dependency list entirely.\n\nIncluding a package as an exclusion will prevent it from being installed, even if\nit's requested by transitive dependencies. This can be useful for removing optional\ndependencies or working around packages with broken dependencies.\n\nExclusions can be limited to the dependencies declared by a specific package version by\nusing a table with `package` and `dependencies`. The `package` table identifies the package\nwhose dependencies will be excluded by `name` and, optionally, `version`. If `version` is\nomitted, the exclusions apply to all versions of that package. A version-specific entry\ntakes precedence over an all-versions entry.\n\n!!! note\n In `uv lock`, `uv sync`, and `uv run`, uv will only read `exclude-dependencies` from\n the `pyproject.toml` at the workspace root, and will ignore any declarations in other\n workspace members or `uv.toml` files.",
"type": ["array", "null"],
"items": {
- "type": "string"
+ "$ref": "#/definitions/ExcludeDependency"
}
},
"exclude-newer": {
- "description": "Limit candidate packages to those that were uploaded prior to the given date.\n\nThe date is compared against the upload time of each individual distribution artifact\n(i.e., when each file was uploaded to the package index), not the release date of the\npackage version.\n\nAccepts RFC 3339 timestamps (e.g., `2006-12-02T02:07:43Z`), a \"friendly\" duration (e.g.,\n`24 hours`, `1 week`, `30 days`), or an ISO 8601 duration (e.g., `PT24H`, `P7D`, `P30D`).\n\nDurations do not respect semantics of the local time zone and are always resolved to a fixed\nnumber of seconds assuming that a day is 24 hours (e.g., DST transitions are ignored).\nCalendar units such as months and years are not allowed.",
+ "description": "Limit candidate packages to those that were uploaded prior to the given date.\n\nThe date is compared against the upload time of each individual distribution artifact\n(i.e., when each file was uploaded to the package index), not the release date of the\npackage version.\n\nAccepts RFC 3339 timestamps (e.g., `2006-12-02T02:07:43Z`), a \"friendly\" duration (e.g.,\n`24 hours`, `1 week`, `30 days`), or an ISO 8601 duration (e.g., `PT24H`, `P7D`, `P30D`).\n\nDurations do not respect semantics of the local time zone and are always resolved to a fixed\nnumber of seconds assuming that a day is 24 hours (e.g., DST transitions are ignored).\nCalendar units such as months and years are not allowed.\n\nSet to `false` to disable `exclude-newer`.",
"anyOf": [
{
- "$ref": "#/definitions/ExcludeNewerValue"
+ "$ref": "#/definitions/ExcludeNewerOverride"
},
{
"type": "null"
@@ -334,7 +334,8 @@
},
"native-tls": {
"description": "Whether to load TLS certificates from the platform's native certificate store.\n\nBy default, uv uses bundled Mozilla root certificates. When enabled, this loads\ncertificates from the platform's native certificate store instead.\n\n(Deprecated: use `system-certs` instead.)",
- "type": ["boolean", "null"]
+ "type": ["boolean", "null"],
+ "deprecated": true
},
"no-binary": {
"description": "Don't install pre-built wheels.\n\nThe given packages will be built and installed from source. The resolver will still use\npre-built wheels to extract package metadata, if available.",
@@ -348,7 +349,7 @@
}
},
"no-build": {
- "description": "Don't build source distributions.\n\nWhen enabled, resolving will not run arbitrary Python code. The cached wheels of\nalready-built source distributions will be reused, but operations that require building\ndistributions will exit with an error.",
+ "description": "Don't build source distributions.\n\nWhen enabled, uv will reuse cached wheels from previously built source distributions, but\noperations that require building a source distribution will exit with an error. uv may\nstill build editable requirements, and their build backends may run arbitrary Python code.",
"type": ["boolean", "null"]
},
"no-build-isolation": {
@@ -400,10 +401,10 @@
"type": ["boolean", "null"]
},
"override-dependencies": {
- "description": "PEP 508-style requirements, e.g., `ruff==0.5.0`, or `ruff @ https://...`.",
+ "description": "Overrides to apply when resolving the project's dependencies.\n\nOverrides are used to force selection of a specific version of a package, regardless of the\nversion requested by any other package, and regardless of whether choosing that version\nwould typically constitute an invalid resolution.\n\nWhile constraints are _additive_, in that they're combined with the requirements of the\nconstituent packages, overrides are _absolute_, in that they completely replace the\nrequirements of any constituent packages.\n\nIncluding a package as an override will _not_ trigger installation of the package on its\nown; instead, the package must be requested elsewhere in the project's first-party or\ntransitive dependencies.\n\nOverrides can be limited to the dependencies declared by a specific package version by\nusing a table with `package` and `dependencies`. The `package` table identifies the package\nwhose dependencies will be overridden by `name` and, optionally, `version`. If `version` is\nomitted, the overrides apply to all versions of that package. Requirements in `dependencies`\nreplace dependencies with the same name and add dependencies that are not declared by the\npackage. Dependencies not listed in `dependencies` are left unchanged.\n\nScoped overrides currently support registry version specifiers only. Direct URL and path\nsources, including Git sources, and explicit indexes are not supported.\n\n!!! note\n In `uv lock`, `uv sync`, and `uv run`, uv will only read `override-dependencies` from\n the `pyproject.toml` at the workspace root, and will ignore any declarations in other\n workspace members or `uv.toml` files.",
"type": ["array", "null"],
"items": {
- "type": "string"
+ "$ref": "#/definitions/Override"
}
},
"package": {
@@ -432,8 +433,20 @@
]
},
"preview": {
- "description": "Whether to enable experimental, preview features.",
- "type": ["boolean", "null"]
+ "description": "Whether to enable all experimental, preview features.\n\nUse `preview-features` instead.",
+ "type": ["boolean", "null"],
+ "deprecated": true
+ },
+ "preview-features": {
+ "description": "Whether to enable specific or all experimental preview features.\n\nUnknown feature names are ignored with a warning.",
+ "anyOf": [
+ {
+ "$ref": "#/definitions/PreviewFeaturesOption"
+ },
+ {
+ "type": "null"
+ }
+ ]
},
"publish-url": {
"description": "The URL for publishing packages to the Python package index (by default:\n).",
@@ -581,6 +594,13 @@
}
},
"additionalProperties": false,
+ "not": {
+ "properties": {
+ "preview": {},
+ "preview-features": {}
+ },
+ "required": ["preview", "preview-features"]
+ },
"definitions": {
"AddBoundsKind": {
"description": "The default version specifier when adding a dependency.",
@@ -838,6 +858,17 @@
"type": "string",
"format": "uri"
},
+ "ExcludeDependency": {
+ "description": "An exclusion, either global or scoped to a specific package version.",
+ "anyOf": [
+ {
+ "$ref": "#/definitions/PackageExclusion"
+ },
+ {
+ "$ref": "#/definitions/PackageName"
+ }
+ ]
+ },
"ExcludeNewerOverride": {
"oneOf": [
{
@@ -994,7 +1025,7 @@
"default": "simple"
},
"ignore-error-codes": {
- "description": "Status codes that uv should ignore when deciding whether\nto continue searching in the next index after a failure.\n\n```toml\n[[tool.uv.index]]\nname = \"my-index\"\nurl = \"https:///simple\"\nignore-error-codes = [401, 403]\n```",
+ "description": "Status codes that uv should ignore when deciding whether to continue resolution after a\nrequest to this index fails.\n\n```toml\n[[tool.uv.index]]\nname = \"my-index\"\nurl = \"https:///simple\"\nignore-error-codes = [401, 403]\n```",
"type": ["array", "null"],
"default": null,
"items": {
@@ -1149,6 +1180,17 @@
}
]
},
+ "Override": {
+ "description": "An override, either global or scoped to a specific package version.",
+ "anyOf": [
+ {
+ "$ref": "#/definitions/PackageOverride"
+ },
+ {
+ "$ref": "#/definitions/Requirement"
+ }
+ ]
+ },
"PackageConfigSettings": {
"description": "Settings to pass to PEP 517 build backends on a per-package basis.",
"type": "object",
@@ -1156,6 +1198,38 @@
"$ref": "#/definitions/ConfigSettings"
}
},
+ "PackageExclusion": {
+ "description": "A set of exclusions that applies to the dependencies of a specific package version.",
+ "type": "object",
+ "properties": {
+ "dependencies": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/PackageName"
+ }
+ },
+ "package": {
+ "$ref": "#/definitions/PackageExclusionTarget"
+ }
+ },
+ "additionalProperties": false,
+ "required": ["package", "dependencies"]
+ },
+ "PackageExclusionTarget": {
+ "description": "The package and optional version selected by a [`PackageExclusion`].",
+ "type": "object",
+ "properties": {
+ "name": {
+ "$ref": "#/definitions/PackageName"
+ },
+ "version": {
+ "description": "PEP 440-style package version, e.g., `1.2.3`",
+ "type": ["string", "null"]
+ }
+ },
+ "additionalProperties": false,
+ "required": ["name"]
+ },
"PackageName": {
"description": "The normalized name of a package.\n\nConverts the name to lowercase and collapses runs of `-`, `_`, and `.` down to a single `-`.\nFor example, `---`, `.`, and `__` are all converted to a single `-`.\n\nSee: ",
"type": "string"
@@ -1165,6 +1239,38 @@
"type": "string",
"pattern": "^(:none:|:all:|([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9]))$"
},
+ "PackageOverride": {
+ "description": "An override that applies to the dependencies of a specific package version.",
+ "type": "object",
+ "properties": {
+ "dependencies": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Requirement"
+ }
+ },
+ "package": {
+ "$ref": "#/definitions/PackageOverrideTarget"
+ }
+ },
+ "additionalProperties": false,
+ "required": ["package", "dependencies"]
+ },
+ "PackageOverrideTarget": {
+ "description": "The package and optional version selected by a [`PackageOverride`].",
+ "type": "object",
+ "properties": {
+ "name": {
+ "$ref": "#/definitions/PackageName"
+ },
+ "version": {
+ "description": "PEP 440-style package version, e.g., `1.2.3`",
+ "type": ["string", "null"]
+ }
+ },
+ "additionalProperties": false,
+ "required": ["name"]
+ },
"PipGroupName": {
"description": "The pip-compatible variant of a [`GroupName`].\n\nEither or :.\nIf is omitted it defaults to \"pyproject.toml\".",
"type": "object",
@@ -1263,10 +1369,10 @@
"type": ["boolean", "null"]
},
"exclude-newer": {
- "description": "Limit candidate packages to those that were uploaded prior to a given point in time.\n\nThe date is compared against the upload time of each individual distribution artifact\n(i.e., when each file was uploaded to the package index), not the release date of the\npackage version.\n\nAccepts RFC 3339 timestamps (e.g., `2006-12-02T02:07:43Z`), a \"friendly\" duration (e.g.,\n`24 hours`, `1 week`, `30 days`), or an ISO 8601 duration (e.g., `PT24H`, `P7D`, `P30D`).\n\nDurations do not respect semantics of the local time zone and are always resolved to a fixed\nnumber of seconds assuming that a day is 24 hours (e.g., DST transitions are ignored).\nCalendar units such as months and years are not allowed.",
+ "description": "Limit candidate packages to those that were uploaded prior to a given point in time.\n\nThe date is compared against the upload time of each individual distribution artifact\n(i.e., when each file was uploaded to the package index), not the release date of the\npackage version.\n\nAccepts RFC 3339 timestamps (e.g., `2006-12-02T02:07:43Z`), a \"friendly\" duration (e.g.,\n`24 hours`, `1 week`, `30 days`), or an ISO 8601 duration (e.g., `PT24H`, `P7D`, `P30D`).\n\nDurations do not respect semantics of the local time zone and are always resolved to a fixed\nnumber of seconds assuming that a day is 24 hours (e.g., DST transitions are ignored).\nCalendar units such as months and years are not allowed.\n\nSet to `false` to disable `exclude-newer`.",
"anyOf": [
{
- "$ref": "#/definitions/ExcludeNewerValue"
+ "$ref": "#/definitions/ExcludeNewerOverride"
},
{
"type": "null"
@@ -1405,7 +1511,7 @@
}
},
"no-build": {
- "description": "Don't build source distributions.\n\nWhen enabled, resolving will not run arbitrary Python code. The cached wheels of\nalready-built source distributions will be reused, but operations that require building\ndistributions will exit with an error.\n\nAlias for `--only-binary :all:`.",
+ "description": "Don't build source distributions.\n\nWhen enabled, uv will reuse cached wheels from previously built source distributions, but\noperations that require building a source distribution will exit with an error. uv may\nstill build editable requirements, and their build backends may run arbitrary Python code.\n\nAlias for `--only-binary :all:`.",
"type": ["boolean", "null"]
},
"no-build-isolation": {
@@ -1465,7 +1571,7 @@
"type": ["boolean", "null"]
},
"only-binary": {
- "description": "Only use pre-built wheels; don't build source distributions.\n\nWhen enabled, resolving will not run code from the given packages. The cached wheels of already-built\nsource distributions will be reused, but operations that require building distributions will\nexit with an error.\n\nMultiple packages may be provided. Disable binaries for all packages with `:all:`.\nClear previously specified packages with `:none:`.",
+ "description": "Only use pre-built wheels; don't build source distributions.\n\nWhen enabled, uv will reuse cached wheels from previously built source distributions, but\noperations that require building a source distribution for the given packages will exit\nwith an error. uv may still build editable requirements, and their build backends may run\narbitrary Python code.\n\nMultiple packages may be provided. Disable binaries for all packages with `:all:`.\nClear previously specified packages with `:none:`.",
"type": ["array", "null"],
"items": {
"$ref": "#/definitions/PackageNameSpecifier"
@@ -1619,6 +1725,71 @@
}
]
},
+ "PreviewFeature": {
+ "type": "string",
+ "anyOf": [
+ {
+ "enum": [
+ "python-install-default",
+ "python-upgrade",
+ "json-output",
+ "pylock",
+ "add-bounds",
+ "package-conflicts",
+ "extra-build-dependencies",
+ "detect-module-conflicts",
+ "format-command",
+ "native-auth",
+ "s3-endpoint",
+ "cache-size",
+ "init-project-flag",
+ "workspace-metadata",
+ "workspace-dir",
+ "workspace-list",
+ "sbom-export",
+ "auth-helper",
+ "direct-publish",
+ "target-workspace-discovery",
+ "metadata-json",
+ "gcs-endpoint",
+ "adjust-ulimit",
+ "special-conda-env-names",
+ "relocatable-envs-default",
+ "publish-require-normalized",
+ "audit-command",
+ "project-directory-must-exist",
+ "index-exclude-newer",
+ "azure-endpoint",
+ "toml-backwards-compatibility",
+ "malware-check",
+ "venv-safe-clear",
+ "check-command",
+ "packaged-init",
+ "centralized-project-envs",
+ "tool-install-locks",
+ "workspace-list-scripts",
+ "no-distutils-patch"
+ ]
+ },
+ {
+ "pattern": "\\S"
+ }
+ ]
+ },
+ "PreviewFeaturesOption": {
+ "description": "Represents the `preview-features` configuration option.",
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/PreviewFeature"
+ }
+ }
+ ]
+ },
"ProxyUrl": {
"description": "A proxy URL (e.g., `http://proxy.example.com:8080`).",
"type": "string",
@@ -2256,10 +2427,15 @@
"const": "x86_64-linux-android"
},
{
- "description": "A wasm32 target using the Pyodide 2024 platform. Meant for use with Python 3.12.",
+ "description": "A wasm32 target using the Pyodide 2024 platform. Meant for use with Python 3.12.\nSee ",
"type": "string",
"const": "wasm32-pyodide2024"
},
+ {
+ "description": "A wasm32 target using the Pyodide 2025 platform. Meant for use with Python 3.13.\nSee ",
+ "type": "string",
+ "const": "wasm32-pyodide2025"
+ },
{
"description": "An ARM64 target for iOS device\n\nBy default, iOS 13.0 is used, but respects the `IPHONEOS_DEPLOYMENT_TARGET`\nenvironment variable if set.",
"type": "string",
@@ -2322,6 +2498,11 @@
"type": "string",
"const": "cpu"
},
+ {
+ "description": "Use the PyTorch index for CUDA 13.2.",
+ "type": "string",
+ "const": "cu132"
+ },
{
"description": "Use the PyTorch index for CUDA 13.0.",
"type": "string",
diff --git a/src/test/dependabot-2.0/registries-npm-scope.json b/src/test/dependabot-2.0/registries-npm-scope.json
new file mode 100644
index 00000000000..58a8ccb3030
--- /dev/null
+++ b/src/test/dependabot-2.0/registries-npm-scope.json
@@ -0,0 +1,27 @@
+{
+ "registries": {
+ "github-packages-multi-scope": {
+ "scope": ["@my-org", "@my-other-org"],
+ "token": "${{ secrets.GH_PACKAGES_PAT }}",
+ "type": "npm-registry",
+ "url": "https://npm.pkg.github.com"
+ },
+ "github-packages-single-scope": {
+ "scope": "@my-org",
+ "token": "${{ secrets.GH_PACKAGES_PAT }}",
+ "type": "npm-registry",
+ "url": "https://npm.pkg.github.com"
+ }
+ },
+ "updates": [
+ {
+ "directory": "/",
+ "package-ecosystem": "npm",
+ "registries": ["github-packages-single-scope"],
+ "schedule": {
+ "interval": "daily"
+ }
+ }
+ ],
+ "version": 2
+}
diff --git a/src/test/glazewm/latipun.yaml b/src/test/glazewm/latipun.yaml
new file mode 100644
index 00000000000..e51a9e52823
--- /dev/null
+++ b/src/test/glazewm/latipun.yaml
@@ -0,0 +1,423 @@
+# yaml-language-server: $schema=../../schemas/json/glazewm.json
+general:
+ # Commands to run when the WM has started. This is useful for running a
+ # script or launching another application.
+ # Example: The below command launches Zebar.
+ # startup_commands: ['shell-exec zebar']
+ startup_commands: []
+
+ # Commands to run just before the WM is shutdown.
+ # Example: The below command kills Zebar.
+ # shutdown_commands: ['shell-exec taskkill /IM zebar.exe /F']
+ shutdown_commands: []
+
+ # Commands to run after the WM config is reloaded.
+ config_reload_commands: []
+
+ # Whether to automatically focus windows underneath the cursor.
+ focus_follows_cursor: false
+
+ # Whether to switch back and forth between the previously focused
+ # workspace when focusing the current workspace.
+ toggle_workspace_on_refocus: false
+
+ cursor_jump:
+ # Whether to automatically move the cursor on the specified trigger.
+ enabled: true
+
+ # Trigger for cursor jump:
+ # - 'monitor_focus': Jump when focus changes between monitors.
+ # - 'window_focus': Jump when focus changes between windows.
+ trigger: 'monitor_focus'
+
+ # How windows should be hidden when switching workspaces.
+ # - 'cloak': Recommended. Hides windows with no animation.
+ # - 'hide': Legacy method (v3.5 and earlier) that has a brief animation,
+ # but has stability issues with some apps.
+ hide_method: 'cloak'
+
+ # Affects which windows get shown in the native Windows taskbar. Has no
+ # effect if `hide_method: 'hide'`.
+ # - 'true': Show all windows (regardless of workspace).
+ # - 'false': Only show windows from the currently shown workspaces.
+ show_all_in_taskbar: false
+
+gaps:
+ # Whether to scale the gaps with the DPI of the monitor.
+ scale_with_dpi: true
+
+ # Gap between adjacent windows.
+ inner_gap: '7px'
+
+ # Gap between windows and the screen edge.
+ outer_gap:
+ top: '7px'
+ right: '7px'
+ bottom: '7px'
+ left: '7px'
+
+window_effects:
+ # Visual effects to apply to the focused window.
+ focused_window:
+ # Highlight the window with a colored border.
+ # ** Exclusive to Windows 11 due to API limitations.
+ border:
+ enabled: true
+ color: '#74c7ec' # Catppuccin Mocha - Sapphire
+
+ # Remove the title bar from the window's frame. Note that this can
+ # cause rendering issues for some applications.
+ hide_title_bar:
+ enabled: false
+
+ # Change the corner style of the window's frame.
+ # ** Exclusive to Windows 11 due to API limitations.
+ corner_style:
+ enabled: false
+ # Allowed values: 'square', 'rounded', 'small_rounded'.
+ style: 'small_rounded'
+
+ # Change the transparency of the window.
+ transparency:
+ enabled: false
+ # Can be something like '95%' or '0.95' for slightly transparent windows.
+ # '0' or '0%' is fully transparent (and, by consequence, unfocusable).
+ opacity: '95%'
+
+ # Visual effects to apply to non-focused windows.
+ other_windows:
+ border:
+ enabled: true
+ color: '#1e1e2e' # Catppuccin Mocha - Base
+ hide_title_bar:
+ enabled: false
+ corner_style:
+ enabled: false
+ style: 'square'
+ transparency:
+ enabled: false
+ opacity: '90%'
+
+window_behavior:
+ # New windows are created in this state whenever possible.
+ # Allowed values: 'tiling', 'floating'.
+ initial_state: 'tiling'
+
+ # Sets the default options for when a new window is created. This also
+ # changes the defaults for when the state change commands, like
+ # `set-floating`, are used without any flags.
+ state_defaults:
+ floating:
+ # Whether to center floating windows by default.
+ centered: true
+
+ # Whether to show floating windows as always on top.
+ shown_on_top: false
+
+ fullscreen:
+ # Maximize the window if possible. If the window doesn't have a
+ # maximize button, then it'll be fullscreen'ed normally instead.
+ maximized: false
+
+ # Whether to show fullscreen windows as always on top.
+ shown_on_top: false
+
+workspaces:
+ - name: '1'
+ keep_alive: true
+ bind_to_monitor: 0
+ - name: '2'
+ keep_alive: true
+ bind_to_monitor: 0
+ - name: '3'
+ keep_alive: true
+ bind_to_monitor: 0
+ - name: '4'
+ keep_alive: false
+ - name: '5'
+ keep_alive: false
+
+window_rules:
+ - commands: ['set-floating']
+ match:
+ # Operation Window
+ - window_process: { equals: 'explorer' }
+ window_class: { equals: 'OperationStatusWindow' }
+ - window_process: { equals: 'msrdc' }
+ window_title: { regex: '\(Arch\)' }
+
+ # Flow Launcher Settings
+ - window_class: { regex: 'HwndWrapper\[Flow.Launcher.*' }
+
+ # ShareX Inspect Window
+ - window_process: { equals: 'ShareX' }
+ window_title:
+ { regex: '.*ShareX.*([Ii]nspect [Ww]indow|[Tt]ext [Ii]nput)' }
+
+ # MuMuPlayer
+ - window_process: { equals: 'MuMuNxUpdater' }
+ - window_process: { equals: 'MuMuNxMain' }
+ - window_process: { equals: 'MuMuNxDevice' }
+
+ # Playnite
+ - window_process: { equals: 'Playnite.DesktopApp' }
+ - window_class: { regex: 'HwndWrapper\[Playnite.DesktopApp.*' }
+
+ # Games
+ - window_title: { regex: 'Legacy Launcher.*' }
+ - window_title: { equals: 'AutoTapTapLoot' }
+ - window_process: { equals: 'Untrusted' }
+
+ - commands:
+ ['set-floating', 'size --width 95% --height 90%', 'position --centered']
+ match:
+ # Discord scratchpad
+ - window_process: { equals: 'Discord' }
+ window_class: { not_regex: 'Discord Updater|#32770' }
+ window_title: { not_regex: 'Discord Updater|Save As|Open' }
+
+ # WhatsApp scratchpad
+ - window_process: { equals: 'WhatsApp' }
+ window_class: { not_regex: '#32770' }
+ window_title: { not_regex: 'Save As|Open' }
+
+ # Notion Calendar
+ - window_process: { equals: 'Notion Calendar' }
+ window_class: { not_regex: '#32770' }
+
+ - window_process: { equals: 'GranblueFantasy' }
+
+ - commands:
+ ['set-floating', 'size --width 75% --height 75%', 'position --centered']
+ match:
+ # Windows Terminal scratchpad (default profile or Arch)
+ - window_process: { equals: 'WindowsTerminal' }
+ window_title: { regex: '^scratch-(arch|term)' }
+
+ - commands: ['ignore']
+ match:
+ # Ignores any Zebar & Yasb windows.
+ - window_process: { equals: 'zebar' }
+ - window_process: { equals: 'yasb' }
+
+ # Ignores picture-in-picture windows for browsers.
+ - window_title: { regex: '[Pp]icture.in.[Pp]icture' }
+ window_class: { regex: 'Chrome_WidgetWin_1|MozillaDialogClass' }
+ - window_process: { equals: 'Spotify' }
+ window_title: { regex: '.* • .*' }
+
+ # Discord Updater
+ - window_process: { equals: 'Discord' }
+ window_title: { equals: 'Discord Updater' }
+
+ # Ignore rules for various 3rd-party apps.
+ - window_process: { equals: 'PowerToys' }
+ window_class: { regex: 'HwndWrapper\[PowerToys\.PowerAccent.*?\]' }
+ - window_process: { equals: 'QuickLook' }
+ window_class: { regex: 'HwndWrapper\[QuickLook.*' }
+ - window_process: { equals: 'PowerToys' }
+ window_title: { regex: '.*? - Peek' }
+ - window_process: { equals: 'Lively' }
+ window_class: { regex: 'HwndWrapper' }
+ - window_process: { equals: 'EXCEL' }
+ window_class: { not_regex: 'XLMAIN' }
+ - window_process: { equals: 'WINWORD' }
+ window_class: { not_regex: 'OpusApp' }
+ - window_process: { equals: 'POWERPNT' }
+ window_class: { not_regex: 'PPTFrameClass' }
+ - window_process: { equals: 'FPersonnel' }
+ - window_process: { equals: 'ShareX' }
+ window_class: { equals: 'WindowsForms10.Window.8.app.0.2a9c631_r3_ad1' }
+ - window_process: { equals: 'BongoCat' }
+ - window_process: { equals: 'lifeskill-companion-by-jhidal' }
+ - window_process: { equals: 'TapTapLoot' }
+ - window_process: { equals: 'BongoCat' }
+ - window_process:
+ { regex: '^hermes-webui-(?:desktop-)?companion(?:-.*)?$' }
+
+binding_modes:
+ # When enabled, the focused window can be resized via arrow keys or HJKL.
+ - name: 'resize'
+ keybindings:
+ - commands: ['resize --width -2%']
+ bindings: ['h', 'left']
+ - commands: ['resize --width +2%']
+ bindings: ['l', 'right']
+ - commands: ['resize --height -2%']
+ bindings: ['k', 'up']
+ - commands: ['resize --height +2%']
+ bindings: ['j', 'down']
+ # Press enter/escape to return to default keybindings.
+ - commands: ['wm-disable-binding-mode --name resize']
+ bindings: ['escape', 'enter']
+
+keybindings:
+ # Shift focus in a given direction.
+ - commands: ['focus --direction left']
+ bindings: ['alt+h']
+ - commands: ['focus --direction right']
+ bindings: ['alt+l']
+ - commands: ['focus --direction up']
+ bindings: ['alt+k']
+ - commands: ['focus --direction down']
+ bindings: ['alt+j']
+
+ # Move focused window in a given direction.
+ - commands: ['move --direction left']
+ bindings: ['alt+shift+h', 'alt+shift+left']
+ - commands: ['move --direction right']
+ bindings: ['alt+shift+l', 'alt+shift+right']
+ - commands: ['move --direction up']
+ bindings: ['alt+shift+k', 'alt+shift+up']
+ - commands: ['move --direction down']
+ bindings: ['alt+shift+j', 'alt+shift+down']
+
+ # Resize focused window by a percentage or pixel amount.
+ - commands: ['resize --width -2%']
+ bindings: ['alt+u']
+ - commands: ['resize --width +2%']
+ bindings: ['alt+p']
+ - commands: ['resize --height -2%']
+ bindings: ['alt+o']
+ - commands: ['resize --height +2%']
+ bindings: ['alt+i']
+
+ # As an alternative to the resize keybindings above, resize mode enables
+ # resizing via arrow keys or HJKL. The binding mode is defined above with
+ # the name 'resize'.
+ - commands: ['wm-enable-binding-mode --name resize']
+ bindings: ['alt+r']
+
+ # Disables window management and all other keybindings until alt+shift+p
+ # is pressed again.
+ - commands: ['wm-toggle-pause']
+ bindings: ['alt+shift+p']
+
+ # Change tiling direction. This determines where new tiling windows will
+ # be inserted.
+ - commands: ['toggle-tiling-direction']
+ bindings: ['alt+v']
+
+ # Change focus from tiling windows -> floating -> fullscreen.
+ - commands: ['wm-cycle-focus']
+ bindings: ['alt+shift+space']
+
+ # Change floating window position to center.
+ - commands: ['position --centered']
+ bindings: ['alt+shift+c']
+
+ # Change the focused window to be floating.
+ - commands: ['toggle-floating']
+ bindings: ['alt+shift+t']
+
+ # Change the focused window to be tiling.
+ - commands: ['toggle-tiling']
+ bindings: ['alt+t']
+
+ # Change the focused window to be fullscreen.
+ - commands: ['toggle-fullscreen']
+ bindings: ['alt+f']
+
+ # Minimize focused window.
+ - commands: ['toggle-minimized']
+ bindings: ['alt+m']
+
+ # Close focused window.
+ - commands: ['close']
+ bindings: ['alt+shift+q']
+
+ # Kill GlazeWM process safely.
+ - commands: ['wm-exit']
+ bindings: ['alt+shift+e']
+
+ # Re-evaluate configuration file.
+ - commands: ['wm-reload-config']
+ bindings: ['alt+shift+r']
+
+ # Redraw all windows.
+ - commands: ['wm-redraw']
+ bindings: ['alt+shift+w']
+
+ # Focus the next/previous active workspace defined in `workspaces` config.
+ - commands: ['focus --next-active-workspace']
+ bindings: ['alt+s']
+ - commands: ['focus --prev-active-workspace']
+ bindings: ['alt+a']
+
+ # Focus the workspace that last had focus.
+ - commands: ['focus --recent-workspace']
+ bindings: ['alt+d']
+
+ # Change focus to a workspace defined in `workspaces` config.
+ - commands: ['focus --workspace 1']
+ bindings: ['alt+1']
+ - commands: ['focus --workspace 2']
+ bindings: ['alt+2']
+ - commands: ['focus --workspace 3']
+ bindings: ['alt+3']
+ - commands: ['focus --workspace 4']
+ bindings: ['alt+4']
+ - commands: ['focus --workspace 5']
+ bindings: ['alt+5']
+
+ # Move the focused window's parent workspace to a monitor in a given
+ # direction.
+ - commands: ['move-workspace --direction left']
+ bindings: ['alt+shift+a']
+ - commands: ['move-workspace --direction right']
+ bindings: ['alt+shift+f']
+ - commands: ['move-workspace --direction up']
+ bindings: ['alt+shift+d']
+ - commands: ['move-workspace --direction down']
+ bindings: ['alt+shift+s']
+
+ # Move focused window to a workspace defined in `workspaces` config.
+ - commands: ['move --workspace 1', 'focus --workspace 1']
+ bindings: ['alt+shift+1']
+ - commands: ['move --workspace 2', 'focus --workspace 2']
+ bindings: ['alt+shift+2']
+ - commands: ['move --workspace 3', 'focus --workspace 3']
+ bindings: ['alt+shift+3']
+ - commands: ['move --workspace 4', 'focus --workspace 4']
+ bindings: ['alt+shift+4']
+ - commands: ['move --workspace 5', 'focus --workspace 5']
+ bindings: ['alt+shift+5']
+
+ # Scratchpad key bindings - removed debug logging for production
+ - commands:
+ [
+ 'shell-exec --hide-window pwsh -NoProfile -ExecutionPolicy Bypass -File "%USERPROFILE%/.glzr/glazewm/scripts/scratchpad.ps1" chat',
+ ]
+ bindings: ['alt+c']
+
+ - commands:
+ [
+ 'shell-exec --hide-window pwsh -NoProfile -ExecutionPolicy Bypass -File "%USERPROFILE%/.glzr/glazewm/scripts/scratchpad.ps1" whatsapp',
+ ]
+ bindings: ['alt+w']
+
+ - commands:
+ [
+ 'shell-exec --hide-window pwsh -NoProfile -ExecutionPolicy Bypass -File "%USERPROFILE%/.glzr/glazewm/scripts/scratchpad.ps1" calendar',
+ ]
+ bindings: ['alt+n']
+
+ - commands:
+ [
+ 'shell-exec --hide-window pwsh -NoProfile -ExecutionPolicy Bypass -File "%USERPROFILE%/.glzr/glazewm/scripts/scratchpad.ps1" term',
+ ]
+ bindings: ['alt+shift+enter']
+
+ - commands:
+ [
+ 'shell-exec --hide-window pwsh -NoProfile -ExecutionPolicy Bypass -File "%USERPROFILE%/.glzr/glazewm/scripts/scratchpad.ps1" arch',
+ ]
+ bindings: ['alt+ctrl+enter']
+
+ # Debug versions (optional - for troubleshooting)
+ # Add `-Debug` flag at the end of commands
+ # - commands:
+ # [
+ # 'shell-exec --hide-window pwsh -NoProfile -ExecutionPolicy Bypass -File "%USERPROFILE%/.glzr/glazewm/scripts/scratchpad.ps1" arch -Debug',
+ # ]
+ # bindings: ["alt+ctrl+enter"]
diff --git a/src/test/glazewm/sample.yaml b/src/test/glazewm/sample.yaml
new file mode 100644
index 00000000000..868c1c60b8c
--- /dev/null
+++ b/src/test/glazewm/sample.yaml
@@ -0,0 +1,91 @@
+# yaml-language-server: $schema=../../schemas/json/glazewm.json
+general:
+ startup_commands: ['shell-exec zebar']
+ shutdown_commands: ['shell-exec taskkill /IM zebar.exe /F']
+ config_reload_commands: []
+ focus_follows_cursor: false
+ toggle_workspace_on_refocus: false
+ cursor_jump:
+ enabled: true
+ trigger: 'monitor_focus'
+ hide_method: 'cloak'
+ show_all_in_taskbar: false
+
+gaps:
+ scale_with_dpi: true
+ inner_gap: '20px'
+ outer_gap:
+ top: '60px'
+ right: '20px'
+ bottom: '20px'
+ left: '20px'
+
+window_effects:
+ focused_window:
+ border:
+ enabled: true
+ color: '#8dbcff'
+ hide_title_bar:
+ enabled: false
+ corner_style:
+ enabled: false
+ style: 'square'
+ transparency:
+ enabled: false
+ opacity: '95%'
+ other_windows:
+ border:
+ enabled: true
+ color: '#a1a1a1'
+ hide_title_bar:
+ enabled: false
+ corner_style:
+ enabled: false
+ style: 'square'
+ transparency:
+ enabled: false
+ opacity: '0%'
+
+window_behavior:
+ initial_state: 'tiling'
+ state_defaults:
+ floating:
+ centered: true
+ shown_on_top: false
+ fullscreen:
+ maximized: false
+ shown_on_top: false
+
+workspaces:
+ - name: '1'
+ keep_alive: true
+ bind_to_monitor: 0
+ - name: '2'
+ - name: '3'
+
+window_rules:
+ - commands: ['ignore']
+ match:
+ - window_process: { equals: 'zebar' }
+ - window_title: { regex: '[Pp]icture.in.[Pp]icture' }
+ window_class: { regex: 'Chrome_WidgetWin_1|MozillaDialogClass' }
+
+binding_modes:
+ - name: 'resize'
+ keybindings:
+ - commands: ['resize --width -2%']
+ bindings: ['h', 'left']
+ - commands: ['resize --width +2%']
+ bindings: ['l', 'right']
+ - commands: ['wm-disable-binding-mode --name resize']
+ bindings: ['escape', 'enter']
+
+keybindings:
+ - commands: ['focus --direction left']
+ bindings: ['alt+h', 'alt+left']
+ - commands: ['focus --direction right']
+ bindings: ['alt+l', 'alt+right']
+ - commands: ['close']
+ bindings: ['alt+shift+q']
+ - commands: ['shell-exec cmd']
+ bindings: ['alt+enter']
diff --git a/src/test/glazewm/upstream-sample.yaml b/src/test/glazewm/upstream-sample.yaml
new file mode 100644
index 00000000000..0229c0e4516
--- /dev/null
+++ b/src/test/glazewm/upstream-sample.yaml
@@ -0,0 +1,326 @@
+# yaml-language-server: $schema=../../schemas/json/glazewm.json
+general:
+ # Commands to run when the WM has started. This is useful for running a
+ # script or launching another application.
+ # Example: The below command launches Zebar.
+ startup_commands: ['shell-exec zebar']
+
+ # Commands to run just before the WM is shutdown.
+ # Example: The below command kills Zebar.
+ shutdown_commands: ['shell-exec taskkill /IM zebar.exe /F']
+
+ # Commands to run after the WM config is reloaded.
+ config_reload_commands: []
+
+ # Whether to automatically focus windows underneath the cursor.
+ focus_follows_cursor: false
+
+ # Whether to switch back and forth between the previously focused
+ # workspace when focusing the current workspace.
+ toggle_workspace_on_refocus: false
+
+ cursor_jump:
+ # Whether to automatically move the cursor on the specified trigger.
+ enabled: true
+
+ # Trigger for cursor jump:
+ # - 'monitor_focus': Jump when focus changes between monitors.
+ # - 'window_focus': Jump when focus changes between windows.
+ trigger: 'monitor_focus'
+
+ # How windows should be hidden when switching workspaces.
+ # - 'cloak': (Windows-only) Recommended option for Windows.
+ # - 'hide': (Windows-only) Legacy option for Windows. Has stability issues with some apps.
+ # - 'place_in_corner': Artificially hides the window by placing it in the corner of the
+ # monitor. On macOS, this is always used instead of cloak/hide.
+ hide_method: 'cloak'
+
+ # Affects which windows get shown in the native Windows taskbar. Has no
+ # effect if `hide_method: 'hide'`.
+ # - 'true': Show all windows (regardless of workspace).
+ # - 'false': Only show windows from the currently shown workspaces.
+ show_all_in_taskbar: false
+
+gaps:
+ # Whether to scale the gaps with the DPI of the monitor.
+ scale_with_dpi: true
+
+ # Gap between adjacent windows.
+ inner_gap: '20px'
+
+ # Gap between windows and the screen edge.
+ outer_gap:
+ top: '60px'
+ right: '20px'
+ bottom: '20px'
+ left: '20px'
+
+window_effects:
+ # Visual effects to apply to the focused window.
+ focused_window:
+ # Highlight the window with a colored border.
+ # ** Exclusive to Windows 11 due to API limitations.
+ border:
+ enabled: true
+ color: '#8dbcff'
+
+ # Remove the title bar from the window's frame. Note that this can
+ # cause rendering issues for some applications.
+ hide_title_bar:
+ enabled: false
+
+ # Change the corner style of the window's frame.
+ # ** Exclusive to Windows 11 due to API limitations.
+ corner_style:
+ enabled: false
+ # Allowed values: 'square', 'rounded', 'small_rounded'.
+ style: 'square'
+
+ # Change the transparency of the window.
+ transparency:
+ enabled: false
+ # Can be something like '95%' or '0.95' for slightly transparent windows.
+ # '0' or '0%' is fully transparent (and, by consequence, unfocusable).
+ opacity: '95%'
+
+ # Visual effects to apply to non-focused windows.
+ other_windows:
+ border:
+ enabled: true
+ color: '#a1a1a1'
+ hide_title_bar:
+ enabled: false
+ corner_style:
+ enabled: false
+ style: 'square'
+ transparency:
+ enabled: false
+ opacity: '0%'
+
+window_behavior:
+ # New windows are created in this state whenever possible.
+ # Allowed values: 'tiling', 'floating'.
+ initial_state: 'tiling'
+
+ # Sets the default options for when a new window is created. This also
+ # changes the defaults for when the state change commands, like
+ # `set-floating`, are used without any flags.
+ state_defaults:
+ floating:
+ # Whether to center floating windows by default.
+ centered: true
+
+ # Whether to show floating windows as always on top.
+ shown_on_top: false
+
+ fullscreen:
+ # Maximize the window if possible. If the window doesn't have a
+ # maximize button, then it'll be fullscreen'ed normally instead.
+ maximized: false
+
+ # Whether to show fullscreen windows as always on top.
+ shown_on_top: false
+
+workspaces:
+ - name: '1'
+ - name: '2'
+ - name: '3'
+ - name: '4'
+ - name: '5'
+ - name: '6'
+ - name: '7'
+ - name: '8'
+ - name: '9'
+
+window_rules:
+ - commands: ['ignore']
+ match:
+ # Ignores any Zebar windows.
+ - window_process: { equals: 'zebar' }
+
+ # Ignores picture-in-picture windows for browsers.
+ - window_title: { regex: '[Pp]icture.in.[Pp]icture' }
+ window_class: { regex: 'Chrome_WidgetWin_1|MozillaDialogClass' }
+
+ # Ignore rules for various 3rd-party apps.
+ - window_process: { equals: 'PowerToys' }
+ window_class: { regex: 'HwndWrapper\[PowerToys\.PowerAccent.*?\]' }
+ - window_title: { equals: 'Command Palette' }
+ window_class: { equals: 'WinUIDesktopWin32WindowClass' }
+ - window_process: { equals: 'PowerToys' }
+ window_title: { regex: '.*? - Peek' }
+ - window_process: { equals: 'Lively' }
+ window_class: { regex: 'HwndWrapper' }
+ - window_process: { equals: 'EXCEL' }
+ window_class: { not_regex: 'XLMAIN' }
+ - window_process: { equals: 'WINWORD' }
+ window_class: { not_regex: 'OpusApp' }
+ - window_process: { equals: 'POWERPNT' }
+ window_class: { not_regex: 'PPTFrameClass' }
+ - window_process: { equals: 'CleanShot X' }
+
+binding_modes:
+ # When enabled, the focused window can be resized via arrow keys or HJKL.
+ - name: 'resize'
+ keybindings:
+ - commands: ['resize --width -2%']
+ bindings: ['h', 'left']
+ - commands: ['resize --width +2%']
+ bindings: ['l', 'right']
+ - commands: ['resize --height +2%']
+ bindings: ['k', 'up']
+ - commands: ['resize --height -2%']
+ bindings: ['j', 'down']
+ # Press escape/enter/alt+r to return to default keybindings.
+ - commands: ['wm-disable-binding-mode --name resize']
+ bindings: ['escape', 'enter', 'alt+r']
+
+keybindings:
+ # Shift focus in a given direction.
+ - commands: ['focus --direction left']
+ bindings: ['alt+h', 'alt+left']
+ - commands: ['focus --direction right']
+ bindings: ['alt+l', 'alt+right']
+ - commands: ['focus --direction up']
+ bindings: ['alt+k', 'alt+up']
+ - commands: ['focus --direction down']
+ bindings: ['alt+j', 'alt+down']
+
+ # Move focused window in a given direction.
+ - commands: ['move --direction left']
+ bindings: ['alt+shift+h', 'alt+shift+left']
+ - commands: ['move --direction right']
+ bindings: ['alt+shift+l', 'alt+shift+right']
+ - commands: ['move --direction up']
+ bindings: ['alt+shift+k', 'alt+shift+up']
+ - commands: ['move --direction down']
+ bindings: ['alt+shift+j', 'alt+shift+down']
+
+ # Resize focused window by a percentage or pixel amount.
+ - commands: ['resize --width -2%']
+ bindings: ['alt+u']
+ - commands: ['resize --width +2%']
+ bindings: ['alt+p']
+ - commands: ['resize --height +2%']
+ bindings: ['alt+o']
+ - commands: ['resize --height -2%']
+ bindings: ['alt+i']
+
+ # As an alternative to the resize keybindings above, resize mode enables
+ # resizing via arrow keys or HJKL. The binding mode is defined above with
+ # the name 'resize'.
+ - commands: ['wm-enable-binding-mode --name resize']
+ bindings: ['alt+r']
+
+ # Disables window management and all other keybindings until alt+shift+p
+ # is pressed again.
+ - commands: ['wm-toggle-pause']
+ bindings: ['alt+shift+p']
+
+ # Change tiling direction. This determines where new tiling windows will
+ # be inserted.
+ - commands: ['toggle-tiling-direction']
+ bindings: ['alt+v']
+
+ # Change focus from tiling windows -> floating -> fullscreen.
+ - commands: ['wm-cycle-focus']
+ bindings: ['alt+space']
+
+ # Change the focused window to be floating.
+ - commands: ['toggle-floating --centered']
+ bindings: ['alt+shift+space']
+
+ # Change the focused window to be tiling.
+ - commands: ['toggle-tiling']
+ bindings: ['alt+t']
+
+ # Change the focused window to be fullscreen.
+ - commands: ['toggle-fullscreen']
+ bindings: ['alt+f']
+
+ # Minimize focused window.
+ - commands: ['toggle-minimized']
+ bindings: ['alt+m']
+
+ # Close focused window.
+ - commands: ['close']
+ bindings: ['alt+shift+q']
+
+ # Kill GlazeWM process safely.
+ - commands: ['wm-exit']
+ bindings: ['alt+shift+e']
+
+ # Re-evaluate configuration file.
+ - commands: ['wm-reload-config']
+ bindings: ['alt+shift+r']
+
+ # Redraw all windows.
+ - commands: ['wm-redraw']
+ bindings: ['alt+shift+w']
+
+ # Launch CMD terminal. Alternatively, use `shell-exec wt` or
+ # `shell-exec %ProgramFiles%/Git/git-bash.exe` to start Windows
+ # Terminal and Git Bash respectively.
+ - commands: ['shell-exec cmd']
+ bindings: ['alt+enter']
+
+ # Focus the next/previous active workspace defined in `workspaces` config.
+ - commands: ['focus --next-active-workspace']
+ bindings: ['alt+s']
+ - commands: ['focus --prev-active-workspace']
+ bindings: ['alt+a']
+
+ # Focus the workspace that last had focus.
+ - commands: ['focus --recent-workspace']
+ bindings: ['alt+d']
+
+ # Change focus to a workspace defined in `workspaces` config.
+ - commands: ['focus --workspace 1']
+ bindings: ['alt+1']
+ - commands: ['focus --workspace 2']
+ bindings: ['alt+2']
+ - commands: ['focus --workspace 3']
+ bindings: ['alt+3']
+ - commands: ['focus --workspace 4']
+ bindings: ['alt+4']
+ - commands: ['focus --workspace 5']
+ bindings: ['alt+5']
+ - commands: ['focus --workspace 6']
+ bindings: ['alt+6']
+ - commands: ['focus --workspace 7']
+ bindings: ['alt+7']
+ - commands: ['focus --workspace 8']
+ bindings: ['alt+8']
+ - commands: ['focus --workspace 9']
+ bindings: ['alt+9']
+
+ # Move the focused window's parent workspace to a monitor in a given
+ # direction.
+ - commands: ['move-workspace --direction left']
+ bindings: ['alt+shift+a']
+ - commands: ['move-workspace --direction right']
+ bindings: ['alt+shift+f']
+ - commands: ['move-workspace --direction up']
+ bindings: ['alt+shift+d']
+ - commands: ['move-workspace --direction down']
+ bindings: ['alt+shift+s']
+
+ # Move focused window to a workspace defined in `workspaces` config.
+ - commands: ['move --workspace 1', 'focus --workspace 1']
+ bindings: ['alt+shift+1']
+ - commands: ['move --workspace 2', 'focus --workspace 2']
+ bindings: ['alt+shift+2']
+ - commands: ['move --workspace 3', 'focus --workspace 3']
+ bindings: ['alt+shift+3']
+ - commands: ['move --workspace 4', 'focus --workspace 4']
+ bindings: ['alt+shift+4']
+ - commands: ['move --workspace 5', 'focus --workspace 5']
+ bindings: ['alt+shift+5']
+ - commands: ['move --workspace 6', 'focus --workspace 6']
+ bindings: ['alt+shift+6']
+ - commands: ['move --workspace 7', 'focus --workspace 7']
+ bindings: ['alt+shift+7']
+ - commands: ['move --workspace 8', 'focus --workspace 8']
+ bindings: ['alt+shift+8']
+ - commands: ['move --workspace 9', 'focus --workspace 9']
+ bindings: ['alt+shift+9']
diff --git a/src/test/kind-cluster/minimal.yaml b/src/test/kind-cluster/minimal.yaml
new file mode 100644
index 00000000000..a089b5d8baa
--- /dev/null
+++ b/src/test/kind-cluster/minimal.yaml
@@ -0,0 +1,3 @@
+# yaml-language-server: $schema=../../schemas/json/kind-cluster.json
+kind: Cluster
+apiVersion: kind.x-k8s.io/v1alpha4
diff --git a/src/test/kind-cluster/multi-node.yaml b/src/test/kind-cluster/multi-node.yaml
new file mode 100644
index 00000000000..5252f71e3e0
--- /dev/null
+++ b/src/test/kind-cluster/multi-node.yaml
@@ -0,0 +1,18 @@
+# yaml-language-server: $schema=../../schemas/json/kind-cluster.json
+kind: Cluster
+apiVersion: kind.x-k8s.io/v1alpha4
+name: app-1-cluster
+nodes:
+ - role: control-plane
+ extraPortMappings:
+ - containerPort: 80
+ hostPort: 80
+ protocol: TCP
+ - role: worker
+ image: kindest/node:v1.31.0
+networking:
+ ipFamily: ipv4
+ disableDefaultCNI: false
+ kubeProxyMode: iptables
+featureGates:
+ CSIMigration: true
diff --git a/src/test/pyproject/mypy-02.toml b/src/test/pyproject/mypy-02.toml
index 3f0169d9842..470ceafb84d 100644
--- a/src/test/pyproject/mypy-02.toml
+++ b/src/test/pyproject/mypy-02.toml
@@ -5,6 +5,7 @@ python_version = "3.8"
strict = true
enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"]
warn_unreachable = true
+native_parser = true
# You can disable imports or control per-module/file settings here
[[tool.mypy.overrides]]