From 97691c707e2c1e1a3aafe34429af45db9c9d06ea Mon Sep 17 00:00:00 2001 From: kzrnm Date: Fri, 2 Jan 2026 02:59:21 +0900 Subject: [PATCH 1/6] (pyproject) Update poe schema (#5255) --- src/schemas/json/partial-poe.json | 372 ++++++++++++++++++++---------- 1 file changed, 246 insertions(+), 126 deletions(-) diff --git a/src/schemas/json/partial-poe.json b/src/schemas/json/partial-poe.json index 4ca8dd2690f..913fe9c116b 100644 --- a/src/schemas/json/partial-poe.json +++ b/src/schemas/json/partial-poe.json @@ -7,32 +7,7 @@ "title": "Poe the Poet configuration", "description": "Poe the Poet is a task runner and build tool that uses simple configuration to define project tasks. It can work as a standalone tool or as a plugin for Poetry.", "definitions": { - "cmd_task": { - "allOf": [ - { - "$ref": "#/definitions/common_task" - }, - { - "type": "object", - "properties": { - "cmd": { - "title": "Command to execute", - "description": "Executes a single command as a subprocess without a shell. Supports glob patterns for file matching, parameter expansion, and pattern matching. Environment variable templating is also supported within the command.", - "examples": [ - "rm -rf ./**/*.pyc", - "echo '.*' # prevents glob expansion", - "echo \\.* # also prevents glob expansion", - "echo Hello ${USER}", - "echo Hello \\${USER} # escapes the variable for literal dollar sign" - ], - "type": "string" - } - }, - "required": ["cmd"] - } - ] - }, - "common_task": { + "standard_options": { "properties": { "args": { "anyOf": [ @@ -43,7 +18,7 @@ "type": "string" }, { - "$ref": "#/definitions/common_task/properties/args/definitions/args" + "$ref": "#/definitions/standard_options/properties/args/definitions/args" } ] }, @@ -51,7 +26,7 @@ }, { "additionalProperties": { - "$ref": "#/definitions/common_task/properties/args/definitions/args" + "$ref": "#/definitions/standard_options/properties/args/definitions/args" }, "type": "object" } @@ -114,12 +89,6 @@ }, "description": "Define CLI options, positional arguments, or flags that this task should accept." }, - "capture_stdout": { - "description": "Redirects the task output to a file with the given path. Supports environment variable interpolation.", - "examples": ["output.log", "${POE_PWD}/output.txt"], - "pattern": "^(?:\\$\\{[^\\}]+\\}/)?.+$", - "type": "string" - }, "cwd": { "description": "Specify the current working directory that this task should run with. This can be a relative path from the project root or an absolute path, and environment variables can be used in the format ${VAR_NAME}.", "minLength": 1, @@ -135,53 +104,14 @@ "type": "array" }, "env": { - "additionalProperties": false, - "patternProperties": { - "^.+$": { - "description": "The value to be set for the environment variable.", - "oneOf": [ - { - "type": "string" - }, - { - "type": "object", - "properties": { - "default": { - "description": "A default value for an environment variable that will be used only if the variable is not already set.", - "type": "string" - } - } - } - ] - } - }, - "type": "object" + "$ref": "#/definitions/env_option" }, "envfile": { - "description": "Provide one or more env files to be loaded before running this task. If an array is provided, files will be loaded in the given order.", - "oneOf": [ - { - "description": "The name or relative path to a single env file.", - "type": "string" - }, - { - "description": "An array of names or relative paths to env files which will be loaded in the given order.", - "items": { - "description": "The name or relative path to an env file.", - "type": "string" - }, - "type": "array" - } - ] + "$ref": "#/definitions/envfile_option" }, "help": { "description": "Help text to be displayed next to the task name in the documentation when poe is run without specifying a task.", - "anyOf": [{ "type": "string" }, { "type": "null" }] - }, - "use_exec": { - "description": "Specify that this task should be executed in the same process, instead of as a subprocess. Note: This feature has limitations, such as not being compatible with tasks that are referenced by other tasks and not working on Windows.", - "examples": [true, false], - "type": "boolean" + "type": "string" }, "uses": { "additionalProperties": { @@ -190,14 +120,147 @@ }, "description": "Allows this task to use the output of other tasks which are executed first. The values are references to the names of the tasks, and the keys are environment variables by which the results of those tasks will be accessible in this task.", "type": "object" + }, + "executor": { + "$ref": "#/definitions/executor_option" + }, + "verbosity": { + "default": 0, + "description": "Specify the verbosity level for this task, from -2 (least verbose) to 2 (most verbose), overriding the project level verbosity setting, which defaults to 0.", + "maximum": 2, + "minimum": -2, + "type": "integer" + } + }, + "type": "object" + }, + "capture_stdout_option": { + "properties": { + "capture_stdout": { + "description": "Redirects the task output to a file with the given path. Supports environment variable interpolation.", + "examples": ["output.log", "${POE_PWD}/output.txt"], + "pattern": "^(?:\\$\\{[^\\}]+\\}/)?.+$", + "type": "string" + } + }, + "type": "object" + }, + "use_exec_option": { + "properties": { + "use_exec": { + "description": "Specify that this task should be executed in the same process, instead of as a subprocess. Note: This feature has limitations, such as not being compatible with tasks that are referenced by other tasks and not working on Windows.", + "examples": [true, false], + "type": "boolean" + } + }, + "if": { + "properties": { "use_exec": { "const": true } }, + "required": ["use_exec"] + }, + "then": { "not": { "required": ["capture_stdout"] } }, + "type": "object" + }, + "env_option": { + "additionalProperties": false, + "patternProperties": { + "^.+$": { + "description": "A map of environment variables to be set for this task.", + "oneOf": [ + { "type": "string" }, + { + "type": "object", + "properties": { + "default": { + "description": "A default value for an environment variable that will be used only if the variable is not already set.", + "type": "string" + } + } + } + ] + } + }, + "type": "object" + }, + "envfile_option": { + "description": "Provide one or more env files to be loaded before running this task. If an array is provided, files will be loaded in the given order.", + "oneOf": [ + { + "description": "The name or relative path to a single env file.", + "type": "string" + }, + { + "description": "An array of names or relative paths to env files which will be loaded in the given order.", + "items": { + "description": "The name or relative path to an env file.", + "type": "string" + }, + "type": "array" + } + ] + }, + "executor_option": { + "additionalProperties": false, + "description": "Configure the executor type for running tasks. Can be 'auto', 'poetry', 'virtualenv', or 'simple', with 'auto' being the default.", + "properties": { + "location": { + "description": "Specifies the location of the virtualenv relative to the parent directory. Relevant when 'type' is set to 'virtualenv'.", + "type": "string" + }, + "type": { + "default": "auto", + "description": "Specifies the executor type. 'auto' uses the most appropriate executor, 'poetry' uses the poetry environment, 'uv' uses `uv run` to run tasks, 'virtualenv' specifies a virtual environment, and 'simple' runs tasks without any specific environment setup.", + "enum": ["auto", "poetry", "uv", "virtualenv", "simple"], + "type": "string" } }, "type": "object" }, + "cmd_task": { + "allOf": [ + { + "$ref": "#/definitions/standard_options" + }, + { + "$ref": "#/definitions/capture_stdout_option" + }, + { + "$ref": "#/definitions/use_exec_option" + }, + { + "type": "object", + "properties": { + "empty_glob": { + "default": "pass", + "description": "Determines how to handle glob patterns with no matches. The default is 'pass', which causes unmatched patterns to be passed through to the command (just like in bash). Setting it to 'null' will replace an unmatched pattern with nothing, and setting it to 'fail' will cause the task to fail with an error if there are no matches.", + "enum": ["pass", "null", "fail"] + }, + "cmd": { + "title": "Command to execute", + "description": "Executes a single command as a subprocess without a shell. Supports glob patterns for file matching, parameter expansion, and pattern matching. Environment variable templating is also supported within the command.", + "examples": [ + "rm -rf ./**/*.pyc", + "echo '.*' # prevents glob expansion", + "echo \\.* # also prevents glob expansion", + "echo Hello ${USER}", + "echo Hello \\${USER} # escapes the variable for literal dollar sign" + ], + "type": "string" + } + }, + "required": ["cmd"] + } + ] + }, "expr_task": { "allOf": [ { - "$ref": "#/definitions/common_task" + "$ref": "#/definitions/standard_options" + }, + { + "$ref": "#/definitions/capture_stdout_option" + }, + { + "$ref": "#/definitions/use_exec_option" }, { "type": "object", @@ -225,7 +288,10 @@ "ref_task": { "allOf": [ { - "$ref": "#/definitions/common_task" + "$ref": "#/definitions/standard_options" + }, + { + "$ref": "#/definitions/capture_stdout_option" }, { "type": "object", @@ -242,7 +308,13 @@ "script_task": { "allOf": [ { - "$ref": "#/definitions/common_task" + "$ref": "#/definitions/standard_options" + }, + { + "$ref": "#/definitions/capture_stdout_option" + }, + { + "$ref": "#/definitions/use_exec_option" }, { "type": "object", @@ -269,7 +341,7 @@ "sequence_task": { "allOf": [ { - "$ref": "#/definitions/common_task" + "$ref": "#/definitions/standard_options" }, { "type": "object", @@ -300,10 +372,62 @@ } ] }, + "parallel_task": { + "allOf": [ + { + "$ref": "#/definitions/standard_options" + }, + { + "type": "object", + "properties": { + "default_item_type": { + "default": "ref", + "description": "Change the default item type that strings in the sequence are interpreted as.", + "type": "string" + }, + "ignore_fail": { + "description": "If true then the failure (or non-zero return value) of one task in the parallel group does not abort the execution.", + "oneOf": [ + { + "type": "boolean" + }, + { + "enum": ["return_zero", "return_non_zero"], + "type": "string" + } + ] + }, + "prefix": { + "default": "{name}", + "description": "Set the prefix applied to each line of output from subtasks. By default this is the task name.", + "type": "string" + }, + "prefix_max": { + "default": 16, + "description": "Set the maximum width of the prefix. Longer prefixes will be truncated.", + "type": "integer" + }, + "prefix_template": { + "default": "{color_start}{prefix}{color_end} |", + "description": "Specifies a template for how the prefix is applied after truncating it to the prefix_max length.", + "type": "string" + }, + "parallel": { + "$ref": "#/definitions/tasks_array", + "description": "A subtask is defined by an array of tasks or command names to be run multiple tasks concurrently. Each subtask can be a command name, a command, script, reference to another task, or another sequence." + } + }, + "required": ["parallel"] + } + ] + }, "shell_task": { "allOf": [ { - "$ref": "#/definitions/common_task" + "$ref": "#/definitions/standard_options" + }, + { + "$ref": "#/definitions/capture_stdout_option" }, { "type": "object", @@ -346,7 +470,10 @@ "switch_task": { "allOf": [ { - "$ref": "#/definitions/common_task" + "$ref": "#/definitions/standard_options" + }, + { + "$ref": "#/definitions/capture_stdout_option" }, { "type": "object", @@ -407,6 +534,9 @@ { "$ref": "#/definitions/sequence_task" }, + { + "$ref": "#/definitions/parallel_task" + }, { "$ref": "#/definitions/expr_task" }, @@ -444,68 +574,58 @@ "type": "string" }, "env": { - "additionalProperties": false, - "description": "Define environment variables to be exposed to all tasks. Supports POSIX variable interpolation and setting default values with a '.default' suffix.", - "patternProperties": { - "^.+$": { - "description": "A POSIX string that may include environment variable interpolations.", - "oneOf": [ - { - "type": "string" - }, - { - "type": "object", - "properties": { - "default": { - "description": "A default value for an environment variable that will be used only if the variable is not already set.", - "type": "string" - } - } - } - ] - } - }, - "type": "object" + "$ref": "#/definitions/env_option" }, "envfile": { + "$ref": "#/definitions/envfile_option" + }, + "executor": { + "$ref": "#/definitions/executor_option" + }, + "include": { "anyOf": [ { "type": "string" }, { "items": { - "type": "string" + "oneOf": [ + { "type": "string" }, + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + ] }, "type": "array" - } - ], - "description": "Link to one or more files defining environment variables to be exposed to all tasks." - }, - "executor": { - "additionalProperties": false, - "description": "Configure the executor type for running tasks. Can be 'auto', 'poetry', 'virtualenv', or 'simple', with 'auto' being the default.", - "properties": { - "location": { - "description": "Specifies the location of the virtualenv relative to the parent directory. Relevant when 'type' is set to 'virtualenv'.", - "type": "string" }, - "type": { - "default": "auto", - "description": "Specifies the executor type. 'auto' uses the most appropriate executor, 'poetry' uses the poetry environment, 'uv' uses `uv run` to run tasks, 'virtualenv' specifies a virtual environment, and 'simple' runs tasks without any specific environment setup.", - "enum": ["auto", "poetry", "uv", "virtualenv", "simple"], - "type": "string" + { + "additionalProperties": { + "type": "string" + }, + "type": "object" } - }, - "type": "object" + ], + "description": "Specify one or more other toml or json files to load tasks from." }, - "include": { + "include_script": { "anyOf": [ { "type": "string" }, { "items": { - "type": "string" + "oneOf": [ + { "type": "string" }, + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + ] }, "type": "array" }, @@ -516,7 +636,7 @@ "type": "object" } ], - "description": "Specify one or more other toml or json files to load tasks from." + "description": "Load dynamically generated tasks from one or more python functions." }, "poetry_command": { "description": "Change the name of the task poe registers with poetry when used as a plugin.", From 0463cc50ac530c946d41706e096d1f658fa82b91 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Jan 2026 09:59:31 -0800 Subject: [PATCH 2/6] Bump peter-evans/create-pull-request in the github-actions group (#5258) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/auto-update.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/auto-update.yml b/.github/workflows/auto-update.yml index 5ee4dcfd7e9..c4404c45ccc 100644 --- a/.github/workflows/auto-update.yml +++ b/.github/workflows/auto-update.yml @@ -34,4 +34,4 @@ jobs: cache-dependency-path: './package-lock.json' - run: 'npm clean-install' - run: 'node ./cli.js build-xregistry' - - uses: peter-evans/create-pull-request@v7 + - uses: peter-evans/create-pull-request@v8 From 44a1d760e903c743c9fac69abeb06c4fd0bcef07 Mon Sep 17 00:00:00 2001 From: nate nowack Date: Thu, 1 Jan 2026 12:00:23 -0600 Subject: [PATCH 3/6] add prefect.yaml schema entry (#5253) --- src/api/json/catalog.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/api/json/catalog.json b/src/api/json/catalog.json index 68190e315ff..61f148431d4 100644 --- a/src/api/json/catalog.json +++ b/src/api/json/catalog.json @@ -4937,6 +4937,12 @@ "fileMatch": ["prefect.toml"], "url": "https://raw.githubusercontent.com/PrefectHQ/prefect/refs/heads/main/schemas/settings.schema.json" }, + { + "name": "prefect.yaml", + "description": "Prefect deployment configuration file", + "fileMatch": ["prefect.yaml", "prefect.yml"], + "url": "https://raw.githubusercontent.com/PrefectHQ/prefect/refs/heads/main/schemas/prefect.yaml.schema.json" + }, { "name": "prettierrc.json", "description": ".prettierrc configuration file", From 0e62b6e5d8284588c6d3a7d0c878bd5f47290ae4 Mon Sep 17 00:00:00 2001 From: Jeong Min Oh Date: Fri, 2 Jan 2026 03:01:02 +0900 Subject: [PATCH 4/6] Add devup (#5254) --- src/api/json/catalog.json | 6 + src/schemas/json/devup.json | 304 ++++++++++++++++++ src/test/devup/devup.json | 594 ++++++++++++++++++++++++++++++++++++ 3 files changed, 904 insertions(+) create mode 100644 src/schemas/json/devup.json create mode 100644 src/test/devup/devup.json diff --git a/src/api/json/catalog.json b/src/api/json/catalog.json index 61f148431d4..f123126688d 100644 --- a/src/api/json/catalog.json +++ b/src/api/json/catalog.json @@ -9088,6 +9088,12 @@ "description": "Changepacks are a way to package changes to a project", "fileMatch": ["**/.changepacks/config.json"], "url": "https://www.schemastore.org/changepacks.json" + }, + { + "name": "Devup", + "description": "JSX Zero-Runtime UI Styling Library", + "fileMatch": ["devup.json"], + "url": "https://www.schemastore.org/devup.json" } ] } diff --git a/src/schemas/json/devup.json b/src/schemas/json/devup.json new file mode 100644 index 00000000000..de16bb4e1b5 --- /dev/null +++ b/src/schemas/json/devup.json @@ -0,0 +1,304 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.schemastore.org/devup.json", + "$defs": { + "ColorValue": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/ColorValue" + } + } + ] + }, + "ColorTheme": { + "description": "Color theme with color name to value mappings. Supports nested objects for color scales.", + "type": "object", + "additionalProperties": { + "oneOf": [ + { + "description": "Color value (e.g., '#000', 'rgb(0,0,0)')", + "type": "string" + }, + { + "description": "Nested color object", + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/ColorValue" + } + } + ] + } + }, + "Theme": { + "type": "object", + "properties": { + "breakpoints": { + "description": "Breakpoints in pixels for responsive typography (default: [0, 480, 768, 992, 1280, 1600])", + "type": "array", + "default": [0, 480, 768, 992, 1280, 1600], + "items": { + "type": "integer", + "maximum": 65535, + "minimum": 0 + } + }, + "colors": { + "description": "Color themes by mode name (e.g., \"light\", \"dark\")", + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/ColorTheme" + }, + "default": {} + }, + "typography": { + "description": "Typography definitions by name (e.g., \"h1\", \"body\", \"caption\")", + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/Typographies" + }, + "default": {} + } + } + }, + "Typographies": { + "description": "Typography definition supporting both traditional array format and compact object format", + "oneOf": [ + { + "description": "Traditional array format: array of Typography objects or null for each breakpoint", + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "#/$defs/Typography" + }, + { + "type": "null" + } + ] + } + }, + { + "description": "Compact object format: each property can be a single value or array of values per breakpoint", + "type": "object", + "properties": { + "fontFamily": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "type": "null" + } + ] + }, + "fontSize": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "type": "null" + } + ] + }, + "fontStyle": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "type": "null" + } + ] + }, + "fontWeight": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "array", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + { + "type": "null" + } + ] + }, + "letterSpacing": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "type": "null" + } + ] + }, + "lineHeight": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "array", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + { + "type": "null" + } + ] + } + }, + "additionalProperties": false + } + ] + }, + "Typography": { + "type": "object", + "properties": { + "fontFamily": { + "type": ["string", "null"] + }, + "fontSize": { + "type": ["string", "null"] + }, + "fontWeight": { + "default": null, + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "letterSpacing": { + "type": ["string", "null"] + }, + "lineHeight": { + "default": null, + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "null" + } + ] + } + } + } + }, + "title": "DevupJson", + "description": "Root devup.json configuration", + "type": "object", + "properties": { + "theme": { + "description": "Theme configuration including colors, typography, and breakpoints", + "anyOf": [ + { + "$ref": "#/$defs/Theme" + }, + { + "type": "null" + } + ], + "default": null + } + } +} diff --git a/src/test/devup/devup.json b/src/test/devup/devup.json new file mode 100644 index 00000000000..15440c4963b --- /dev/null +++ b/src/test/devup/devup.json @@ -0,0 +1,594 @@ +{ + "theme": { + "colors": { + "dark": { + "background": "#131313", + "base": "#000", + "border": "#333", + "buttonBlue": "#0867AF", + "buttonBlueActive": "#19498B", + "buttonBlueHover": "#1453AC", + "caption": "#787878", + "captionBold": "#9C9BA9", + "cardBg": "#28272B", + "codeBackground": "#2E2E2E", + "codeBg": "#2E303C", + "containerBackground": "#373639", + "error": "#F44336", + "footerBg": "#2E303C", + "footerText": "#FFF", + "footerTitle": "#A3A4B4", + "imageBorder": "#4D4C53", + "imageDate": "#636363", + "imageDateNone": "#343333", + "imageDropdown": "#3A3A3A", + "imageMenuBg": "#262626", + "imageMenuSelect": "#3F3F3F", + "imagePlaceholder": "#4C4C4C", + "imageProgress": "#444", + "info": "#2196F3", + "joinBg": "#2F363E", + "kakaoButton": "#A3740D", + "kakaoButtonActive": "#E09900", + "kakaoButtonHover": "#C98900", + "link": "#006BFF", + "menuActive": "#283259", + "menuHover": "#3C404B", + "negativeBase": "#FFF", + "primary": "#9086FF", + "search": "#6FA4FF", + "secondary": "#2A4586", + "shadow": "#62626240", + "starBg": "#232323", + "success": "#4CAF50", + "text": "#EDEDED", + "textReverse": "#2F2F2F", + "third": "#737FE4", + "title": "#FAFAFA", + "warning": "#FF9800" + }, + "light": { + "background": "#FFF", + "base": "#FFF", + "border": "#E0E0E0", + "buttonBlue": "#266CCD", + "buttonBlueActive": "#19498B", + "buttonBlueHover": "#1453AC", + "caption": "#A9A8B4", + "captionBold": "#7C7B8E", + "cardBg": "#F8F8F8", + "codeBackground": "#F5F5F5", + "codeBg": "#3E3B41", + "containerBackground": "#FFF", + "error": "#F44336", + "footerBg": "#F4F4F6", + "footerText": "#51575F", + "footerTitle": "#A3A4B4", + "imageBorder": "#C8C7D1", + "imageDate": "#C9C9C9", + "imageDateNone": "#F2F2F2", + "imageDropdown": "#ECECEC", + "imageMenuBg": "#FBFBFB", + "imageMenuSelect": "#EDECF7", + "imagePlaceholder": "#999", + "imageProgress": "#DADADA", + "info": "#2196F3", + "joinBg": "#CDE2FA", + "kakaoButton": "#DE9800", + "kakaoButtonActive": "#B77D00", + "kakaoButtonHover": "#C98900", + "link": "#006BFF", + "menuActive": "#EAE8FC", + "menuHover": "#F6F4FF", + "negativeBase": "#000", + "primary": "#5A44FF", + "search": "#9C50FF", + "secondary": "#85A5F2", + "shadow": "#87878740", + "starBg": "#F7F8FF", + "success": "#4CAF50", + "text": "#2F2F2F", + "textReverse": "#FFF", + "third": "#918AE9", + "title": "#1A1A1A", + "warning": "#FF9800" + } + }, + "typography": { + "body": [ + { + "fontFamily": "Pretendard", + "fontSize": "14px", + "fontStyle": "normal", + "fontWeight": 500, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "16px", + "fontStyle": "normal", + "fontWeight": 500, + "letterSpacing": "-0.03em", + "lineHeight": 1.5 + }, + null + ], + "bodyBold": { + "fontFamily": "Pretendard", + "fontSize": "16px", + "fontStyle": "normal", + "fontWeight": 700, + "letterSpacing": "-0.03em", + "lineHeight": 1.5 + }, + "bodyReg": [ + { + "fontFamily": "Pretendard", + "fontSize": "14px", + "fontStyle": "normal", + "fontWeight": 400, + "letterSpacing": "-0.03em", + "lineHeight": 1.5 + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "16px", + "fontStyle": "normal", + "fontWeight": 400, + "letterSpacing": "-0.03em", + "lineHeight": 1.5 + }, + null + ], + "buttonL": [ + { + "fontFamily": "Pretendard", + "fontSize": "17px", + "fontStyle": "normal", + "fontWeight": 800, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "20px", + "fontStyle": "normal", + "fontWeight": 800, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null + ], + "buttonLbold": [ + { + "fontFamily": "Pretendard", + "fontSize": "17px", + "fontStyle": "normal", + "fontWeight": 700, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "18px", + "fontStyle": "normal", + "fontWeight": 700, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null + ], + "buttonLsemiB": [ + { + "fontFamily": "Pretendard", + "fontSize": "17px", + "fontStyle": "normal", + "fontWeight": 600, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "18px", + "fontStyle": "normal", + "fontWeight": 600, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null + ], + "buttonM": [ + { + "fontFamily": "Pretendard", + "fontSize": "15px", + "fontStyle": "normal", + "fontWeight": 600, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "17px", + "fontStyle": "normal", + "fontWeight": 600, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null + ], + "buttonS": [ + { + "fontFamily": "Pretendard", + "fontSize": "14px", + "fontStyle": "normal", + "fontWeight": 800, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "15px", + "fontStyle": "normal", + "fontWeight": 700, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null + ], + "buttonSmid": [ + { + "fontFamily": "Pretendard", + "fontSize": "14px", + "fontStyle": "normal", + "fontWeight": 500, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "15px", + "fontStyle": "normal", + "fontWeight": 500, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null + ], + "caption": { + "fontFamily": "Pretendard", + "fontSize": "14px", + "fontStyle": "normal", + "fontWeight": 500, + "letterSpacing": "-0.03em", + "lineHeight": 1.4 + }, + "captionBold": [ + { + "fontFamily": "Pretendard", + "fontSize": "13px", + "fontStyle": "normal", + "fontWeight": 700, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "14px", + "fontStyle": "normal", + "fontWeight": 700, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null + ], + "code": [ + { + "fontFamily": "D2Coding", + "fontSize": "13px", + "fontStyle": "normal", + "fontWeight": 700, + "letterSpacing": "-0.03em", + "lineHeight": 1.5 + }, + null, + null, + null, + { + "fontFamily": "D2Coding", + "fontSize": "15px", + "fontStyle": "normal", + "fontWeight": 700, + "letterSpacing": "-0.03em", + "lineHeight": 1.5 + }, + null + ], + "footerMenu": [ + { + "fontFamily": "Pretendard", + "fontSize": "13px", + "fontStyle": "normal", + "fontWeight": 500, + "letterSpacing": "-0.03em", + "lineHeight": 1.4 + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "14px", + "fontStyle": "normal", + "fontWeight": 500, + "letterSpacing": "-0.03em", + "lineHeight": 1.4 + }, + null + ], + "h1": [ + { + "fontFamily": "Pretendard", + "fontSize": "38px", + "fontStyle": "normal", + "fontWeight": 800, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "52px", + "fontStyle": "normal", + "fontWeight": 800, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null + ], + "h2": [ + { + "fontFamily": "Pretendard", + "fontSize": "36px", + "fontStyle": "normal", + "fontWeight": 800, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "48px", + "fontStyle": "normal", + "fontWeight": 800, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null + ], + "h3": [ + { + "fontFamily": "Pretendard", + "fontSize": "32px", + "fontStyle": "normal", + "fontWeight": 700, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "42px", + "fontStyle": "normal", + "fontWeight": 700, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null + ], + "h4": [ + { + "fontFamily": "Pretendard", + "fontSize": "28px", + "fontStyle": "normal", + "fontWeight": 700, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "36px", + "fontStyle": "normal", + "fontWeight": 700, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null + ], + "h5": [ + { + "fontFamily": "Pretendard", + "fontSize": "24px", + "fontStyle": "normal", + "fontWeight": 600, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "30px", + "fontStyle": "normal", + "fontWeight": 700, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null + ], + "h6": [ + { + "fontFamily": "Pretendard", + "fontSize": "18px", + "fontStyle": "normal", + "fontWeight": 600, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "24px", + "fontStyle": "normal", + "fontWeight": 600, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null + ], + "h6Reg": [ + { + "fontFamily": "Pretendard", + "fontSize": "18px", + "fontStyle": "normal", + "fontWeight": 400, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "24px", + "fontStyle": "normal", + "fontWeight": 400, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null + ], + "small": [ + { + "fontFamily": "Pretendard", + "fontSize": "11px", + "fontStyle": "normal", + "fontWeight": 300, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "12px", + "fontStyle": "normal", + "fontWeight": 400, + "letterSpacing": "-0.03em", + "lineHeight": 1.4 + }, + null + ], + "smallBold": { + "fontFamily": "Pretendard", + "fontSize": "12px", + "fontStyle": "normal", + "fontWeight": 800, + "letterSpacing": "-0.03em", + "lineHeight": 1.4 + }, + "textL": [ + { + "fontFamily": "Pretendard", + "fontSize": "16px", + "fontStyle": "normal", + "fontWeight": 500, + "letterSpacing": "-0.03em", + "lineHeight": 1.3 + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "18px", + "fontStyle": "normal", + "fontWeight": 500, + "letterSpacing": "-0.03em", + "lineHeight": 1.5 + }, + null + ], + "textS": { + "fontFamily": "Pretendard", + "fontSize": "15px", + "fontStyle": "normal", + "fontWeight": 500, + "letterSpacing": "-0.03em", + "lineHeight": 1.4 + }, + "textSbold": [ + { + "fontFamily": "Pretendard", + "fontSize": "13px", + "fontStyle": "normal", + "fontWeight": 700, + "letterSpacing": "-0.03em", + "lineHeight": 1.4 + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "15px", + "fontStyle": "normal", + "fontWeight": 700, + "letterSpacing": "-0.03em", + "lineHeight": 1.4 + }, + null + ] + } + } +} From c8f89af2c5fc33646a2326336beec78dd46c523a Mon Sep 17 00:00:00 2001 From: Dmitry Savintsev Date: Thu, 1 Jan 2026 19:01:19 +0100 Subject: [PATCH 5/6] dependabot-2.0: Make schedule optional in multi-ecosystem groups (#5249) (#5250) --- src/schemas/json/dependabot-2.0.json | 11 +++++- ...osystem-groups.no-schedule-in-updates.yaml | 37 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/test/dependabot-2.0/multi-ecosystem-groups.no-schedule-in-updates.yaml diff --git a/src/schemas/json/dependabot-2.0.json b/src/schemas/json/dependabot-2.0.json index 235fd1566c4..49a4f21bbb2 100644 --- a/src/schemas/json/dependabot-2.0.json +++ b/src/schemas/json/dependabot-2.0.json @@ -1068,7 +1068,16 @@ }, "allOf": [ { - "required": ["package-ecosystem", "schedule"] + "$comment": "Schedule is required UNLESS multi-ecosystem-group is specified", + "if": { + "required": ["multi-ecosystem-group"] + }, + "then": { + "required": ["package-ecosystem"] + }, + "else": { + "required": ["package-ecosystem", "schedule"] + } }, { "oneOf": [ diff --git a/src/test/dependabot-2.0/multi-ecosystem-groups.no-schedule-in-updates.yaml b/src/test/dependabot-2.0/multi-ecosystem-groups.no-schedule-in-updates.yaml new file mode 100644 index 00000000000..884876ef7ab --- /dev/null +++ b/src/test/dependabot-2.0/multi-ecosystem-groups.no-schedule-in-updates.yaml @@ -0,0 +1,37 @@ +# yaml-language-server: $schema=../../schemas/json/dependabot-2.0.json +# Test case: Updates with multi-ecosystem-group but no schedule property +# The schedule is defined at the group level, so individual updates don't need it +version: 2 + +multi-ecosystem-groups: + shared-dependencies: + schedule: + interval: weekly + day: monday + labels: + - dependencies + - automated + +updates: + # Update without schedule - should be valid when multi-ecosystem-group is present + - package-ecosystem: npm + directory: /frontend + patterns: + - '*' + multi-ecosystem-group: shared-dependencies + + # Another update without schedule in same group + - package-ecosystem: pip + directory: /backend + patterns: + - django + - flask + multi-ecosystem-group: shared-dependencies + + # Third ecosystem without individual schedule + - package-ecosystem: docker + directory: / + patterns: + - nginx + - postgres + multi-ecosystem-group: shared-dependencies From 77de04a80a228c420395d6061a4cacd63c74b5df Mon Sep 17 00:00:00 2001 From: Yukai Chou Date: Fri, 2 Jan 2026 02:03:36 +0800 Subject: [PATCH 6/6] github-workflow: add `jobs..snapshot` schema (#5247) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- src/schemas/json/github-workflow.json | 31 +++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/schemas/json/github-workflow.json b/src/schemas/json/github-workflow.json index 160824c1de3..74467f564ee 100644 --- a/src/schemas/json/github-workflow.json +++ b/src/schemas/json/github-workflow.json @@ -351,6 +351,34 @@ } ] }, + "snapshot": { + "$comment": "https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idsnapshot", + "description": "You can use `jobs..snapshot` to generate a custom image.\nAdd the snapshot keyword to the job, using either the string syntax or mapping syntax as shown in https://docs.github.com/en/actions/how-tos/manage-runners/larger-runners/use-custom-images#generating-a-custom-image.\nEach job that includes the snapshot keyword creates a separate image. To generate only one image or image version, include all workflow steps in a single job. Each successful run of a job that includes the snapshot keyword creates a new version of that image.\nFor more information, see https://docs.github.com/en/actions/how-tos/manage-runners/larger-runners/use-custom-images.", + "oneOf": [ + { + "$comment": "https://docs.github.com/en/actions/how-tos/manage-runners/larger-runners/use-custom-images#string-syntax", + "type": "string", + "description": "You can use the string syntax with `snapshot` to define the image name. This method creates a new image or adds a new version to an existing image with the same name. You cannot specify a version number using this syntax." + }, + { + "$comment": "https://docs.github.com/en/actions/how-tos/manage-runners/larger-runners/use-custom-images#mapping-syntax", + "type": "object", + "additionalProperties": false, + "description": "You can use the mapping syntax with `snapshot` to define both the `image-name` and the optional `version`. When you specify a major version, the minor versioning automatically increments if that major version already exists. Patch versions are not supported.", + "properties": { + "image-name": { + "type": "string" + }, + "version": { + "$comment": "https://docs.github.com/en/actions/how-tos/manage-runners/larger-runners/use-custom-images#specifying-a-version-in-your-workflow", + "type": "string", + "pattern": "^\\d+(\\.\\d+|\\*)?$" + } + }, + "required": ["image-name"] + } + ] + }, "step": { "type": "object", "additionalProperties": false, @@ -623,6 +651,9 @@ "needs": { "$ref": "#/definitions/jobNeeds" }, + "snapshot": { + "$ref": "#/definitions/snapshot" + }, "permissions": { "$ref": "#/definitions/permissions" },