{"$schema":"https://json-schema.org/draft/2019-09/schema","title":"UbprojectConfig","description":"Configuration for ubcode","type":"object","properties":{"build_tags":{"description":"Build tags for conditional processing, mirroring Sphinx's `tags` configuration.","type":"array","default":[],"items":{"type":"string"},"uniqueItems":true},"codelinks":{"description":"Codelinks configuration (source-code marker extraction).","$ref":"#/$defs/CodelinksConfig","default":{"local_url_field":"local-url","outdir":null,"projects":{},"remote_url_field":"remote-url","set_local_url":false,"set_remote_url":false}},"extend":{"description":"The path to a configuration file to extend.","type":["string","null"],"default":null},"format_rst":{"description":"RST formatting configuration","$ref":"#/$defs/FormatRstConfig","default":{"blockquote_indent":2,"definition_list_indent":2,"directive_indent":3,"enum_list_auto":"preserve","enum_list_style":"preserve","fail_on_warning":[],"field_list_align_body":false,"field_list_body_on_new_line":20,"field_list_indent":2,"literal_indent":2,"paragraph_line_length":null,"paragraph_semantic_wrap":false,"simple_table_space":2,"substitution_indent":3,"transition_char":null,"transition_length":10,"validate":true}},"lint":{"description":"Lint configuration settings","$ref":"#/$defs/LintConfig","default":{"ignore":[],"lsp_select":[],"message-ignores":[],"per-file-ignores":{}}},"needs":{"description":"Needs configuration settings","$ref":"#/$defs/NeedsConfig","default":{"external_needs":[],"extra_links":[],"extra_options":[],"fields":{},"filter_data":{},"global_options":{},"id_from_title":false,"id_length":5,"id_regex":"^[A-Z0-9_]{5,}","id_required":false,"import_keys":{},"links":{},"parse_dynamic_functions":true,"schema_definitions_from_json":"","statuses":[],"tags":[],"title_from_content":false,"title_optional":false,"types":[{"color":"#BFD8D2","directive":"req","prefix":"R_","style":"node","title":"Requirement"},{"color":"#FEDCD2","directive":"spec","prefix":"S_","style":"node","title":"Specification"},{"color":"#DF744A","directive":"impl","prefix":"I_","style":"node","title":"Implementation"},{"color":"#DCB239","directive":"test","prefix":"T_","style":"node","title":"Test Case"}],"variant_data":{},"variant_data_file":"","variant_options":[],"variants":{}}},"needs_json":{"description":"Needs JSON configuration settings","$ref":"#/$defs/NeedsJsonConfig","default":{"path":"","src":null}},"parse":{"description":"Parse configuration settings","$ref":"#/$defs/ParseConfig","default":{"extend_directives":{},"extend_roles":{},"ignore_directives":[],"parsers":{}}},"project":{"description":"Project configuration settings","$ref":"#/$defs/ProjectConfig","default":{"description":"","name":"","srcdir":"","version":""}},"reports":{"description":"Report-template configuration (`.html.j2` discovery + render limits).","$ref":"#/$defs/ReportsConfig","default":{"directory":"reports","max_output_bytes":52428800}},"rst_lint":{"description":"Deprecated RST lint configuration (use `lint` instead)","$ref":"#/$defs/LintConfig","default":{"ignore":[],"lsp_select":[],"message-ignores":[],"per-file-ignores":{}},"deprecated":true},"scripts":{"description":"A map of script names to command templates.","type":"object","additionalProperties":{"description":"Configuration for a script, either as a string, command, or chain","anyOf":[{"description":"A string to run as a script.","type":"string"},{"description":"A command configuration","type":"object","properties":{"cmd":{"description":"The command to run.","type":"string"},"env":{"description":"A map of environment variables to set when running the command.","type":"object","additionalProperties":{"type":"string"},"default":{}},"jinja":{"description":"If True, the command is a Jinja template.","type":"boolean","default":true},"terminal":{"description":"The terminal name to use to run the command (defaults to script key).","type":["string","null"],"default":null}},"additionalProperties":false,"required":["cmd"]},{"description":"A chain of script configurations","type":"object","properties":{"chain":{"description":"A list of keys of scripts to chain together.","type":"array","items":{"type":"string"}},"terminal":{"description":"The terminal name to use to run the command (defaults to script key).","type":["string","null"],"default":null}},"additionalProperties":false,"required":["chain"]}]},"default":{}},"server":{"description":"Server configuration settings","$ref":"#/$defs/ServerConfig","default":{"hover_images":true,"hover_need_refs":true,"image_file_patterns":["*.jpg","*.jpeg","*.png","*.gif","*.svg","*.webp","*.bmp","*.tiff","*.tif","*.ico","*.heif","*.heic","*.avif","*.eps","*.psd","*.ai","*.pdf"],"index_on_save":false}},"source":{"description":"Source file discovery configuration","$ref":"#/$defs/SourceConfig","default":{"exclude":[".bzr",".direnv",".eggs",".git",".git-rewrite",".hg",".svn",".venv",".vscode","_build","build","dist","node_modules","site-packages"],"extend_exclude":[],"extend_include":[],"follow_links":false,"include":["*.rst"],"respect_gitignore":true}},"virtual":{"description":"Virtual configurations do not correspond to an actual project.\nThey are used for providing shared configuration defaults,\nor for workspaces that are not themselves projects.","type":"boolean","default":false}},"$defs":{"CodelinksConfig":{"description":"Codelinks configuration.","type":"object","properties":{"local_url_field":{"description":"Field name for local URL.","type":"string","default":"local-url"},"outdir":{"description":"Optional output directory for standalone use.","type":["string","null"],"default":null},"projects":{"description":"Per-project configurations keyed by project name.","type":"object","additionalProperties":{"description":"Per-project configuration.","type":"object","properties":{"analyse":{"description":"Analysis settings.","type":"object","properties":{"get_need_id_refs":{"description":"Whether to extract need-id references.","type":"boolean","default":true},"get_oneline_needs":{"description":"Whether to extract one-line needs.","type":"boolean","default":true},"get_rst":{"description":"Whether to extract marked RST blocks.","type":"boolean","default":false},"git_root":{"description":"Optional explicit git root (relative to TOML file).","type":["string","null"],"default":null},"marked_rst":{"description":"Marked RST block configuration.","type":"object","properties":{"end_sequence":{"description":"Sequence that ends a marked RST block.","type":"string","default":"@endrst","minLength":1},"start_sequence":{"description":"Sequence that starts a marked RST block.","type":"string","default":"@rst","minLength":1}},"additionalProperties":false,"default":{"end_sequence":"@endrst","start_sequence":"@rst"}},"need_id_refs":{"description":"Need-id reference marker configuration.","type":"object","properties":{"markers":{"description":"Marker strings that identify need-id references.","type":"array","default":["@need-ids:"],"items":{"type":"string"},"minItems":1}},"additionalProperties":false,"default":{"markers":["@need-ids:"]}},"oneline_comment_style":{"description":"One-line comment style configuration.","type":"object","properties":{"end_sequence":{"description":"Character sequence that ends a one-line marker.","type":"string","default":"\n","minLength":1},"field_split_char":{"description":"Character used to split fields.","type":"string","default":",","minLength":1},"needs_fields":{"description":"Ordered list of field definitions.","type":"array","default":[{"default":null,"name":"title","type":"str"},{"default":null,"name":"id","type":"str"},{"default":"impl","name":"type","type":"str"},{"default":[],"name":"links","type":"list[str]"}],"items":{"description":"A single field definition in the one-line comment style.","type":"object","properties":{"default":{"description":"Default value applied when the field is omitted from the marker.\n`None` means the field is required (no default).","anyOf":[{"description":"Default value for a need field.","anyOf":[{"description":"A string default value.","type":"string"},{"description":"A list-of-strings default value.","type":"array","items":{"type":"string"}}]},{"type":"null"}],"default":null},"name":{"description":"Field name (e.g., \"title\", \"id\", \"type\").","type":"string","minLength":1},"type":{"description":"Field type. Defaults to `Str` if omitted.","default":"str","oneOf":[{"description":"A plain string field.","type":"string","const":"str"},{"description":"A list of strings.","type":"string","const":"list[str]"}]}},"additionalProperties":false,"required":["name"]},"minItems":1},"start_sequence":{"description":"Character sequence that starts a one-line marker.","type":"string","default":"@","minLength":1}},"additionalProperties":false,"default":{"end_sequence":"\n","field_split_char":",","needs_fields":[{"default":null,"name":"title","type":"str"},{"default":null,"name":"id","type":"str"},{"default":"impl","name":"type","type":"str"},{"default":[],"name":"links","type":"list[str]"}],"start_sequence":"@"}}},"additionalProperties":false,"default":{"get_need_id_refs":true,"get_oneline_needs":true,"get_rst":false,"git_root":null,"marked_rst":{"end_sequence":"@endrst","start_sequence":"@rst"},"need_id_refs":{"markers":["@need-ids:"]},"oneline_comment_style":{"end_sequence":"\n","field_split_char":",","needs_fields":[{"default":null,"name":"title","type":"str"},{"default":null,"name":"id","type":"str"},{"default":"impl","name":"type","type":"str"},{"default":[],"name":"links","type":"list[str]"}],"start_sequence":"@"}}},"remote_url_pattern":{"description":"URL pattern for remote links (e.g., GitHub blob URLs).","type":["string","null"],"default":null},"source_discover":{"description":"Source file discovery settings.","type":"object","properties":{"comment_type":{"description":"Language/comment type for this project.","anyOf":[{"description":"Supported programming languages for code links extraction.","oneOf":[{"description":"C++ language.","type":"string","const":"cpp"},{"description":"Python language.","type":"string","const":"python"},{"description":"Rust language.","type":"string","const":"rust"},{"description":"C# language.","type":"string","const":"csharp"},{"description":"YAML language.","type":"string","const":"yaml"}]},{"type":"null"}],"default":null},"exclude":{"description":"Glob patterns for files to exclude.","type":"array","default":[],"items":{"type":"string"}},"follow_links":{"description":"If true, follow symbolic links when traversing source directories.","type":"boolean","default":false},"gitignore":{"description":"Whether to respect `.gitignore` files.","type":"boolean","default":true},"include":{"description":"Glob patterns for files to include.","type":"array","default":[],"items":{"type":"string"}},"src_dir":{"description":"Source directory (absolute or relative).","type":"string","default":"."}},"additionalProperties":false,"default":{"comment_type":null,"exclude":[],"follow_links":false,"gitignore":true,"include":[],"src_dir":"."}}},"additionalProperties":false},"default":{}},"remote_url_field":{"description":"Field name for remote URL.","type":"string","default":"remote-url"},"set_local_url":{"description":"Whether to compute local file URLs.","type":"boolean","default":false},"set_remote_url":{"description":"Whether to compute remote (git) URLs.","type":"boolean","default":false}},"additionalProperties":false},"DefaultExcludeList":{"description":"Default list of glob patterns to exclude from source files","type":"array","items":{"type":"string"}},"DefaultIdLength":{"description":"Default ID length for needs (5 characters)","type":"integer","format":"uint","minimum":0},"DefaultIdRegex":{"description":"Default regex pattern for need IDs (uppercase letters, numbers, and underscores, at least 5 characters)","type":"string"},"DefaultImageFilePatterns":{"description":"Default list of image file patterns for image file detection","type":"array","items":{"type":"string"}},"DefaultIncludeList":{"description":"Default list of glob patterns to include in source files (*.rst)","type":"array","items":{"type":"string"}},"DefaultLength10":{"description":"Default length value of 10","type":"integer","format":"uint","minimum":0},"DefaultLength2":{"description":"Default length value of 2","type":"integer","format":"uint","minimum":0},"DefaultLength20":{"description":"Default length value of 20","type":"integer","format":"uint","minimum":0},"DefaultLength3":{"description":"Default length value of 3","type":"integer","format":"uint","minimum":0},"DefaultMaxOutputBytes":{"description":"Default maximum rendered-output size in bytes (50 MiB)","type":"integer","format":"uint64","minimum":0},"DefaultNeedTypes":{"description":"Default need types (req, spec, impl, test)","type":"array","items":{"description":"Defines a need type.","type":"object","properties":{"color":{"description":"The default color to use in diagrams.","type":"string","default":"#000000"},"directive":{"description":"The directive name.","type":"string"},"prefix":{"description":"The prefix to use for auto-generated need IDs.","type":"string"},"style":{"description":"The default style to use in diagrams.","type":"string","default":"node"},"title":{"description":"A human readable title.","type":"string"}},"required":["directive","title","prefix"]}},"DefaultReportsDirectory":{"description":"Default reports directory (`reports`, relative to the config file)","type":"string"},"DefaultTrueBool":{"description":"Default boolean value of true","type":"boolean"},"EnumListAuto":{"oneOf":[{"description":"Preserve ``#`` markers from the original text.","type":"string","const":"preserve"},{"description":"Always use ``#`` markers for susequent items.","type":"string","const":"always"},{"description":"Never use ``#`` markers for susequent items.","type":"string","const":"never"}]},"EnumListStyle":{"oneOf":[{"description":"Preserve the original style of the list.","type":"string","const":"preserve"},{"description":"Use a period after the number (e.g. 1., 2., 3.).","type":"string","const":"period"},{"description":"Use a right parenthesis after the number (e.g. 1), 2), 3)).","type":"string","const":"rparen"},{"description":"Use parentheses around the number (e.g. (1), (2), (3)).","type":"string","const":"parens"}]},"FormatRstConfig":{"description":"reStructuredText formatting configuration.","type":"object","properties":{"blockquote_indent":{"description":"The number of spaces to use for indentation of blockquotes.","$ref":"#/$defs/DefaultLength2","default":2},"definition_list_indent":{"description":"The number of spaces to use for indentation of definitions.","$ref":"#/$defs/DefaultLength2","default":2},"directive_indent":{"description":"The number of spaces to use for indentation of directive content","$ref":"#/$defs/DefaultLength3","default":3},"enum_list_auto":{"description":"Behavior of enumerated lists when using auto ``#`` markers.","$ref":"#/$defs/EnumListAuto","default":"preserve"},"enum_list_style":{"description":"The style of enumerated list item markers.","$ref":"#/$defs/EnumListStyle","default":"preserve"},"fail_on_warning":{"description":"A list of linting codes to fail formatting","type":"array","default":[],"items":{"type":"string"},"uniqueItems":true},"field_list_align_body":{"description":"Whether to align the body of field lists with the with its first line.","type":"boolean","default":false},"field_list_body_on_new_line":{"description":"The field length after which the first line of the body should start on a new line.","$ref":"#/$defs/DefaultLength20","default":20},"field_list_indent":{"description":"The number of spaces to use for indentation of field bodies.","$ref":"#/$defs/DefaultLength2","default":2},"literal_indent":{"description":"The number of spaces to use for indentation of literal blocks.","$ref":"#/$defs/DefaultLength2","default":2},"paragraph_line_length":{"description":"A target width for paragraphs.\nNote this is not a hard limit, but a target length.\nIt will also not wrap paragraphs in tables.","type":["integer","null"],"format":"uint","default":null,"minimum":1},"paragraph_semantic_wrap":{"description":"Whether to wrap paragraphs at semantic boundaries.","type":"boolean","default":false},"simple_table_space":{"description":"The number of spaces to use between columns in simple tables.","$ref":"#/$defs/DefaultLength2","default":2},"substitution_indent":{"description":"The number of spaces to use for indentation of substitution content.","$ref":"#/$defs/DefaultLength3","default":3},"transition_char":{"description":"The character to use for transition lines.","type":["string","null"],"default":null,"enum":["-","=","~","^",".","+","_","#",null]},"transition_length":{"description":"The length of transition lines.","$ref":"#/$defs/DefaultLength10","default":10},"validate":{"description":"Validate the formatted syntax structure has not changed.","$ref":"#/$defs/DefaultTrueBool","default":true}}},"LintConfig":{"description":"Lint configuration.","type":"object","properties":{"ignore":{"description":"A list of linting codes to ignore.","type":"array","default":[],"items":{"type":"string"},"uniqueItems":true},"lsp_select":{"description":"A list of linting codes to select in LSP file diagnostics\nThis overrides the ignore list.","type":"array","default":[],"items":{"type":"string"},"uniqueItems":true},"message-ignores":{"description":"Message-based ignores: suppress diagnostics whose message contains a given substring.","type":"array","default":[],"items":{"description":"A rule for suppressing diagnostics whose message contains a given substring.","type":"object","properties":{"codes":{"description":"Optional set of diagnostic codes this rule applies to.\nIf empty/omitted, the rule applies to all codes.","type":"array","items":{"type":"string"},"uniqueItems":true},"contains":{"description":"A case-insensitive substring to match against the diagnostic message.","type":"string","default":""}}}},"per-file-ignores":{"description":"Per-file ignores: maps POSIX glob patterns (relative to config directory)\nto lists of diagnostic codes to ignore for matching files.","type":"object","additionalProperties":{"type":"array","items":{"type":"string"},"uniqueItems":true},"default":{}}}},"NeedsConfig":{"description":"Needs configuration.","type":"object","properties":{"external_needs":{"description":"External sources to load needs from.","type":"array","default":[],"items":{"description":"External source to load needs from.","type":"object","properties":{"base_url":{"description":"The base URL for references to the external source","type":["string","null"],"default":null},"css_class":{"description":"Add a CSS class to URL references","type":["string","null"],"default":null},"id_prefix":{"description":"Prefix all IDs from the external source with this string (note will be uppercased)","type":["string","null"],"default":null},"skip_in_ubcode":{"description":"Skip this source when loading needs in ubcode","type":"boolean","default":false},"target_url":{"description":"A Jinja template for the URL of references to the external source, relative to `base_url`","type":["string","null"],"default":null},"version":{"description":"Override `current_version` from loaded JSON","type":["string","null"],"default":null}},"anyOf":[{"description":"JSON source from a local file path","type":"object","properties":{"json_path":{"description":"Local path to a JSON file.","type":"string"}},"required":["json_path"]},{"description":"JSON source from a remote URL","type":"object","properties":{"json_url":{"description":"Remote URL to a JSON file.","type":"string","format":"uri"}},"required":["json_url"]}]}},"extra_links":{"description":"Links between needs.","type":"array","default":[],"items":{"description":"Defines a link between needs.","type":"object","properties":{"allow_dead_links":{"description":"Do not warn if a link connects to an unknown need ID.","type":"boolean","default":false},"color":{"description":"The default color to use in diagrams.","type":"string","default":"#000000"},"copy":{"description":"Copy to common links field.","type":"boolean","default":false},"incoming":{"description":"The incoming link title.","type":["string","null"]},"option":{"description":"The name of the link type.","type":"string"},"outgoing":{"description":"The outgoing link title.","type":["string","null"]},"parse_conditions":{"description":"Whether condition bracket syntax is parsed in this link's values.\nWhen `false`, brackets are treated as literal ID text.\nDefaults to `true` when not set.","type":["boolean","null"]},"parse_dynamic_functions":{"description":"Whether dynamic functions are parsed in this link.\nFalls back to global `parse_dynamic_functions` when not set.","type":["boolean","null"]},"parse_variants":{"description":"Whether variants are parsed in this link.","type":["boolean","null"]},"schema":{"description":"Schema constraints for validating the link array.","type":["object","null"],"properties":{"contains":{"description":"Schema constraints that at least one item must match.","type":["object","null"],"properties":{"maxLength":{"description":"Maximum string length of each link ID.","type":["integer","null"],"format":"uint","minimum":0},"minLength":{"description":"Minimum string length of each link ID.","type":["integer","null"],"format":"uint","minimum":0},"pattern":{"description":"A regex pattern to validate each link ID against.","type":["string","null"]},"type":{"description":"Type for link items. Injected automatically if not provided.","type":"string","default":"string","enum":["string"]}}},"items":{"description":"Schema constraints that apply to all items in the link ID array.\nDefaults to `{\"type\": \"string\"}` to ensure schema completeness.","type":"object","properties":{"maxLength":{"description":"Maximum string length of each link ID.","type":["integer","null"],"format":"uint","minimum":0},"minLength":{"description":"Minimum string length of each link ID.","type":["integer","null"],"format":"uint","minimum":0},"pattern":{"description":"A regex pattern to validate each link ID against.","type":["string","null"]},"type":{"description":"Type for link items. Injected automatically if not provided.","type":"string","default":"string","enum":["string"]}},"default":{"type":"string"}},"maxContains":{"description":"Maximum number of items that must match the 'contains' schema.","type":["integer","null"],"format":"uint","minimum":0},"maxItems":{"description":"Maximum number of outgoing links allowed.","type":["integer","null"],"format":"uint","minimum":0},"minContains":{"description":"Minimum number of items that must match the 'contains' schema.","type":["integer","null"],"format":"uint","minimum":0},"minItems":{"description":"Minimum number of outgoing links required.","type":["integer","null"],"format":"uint","minimum":0},"type":{"description":"Type for extra links, must be \"array\". Injected automatically if not provided.","type":"string","default":"array","enum":["array"]}}},"style":{"description":"The default style to use in diagrams.","type":"string","default":"solid"},"style_end":{"description":"The default end style to use in diagrams.","type":"string","default":">"},"style_part":{"description":"The default style to use in diagrams for part links.","type":"string","default":"dotted"},"style_start":{"description":"The default start style to use in diagrams.","type":"string","default":"-"}},"required":["option"]}},"extra_options":{"description":"Extra options for needs.","type":"array","default":[],"items":{"description":"Definition for extra options, either as a map or string reference","anyOf":[{"description":"Extra option for needs","type":"object","properties":{"description":{"description":"The description of the option.","type":"string","default":""},"name":{"description":"The name of the option.","type":"string"},"schema":{"description":"Schema for the option value.","anyOf":[{"description":"Union type that can represent either an array schema or a single-value schema.","anyOf":[{"description":"Array type schema with array-specific validation rules","type":"object","properties":{"contains":{"description":"Schema that at least one item in the array must match","anyOf":[{"description":"Union type representing different single-value types","anyOf":[{"description":"String type schema with string-specific validation rules","type":"object","properties":{"const":{"description":"A constant value that the string must equal","type":["string","null"]},"enum":{"description":"An array of valid string values","type":["array","null"],"items":{"type":"string"}},"format":{"description":"The format that the string must conform to","anyOf":[{"description":"String format validation types supported by JSON Schema","oneOf":[{"description":"RFC 3339 date-time format (e.g., `2023-10-22T14:30:00Z`)","type":"string","const":"date-time"},{"description":"RFC 3339 full-date format (e.g., `2023-10-22`)","type":"string","const":"date"},{"description":"RFC 3339 full-time format (e.g., `14:30:00Z`)","type":"string","const":"time"},{"description":"RFC 3339 duration format (e.g., `P1DT12H`)","type":"string","const":"duration"},{"description":"RFC 5322 email address format (e.g., `user@example.com`)","type":"string","const":"email"},{"description":"Internationalized email address format (RFC 6531)","type":"string","const":"idn-email"},{"description":"RFC 1123 hostname format (e.g., `example.com`)","type":"string","const":"hostname"},{"description":"Internationalized hostname format (RFC 5890)","type":"string","const":"idn-hostname"},{"description":"IPv4 address format (e.g., `192.168.1.1`)","type":"string","const":"ipv4"},{"description":"IPv6 address format (e.g., `2001:db8::1`","type":"string","const":"ipv6"},{"description":"RFC 3986 URI format (e.g., `https://example.com/path`)","type":"string","const":"uri"},{"description":"RFC 3986 URI reference format (URI or relative reference)","type":"string","const":"uri-reference"},{"description":"RFC 3987 IRI format (internationalized URI)","type":"string","const":"iri"},{"description":"RFC 3987 IRI reference format (IRI or relative reference)","type":"string","const":"iri-reference"},{"description":"RFC 4122 UUID format (e.g., `550e8400-e29b-41d4-a716-446655440000`)","type":"string","const":"uuid"},{"description":"RFC 6570 URI template format (e.g., `/users/{id}`)","type":"string","const":"uri-template"},{"description":"RFC 6901 JSON pointer format (e.g., `/path/to/field`)","type":"string","const":"json-pointer"},{"description":"RFC 6901 relative JSON pointer format (e.g., `1/name`)","type":"string","const":"relative-json-pointer"},{"description":"ECMAScript regular expression format","type":"string","const":"regex"}]},{"type":"null"}]},"maxLength":{"description":"The maximum length (inclusive) of the string","type":["integer","null"],"format":"int64"},"minLength":{"description":"The minimum length (inclusive) of the string","type":["integer","null"],"format":"int64"},"pattern":{"description":"A regular expression pattern that the string must match","type":["string","null"]},"type":{"description":"The type identifier for string values","oneOf":[{"description":"The \"string\" type tag value","type":"string","const":"string"}]}},"required":["type"]},{"description":"Boolean type schema with boolean-specific validation rules","type":"object","properties":{"const":{"description":"A constant value that the boolean must equal","type":["boolean","null"]},"enum":{"description":"An array of valid boolean values","type":["array","null"],"items":{"type":"boolean"}},"type":{"description":"The type identifier for boolean values","oneOf":[{"description":"The \"boolean\" type tag value","type":"string","const":"boolean"}]}},"required":["type"]},{"description":"Integer type schema with integer-specific validation rules","type":"object","properties":{"const":{"description":"A constant value that the integer must equal","type":["integer","null"],"format":"int64"},"enum":{"description":"An array of valid integer values","type":["array","null"],"items":{"type":"integer","format":"int64"}},"exclusiveMaximum":{"description":"The maximum value (exclusive) that the integer can have","type":["integer","null"],"format":"int64"},"exclusiveMinimum":{"description":"The minimum value (exclusive) that the integer can have","type":["integer","null"],"format":"int64"},"maximum":{"description":"The maximum value (inclusive) that the integer can have","type":["integer","null"],"format":"int64"},"minimum":{"description":"The minimum value (inclusive) that the integer can have","type":["integer","null"],"format":"int64"},"multipleOf":{"description":"The integer must be a multiple of this value","type":["integer","null"],"format":"int64"},"type":{"description":"The type identifier for integer values","oneOf":[{"description":"The \"integer\" type tag value","type":"string","const":"integer"}]}},"required":["type"]},{"description":"Number type schema with number-specific validation rules","type":"object","properties":{"const":{"description":"A constant value that the number must equal","type":["number","null"],"format":"double"},"enum":{"description":"An array of valid number values","type":["array","null"],"items":{"type":"number","format":"double"}},"exclusiveMaximum":{"description":"The maximum value (exclusive) that the number can have","type":["number","null"],"format":"double"},"exclusiveMinimum":{"description":"The minimum value (exclusive) that the number can have","type":["number","null"],"format":"double"},"maximum":{"description":"The maximum value (inclusive) that the number can have","type":["number","null"],"format":"double"},"minimum":{"description":"The minimum value (inclusive) that the number can have","type":["number","null"],"format":"double"},"multipleOf":{"description":"The number must be a multiple of this value","type":["number","null"],"format":"double"},"type":{"description":"The type identifier for number values","oneOf":[{"description":"The \"number\" type tag value","type":"string","const":"number"}]}},"required":["type"]}]},{"type":"null"}]},"items":{"description":"If the type is \"array\", the type of the items in the array","anyOf":[{"description":"String type schema with string-specific validation rules","type":"object","properties":{"const":{"description":"A constant value that the string must equal","type":["string","null"]},"enum":{"description":"An array of valid string values","type":["array","null"],"items":{"type":"string"}},"format":{"description":"The format that the string must conform to","anyOf":[{"description":"String format validation types supported by JSON Schema","oneOf":[{"description":"RFC 3339 date-time format (e.g., `2023-10-22T14:30:00Z`)","type":"string","const":"date-time"},{"description":"RFC 3339 full-date format (e.g., `2023-10-22`)","type":"string","const":"date"},{"description":"RFC 3339 full-time format (e.g., `14:30:00Z`)","type":"string","const":"time"},{"description":"RFC 3339 duration format (e.g., `P1DT12H`)","type":"string","const":"duration"},{"description":"RFC 5322 email address format (e.g., `user@example.com`)","type":"string","const":"email"},{"description":"Internationalized email address format (RFC 6531)","type":"string","const":"idn-email"},{"description":"RFC 1123 hostname format (e.g., `example.com`)","type":"string","const":"hostname"},{"description":"Internationalized hostname format (RFC 5890)","type":"string","const":"idn-hostname"},{"description":"IPv4 address format (e.g., `192.168.1.1`)","type":"string","const":"ipv4"},{"description":"IPv6 address format (e.g., `2001:db8::1`","type":"string","const":"ipv6"},{"description":"RFC 3986 URI format (e.g., `https://example.com/path`)","type":"string","const":"uri"},{"description":"RFC 3986 URI reference format (URI or relative reference)","type":"string","const":"uri-reference"},{"description":"RFC 3987 IRI format (internationalized URI)","type":"string","const":"iri"},{"description":"RFC 3987 IRI reference format (IRI or relative reference)","type":"string","const":"iri-reference"},{"description":"RFC 4122 UUID format (e.g., `550e8400-e29b-41d4-a716-446655440000`)","type":"string","const":"uuid"},{"description":"RFC 6570 URI template format (e.g., `/users/{id}`)","type":"string","const":"uri-template"},{"description":"RFC 6901 JSON pointer format (e.g., `/path/to/field`)","type":"string","const":"json-pointer"},{"description":"RFC 6901 relative JSON pointer format (e.g., `1/name`)","type":"string","const":"relative-json-pointer"},{"description":"ECMAScript regular expression format","type":"string","const":"regex"}]},{"type":"null"}]},"maxLength":{"description":"The maximum length (inclusive) of the string","type":["integer","null"],"format":"int64"},"minLength":{"description":"The minimum length (inclusive) of the string","type":["integer","null"],"format":"int64"},"pattern":{"description":"A regular expression pattern that the string must match","type":["string","null"]},"type":{"description":"The type identifier for string values","oneOf":[{"description":"The \"string\" type tag value","type":"string","const":"string"}]}},"required":["type"]},{"description":"Boolean type schema with boolean-specific validation rules","type":"object","properties":{"const":{"description":"A constant value that the boolean must equal","type":["boolean","null"]},"enum":{"description":"An array of valid boolean values","type":["array","null"],"items":{"type":"boolean"}},"type":{"description":"The type identifier for boolean values","oneOf":[{"description":"The \"boolean\" type tag value","type":"string","const":"boolean"}]}},"required":["type"]},{"description":"Integer type schema with integer-specific validation rules","type":"object","properties":{"const":{"description":"A constant value that the integer must equal","type":["integer","null"],"format":"int64"},"enum":{"description":"An array of valid integer values","type":["array","null"],"items":{"type":"integer","format":"int64"}},"exclusiveMaximum":{"description":"The maximum value (exclusive) that the integer can have","type":["integer","null"],"format":"int64"},"exclusiveMinimum":{"description":"The minimum value (exclusive) that the integer can have","type":["integer","null"],"format":"int64"},"maximum":{"description":"The maximum value (inclusive) that the integer can have","type":["integer","null"],"format":"int64"},"minimum":{"description":"The minimum value (inclusive) that the integer can have","type":["integer","null"],"format":"int64"},"multipleOf":{"description":"The integer must be a multiple of this value","type":["integer","null"],"format":"int64"},"type":{"description":"The type identifier for integer values","oneOf":[{"description":"The \"integer\" type tag value","type":"string","const":"integer"}]}},"required":["type"]},{"description":"Number type schema with number-specific validation rules","type":"object","properties":{"const":{"description":"A constant value that the number must equal","type":["number","null"],"format":"double"},"enum":{"description":"An array of valid number values","type":["array","null"],"items":{"type":"number","format":"double"}},"exclusiveMaximum":{"description":"The maximum value (exclusive) that the number can have","type":["number","null"],"format":"double"},"exclusiveMinimum":{"description":"The minimum value (exclusive) that the number can have","type":["number","null"],"format":"double"},"maximum":{"description":"The maximum value (inclusive) that the number can have","type":["number","null"],"format":"double"},"minimum":{"description":"The minimum value (inclusive) that the number can have","type":["number","null"],"format":"double"},"multipleOf":{"description":"The number must be a multiple of this value","type":["number","null"],"format":"double"},"type":{"description":"The type identifier for number values","oneOf":[{"description":"The \"number\" type tag value","type":"string","const":"number"}]}},"required":["type"]}]},"maxContains":{"description":"Maximum number of items that can match the 'contains' schema","type":["integer","null"],"format":"uint64","minimum":0},"maxItems":{"description":"The maximum number of items (inclusive) that the array can contain","type":["integer","null"],"format":"uint64","minimum":0},"minContains":{"description":"Minimum number of items that must match the 'contains' schema","type":["integer","null"],"format":"uint64","minimum":0},"minItems":{"description":"The minimum number of items (inclusive) that the array can contain","type":["integer","null"],"format":"uint64","minimum":0},"type":{"description":"The type identifier for array values","oneOf":[{"description":"The \"array\" type tag value","type":"string","const":"array"}]},"uniqueItems":{"description":"Whether all items in the array must be unique","type":["boolean","null"]}},"required":["type","items"]},{"description":"Single value type schema (string, boolean, integer, or number)","anyOf":[{"description":"String type schema with string-specific validation rules","type":"object","properties":{"const":{"description":"A constant value that the string must equal","type":["string","null"]},"enum":{"description":"An array of valid string values","type":["array","null"],"items":{"type":"string"}},"format":{"description":"The format that the string must conform to","anyOf":[{"description":"String format validation types supported by JSON Schema","oneOf":[{"description":"RFC 3339 date-time format (e.g., `2023-10-22T14:30:00Z`)","type":"string","const":"date-time"},{"description":"RFC 3339 full-date format (e.g., `2023-10-22`)","type":"string","const":"date"},{"description":"RFC 3339 full-time format (e.g., `14:30:00Z`)","type":"string","const":"time"},{"description":"RFC 3339 duration format (e.g., `P1DT12H`)","type":"string","const":"duration"},{"description":"RFC 5322 email address format (e.g., `user@example.com`)","type":"string","const":"email"},{"description":"Internationalized email address format (RFC 6531)","type":"string","const":"idn-email"},{"description":"RFC 1123 hostname format (e.g., `example.com`)","type":"string","const":"hostname"},{"description":"Internationalized hostname format (RFC 5890)","type":"string","const":"idn-hostname"},{"description":"IPv4 address format (e.g., `192.168.1.1`)","type":"string","const":"ipv4"},{"description":"IPv6 address format (e.g., `2001:db8::1`","type":"string","const":"ipv6"},{"description":"RFC 3986 URI format (e.g., `https://example.com/path`)","type":"string","const":"uri"},{"description":"RFC 3986 URI reference format (URI or relative reference)","type":"string","const":"uri-reference"},{"description":"RFC 3987 IRI format (internationalized URI)","type":"string","const":"iri"},{"description":"RFC 3987 IRI reference format (IRI or relative reference)","type":"string","const":"iri-reference"},{"description":"RFC 4122 UUID format (e.g., `550e8400-e29b-41d4-a716-446655440000`)","type":"string","const":"uuid"},{"description":"RFC 6570 URI template format (e.g., `/users/{id}`)","type":"string","const":"uri-template"},{"description":"RFC 6901 JSON pointer format (e.g., `/path/to/field`)","type":"string","const":"json-pointer"},{"description":"RFC 6901 relative JSON pointer format (e.g., `1/name`)","type":"string","const":"relative-json-pointer"},{"description":"ECMAScript regular expression format","type":"string","const":"regex"}]},{"type":"null"}]},"maxLength":{"description":"The maximum length (inclusive) of the string","type":["integer","null"],"format":"int64"},"minLength":{"description":"The minimum length (inclusive) of the string","type":["integer","null"],"format":"int64"},"pattern":{"description":"A regular expression pattern that the string must match","type":["string","null"]},"type":{"description":"The type identifier for string values","oneOf":[{"description":"The \"string\" type tag value","type":"string","const":"string"}]}},"required":["type"]},{"description":"Boolean type schema with boolean-specific validation rules","type":"object","properties":{"const":{"description":"A constant value that the boolean must equal","type":["boolean","null"]},"enum":{"description":"An array of valid boolean values","type":["array","null"],"items":{"type":"boolean"}},"type":{"description":"The type identifier for boolean values","oneOf":[{"description":"The \"boolean\" type tag value","type":"string","const":"boolean"}]}},"required":["type"]},{"description":"Integer type schema with integer-specific validation rules","type":"object","properties":{"const":{"description":"A constant value that the integer must equal","type":["integer","null"],"format":"int64"},"enum":{"description":"An array of valid integer values","type":["array","null"],"items":{"type":"integer","format":"int64"}},"exclusiveMaximum":{"description":"The maximum value (exclusive) that the integer can have","type":["integer","null"],"format":"int64"},"exclusiveMinimum":{"description":"The minimum value (exclusive) that the integer can have","type":["integer","null"],"format":"int64"},"maximum":{"description":"The maximum value (inclusive) that the integer can have","type":["integer","null"],"format":"int64"},"minimum":{"description":"The minimum value (inclusive) that the integer can have","type":["integer","null"],"format":"int64"},"multipleOf":{"description":"The integer must be a multiple of this value","type":["integer","null"],"format":"int64"},"type":{"description":"The type identifier for integer values","oneOf":[{"description":"The \"integer\" type tag value","type":"string","const":"integer"}]}},"required":["type"]},{"description":"Number type schema with number-specific validation rules","type":"object","properties":{"const":{"description":"A constant value that the number must equal","type":["number","null"],"format":"double"},"enum":{"description":"An array of valid number values","type":["array","null"],"items":{"type":"number","format":"double"}},"exclusiveMaximum":{"description":"The maximum value (exclusive) that the number can have","type":["number","null"],"format":"double"},"exclusiveMinimum":{"description":"The minimum value (exclusive) that the number can have","type":["number","null"],"format":"double"},"maximum":{"description":"The maximum value (inclusive) that the number can have","type":["number","null"],"format":"double"},"minimum":{"description":"The minimum value (inclusive) that the number can have","type":["number","null"],"format":"double"},"multipleOf":{"description":"The number must be a multiple of this value","type":["number","null"],"format":"double"},"type":{"description":"The type identifier for number values","oneOf":[{"description":"The \"number\" type tag value","type":"string","const":"number"}]}},"required":["type"]}]}]},{"type":"null"}],"default":null}},"required":["name"]},{"type":"string"}]}},"fields":{"description":"Defines a field for needs.","type":"object","additionalProperties":{"description":"Definition of a field for needs.","type":"object","properties":{"default":{"description":"Default value for the field.","default":null},"description":{"description":"A description of the field.","type":["string","null"],"default":null},"nullable":{"description":"Whether the field allows unset values.","type":["boolean","null"],"default":null},"parse_dynamic_functions":{"description":"Whether dynamic functions are parsed in this field.\nFalls back to global `parse_dynamic_functions` when not set.","type":["boolean","null"],"default":null},"parse_variants":{"description":"Whether variants are parsed in this field","type":["boolean","null"],"default":null},"predicates":{"description":"List of (need filter, value) pairs for predicate default values.","type":"array","default":[],"items":{"type":"array","items":[{"type":"string"},true],"maxItems":2,"minItems":2}},"schema":{"description":"A JSON schema definition for the field.","anyOf":[{"description":"Union type that can represent either an array schema or a single-value schema.","anyOf":[{"description":"Array type schema with array-specific validation rules","type":"object","properties":{"contains":{"description":"Schema that at least one item in the array must match","anyOf":[{"description":"Union type representing different single-value types","anyOf":[{"description":"String type schema with string-specific validation rules","type":"object","properties":{"const":{"description":"A constant value that the string must equal","type":["string","null"]},"enum":{"description":"An array of valid string values","type":["array","null"],"items":{"type":"string"}},"format":{"description":"The format that the string must conform to","anyOf":[{"description":"String format validation types supported by JSON Schema","oneOf":[{"description":"RFC 3339 date-time format (e.g., `2023-10-22T14:30:00Z`)","type":"string","const":"date-time"},{"description":"RFC 3339 full-date format (e.g., `2023-10-22`)","type":"string","const":"date"},{"description":"RFC 3339 full-time format (e.g., `14:30:00Z`)","type":"string","const":"time"},{"description":"RFC 3339 duration format (e.g., `P1DT12H`)","type":"string","const":"duration"},{"description":"RFC 5322 email address format (e.g., `user@example.com`)","type":"string","const":"email"},{"description":"Internationalized email address format (RFC 6531)","type":"string","const":"idn-email"},{"description":"RFC 1123 hostname format (e.g., `example.com`)","type":"string","const":"hostname"},{"description":"Internationalized hostname format (RFC 5890)","type":"string","const":"idn-hostname"},{"description":"IPv4 address format (e.g., `192.168.1.1`)","type":"string","const":"ipv4"},{"description":"IPv6 address format (e.g., `2001:db8::1`","type":"string","const":"ipv6"},{"description":"RFC 3986 URI format (e.g., `https://example.com/path`)","type":"string","const":"uri"},{"description":"RFC 3986 URI reference format (URI or relative reference)","type":"string","const":"uri-reference"},{"description":"RFC 3987 IRI format (internationalized URI)","type":"string","const":"iri"},{"description":"RFC 3987 IRI reference format (IRI or relative reference)","type":"string","const":"iri-reference"},{"description":"RFC 4122 UUID format (e.g., `550e8400-e29b-41d4-a716-446655440000`)","type":"string","const":"uuid"},{"description":"RFC 6570 URI template format (e.g., `/users/{id}`)","type":"string","const":"uri-template"},{"description":"RFC 6901 JSON pointer format (e.g., `/path/to/field`)","type":"string","const":"json-pointer"},{"description":"RFC 6901 relative JSON pointer format (e.g., `1/name`)","type":"string","const":"relative-json-pointer"},{"description":"ECMAScript regular expression format","type":"string","const":"regex"}]},{"type":"null"}]},"maxLength":{"description":"The maximum length (inclusive) of the string","type":["integer","null"],"format":"int64"},"minLength":{"description":"The minimum length (inclusive) of the string","type":["integer","null"],"format":"int64"},"pattern":{"description":"A regular expression pattern that the string must match","type":["string","null"]},"type":{"description":"The type identifier for string values","oneOf":[{"description":"The \"string\" type tag value","type":"string","const":"string"}]}},"required":["type"]},{"description":"Boolean type schema with boolean-specific validation rules","type":"object","properties":{"const":{"description":"A constant value that the boolean must equal","type":["boolean","null"]},"enum":{"description":"An array of valid boolean values","type":["array","null"],"items":{"type":"boolean"}},"type":{"description":"The type identifier for boolean values","oneOf":[{"description":"The \"boolean\" type tag value","type":"string","const":"boolean"}]}},"required":["type"]},{"description":"Integer type schema with integer-specific validation rules","type":"object","properties":{"const":{"description":"A constant value that the integer must equal","type":["integer","null"],"format":"int64"},"enum":{"description":"An array of valid integer values","type":["array","null"],"items":{"type":"integer","format":"int64"}},"exclusiveMaximum":{"description":"The maximum value (exclusive) that the integer can have","type":["integer","null"],"format":"int64"},"exclusiveMinimum":{"description":"The minimum value (exclusive) that the integer can have","type":["integer","null"],"format":"int64"},"maximum":{"description":"The maximum value (inclusive) that the integer can have","type":["integer","null"],"format":"int64"},"minimum":{"description":"The minimum value (inclusive) that the integer can have","type":["integer","null"],"format":"int64"},"multipleOf":{"description":"The integer must be a multiple of this value","type":["integer","null"],"format":"int64"},"type":{"description":"The type identifier for integer values","oneOf":[{"description":"The \"integer\" type tag value","type":"string","const":"integer"}]}},"required":["type"]},{"description":"Number type schema with number-specific validation rules","type":"object","properties":{"const":{"description":"A constant value that the number must equal","type":["number","null"],"format":"double"},"enum":{"description":"An array of valid number values","type":["array","null"],"items":{"type":"number","format":"double"}},"exclusiveMaximum":{"description":"The maximum value (exclusive) that the number can have","type":["number","null"],"format":"double"},"exclusiveMinimum":{"description":"The minimum value (exclusive) that the number can have","type":["number","null"],"format":"double"},"maximum":{"description":"The maximum value (inclusive) that the number can have","type":["number","null"],"format":"double"},"minimum":{"description":"The minimum value (inclusive) that the number can have","type":["number","null"],"format":"double"},"multipleOf":{"description":"The number must be a multiple of this value","type":["number","null"],"format":"double"},"type":{"description":"The type identifier for number values","oneOf":[{"description":"The \"number\" type tag value","type":"string","const":"number"}]}},"required":["type"]}]},{"type":"null"}]},"items":{"description":"If the type is \"array\", the type of the items in the array","anyOf":[{"description":"String type schema with string-specific validation rules","type":"object","properties":{"const":{"description":"A constant value that the string must equal","type":["string","null"]},"enum":{"description":"An array of valid string values","type":["array","null"],"items":{"type":"string"}},"format":{"description":"The format that the string must conform to","anyOf":[{"description":"String format validation types supported by JSON Schema","oneOf":[{"description":"RFC 3339 date-time format (e.g., `2023-10-22T14:30:00Z`)","type":"string","const":"date-time"},{"description":"RFC 3339 full-date format (e.g., `2023-10-22`)","type":"string","const":"date"},{"description":"RFC 3339 full-time format (e.g., `14:30:00Z`)","type":"string","const":"time"},{"description":"RFC 3339 duration format (e.g., `P1DT12H`)","type":"string","const":"duration"},{"description":"RFC 5322 email address format (e.g., `user@example.com`)","type":"string","const":"email"},{"description":"Internationalized email address format (RFC 6531)","type":"string","const":"idn-email"},{"description":"RFC 1123 hostname format (e.g., `example.com`)","type":"string","const":"hostname"},{"description":"Internationalized hostname format (RFC 5890)","type":"string","const":"idn-hostname"},{"description":"IPv4 address format (e.g., `192.168.1.1`)","type":"string","const":"ipv4"},{"description":"IPv6 address format (e.g., `2001:db8::1`","type":"string","const":"ipv6"},{"description":"RFC 3986 URI format (e.g., `https://example.com/path`)","type":"string","const":"uri"},{"description":"RFC 3986 URI reference format (URI or relative reference)","type":"string","const":"uri-reference"},{"description":"RFC 3987 IRI format (internationalized URI)","type":"string","const":"iri"},{"description":"RFC 3987 IRI reference format (IRI or relative reference)","type":"string","const":"iri-reference"},{"description":"RFC 4122 UUID format (e.g., `550e8400-e29b-41d4-a716-446655440000`)","type":"string","const":"uuid"},{"description":"RFC 6570 URI template format (e.g., `/users/{id}`)","type":"string","const":"uri-template"},{"description":"RFC 6901 JSON pointer format (e.g., `/path/to/field`)","type":"string","const":"json-pointer"},{"description":"RFC 6901 relative JSON pointer format (e.g., `1/name`)","type":"string","const":"relative-json-pointer"},{"description":"ECMAScript regular expression format","type":"string","const":"regex"}]},{"type":"null"}]},"maxLength":{"description":"The maximum length (inclusive) of the string","type":["integer","null"],"format":"int64"},"minLength":{"description":"The minimum length (inclusive) of the string","type":["integer","null"],"format":"int64"},"pattern":{"description":"A regular expression pattern that the string must match","type":["string","null"]},"type":{"description":"The type identifier for string values","oneOf":[{"description":"The \"string\" type tag value","type":"string","const":"string"}]}},"required":["type"]},{"description":"Boolean type schema with boolean-specific validation rules","type":"object","properties":{"const":{"description":"A constant value that the boolean must equal","type":["boolean","null"]},"enum":{"description":"An array of valid boolean values","type":["array","null"],"items":{"type":"boolean"}},"type":{"description":"The type identifier for boolean values","oneOf":[{"description":"The \"boolean\" type tag value","type":"string","const":"boolean"}]}},"required":["type"]},{"description":"Integer type schema with integer-specific validation rules","type":"object","properties":{"const":{"description":"A constant value that the integer must equal","type":["integer","null"],"format":"int64"},"enum":{"description":"An array of valid integer values","type":["array","null"],"items":{"type":"integer","format":"int64"}},"exclusiveMaximum":{"description":"The maximum value (exclusive) that the integer can have","type":["integer","null"],"format":"int64"},"exclusiveMinimum":{"description":"The minimum value (exclusive) that the integer can have","type":["integer","null"],"format":"int64"},"maximum":{"description":"The maximum value (inclusive) that the integer can have","type":["integer","null"],"format":"int64"},"minimum":{"description":"The minimum value (inclusive) that the integer can have","type":["integer","null"],"format":"int64"},"multipleOf":{"description":"The integer must be a multiple of this value","type":["integer","null"],"format":"int64"},"type":{"description":"The type identifier for integer values","oneOf":[{"description":"The \"integer\" type tag value","type":"string","const":"integer"}]}},"required":["type"]},{"description":"Number type schema with number-specific validation rules","type":"object","properties":{"const":{"description":"A constant value that the number must equal","type":["number","null"],"format":"double"},"enum":{"description":"An array of valid number values","type":["array","null"],"items":{"type":"number","format":"double"}},"exclusiveMaximum":{"description":"The maximum value (exclusive) that the number can have","type":["number","null"],"format":"double"},"exclusiveMinimum":{"description":"The minimum value (exclusive) that the number can have","type":["number","null"],"format":"double"},"maximum":{"description":"The maximum value (inclusive) that the number can have","type":["number","null"],"format":"double"},"minimum":{"description":"The minimum value (inclusive) that the number can have","type":["number","null"],"format":"double"},"multipleOf":{"description":"The number must be a multiple of this value","type":["number","null"],"format":"double"},"type":{"description":"The type identifier for number values","oneOf":[{"description":"The \"number\" type tag value","type":"string","const":"number"}]}},"required":["type"]}]},"maxContains":{"description":"Maximum number of items that can match the 'contains' schema","type":["integer","null"],"format":"uint64","minimum":0},"maxItems":{"description":"The maximum number of items (inclusive) that the array can contain","type":["integer","null"],"format":"uint64","minimum":0},"minContains":{"description":"Minimum number of items that must match the 'contains' schema","type":["integer","null"],"format":"uint64","minimum":0},"minItems":{"description":"The minimum number of items (inclusive) that the array can contain","type":["integer","null"],"format":"uint64","minimum":0},"type":{"description":"The type identifier for array values","oneOf":[{"description":"The \"array\" type tag value","type":"string","const":"array"}]},"uniqueItems":{"description":"Whether all items in the array must be unique","type":["boolean","null"]}},"required":["type","items"]},{"description":"Single value type schema (string, boolean, integer, or number)","anyOf":[{"description":"String type schema with string-specific validation rules","type":"object","properties":{"const":{"description":"A constant value that the string must equal","type":["string","null"]},"enum":{"description":"An array of valid string values","type":["array","null"],"items":{"type":"string"}},"format":{"description":"The format that the string must conform to","anyOf":[{"description":"String format validation types supported by JSON Schema","oneOf":[{"description":"RFC 3339 date-time format (e.g., `2023-10-22T14:30:00Z`)","type":"string","const":"date-time"},{"description":"RFC 3339 full-date format (e.g., `2023-10-22`)","type":"string","const":"date"},{"description":"RFC 3339 full-time format (e.g., `14:30:00Z`)","type":"string","const":"time"},{"description":"RFC 3339 duration format (e.g., `P1DT12H`)","type":"string","const":"duration"},{"description":"RFC 5322 email address format (e.g., `user@example.com`)","type":"string","const":"email"},{"description":"Internationalized email address format (RFC 6531)","type":"string","const":"idn-email"},{"description":"RFC 1123 hostname format (e.g., `example.com`)","type":"string","const":"hostname"},{"description":"Internationalized hostname format (RFC 5890)","type":"string","const":"idn-hostname"},{"description":"IPv4 address format (e.g., `192.168.1.1`)","type":"string","const":"ipv4"},{"description":"IPv6 address format (e.g., `2001:db8::1`","type":"string","const":"ipv6"},{"description":"RFC 3986 URI format (e.g., `https://example.com/path`)","type":"string","const":"uri"},{"description":"RFC 3986 URI reference format (URI or relative reference)","type":"string","const":"uri-reference"},{"description":"RFC 3987 IRI format (internationalized URI)","type":"string","const":"iri"},{"description":"RFC 3987 IRI reference format (IRI or relative reference)","type":"string","const":"iri-reference"},{"description":"RFC 4122 UUID format (e.g., `550e8400-e29b-41d4-a716-446655440000`)","type":"string","const":"uuid"},{"description":"RFC 6570 URI template format (e.g., `/users/{id}`)","type":"string","const":"uri-template"},{"description":"RFC 6901 JSON pointer format (e.g., `/path/to/field`)","type":"string","const":"json-pointer"},{"description":"RFC 6901 relative JSON pointer format (e.g., `1/name`)","type":"string","const":"relative-json-pointer"},{"description":"ECMAScript regular expression format","type":"string","const":"regex"}]},{"type":"null"}]},"maxLength":{"description":"The maximum length (inclusive) of the string","type":["integer","null"],"format":"int64"},"minLength":{"description":"The minimum length (inclusive) of the string","type":["integer","null"],"format":"int64"},"pattern":{"description":"A regular expression pattern that the string must match","type":["string","null"]},"type":{"description":"The type identifier for string values","oneOf":[{"description":"The \"string\" type tag value","type":"string","const":"string"}]}},"required":["type"]},{"description":"Boolean type schema with boolean-specific validation rules","type":"object","properties":{"const":{"description":"A constant value that the boolean must equal","type":["boolean","null"]},"enum":{"description":"An array of valid boolean values","type":["array","null"],"items":{"type":"boolean"}},"type":{"description":"The type identifier for boolean values","oneOf":[{"description":"The \"boolean\" type tag value","type":"string","const":"boolean"}]}},"required":["type"]},{"description":"Integer type schema with integer-specific validation rules","type":"object","properties":{"const":{"description":"A constant value that the integer must equal","type":["integer","null"],"format":"int64"},"enum":{"description":"An array of valid integer values","type":["array","null"],"items":{"type":"integer","format":"int64"}},"exclusiveMaximum":{"description":"The maximum value (exclusive) that the integer can have","type":["integer","null"],"format":"int64"},"exclusiveMinimum":{"description":"The minimum value (exclusive) that the integer can have","type":["integer","null"],"format":"int64"},"maximum":{"description":"The maximum value (inclusive) that the integer can have","type":["integer","null"],"format":"int64"},"minimum":{"description":"The minimum value (inclusive) that the integer can have","type":["integer","null"],"format":"int64"},"multipleOf":{"description":"The integer must be a multiple of this value","type":["integer","null"],"format":"int64"},"type":{"description":"The type identifier for integer values","oneOf":[{"description":"The \"integer\" type tag value","type":"string","const":"integer"}]}},"required":["type"]},{"description":"Number type schema with number-specific validation rules","type":"object","properties":{"const":{"description":"A constant value that the number must equal","type":["number","null"],"format":"double"},"enum":{"description":"An array of valid number values","type":["array","null"],"items":{"type":"number","format":"double"}},"exclusiveMaximum":{"description":"The maximum value (exclusive) that the number can have","type":["number","null"],"format":"double"},"exclusiveMinimum":{"description":"The minimum value (exclusive) that the number can have","type":["number","null"],"format":"double"},"maximum":{"description":"The maximum value (inclusive) that the number can have","type":["number","null"],"format":"double"},"minimum":{"description":"The minimum value (inclusive) that the number can have","type":["number","null"],"format":"double"},"multipleOf":{"description":"The number must be a multiple of this value","type":["number","null"],"format":"double"},"type":{"description":"The type identifier for number values","oneOf":[{"description":"The \"number\" type tag value","type":"string","const":"number"}]}},"required":["type"]}]}]},{"type":"null"}],"default":null}}},"default":{}},"filter_data":{"description":"Additional context for filter expressions","type":"object","additionalProperties":{"type":"string"},"default":{}},"global_options":{"description":"Default values given to specified fields of needs","type":"object","additionalProperties":{"type":"object","properties":{"default":{"description":"This value is used, if the field has not been specifically set, and no predicate matches."},"predicates":{"description":"A list of (filter predicate, value) to match against the need.\nIf the field has not been specifically set,\nthe value of the first predicate that matches is used.","type":"array","items":{"type":"array","items":[{"type":"string"},true],"maxItems":2,"minItems":2}}}},"default":{}},"id_from_title":{"description":"Base auto-generated IDs on the title.","type":"boolean","default":false},"id_length":{"description":"The length of the auto-generated ID.","$ref":"#/$defs/DefaultIdLength","default":5},"id_regex":{"description":"Validate IDs with a regex.","$ref":"#/$defs/DefaultIdRegex","default":"^[A-Z0-9_]{5,}"},"id_required":{"description":"If True, an ID is required.","type":"boolean","default":false},"import_keys":{"description":"Mapping of keys that can be used as needimport arguments and replaced by the values.","type":"object","additionalProperties":{"type":"string"},"default":{}},"links":{"description":"Defines a link between needs.","type":"object","additionalProperties":{"description":"Defines a link between needs (dict-based, key is the link name).","type":"object","properties":{"allow_dead_links":{"description":"Do not warn if a link connects to an unknown need ID.","type":"boolean","default":false},"color":{"description":"The default color to use in diagrams.","type":"string","default":"#000000"},"copy":{"description":"Copy to common links field.","type":"boolean","default":false},"description":{"description":"A description of the link type.","type":["string","null"]},"incoming":{"description":"The incoming link title.","type":["string","null"]},"outgoing":{"description":"The outgoing link title.","type":["string","null"]},"parse_conditions":{"description":"Whether condition bracket syntax is parsed in this link's values.\nWhen `false`, brackets are treated as literal ID text.\nDefaults to `true` when not set.","type":["boolean","null"]},"parse_dynamic_functions":{"description":"Whether dynamic functions are parsed in this link.\nFalls back to global `parse_dynamic_functions` when not set.","type":["boolean","null"]},"parse_variants":{"description":"Whether variants are parsed in this link.","type":["boolean","null"]},"schema":{"description":"Schema constraints for validating the link array.","type":["object","null"],"properties":{"contains":{"description":"Schema constraints that at least one item must match.","type":["object","null"],"properties":{"maxLength":{"description":"Maximum string length of each link ID.","type":["integer","null"],"format":"uint","minimum":0},"minLength":{"description":"Minimum string length of each link ID.","type":["integer","null"],"format":"uint","minimum":0},"pattern":{"description":"A regex pattern to validate each link ID against.","type":["string","null"]},"type":{"description":"Type for link items. Injected automatically if not provided.","type":"string","default":"string","enum":["string"]}}},"items":{"description":"Schema constraints that apply to all items in the link ID array.\nDefaults to `{\"type\": \"string\"}` to ensure schema completeness.","type":"object","properties":{"maxLength":{"description":"Maximum string length of each link ID.","type":["integer","null"],"format":"uint","minimum":0},"minLength":{"description":"Minimum string length of each link ID.","type":["integer","null"],"format":"uint","minimum":0},"pattern":{"description":"A regex pattern to validate each link ID against.","type":["string","null"]},"type":{"description":"Type for link items. Injected automatically if not provided.","type":"string","default":"string","enum":["string"]}},"default":{"type":"string"}},"maxContains":{"description":"Maximum number of items that must match the 'contains' schema.","type":["integer","null"],"format":"uint","minimum":0},"maxItems":{"description":"Maximum number of outgoing links allowed.","type":["integer","null"],"format":"uint","minimum":0},"minContains":{"description":"Minimum number of items that must match the 'contains' schema.","type":["integer","null"],"format":"uint","minimum":0},"minItems":{"description":"Minimum number of outgoing links required.","type":["integer","null"],"format":"uint","minimum":0},"type":{"description":"Type for extra links, must be \"array\". Injected automatically if not provided.","type":"string","default":"array","enum":["array"]}}},"style":{"description":"The default style to use in diagrams.","type":"string","default":"solid"},"style_end":{"description":"The default end style to use in diagrams.","type":"string","default":">"},"style_part":{"description":"The default style to use in diagrams for part links.","type":"string","default":"dotted"},"style_start":{"description":"The default start style to use in diagrams.","type":"string","default":"-"}}},"default":{}},"parse_dynamic_functions":{"description":"Whether dynamic functions are parsed by default.\n\nApplies to extra fields and links unless overridden per-field/per-link.\nCore fields are not affected by this global setting.","$ref":"#/$defs/DefaultTrueBool","default":true},"schema_definitions_from_json":{"description":"Path to a JSON file containing schema definitions.","type":"string","default":""},"statuses":{"description":"If given, only the defined statuses are allowed.","type":"array","default":[],"items":{"description":"Allowed need status","type":"object","properties":{"description":{"description":"The description of the status.","type":"string","default":""},"name":{"description":"The name of the status.","type":"string"}},"required":["name"]}},"tags":{"description":"If given, only the defined tags are allowed.","type":"array","default":[],"items":{"description":"Allowed need tag","type":"object","properties":{"description":{"description":"The description of the tag.","type":"string","default":""},"name":{"description":"The name of the tag.","type":"string"}},"required":["name"]}},"title_from_content":{"description":"Base auto-generated titles on the content.","type":"boolean","default":false},"title_optional":{"description":"If True, a title is optional.","type":"boolean","default":false},"types":{"description":"The types of need items.","$ref":"#/$defs/DefaultNeedTypes","default":[{"color":"#BFD8D2","directive":"req","prefix":"R_","style":"node","title":"Requirement"},{"color":"#FEDCD2","directive":"spec","prefix":"S_","style":"node","title":"Specification"},{"color":"#DF744A","directive":"impl","prefix":"I_","style":"node","title":"Implementation"},{"color":"#DCB239","directive":"test","prefix":"T_","style":"node","title":"Test Case"}]},"variant_data":{"description":"Nested variant data accessible as `var.*` in filter expressions.\n\nProvides a hierarchical key-value store for build-variant-aware filtering\n(e.g., `var.cpu == \"arm\"` or `\"feature_a\" in var.build.features`).","type":"object","additionalProperties":{"description":"A value in the variant data tree.\n\nValues can be scalars, uniform arrays of scalars, or nested maps.\nArrays must contain elements of a single type (validated at resolution time).","anyOf":[{"description":"A single scalar value.","anyOf":[{"description":"A boolean value.","type":"boolean"},{"description":"An integer value.","type":"integer","format":"int64"},{"description":"A floating-point value.","type":"number","format":"double"},{"description":"A string value.","type":"string"}]},{"description":"A uniform array of scalar values.","type":"array","items":{"description":"A scalar leaf value in variant data.","anyOf":[{"description":"A boolean value.","type":"boolean"},{"description":"An integer value.","type":"integer","format":"int64"},{"description":"A floating-point value.","type":"number","format":"double"},{"description":"A string value.","type":"string"}]}},{"description":"A nested map of variant values.","type":"object","additionalProperties":{"$ref":"#/$defs/VariantValue"}}]},"default":{}},"variant_data_file":{"description":"Path to a JSON file containing variant data.\n\nIf both this and `variant_data` are set, the file is loaded first\nand inline values are deep-merged on top (inline wins).","type":"string","default":""},"variant_options":{"description":"Set of need fields that may contain variant functions.","type":"array","default":[],"items":{"type":"string"},"uniqueItems":true},"variants":{"description":"Named variant definitions, mapping names to filter expressions.\n\nWhen a variant function uses a simple (non-bracketed) expression like\n`<<name: value>>`, the `name` is looked up in this mapping to get the\nactual filter expression that is evaluated against the need's data.","type":"object","additionalProperties":{"type":"string"},"default":{}}}},"NeedsJsonConfig":{"description":"Define a ``needs.json`` index to display.","type":"object","properties":{"path":{"description":"The path to the JSON file containing the needs data.","type":"string"},"src":{"description":"The path to the source directory, used to resolve docnames to file paths.","type":["string","null"],"default":null}},"required":["path"]},"ParseConfig":{"description":"Configuration for parsing source documents.\n\n`ignore_directives`, `extend_directives` and `extend_roles` apply to all\nparsers. Individual parsers are configured under `[parse.parsers.<name>]`\n(e.g. `[parse.parsers.rst]`, `[parse.parsers.md]`).\n\nWith no parsers configured, documents are parsed as reStructuredText. Once\nany parser is configured, the listed parsers are the complete set and file\ndiscovery is derived from their `include` globs — so a lone\n`[parse.parsers.md]` parses Markdown only.","type":"object","properties":{"extend_directives":{"description":"A map of directive names to extend the directives with.","type":"object","additionalProperties":{"description":"Configuration to define parsing rules for a single directive.","type":"object","properties":{"argument":{"description":"If True, the directive accepts an argument.","type":"boolean","default":false},"content":{"description":"If True, the directive accepts content.","type":"boolean","default":false},"content_required":{"description":"If True, a warning will be logged if the directive contains no content.","type":"boolean","default":false},"description":{"description":"A short, human readable description of the directive.","type":"string","default":""},"extension":{"description":"The extension that provides the directive, if any.","type":"string","default":""},"named_options":{"description":"A map of named options to specifications.","type":"object","additionalProperties":{"description":"Configuration to define a single directive option.","type":"object","properties":{"choices":{"description":"A list of valid choices for the option.","type":["array","null"],"default":null,"items":{"type":"string"},"uniqueItems":true},"description":{"description":"A short, human readable description of the option.","type":"string","default":""},"flag":{"description":"If True, the option is a flag, i.e. it has no value.","type":"boolean","default":false}}},"default":{}},"options":{"description":"If True, the directive accepts options.","type":"boolean","default":false},"parse_content":{"description":"If True, the directive content is parsed.","type":"boolean","default":false}}},"default":{}},"extend_roles":{"description":"A map of role names to extend the roles with.","type":"object","additionalProperties":{"description":"Configuration to define a single role.","type":"object","properties":{"description":{"description":"A short, human readable description of the role.","type":"string","default":""},"extension":{"description":"The extension that provides the role, if any.","type":["string","null"],"default":null}}},"default":{}},"ignore_directives":{"description":"A set of directive names that will not emit a warning if they are unknown.","type":"array","default":[],"items":{"type":"string"},"uniqueItems":true},"parsers":{"description":"Per-parser configuration, keyed by parser name (e.g. `rst`, `md`).\n\nThe parser type is inferred from the canonical keys `rst` and `md`; give\nany other key an explicit `type`. Each parser's `include` globs select\nwhich files it handles.","type":"object","additionalProperties":{"description":"Configuration for a single parser, defined under `[parse.parsers.<name>]`.\n\nFields not relevant to the inferred parser type are ignored (e.g. `flavour`\nand `extensions` only apply to Markdown parsers).","type":"object","properties":{"extensions":{"description":"Per-extension configuration (Markdown parsers only).","type":"object","additionalProperties":{"description":"The setting for a single extension within a `[parse.parsers.md.extensions]` table.\n\nAn extension may be given either a bare boolean (`deflist = true`) to enable\nor disable it with default options, or a sub-table of per-extension options\n(`dollarmath = { allow_space = true }`), which also enables it.","anyOf":[{"description":"Enable (`true`) or disable (`false`) the extension with default options.","type":"boolean"},{"description":"Enable the extension with the given per-extension options.","type":"object","additionalProperties":{"description":"A scalar value for a per-extension option.","anyOf":[{"description":"A boolean option value.","type":"boolean"},{"description":"An integer option value.","type":"integer","format":"int64"},{"description":"A string option value.","type":"string"}]}}]},"default":{}},"flavour":{"description":"The Markdown flavour (Markdown parsers only).","anyOf":[{"description":"A Markdown parsing flavour.\n\nThe flavour selects a base set of enabled extensions; individual extensions\ncan be toggled on top via the parser's `extensions` setting. The names match\nthe lowercased strings used in TOML (`commonmark`, `myst`, `gfm`).","oneOf":[{"description":"Plain [CommonMark](https://commonmark.org/) with no extensions enabled\nby default.","type":"string","const":"commonmark"},{"description":"[MyST](https://mystmd.org/) Markdown — enables directive/role syntax and\nthe common `MyST` extension set by default.","type":"string","const":"myst"},{"description":"[GitHub Flavored Markdown](https://github.github.com/gfm/) — enables the\nGFM extension set by default.","type":"string","const":"gfm"}]},{"type":"null"}],"default":null},"include":{"description":"Glob patterns selecting which discovered files this parser handles.\n\nDefaults to the parser type's default (`[\"*.rst\"]` for RST,\n`[\"*.md\"]` for Markdown) when unset.","type":["array","null"],"default":null,"items":{"type":"string"}},"priority":{"description":"Routing priority, used to break ties when a file matches more than one\nparser equally specifically. Higher wins; defaults to `0`.","type":["integer","null"],"format":"int64","default":null},"type":{"description":"Explicit parser type, overriding inference from the sub-table key name.","anyOf":[{"description":"The kind of parser a `[parse.parsers.<name>]` table configures.\n\nInferred from the canonical keys `rst` and `md`; set `type` explicitly for\nany other key.","oneOf":[{"description":"The reStructuredText parser.","type":"string","const":"rst"},{"description":"The Markdown parser.","type":"string","const":"md"}]},{"type":"null"}],"default":null}}},"default":{}}}},"ProjectConfig":{"description":"Configuration for the project.","type":"object","properties":{"description":{"description":"A description of the project.","type":"string","default":""},"name":{"description":"The name of the project.","type":"string","default":""},"srcdir":{"description":"A directory, used for resolving paths in certain directives (defaults to config directory).","type":"string","default":""},"version":{"description":"The version of the project.","type":"string","default":""}}},"ReportsConfig":{"description":"Report-template configuration.\n\nControls discovery of `.html.j2` templates rendered by `ubc report`\nand the ubCode reports viewer, plus the output-size cap applied at\nrender time. Engine-level safety limits (template fuel, recursion\ndepth) are internal constants of the renderer, not configuration.","type":"object","properties":{"directory":{"description":"Directory (relative to the `ubproject.toml`, or absolute) that\ncontains `.html.j2` report templates.","$ref":"#/$defs/DefaultReportsDirectory","default":"reports"},"max_output_bytes":{"description":"Maximum size, in bytes, of a rendered report. Rendering is\naborted as soon as the output exceeds this cap.","$ref":"#/$defs/DefaultMaxOutputBytes","default":52428800}}},"ServerConfig":{"description":"Language server configuration.","type":"object","properties":{"hover_images":{"description":"Whether to enable hover images.","$ref":"#/$defs/DefaultTrueBool","default":true},"hover_need_refs":{"description":"Whether to enable hover tips for need references.","$ref":"#/$defs/DefaultTrueBool","default":true},"image_file_patterns":{"description":"A list of file patterns that are considered image files,\nused for autocompletion of image/figure directives.","$ref":"#/$defs/DefaultImageFilePatterns","default":["*.jpg","*.jpeg","*.png","*.gif","*.svg","*.webp","*.bmp","*.tiff","*.tif","*.ico","*.heif","*.heic","*.avif","*.eps","*.psd","*.ai","*.pdf"]},"index_on_save":{"description":"Whether to run background indexing of the project every time a source document is saved.","type":"boolean","default":false}}},"SourceConfig":{"description":"Configuration for the source file discovery.","type":"object","properties":{"exclude":{"description":"A list of glob patterns to exclude from the search.","$ref":"#/$defs/DefaultExcludeList","default":[".bzr",".direnv",".eggs",".git",".git-rewrite",".hg",".svn",".venv",".vscode","_build","build","dist","node_modules","site-packages"]},"extend_exclude":{"description":"A list of glob patterns to extend the exclude list with.","type":"array","default":[],"items":{"type":"string"}},"extend_include":{"description":"A list of glob patterns to extend the include list with.","type":"array","default":[],"items":{"type":"string"}},"follow_links":{"description":"If True, follow symbolic links when traversing source directories.","type":"boolean","default":false},"include":{"description":"A list of glob patterns to include in the search.","$ref":"#/$defs/DefaultIncludeList","default":["*.rst"]},"respect_gitignore":{"description":"If True, respect `.gitignore` files.","$ref":"#/$defs/DefaultTrueBool","default":true}}},"VariantValue":{"description":"A value in the variant data tree.\n\nValues can be scalars, uniform arrays of scalars, or nested maps.\nArrays must contain elements of a single type (validated at resolution time).","anyOf":[{"description":"A single scalar value.","anyOf":[{"description":"A boolean value.","type":"boolean"},{"description":"An integer value.","type":"integer","format":"int64"},{"description":"A floating-point value.","type":"number","format":"double"},{"description":"A string value.","type":"string"}]},{"description":"A uniform array of scalar values.","type":"array","items":{"description":"A scalar leaf value in variant data.","anyOf":[{"description":"A boolean value.","type":"boolean"},{"description":"An integer value.","type":"integer","format":"int64"},{"description":"A floating-point value.","type":"number","format":"double"},{"description":"A string value.","type":"string"}]}},{"description":"A nested map of variant values.","type":"object","additionalProperties":{"$ref":"#/$defs/VariantValue"}}]}}}